import { useLocal } from "web-utils"; import { DeadEnd } from "../../utils/ui/deadend"; import { Loading } from "../../utils/ui/loading"; import { base } from "./base/base"; import { loadPage } from "./base/page"; import { detectResponsiveMode } from "./base/responsive"; import { initBaseRoute, rebuildMeta } from "./base/route"; import { scanComponent } from "./base/component"; import { Vi } from "../vi/vi"; import { evalCJS } from "../ed/logic/ed-sync"; const w = window as any; export const Root = () => { const local = useLocal({}); // #region init if (base.route.status !== "ready") { if (base.route.status === "init") { base.route.status = "loading"; initBaseRoute().then(async (router) => { detectResponsiveMode(); base.route.status = "ready"; base.route.router = router; const site_script = evalCJS( await ( await fetch(`/deploy/${base.site.id}/_prasi/code/index.js`) ).text() ); if (site_script) { for (const [k, v] of Object.entries(site_script)) { w[k] = v; } } local.render(); }); } return ; } // #endregion // #region routing const router = base.route.router; if (!router) return Failed to create Router; const page = router.lookup(base.pathname); if (!page) return Page Not Found; w.params = page.params; base.page.id = page.id; base.page.url = page.url; const cache = base.page.cache[page.id]; if (!cache) { loadPage(page.id) .then(async (root) => { const p = { id: page.id, url: page.url, root, meta: {}, }; await scanComponent(root.childs); rebuildMeta(p.meta, root); base.page.cache[p.id] = p; local.render(); }) .catch(() => { local.render(); }); return ; } else { base.page.root = cache.root; base.page.meta = cache.meta; } // #endregion return (
e) .map((e) => e.id)} meta={base.page.meta} mode={base.mode} page_id={base.page.id} site_id={base.site.id} db={base.site.db} api={base.site.api} layout={ base.layout.id && base.layout.root && base.layout.meta ? { id: base.layout.id, meta: base.layout.meta, entry: Object.values(base.layout.root.childs) .filter((e) => e) .map((e) => e.id), } : undefined } script={{ init_local_effect: base.init_local_effect }} />
); };