diff --git a/app/web/src/base/page/all.tsx b/app/web/src/base/page/all.tsx
index 9088e96b..4a19a9ed 100644
--- a/app/web/src/base/page/all.tsx
+++ b/app/web/src/base/page/all.tsx
@@ -3,7 +3,7 @@ import { page } from "web-utils";
import { Loading } from "../../utils/ui/loading";
export default page({
- url: "*",
+ url: "**",
component: ({}) => {
useEffect(() => {
if (localStorage.getItem("prasi-session")) {
diff --git a/app/web/src/base/page/ed.tsx b/app/web/src/base/page/ed.tsx
index 74ed93db..800666e6 100644
--- a/app/web/src/base/page/ed.tsx
+++ b/app/web/src/base/page/ed.tsx
@@ -1,10 +1,131 @@
-import { page } from "web-utils";
+import { FC, useEffect } from "react";
+import { page, useGlobal, useLocal } from "web-utils";
+import { EditorGlobal } from "../../render/editor/logic/global";
import { Loading } from "../../utils/ui/loading";
export default page({
- url: "/ed/:site_id/:page_id",
+ url: "/editor/**",
component: ({}) => {
- location.href = `/editor/${params.site_id}/${params.page_id}`;
- return ;
+ const p = useGlobal(EditorGlobal, "EDITOR");
+
+ const local = useLocal({
+ loading: true,
+ session: null as any,
+ notfound: false,
+ init: false,
+ });
+ const site_id = params.site_id === "_" ? "" : params.site_id;
+ const page_id = params.page_id === "_" ? "" : params.page_id;
+
+ useEffect(() => {
+ if (!local.init) {
+ (async () => {
+ let ses: any = null;
+ try {
+ ses = JSON.parse(localStorage.getItem("prasi-session") || "");
+ } catch (e) {}
+
+ await new Promise(async (done) => {
+ try {
+ if (!!ses) {
+ done();
+ }
+ let e = await api.session();
+ if (!e) {
+ (window as any).redirectTo = location.pathname;
+ console.log("session not found");
+ // navigate("/login");
+ localStorage.removeItem("prasi-session");
+ } else {
+ localStorage.setItem("prasi-session", JSON.stringify(e));
+ }
+ if (!ses) {
+ ses = e;
+ done();
+ }
+ } catch (e) {
+ console.error(e);
+ }
+ });
+
+ if (ses) {
+ local.session = ses;
+
+ if (!site_id) {
+ const res = await db.site.findFirst({
+ where: {
+ is_deleted: false,
+ org: {
+ org_user: {
+ some: { id_user: ses.data.user.id },
+ },
+ },
+ },
+ select: {
+ id: true,
+ },
+ });
+ if (res) {
+ const page = await db.page.findFirst({
+ where: {
+ id_site: res.id,
+ is_deleted: false,
+ },
+ select: {
+ id: true,
+ },
+ });
+ if (page) {
+ local.loading = false;
+ local.render();
+ navigate(`/editor/${res.id}/${page.id}`);
+ return;
+ }
+ } else {
+ local.loading = false;
+ local.render();
+ return;
+ }
+ } else if (!page_id) {
+ let res = await db.page.findFirst({
+ where: {
+ id_site: site_id,
+ is_deleted: false,
+ },
+ select: {
+ id: true,
+ },
+ });
+
+ if (!res) {
+ res = await db.page.create({
+ data: {
+ content_tree: {
+ childs: [],
+ id: "root",
+ type: "root",
+ },
+ name: "home",
+ url: "/",
+ id_site: site_id,
+ },
+ });
+ }
+
+ if (res) {
+ local.loading = false;
+ local.render();
+ navigate(`/editor/${site_id}/${res.id}`);
+ return;
+ }
+ }
+ }
+
+ navigate(`/editor/${site_id}/${page_id}`);
+ })();
+ }
+ }, [local.init]);
+
+ return ;
},
});
diff --git a/app/web/src/base/pages.ts b/app/web/src/base/pages.ts
index a4c7d10a..40113090 100644
--- a/app/web/src/base/pages.ts
+++ b/app/web/src/base/pages.ts
@@ -11,11 +11,11 @@ export const auth_register = {
page: () => import("./page/auth/register"),
};
export const all = {
- url: "*",
+ url: "**",
page: () => import("./page/all"),
};
export const ed = {
- url: "/ed/:site_id/:page_id",
+ url: "/editor/**",
page: () => import("./page/ed"),
};
export const editor = {
diff --git a/app/web/src/base/root.tsx b/app/web/src/base/root.tsx
index bc217517..42b6af17 100644
--- a/app/web/src/base/root.tsx
+++ b/app/web/src/base/root.tsx
@@ -8,7 +8,7 @@ export const Root: FC<{}> = ({}) => {
const local = useLocal(
{
router: createRouter<{ url: string; Page: FC }>({
- strictTrailingSlash: false,
+ strictTrailingSlash: true,
}),
Page: null as any,
},
@@ -31,13 +31,12 @@ export const Root: FC<{}> = ({}) => {
const Provider = GlobalContext.Provider as FC<{ value: any; children: any }>;
const found = local.router.lookup(location.pathname);
- console.log(found)
if (found) {
w.params = found.params;
local.Page = found.Page;
}
-
+
if (!local.Page) {
return ;
}
diff --git a/app/web/src/render/editor/logic/init.ts b/app/web/src/render/editor/logic/init.ts
index 273b8320..117702e4 100644
--- a/app/web/src/render/editor/logic/init.ts
+++ b/app/web/src/render/editor/logic/init.ts
@@ -32,7 +32,6 @@ export const w = window as unknown as {
};
export const initEditor = async (p: PG, site_id: string) => {
-
w.isEditor = true;
if (typeof w.isLayout === "undefined") {
w.isLayout = false;
@@ -77,6 +76,7 @@ export const initEditor = async (p: PG, site_id: string) => {
return site;
};
const processSite = async (site: LSite) => {
+ if (!site || (site && !site.id)) return;
if (!w.exports) {
w.exports = {};
}
@@ -149,7 +149,7 @@ export const initEditor = async (p: PG, site_id: string) => {
};
export const execSiteJS = (p: PG) => {
- if (p) {
+ if (p && p.site.api_url) {
p.script.siteTypes = {};
const scope: any = {
types: p.script.siteTypes,
diff --git a/app/web/src/render/editor/panel/script/monaco/monaco-el.tsx b/app/web/src/render/editor/panel/script/monaco/monaco-el.tsx
index e4d7d55a..4411f341 100644
--- a/app/web/src/render/editor/panel/script/monaco/monaco-el.tsx
+++ b/app/web/src/render/editor/panel/script/monaco/monaco-el.tsx
@@ -38,6 +38,7 @@ const w = window as unknown as {
importCache: {
prettier: any;
prettier_parser: any;
+ prettier_estree: any;
};
};
@@ -87,18 +88,28 @@ export const ScriptMonacoElement: FC<{
const doEdit = async (newval: string, all?: boolean) => {
if (local.editor) {
if (!w.importCache) {
- w.importCache = { prettier_parser: "", prettier: "" };
+ w.importCache = {
+ prettier_parser: "",
+ prettier: "",
+ prettier_estree: "",
+ };
}
+
+ if (!w.importCache.prettier)
+ w.importCache.prettier = (await import("prettier/standalone")).default;
+
if (!w.importCache.prettier_parser)
w.importCache.prettier_parser = await import(
"prettier/plugins/typescript"
);
- if (!w.importCache.prettier)
- w.importCache.prettier = await import("prettier/standalone");
+ if (!w.importCache.prettier_estree)
+ w.importCache.prettier_estree = await import("prettier/plugins/estree");
const prettier = w.importCache.prettier;
const prettier_parser = w.importCache.prettier_parser;
+ const prettier_estree = w.importCache.prettier_estree;
+
const text = trim(
prettier.format(
all
@@ -106,7 +117,7 @@ export const ScriptMonacoElement: FC<{
: local.editor?.getValue().replace(/\{\s*children\s*\}/gi, newval),
{
parser: "typescript",
- plugins: [prettier_parser],
+ plugins: [prettier_parser, prettier_estree],
}
),
"; \n"
diff --git a/app/web/src/render/editor/panel/script/monaco/mount.tsx b/app/web/src/render/editor/panel/script/monaco/mount.tsx
index 14ee8509..ea96da1f 100644
--- a/app/web/src/render/editor/panel/script/monaco/mount.tsx
+++ b/app/web/src/render/editor/panel/script/monaco/mount.tsx
@@ -17,6 +17,7 @@ const w = window as unknown as {
importCache: {
prettier: any;
prettier_parser: any;
+ prettier_estree: any;
};
};
@@ -52,22 +53,34 @@ export const jsMount = async (p: PG, editor: MonacoEditor, monaco: Monaco) => {
monaco.languages.registerDocumentFormattingEditProvider("typescript", {
async provideDocumentFormattingEdits(model, options, token) {
if (!w.importCache) {
- w.importCache = { prettier_parser: "", prettier: "" };
+ w.importCache = {
+ prettier_parser: "",
+ prettier: "",
+ prettier_estree: "",
+ };
}
- if (!w.importCache.prettier_parser)
- w.importCache.prettier_parser = await import(
- "prettier/plugins/typescript"
- );
if (!w.importCache.prettier)
- w.importCache.prettier = await import("prettier/standalone");
+ w.importCache.prettier = (await import("prettier/standalone")).default;
+
+ if (!w.importCache.prettier_parser)
+ (w.importCache.prettier_parser = await import(
+ "prettier/plugins/typescript"
+ )).default;
+
+ if (!w.importCache.prettier_estree)
+ w.importCache.prettier_estree = (
+ await import("prettier/plugins/estree")
+ ).default;
const prettier = w.importCache.prettier;
const prettier_parser = w.importCache.prettier_parser;
+ const prettier_estree = w.importCache.prettier_estree;
+
const text = trim(
- prettier.format(model.getValue(), {
+ await prettier.format(model.getValue(), {
parser: "typescript",
- plugins: [prettier_parser],
+ plugins: [prettier_parser, prettier_estree],
}),
"; \n"
);
diff --git a/app/web/src/utils/script/init-api.ts b/app/web/src/utils/script/init-api.ts
index 20647000..3fa4e791 100644
--- a/app/web/src/utils/script/init-api.ts
+++ b/app/web/src/utils/script/init-api.ts
@@ -19,7 +19,9 @@ export const createAPI = (url: string) => {
if (!w.prasiApi) {
w.prasiApi = {};
}
-
+ if (!url) {
+ throw new Error("s")
+ }
return w.apiClient(w.prasiApi[url]?.apiEntry, url);
};
diff --git a/pkgs/core/utils/dev-watcher.ts b/pkgs/core/utils/dev-watcher.ts
index befdf39c..d16eba12 100644
--- a/pkgs/core/utils/dev-watcher.ts
+++ b/pkgs/core/utils/dev-watcher.ts
@@ -30,17 +30,7 @@ export const _ = {
await genPages();
watch(pagedir, async (event, filename) => {
const s = file(dir.path(`${pagedir}/${filename}`));
- if (s.size > 0) {
- // await Bun.write(
- // `app/srv/api/${filename}`,
- // `\
- // export const all = {
- // url: "*",
- // page: () => import("./page/all"),
- // };
- // `
- // );
- }
+ genPages();
});
};
@@ -55,7 +45,7 @@ const genPages = async () => {
const src = await readAsync(`${pagedir}/${pathname}.tsx`);
if (src) {
const url = src.split("url:")[1].split(",").shift();
- if (url) {
+ if (url) {
res.push(
`\
export const ${pathname.replace(/\W/gi, "_")} = {
diff --git a/pkgs/web-utils/src/client-frame.ts b/pkgs/web-utils/src/client-frame.ts
index 217d809a..39c890c2 100644
--- a/pkgs/web-utils/src/client-frame.ts
+++ b/pkgs/web-utils/src/client-frame.ts
@@ -190,10 +190,14 @@ export const fetchSendApi = async (
if (!frm) {
await waitUntil(() => {
- frm = win.frmapi[w.serverurl];
+ frm = win.frmapi[base];
return frm;
});
}
+ if (url.pathname.startsWith("//")) {
+ url.pathname = url.pathname.substring(1);
+ }
+
return await frm.send(url.pathname, params, win.apiHeaders);
};