From ea27006085608f0fb0f0411a96c2c23a3c88eea2 Mon Sep 17 00:00:00 2001 From: Rizky Date: Sun, 19 Nov 2023 14:54:07 +0700 Subject: [PATCH] fix --- app/srv/api/nova-load.ts | 6 +-- app/web/src/nova/view/logic/load-code.ts | 60 +++++++++++++++++++++--- 2 files changed, 55 insertions(+), 11 deletions(-) diff --git a/app/srv/api/nova-load.ts b/app/srv/api/nova-load.ts index c4d5f46d..966b0854 100644 --- a/app/srv/api/nova-load.ts +++ b/app/srv/api/nova-load.ts @@ -4,7 +4,7 @@ import { g } from "utils/global"; export const _ = { url: "/nova-load/:mode/:id/**", - async api(mode: "site" | "page" | "code", id: string) { + async api(mode: "site" | "code", id: string) { const { req, res } = apiContext(this); if (mode === "site") { @@ -17,10 +17,6 @@ export const _ = { return new Response(file as any); } } - } - if (mode === "page") { - const code = await db.code_assign.findMany({ where: { id_page: id } }); - return code.map((e) => e.id); } else if (mode === "code") { const file = Bun.file( dir.path(`${g.datadir}/site/build/${id}/${req.params["*"]}`) diff --git a/app/web/src/nova/view/logic/load-code.ts b/app/web/src/nova/view/logic/load-code.ts index 2fb8972b..4639d182 100644 --- a/app/web/src/nova/view/logic/load-code.ts +++ b/app/web/src/nova/view/logic/load-code.ts @@ -1,6 +1,10 @@ import { VG } from "./global"; export const codeLoaded = new Set(); +const codeMap = { + page: {} as Record, + compGroup: {} as Record, +}; export const vLoadCode = async (v: VG, forceLoad?: boolean) => { if (forceLoad) { codeLoaded.clear(); @@ -25,9 +29,57 @@ export const vLoadCode = async (v: VG, forceLoad?: boolean) => { resolve(); }), ]; + const code_ids: string[] = []; + const code = await db.code.findMany({ + where: { id_site: site_id, name: { notIn: ["site", "SSR"] } }, + select: { code_assign: true }, + }); - const code_ids = await api.nova_load("page", page_id); - for (const id of code_ids) { + codeMap.compGroup = {}; + codeMap.page = {}; + for (const c of code) { + c.code_assign.forEach((e) => { + if (e.id_page) { + if (!codeMap.page[e.id_page]) codeMap.page[e.id_page] = []; + codeMap.page[e.id_page].push(e.id_code); + } + if (e.id_component_group) { + if (!codeMap.compGroup[e.id_component_group]) + codeMap.compGroup[e.id_component_group] = []; + codeMap.page[e.id_component_group].push(e.id_code); + } + }); + } + + if (codeMap.page[page_id]) { + for (const id of codeMap.page[page_id]) { + promises.push( + new Promise(async (resolve) => { + if (!codeLoaded.has(id)) { + codeLoaded.add(id); + const module = await importCJS(`/nova-load/code/${id}/index.js`); + for (const [k, v] of Object.entries(module)) { + w[k] = v; + } + } + resolve(); + }) + ); + } + } + + await Promise.all(promises); + + v.mode = "rebuild"; + v.render(); + } +}; + +const loadCGroupCode = async (cgroup_id: string) => { + if (codeMap.compGroup[cgroup_id]) { + const promises = []; + const w = window as any; + for (const id of codeMap.compGroup[cgroup_id]) { promises.push( new Promise(async (resolve) => { if (!codeLoaded.has(id)) { @@ -41,11 +93,7 @@ export const vLoadCode = async (v: VG, forceLoad?: boolean) => { }) ); } - await Promise.all(promises); - - v.mode = "rebuild"; - v.render(); } };