diff --git a/app/srv/api/auth/logout.ts b/app/srv/api/auth/logout.ts new file mode 100644 index 00000000..42414062 --- /dev/null +++ b/app/srv/api/auth/logout.ts @@ -0,0 +1,10 @@ +import { apiContext } from "service-srv"; +import { session } from "utils/session"; + +export const _ = { + url: "/_logout", + async api() { + const { res } = apiContext(this); + res.setHeader("set-cookie", `${session.cookieKey}=X`); + }, +}; diff --git a/app/srv/ws/sync/editor/code/build.ts b/app/srv/ws/sync/editor/code/build.ts index 69f36b70..a4235070 100644 --- a/app/srv/ws/sync/editor/code/build.ts +++ b/app/srv/ws/sync/editor/code/build.ts @@ -17,6 +17,7 @@ export const codeBuild = async (code: DBCode) => { absWorkingDir: dir.path(`${g.datadir}/site/code/${id_code}`), entryPoints: ["index.tsx"], bundle: true, + format: "cjs", outfile: dir.path(`${g.datadir}/build/code/${id_code}/index.js`), minify: true, treeShaking: true, @@ -52,7 +53,6 @@ export const codeBuild = async (code: DBCode) => { }); }); const result = await Code.build.ctx[id_code].rebuild(); - console.log("rebuilt"); activity.site .room(code.id_site) .findAll({ site_js: code.name }) diff --git a/app/web/src/base/page/all.tsx b/app/web/src/base/page/all.tsx index 824638e1..1e30a21f 100644 --- a/app/web/src/base/page/all.tsx +++ b/app/web/src/base/page/all.tsx @@ -3,6 +3,7 @@ import { page, useGlobal } from "web-utils"; import { EDGlobal } from "../../render/ed/logic/ed-global"; import { edInitSync } from "../../render/ed/logic/ed-sync"; import { Loading } from "../../utils/ui/loading"; +import { isLocalhost } from "../../utils/ui/is-localhost"; export default page({ url: "**", @@ -23,7 +24,11 @@ export default page({ navigate(location.pathname + "/"); } } else { - navigate("/editor/_/_"); + if (isLocalhost()) { + navigate("/ed"); + } else { + navigate("/editor/_/_"); + } } } else { navigate("/login"); diff --git a/app/web/src/base/page/auth/login.tsx b/app/web/src/base/page/auth/login.tsx index 595f3f11..5363f5cc 100644 --- a/app/web/src/base/page/auth/login.tsx +++ b/app/web/src/base/page/auth/login.tsx @@ -47,11 +47,21 @@ export default page({ form.render(); alert(s.reason); } else { - const rto = (window as any).redirectTo; + let rto = (window as any).redirectTo; if (rto) { + if ( + location.href.includes("localhost") && + rto.includes("/editor") + ) { + rto = rto.replace("/editor", "/ed"); + } navigate(rto); } else { - navigate("/editor"); + if (location.href.includes("localhost")) { + navigate("/ed"); + } else { + navigate("/editor"); + } } } }} diff --git a/app/web/src/base/page/live.tsx b/app/web/src/base/page/live.tsx index 4adea67e..7152450e 100644 --- a/app/web/src/base/page/live.tsx +++ b/app/web/src/base/page/live.tsx @@ -15,10 +15,12 @@ export default page({ } (window as any).pathname = pathname; - navigator.serviceWorker.controller?.postMessage({ - type: "add-cache", - url: location.href, - }); + if (navigator.serviceWorker) { + navigator.serviceWorker.controller?.postMessage({ + type: "add-cache", + url: location.href, + }); + } return ( { }; (window as any).mobile = registerMobile(); - if (!isLocalhost()) { - const sw = await registerServiceWorker(); + if (navigator.serviceWorker) { + if (!isLocalhost()) { + const sw = await registerServiceWorker(); - const cacheCurrentPage = () => { - const swController = navigator.serviceWorker.controller; - if (swController) { - [location.href, "", "/", "/ed", "/ed/_/_", "/login"].forEach((url) => { - swController.postMessage({ - type: "add-cache", - url: url, - }); - }); - } - }; - cacheCurrentPage(); - navigator.serviceWorker.addEventListener("message", (e) => { - cacheCurrentPage(); - if (react.root) { - if (e.data.type === "offline") { - w.offline = true; - const click = () => { - if (react.root) react.root.render(); - }; - setTimeout(click, 5000); - react.root.render( - <> - -
-
- Network Failed -
-
- + const cacheCurrentPage = () => { + const swController = navigator.serviceWorker.controller; + if (swController) { + [location.href, "", "/", "/ed", "/ed/_/_", "/login"].forEach( + (url) => { + swController.postMessage({ + type: "add-cache", + url: url, + }); + } ); } - - if (e.data.type === "activated") { - if (e.data.shouldRefresh && sw) { + }; + cacheCurrentPage(); + navigator.serviceWorker.addEventListener("message", (e) => { + cacheCurrentPage(); + if (react.root) { + if (e.data.type === "offline") { + w.offline = true; + const click = () => { + if (react.root) react.root.render(); + }; + setTimeout(click, 5000); react.root.render( <> @@ -81,27 +56,22 @@ const start = async () => { right: 0px; z-index: 999; `, - "flex justify-center" + "flex justify-center cursor-pointer" )} > -
- Updating App... +
+ Network Failed
); + } - sw.unregister().then(() => { - window.location.reload(); - }); - } else { - const localVersion = localStorage.getItem("prasi-version"); - if (localVersion !== e.data.version) { - localStorage.setItem("prasi-version", e.data.version); - const click = () => { - if (react.root) react.root.render(); - }; - setTimeout(click, 5000); + if (e.data.type === "activated") { + if (e.data.shouldRefresh && sw) { react.root.render( <> @@ -114,57 +84,93 @@ const start = async () => { right: 0px; z-index: 999; `, - "flex justify-center cursor-pointer" + "flex justify-center" )} > -
- Prasi Updated{" "} - {e.data.version} +
+ Updating App...
); + + sw.unregister().then(() => { + window.location.reload(); + }); + } else { + const localVersion = localStorage.getItem("prasi-version"); + if (localVersion !== e.data.version) { + localStorage.setItem("prasi-version", e.data.version); + const click = () => { + if (react.root) react.root.render(); + }; + setTimeout(click, 5000); + react.root.render( + <> + +
+
+ Prasi Updated{" "} + {e.data.version} +
+
+ + ); + } } } } - } - }); - } else { - navigator.serviceWorker.getRegistrations().then(function (registrations) { - for (let registration of registrations) { - registration.unregister(); - } - }); + }); + } else { + navigator.serviceWorker.getRegistrations().then(function (registrations) { + for (let registration of registrations) { + registration.unregister(); + } + }); + } } - + defineReact(); await defineWindow(false); w.serverurl = base; await reloadDBAPI(base, "prod"); - const swc = navigator.serviceWorker.controller; - if (swc) { - [location.href, "", "/", "/ed", "/ed/_/_", "/login"].forEach((url) => { - swc.postMessage({ - type: "add-cache", - url: url, + if (navigator.serviceWorker) { + const swc = navigator.serviceWorker.controller; + if (swc) { + [location.href, "", "/", "/ed", "/ed/_/_", "/login"].forEach((url) => { + swc.postMessage({ + type: "add-cache", + url: url, + }); }); - }); - if (w.prasiApi && w.prasiApi[base] && w.prasiApi[base].apiEntry) { - const routes = Object.entries(w.prasiApi[base].apiEntry).map( - ([k, v]: any) => ({ - url: v.url, - name: k, - }) - ); + if (w.prasiApi && w.prasiApi[base] && w.prasiApi[base].apiEntry) { + const routes = Object.entries(w.prasiApi[base].apiEntry).map( + ([k, v]: any) => ({ + url: v.url, + name: k, + }) + ); - swc.postMessage({ - type: "define-route", - routes, - }); + swc.postMessage({ + type: "define-route", + routes, + }); + } } } w.api = createAPI(base); diff --git a/app/web/src/render/ed/panel/popup/code/code.tsx b/app/web/src/render/ed/panel/popup/code/code.tsx index b0f7efde..70b3161f 100644 --- a/app/web/src/render/ed/panel/popup/code/code.tsx +++ b/app/web/src/render/ed/panel/popup/code/code.tsx @@ -5,6 +5,7 @@ import { Loading } from "../../../../../utils/ui/loading"; import { Modal } from "../../../../../utils/ui/modal"; import { Tooltip } from "../../../../../utils/ui/tooltip"; import { EDGlobal } from "../../../logic/ed-global"; +import { Popover } from "../../../../../utils/ui/popover"; export const EdPopCode = () => { const p = useGlobal(EDGlobal, "EDITOR"); @@ -50,50 +51,42 @@ export const EdPopCode = () => { )} >
-
Hellow
} + autoFocus={false} + popoverClassName="bg-white shadow-md" className={cx( - "flex items-center px-2 w-[200px] overflow-ellipsis space-x-1", - "cursor-pointer" + "flex items-center px-2 w-[200px] hover:bg-blue-50 space-x-1", + "cursor-pointer justify-between" )} > -
-
{p.ui.popup.code.name}
+
+ {p.ui.popup.code.name} +
+
`, + }} + >
+ + + {p.ui.popup.code.name !== "site" && ( +
`, + __html: ``, }} >
-
- -
- {p.ui.popup.code.name !== "site" && ( -
-
`, - }} - >
-
- )} - -
`, - }} - >
-
-
- + )} { p.ui.popup.code.show_log = !p.ui.popup.code.show_log; p.render(); diff --git a/app/web/src/utils/ui/is-localhost.ts b/app/web/src/utils/ui/is-localhost.ts index c7c914aa..46d30717 100644 --- a/app/web/src/utils/ui/is-localhost.ts +++ b/app/web/src/utils/ui/is-localhost.ts @@ -1,5 +1,9 @@ export const isLocalhost = () => { - return ["localhost", "127.0.0.1", "trycloudflare.com", "ngrok"].find((e) => - location.hostname.includes(e) - ); + return [ + "localhost", + "127.0.0.1", + "192.168", + "trycloudflare.com", + "ngrok", + ].find((e) => location.hostname.includes(e)); };