prasi-bun/app/web/src/render/live/dev-loader.tsx

122 lines
2.9 KiB
TypeScript

import { LSite, Loader } from "./logic/global";
const cache = { site: null as any, pages: [] as any, api: null };
const config = { serverurl: "" };
export const devLoader: Loader = {
async site(p, where) {
config.serverurl = serverurl;
const site = (await db.site.findFirst({
where:
where.type === "siteid" ? { id: where.id } : { domain: where.domain },
select: {
id: true,
config: true,
domain: true,
name: true,
js: true,
responsive: true,
js_compiled: true,
},
})) as unknown as LSite;
if (!site) {
return null;
}
const cgroups = await db.site_use_comp.findMany({
where: { id_site: site.id },
select: { use_id_site: true },
});
if (Array.isArray(cgroups)) {
site.cgroup_ids = [];
for (const id of cgroups.map((c: any) => c.use_id_site)) {
site.cgroup_ids.push(id);
}
}
const layout = await db.page.findFirst({
where: {
id_site: site.id,
name: { startsWith: "layout:" },
is_default_layout: true,
is_deleted: false,
},
select: { content_tree: true, id: true },
});
if (layout && layout.content_tree) {
const childs = (layout.content_tree as any).childs;
if (childs && childs.length > 0) {
site.layout = childs[0];
site.layout_id = layout.id;
}
}
cache.site = site;
return site;
},
async comp(p, id) {
const comp = await load(`${config.serverurl}/_web/comp/${id}`);
p.comps.all[id] = comp;
return comp;
},
npm(p, type, id) {
if (type === "site") {
return `${config.serverurl}/npm/site/${id}/site.js`;
}
return `${config.serverurl}/npm/page/${id}/page.js`;
},
async page(p, id) {
return await load(`${config.serverurl}/_web/page/${id}`);
},
async pages(p, id) {
let pages = [] as any;
/** load pages */
const pagesLocal = localStorage.getItem(`prasi-pages-[${id}]`);
if (pagesLocal) {
try {
pages = JSON.parse(pagesLocal);
} catch (e) {}
}
const loadPages = async () => {
return await db.page.findMany({
where: {
id_site: cache.site.id,
is_deleted: false,
name: { not: { startsWith: "layout:" } },
},
select: {
id: true,
name: true,
url: true,
},
});
};
if (pages.length === 0) {
pages = await loadPages();
localStorage.setItem(`prasi-pages-[${id}]`, JSON.stringify(pages));
} else {
loadPages().then((pages) => {
localStorage.setItem(`prasi-pages-[${id}]`, JSON.stringify(pages));
});
}
return pages;
},
};
const load = async (url: string) => {
const res = await fetch(url);
try {
const text = await res.text();
const json = JSON.parse(text);
return json;
} catch (e) {
return null;
}
};