diff --git a/app/srv/api/comp.ts b/app/srv/api/comp.ts new file mode 100644 index 00000000..40c46905 --- /dev/null +++ b/app/srv/api/comp.ts @@ -0,0 +1,9 @@ +import { apiContext } from "service-srv"; + +export const _ = { + url: "/_web/comp/:id", + async api(id: string) { + const { req, res } = apiContext(this); + return await db.component.findFirst({ where: { id } }); + }, +}; diff --git a/app/srv/api/page.ts b/app/srv/api/page.ts new file mode 100644 index 00000000..5530d27d --- /dev/null +++ b/app/srv/api/page.ts @@ -0,0 +1,9 @@ +import { apiContext } from "service-srv"; + +export const _ = { + url: "/_web/page/:id", + async api(id: string) { + const { req, res } = apiContext(this); + return await db.page.findFirst({ where: { id } }); + }, +}; diff --git a/app/web/src/base/page/live.tsx b/app/web/src/base/page/live.tsx index 716beeb6..81f3c19d 100644 --- a/app/web/src/base/page/live.tsx +++ b/app/web/src/base/page/live.tsx @@ -1,15 +1,19 @@ import { validate } from "uuid"; import { page } from "web-utils"; +import { devLoader } from "../../render/live/dev-loader"; import { Live } from "../../render/live/live"; -import { defaultLoader } from "../../render/live/logic/default-loader"; export default page({ url: "/live/:domain/**", component: ({}) => { params.site_id = params.domain; + let pathname = `/${params._ === "_" ? "" : params._}`; if (validate(params._)) { - params.page_id = params._; + const arr = params._.split("/"); + params.page_id = arr.shift(); + pathname = `/${arr.join("/")}`; } + (window as any).pathname = pathname; navigator.serviceWorker.controller?.postMessage({ type: "add-cache", @@ -18,10 +22,9 @@ export default page({ return ( ); }, diff --git a/app/web/src/render/editor/logic/init.ts b/app/web/src/render/editor/logic/init.ts index 117702e4..fd4ee4e9 100644 --- a/app/web/src/render/editor/logic/init.ts +++ b/app/web/src/render/editor/logic/init.ts @@ -5,12 +5,12 @@ import { initApi, reloadDBAPI, } from "../../../utils/script/init-api"; -import { defaultLoader } from "../../live/logic/default-loader"; import { LSite } from "../../live/logic/global"; import { validateLayout } from "../../live/logic/layout"; import { jscript } from "../panel/script/script-element"; import importModule from "../tools/dynamic-import"; import { PG } from "./global"; +import { devLoader } from "../../live/dev-loader"; export const w = window as unknown as { basepath: string; @@ -70,7 +70,10 @@ export const initEditor = async (p: PG, site_id: string) => { } catch (e) {} const querySite = async () => { - const site = await defaultLoader.site(p as any, { id: site_id }); + const site = await devLoader.site(p as any, { + type: "siteid", + id: site_id, + }); localStorage.setItem(`prasi-site-${site_id}`, JSON.stringify(site)); return site; diff --git a/app/web/src/render/editor/panel/script/monaco/types/base.ts b/app/web/src/render/editor/panel/script/monaco/types/base.ts index 4fbc8f4d..77d39f08 100644 --- a/app/web/src/render/editor/panel/script/monaco/types/base.ts +++ b/app/web/src/render/editor/panel/script/monaco/types/base.ts @@ -36,7 +36,7 @@ const PassProp: FC & {children: React.ReactNode; }>; const PassChild: FC<{name: string}>; const Preload: FC<{url: string[]}>; const apiurl: string; -const prasiPageID: string; +const pageid: string; type ITEM = { id: string name: string; diff --git a/app/web/src/render/live/dev-loader.tsx b/app/web/src/render/live/dev-loader.tsx new file mode 100644 index 00000000..a7f4c726 --- /dev/null +++ b/app/web/src/render/live/dev-loader.tsx @@ -0,0 +1,117 @@ +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 (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) { + 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); + const text = await res.text(); + const json = JSON.parse(text); + return json; +}; diff --git a/app/web/src/render/live/elements/l-page.tsx b/app/web/src/render/live/elements/l-page.tsx index 7f22ca23..e983e989 100644 --- a/app/web/src/render/live/elements/l-page.tsx +++ b/app/web/src/render/live/elements/l-page.tsx @@ -7,7 +7,7 @@ export const LPage = () => { const p = useGlobal(LiveGlobal, "LIVE"); const mode = p.mode; - let childs = Object.values(p.page?.content_tree.childs || []); + let childs = Object.values(p.page?.content_tree?.childs || []); if (p.layout.section && p.layout.content) { childs = [p.layout.section]; } diff --git a/app/web/src/render/live/live.tsx b/app/web/src/render/live/live.tsx index 6b74cc60..768a1d18 100644 --- a/app/web/src/render/live/live.tsx +++ b/app/web/src/render/live/live.tsx @@ -7,11 +7,10 @@ import { initLive, w } from "./logic/init"; import { preload, routeLive } from "./logic/route"; export const Live: FC<{ - domain: string; + domain_or_siteid: string; pathname: string; loader: Loader; - mode: "dev" | "prod"; -}> = ({ domain, pathname, loader, mode = "dev" }) => { +}> = ({ domain_or_siteid, pathname, loader }) => { const p = useGlobal(LiveGlobal, "LIVE"); p.loader = loader; @@ -19,8 +18,6 @@ export const Live: FC<{ preload(p, url); }; - if (mode === "prod") p.prod = true; - if (p.site.id) { if (!p.mode && !!p.site.responsive) { if (p.site.responsive === "all") { @@ -58,12 +55,20 @@ export const Live: FC<{ }, [p.site.responsive]); if (p.status === "init") { - initLive(p, domain); + initLive(p, domain_or_siteid); } if (p.site.id) { routeLive(p, pathname); } + if (p.status === "not-found") + return ( +
+
404
+
NOT FOUND
+
+ ); + return ; }; diff --git a/app/web/src/render/live/logic/comp.ts b/app/web/src/render/live/logic/comp.ts index 2e0e666c..675a2ed0 100644 --- a/app/web/src/render/live/logic/comp.ts +++ b/app/web/src/render/live/logic/comp.ts @@ -44,29 +44,18 @@ export const loadComponent = async ( if (typeof itemOrID !== "string") { tree = itemOrID; } else { - if (!!p.comps.pending[itemOrID]) { - await p.comps.pending[itemOrID]; - } else { - loadSingleComponent(p, itemOrID); - const res = await p.comps.pending[itemOrID]; - tree = res.content_tree; - } + await loadComponentById(p, itemOrID); } scanComponent(tree, compIds); const promises = [...compIds] .filter((id) => { - if (p.prod) { - if (!p.comps.all[id] && !p.comps.pending[id]) return true; - } else { - if (!p.comps.doc[id] && !p.comps.pending[id]) return true; - } + if (!p.comps.all[id] && !p.comps.pending[id]) return true; return false; }) .map(async (id) => { - const res = await loadSingleComponent(p, id); - await loadComponent(p, res.content_tree); - return res; + const comp = await loadComponentById(p, id); + await loadComponent(p, comp.content_tree); }); if (promises.length > 0) { @@ -74,8 +63,14 @@ export const loadComponent = async ( } }; -const loadSingleComponent = (p: PG, comp_id: string) => { - return p.loader.comp(p, comp_id); +const loadComponentById = async (p: PG, id: string) => { + if (!!p.comps.pending[id]) { + return await p.comps.pending[id]; + } + const res = p.loader.comp(p, id); + p.comps.pending[id] = res; + p.comps.all[id] = await res; + return p.comps.all[id]; }; export const instantiateComp = ( diff --git a/app/web/src/render/live/logic/default-loader.tsx b/app/web/src/render/live/logic/default-loader.tsx deleted file mode 100644 index 7124fe7f..00000000 --- a/app/web/src/render/live/logic/default-loader.tsx +++ /dev/null @@ -1,119 +0,0 @@ -import { PRASI_COMPONENT } from "../../../utils/types/render"; -import { WS_MSG_GET_COMP } from "../../../utils/types/ws"; -import { LPage, LSite, Loader } from "./global"; -import { wsend } from "./ws"; - -export const defaultLoader: Loader = { - async site(_, where) { - const site = (await db.site.findFirst({ - where, - 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 (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) { - const childs = (layout.content_tree as any).childs; - if (childs && childs.length > 0) { - site.layout = childs[0]; - site.layout_id = layout.id; - } - } - - return site; - }, - async comp(p, comp_id) { - p.comps.pending[comp_id] = new Promise(async (resolve) => { - p.comps.resolve[comp_id] = async (comp: PRASI_COMPONENT) => { - resolve(comp); - }; - await wsend( - p, - JSON.stringify({ - type: "get_comp", - comp_id: comp_id, - } as WS_MSG_GET_COMP) - ); - }); - return p.comps.pending[comp_id]; - }, - npm(p, type, id) { - if (type === "site") { - return `${serverurl}/npm/site/${id}/site.js`; - } else if (type === "page") { - return `${serverurl}/npm/page/${id}/page.js`; - } - - return null as any; - }, - async page(p, id) { - const res = await db.page.findFirst({ - where: { id: id, name: { not: { startsWith: "layout:" } } }, - select: { - id: true, - url: true, - name: true, - content_tree: true, - js_compiled: true, - }, - }); - - let page: LPage; - - if (res) { - page = { - id: res.id, - content_tree: res.content_tree as any, - js: res.js_compiled as any, - name: res.name, - url: res.url, - }; - - return page; - } - - return null as unknown as LPage; - }, - async pages(p, site_id: string) { - return (await db.page.findMany({ - where: { - id_site: site_id, - name: { not: { startsWith: "layout:" } }, - is_deleted: false, - }, - select: { id: true, url: true }, - })) as unknown as LPage[]; - }, -}; diff --git a/app/web/src/render/live/logic/global.ts b/app/web/src/render/live/logic/global.ts index eafd329f..4f0f7847 100644 --- a/app/web/src/render/live/logic/global.ts +++ b/app/web/src/render/live/logic/global.ts @@ -16,7 +16,6 @@ export type ItemMeta = { comp?: { id: string; propval?: any; - mcomp?: MItem; child_ids: Record; }; className?: string; @@ -36,7 +35,7 @@ export type LPage = { id: string; name: string; url: string; - content_tree: IRoot; + content_tree?: IRoot; js: string; }; @@ -60,7 +59,7 @@ export type LSite = { export type Loader = { site: ( p: PG, - where: { domain: string } | { id: string } + where: { type: "domain"; domain: string } | { type: "siteid"; id: string } ) => Promise; page: (p: PG, id: string) => Promise; pages: (p: PG, site_id: string) => Promise; @@ -112,7 +111,6 @@ export const LiveGlobal = { comps: { pending: {} as Record>, resolve: {} as Record void>, - doc: {} as Record, all: {} as Record, }, script: { diff --git a/app/web/src/render/live/logic/init.tsx b/app/web/src/render/live/logic/init.tsx index d2b0d622..b4f08f99 100644 --- a/app/web/src/render/live/logic/init.tsx +++ b/app/web/src/render/live/logic/init.tsx @@ -32,7 +32,7 @@ export const w = window as unknown as { }; }; -export const initLive = async (p: PG, domain: string) => { +export const initLive = async (p: PG, domain_or_siteid: string) => { if (p.status === "init") { p.status = "loading"; @@ -68,30 +68,12 @@ export const initLive = async (p: PG, domain: string) => { /** load site */ let site = null as null | LSite; - if (!p.prod) { - try { - site = JSON.parse(localStorage.getItem(`prasi-site-${domain}`) || ""); - } catch (e) {} - - if (!site) { - site = await p.loader.site( - p, - validate(domain) ? { id: domain } : { domain } - ); - localStorage.setItem(`prasi-site-${domain}`, JSON.stringify(site)); - } else { - p.loader - .site(p, validate(domain) ? { id: domain } : { domain }) - .then((site) => { - localStorage.setItem(`prasi-site-${domain}`, JSON.stringify(site)); - }); - } - } else { - site = await p.loader.site( - p, - validate(domain) ? { id: domain } : { domain } - ); - } + site = await p.loader.site( + p, + validate(domain_or_siteid) + ? { type: "siteid", id: domain_or_siteid } + : { type: "domain", domain: domain_or_siteid } + ); if (site) { /** import site module */ @@ -112,59 +94,11 @@ export const initLive = async (p: PG, domain: string) => { await validateLayout(p); - if (p.prod) { - p.site.api_url = await initApi(site.config, "prod"); - } else { - w.externalAPI = { - mode: (localStorage.getItem(`prasi-ext-api-mode-${p.site.id}`) || - "prod") as any, - devUrl: localStorage.getItem(`prasi-ext-dev-url-${p.site.id}`) || "", - prodUrl: - localStorage.getItem(`prasi-ext-prod-url-${p.site.id}`) || "", - }; - p.site.api_url = await initApi(site.config); + p.site.api_url = await initApi(site.config, "prod"); - if (w.externalAPI.prodUrl !== p.site.api_url) { - w.externalAPI.prodUrl = p.site.api_url; - localStorage.setItem( - `prasi-ext-prod-url-${p.site.id}`, - p.site.api_url - ); - } - if (w.externalAPI.mode === "dev" && w.externalAPI.devUrl) { - p.site.api_url = w.externalAPI.devUrl; - await reloadDBAPI(w.externalAPI.devUrl, "dev"); - } - } w.apiurl = p.site.api_url; - let pages = []; - if (!p.prod) { - /** load pages */ - const pagesLocal = localStorage.getItem(`prasi-pages-[${domain}]`); - if (pagesLocal) { - try { - pages = JSON.parse(pagesLocal); - } catch (e) {} - } - - if (pages.length === 0) { - pages = await p.loader.pages(p, site.id); - localStorage.setItem( - `prasi-pages-[${domain}]`, - JSON.stringify(pages) - ); - } else { - p.loader.pages(p, site.id).then((pages) => { - localStorage.setItem( - `prasi-pages-[${domain}]`, - JSON.stringify(pages) - ); - }); - } - } else { - pages = await p.loader.pages(p, site.id); - } + let pages = await p.loader.pages(p, site.id); /** execute site module */ const exec = (fn: string, scopes: any) => { @@ -198,9 +132,11 @@ export const initLive = async (p: PG, domain: string) => { } /** create router */ + p.pages = {}; p.route = createRouter({ strictTrailingSlash: false }); if (pages && pages.length > 0) { for (const page of pages) { + p.pages[page.id] = page; p.route.insert(page.url, page); } } diff --git a/app/web/src/render/live/logic/route.ts b/app/web/src/render/live/logic/route.ts index d98c93cd..0c270764 100644 --- a/app/web/src/render/live/logic/route.ts +++ b/app/web/src/render/live/logic/route.ts @@ -4,18 +4,16 @@ import { w } from "../../../utils/types/general"; import { WS_MSG_GET_PAGE } from "../../../utils/types/ws"; import importModule from "../../editor/tools/dynamic-import"; import { loadComponent } from "./comp"; -import { LPage, LiveGlobal, PG } from "./global"; -import { liveWS, wsend } from "./ws"; +import { LPage, PG } from "./global"; import { rebuildTree } from "./tree-logic"; +import { liveWS, wsend } from "./ws"; export const routeLive = (p: PG, pathname: string) => { - if (p.status !== "loading") { - let page_id = ""; - if (validate(pathname.substring(1))) { - page_id = pathname.substring(1); - } else { - const found = p.route.lookup(pathname); + if (p.status !== "loading" && p.status !== "not-found") { + let page_id = params.page_id; + if (!page_id) { + const found = p.route.lookup(pathname); if (!found) { p.status = "not-found"; } else { @@ -30,48 +28,34 @@ export const routeLive = (p: PG, pathname: string) => { } if (page_id) { - (window as any).prasiPageID = page_id; + (window as any).pageid = page_id; const promises: Promise[] = []; if (page_id !== p.page?.id) { p.page = p.pages[page_id]; p.treeMeta = {}; p.portal = {}; } + if (!p.page || !p.page.content_tree) { promises.push(loadNpmPage(p, page_id)); - - if (!p.prod) { - promises.push(streamPage(p, page_id)); - } else { - promises.push(loadPage(p, page_id)); - } - } else { - if (!p.prod) { - streamPage(p, page_id); - } + promises.push(loadPage(p, page_id)); } if (promises.length > 0) { + p.status = "loading"; Promise.all(promises).then(async () => { - await pageLoaded(p); - p.status = "ready"; - p.render(); + p.page = p.pages[page_id]; + if (p.page) { + await pageLoaded(p); + p.render(); + } }); } else { - if (p.prod && !firstRender[page_id]) { + if (!firstRender[page_id]) { firstRender[page_id] = true; pageLoaded(p).then(p.render); } else { - if (!p.prod) { - pageLoaded(p).then(() => { - if (stream.page_id !== page_id) { - stream.page_id = page_id; - p.render(); - } - }); - } else { - pageLoaded(p); - } + pageLoaded(p); } } } @@ -91,7 +75,11 @@ const pageLoaded = async (p: PG) => { export const preload = async (p: PG, pathname: string) => { const found = p.route.lookup(pathname); if (found) { - if (!p.pages[found.id] && !p.pagePreload[found.id]) { + if ( + (!p.pages[found.id] || + (p.pages[found.id] && !p.pages[found.id].content_tree)) && + !p.pagePreload[found.id] + ) { p.pagePreload[found.id] = true; const dbpage = await p.loader.page(p, found.id); if (dbpage) { @@ -139,6 +127,7 @@ const loadPage = async (p: PG, id: string) => { content_tree: page.content_tree as any, js: (page as any).js_compiled as any, }; + console.log(p.pages[page.id]); const cur = p.pages[page.id]; if (cur && cur.content_tree) { @@ -147,36 +136,6 @@ const loadPage = async (p: PG, id: string) => { } }; -const stream = { page_id: "" }; - -const streamPage = (p: PG, id: string) => { - return new Promise(async (resolve) => { - await liveWS(p); - p.mpageLoaded = async (mpage) => { - const dbpage = mpage.getMap("map").toJSON() as page; - p.pages[dbpage.id] = { - id: dbpage.id, - url: dbpage.url, - name: dbpage.name, - content_tree: dbpage.content_tree as any, - js: dbpage.js_compiled as any, - }; - const page = p.pages[dbpage.id]; - if (page && page.content_tree) { - await loadComponent(p, page.content_tree); - } - resolve(); - }; - wsend( - p, - JSON.stringify({ - type: "get_page", - page_id: id, - } as WS_MSG_GET_PAGE) - ); - }); -}; - export const extractNavigate = (str: string) => { return [ ...findBetween(str, `navigate(`, `)`), diff --git a/app/web/src/render/live/logic/tree-logic.tsx b/app/web/src/render/live/logic/tree-logic.tsx index e1618b80..c66687b4 100644 --- a/app/web/src/render/live/logic/tree-logic.tsx +++ b/app/web/src/render/live/logic/tree-logic.tsx @@ -9,10 +9,12 @@ export const rebuildTree = async ( p: PG, _: { note: string; render?: boolean; reset?: boolean } ) => { + if (!p.page?.content_tree) return; + p.treePending = new Promise(async (resolve) => { const treeMeta = p.treeMeta; if (p.page) { - let childs = Object.values(p.page.content_tree.childs || []); + let childs = Object.values(p.page.content_tree?.childs || []); if ( p.layout.section && p.layout.content && @@ -22,7 +24,7 @@ export const rebuildTree = async ( p.layout.content.type = "item"; if (p.layout.content.type === "item") { - p.layout.content.childs = p.page.content_tree.childs.map((e) => ({ + p.layout.content.childs = p.page.content_tree?.childs.map((e) => ({ ...e, type: "item", })) as IItem[]; @@ -66,7 +68,7 @@ const walk = async ( const treeMeta = val.treeMeta; let item = val.item as IContent; - if (item.hidden === 'all') return; + if (item.hidden === "all") return; if (val.parent_comp) { const pchild_ids = val.parent_comp.comp?.child_ids; @@ -85,9 +87,6 @@ const walk = async ( comp = { id: item.component.id, child_ids: {}, - mcomp: p.prod - ? undefined - : p.comps.doc[item.component.id]?.getMap("map").get("content_tree"), }; } @@ -107,119 +106,48 @@ const walk = async ( if (item.type === "item" && item.component?.id) { const cid = item.component.id; - if (p.prod) { - let comp = p.comps.all[cid]; - if (!comp) { - await loadComponent(p, cid); - comp = p.comps.all[cid]; + let comp = p.comps.all[cid]; + if (!comp) { + await loadComponent(p, cid); + comp = p.comps.all[cid]; + } + + if (comp) { + if (!p.compInstance[item.id]) { + p.compInstance[item.id] = {}; + } + const child_ids = p.compInstance[item.id]; + const itemnew = instantiateComp( + p, + item, + { type: "i", item: comp }, + child_ids + ); + + for (const [k, v] of Object.entries(itemnew)) { + if (k !== "id") (item as any)[k] = v; } - if (comp) { - if (!p.compInstance[item.id]) { - p.compInstance[item.id] = {}; - } - const child_ids = p.compInstance[item.id]; - const itemnew = instantiateComp( - p, - item, - { type: "i", item: comp }, - child_ids - ); + const cprops = comp.content_tree.component?.props; + const iprops = item.component.props; - for (const [k, v] of Object.entries(itemnew)) { - if (k !== "id") (item as any)[k] = v; - } + if (cprops && iprops) { + for (const [name, mprop] of Object.entries(cprops)) { + const jsx_prop = iprops[name]; - const cprops = comp.content_tree.component?.props; - const iprops = item.component.props; + if (jsx_prop) { + if (mprop.meta?.type === "content-element") { + let icontent = jsx_prop.content; - if (cprops && iprops) { - for (const [name, mprop] of Object.entries(cprops)) { - const jsx_prop = iprops[name]; - - if (jsx_prop) { - if (mprop.meta?.type === "content-element") { - let icontent = jsx_prop.content; - - if (icontent) - await walk(p, { - treeMeta, - item: icontent, - parent_id: item.id, - parent_comp: val.parent_comp, - idx: mprop.idx, - isLayout: meta.isLayout, - }); - } - } - } - } - } - } else { - let doc = p.comps.doc[cid]; - if (!doc) { - await loadComponent(p, cid); - doc = p.comps.doc[cid]; - } - - if (doc) { - const mcomp = doc.getMap("map").get("content_tree") as MItem; - if (mcomp) { - if (!p.compInstance[item.id]) { - p.compInstance[item.id] = {}; - } - const child_ids = p.compInstance[item.id]; - - const itemnew = instantiateComp( - p, - item, - { type: "m", item: mcomp }, - child_ids - ); - - for (const [k, v] of Object.entries(itemnew)) { - if (k !== "id") (item as any)[k] = v; - } - - meta.comp = { - id: cid, - mcomp, - child_ids, - }; - } - - let cprops: [string, FNCompDef][] = Object.entries( - item.component?.props || {} - ).sort((a, b) => { - return a[1].idx - b[1].idx; - }); - if (mcomp) { - const mprops = mcomp.get("component")?.get("props"); - const iprops = item.component.props; - - if (mprops && iprops) { - for (const [name, cprop] of cprops) { - let mp = mprops.get(name); - if (mp) { - const mprop = mp?.toJSON() as FNCompDef; - const jsx_prop = iprops[name]; - - if (jsx_prop) { - if (mprop.meta?.type === "content-element") { - let icontent = jsx_prop.content; - - if (icontent) - await walk(p, { - treeMeta, - item: cprop.content, - parent_id: item.id, - parent_comp: meta as any, - idx: mprop.idx, - isLayout: meta.isLayout, - }); - } - } - } + if (icontent) + await walk(p, { + treeMeta, + item: icontent, + parent_id: item.id, + parent_comp: val.parent_comp, + idx: mprop.idx, + isLayout: meta.isLayout, + }); } } } diff --git a/app/web/src/render/site/site.tsx b/app/web/src/render/site/site.tsx index 9f96a41d..81328845 100644 --- a/app/web/src/render/site/site.tsx +++ b/app/web/src/render/site/site.tsx @@ -1,7 +1,7 @@ import { FC, useState } from "react"; import { createRoot } from "react-dom/client"; import { GlobalContext, defineReact, defineWindow } from "web-utils"; -import { SiteLoader } from "./site-loader"; +import { siteLoader } from "./site-loader"; const w = window as unknown as { prasiContext: any; @@ -25,8 +25,7 @@ const Root: FC<{ url: URL; Live: any }> = ({ url, Live }) => { ); diff --git a/pkgs/core/utils/dev-watcher.ts b/pkgs/core/utils/dev-watcher.ts index d16eba12..da400c52 100644 --- a/pkgs/core/utils/dev-watcher.ts +++ b/pkgs/core/utils/dev-watcher.ts @@ -16,7 +16,7 @@ export const startDevWatcher = async () => { import { apiContext } from "service-srv"; export const _ = { - url: "/${filename?.substring(0, filename.length - 3)})}", + url: "/${filename?.substring(0, filename.length - 3)}", async api() { const { req, res } = apiContext(this); return "This is ${filename}";