diff --git a/app/web/src/render/ed/panel/popup/api/api-server.tsx b/app/web/src/render/ed/panel/popup/api/api-server.tsx index 4f74cb3c..960b8033 100644 --- a/app/web/src/render/ed/panel/popup/api/api-server.tsx +++ b/app/web/src/render/ed/panel/popup/api/api-server.tsx @@ -1,17 +1,66 @@ import { forwardRef } from "react"; import { useGlobal, useLocal } from "web-utils"; -import { EDGlobal } from "../../../logic/ed-global"; +import { EDGlobal, PG } from "../../../logic/ed-global"; +import { checkAPI, dev } from "./api-utils"; export const EdApiServer = forwardRef((arg, ref) => { const p = useGlobal(EDGlobal, "EDITOR"); - const local = useLocal({ api_url: p.site.config.api_url }); + const local = useLocal( + { + api_url: p.site.config.api_url, + status: "offline" as "online" | "offline" | "checking", + deployable: false, + hasDB: false, + }, + () => { + try { + if (dev) { + const vdev = JSON.parse(localStorage.getItem("prasi-dev") || "{}"); + if (vdev) { + dev.url = vdev.url; + dev.enabled = vdev.enabled; + } + } + } catch (e) {} + check(); + } + ); + const check = () => { + local.status = "checking"; + local.render(); + const res = checkAPI(p); + if (res) { + local.hasDB = res.hasDB; + local.status = "online"; + local.deployable = res.deployable; + local.render(); + } else { + local.hasDB = false; + local.status = "offline"; + local.deployable = false; + local.render(); + } + }; return (
-
Server URL:
+
+
Server URL:
+
+ {local.status === "online" && ( +
ONLINE
+ )} + {local.status === "offline" && ( +
OFFLINE
+ )} + {local.status === "checking" && ( +
Checking...
+ )} +
+
((arg, ref) => { } }} type="text" - className="outline-none focus:border-blue-500 flex-1" + className={cx( + "outline-none focus:border-blue-500 flex-1", + dev.enabled && "line-through opacity-30" + )} + onKeyDown={(e) => { + if (e.key === "Enter") { + e.currentTarget.blur(); + } + }} + onBlur={check} placeholder="https://..." />
- {local.api_url !== p.site.config.api_url && ( -
-
- Check -
-
- )}
+
+
{ + dev.enabled = !dev.enabled; + localStorage.setItem("prasi-dev", JSON.stringify(dev)); + local.render(); + }} + > + DEV{" "} + {dev.enabled && ON} + {!dev.enabled && OFF} +
+ + { + dev.url = e.currentTarget.value; + localStorage.setItem("prasi-dev", JSON.stringify(dev)); + local.render(); + }} + onKeyDown={(e) => { + if (e.key === "Enter") { + e.currentTarget.blur(); + } + }} + onBlur={check} + /> +
+ {local.status === "online" && ( + <> + {!local.deployable && !local.hasDB && ( +
+ This server is not deployable
+ and do not have DB +
+ )} + + )}
); }); diff --git a/app/web/src/render/ed/panel/popup/api/api-utils.ts b/app/web/src/render/ed/panel/popup/api/api-utils.ts new file mode 100644 index 00000000..1862baa5 --- /dev/null +++ b/app/web/src/render/ed/panel/popup/api/api-utils.ts @@ -0,0 +1,20 @@ +import { PG } from "../../../logic/ed-global"; + +export const dev = JSON.parse(localStorage.getItem("prasi-dev") || "{}") as { + enabled: boolean; + url: string; +}; + +export const apiUrl = function (p: PG): string { + if (dev.enabled) { + return dev.url; + } + return p.site.config.api_url; +}; + +export const checkAPI = (p: PG) => { + const url = apiUrl(p); + if (!url) return null; + + return { deployable: false, hasDB: false }; +}; diff --git a/app/web/src/render/ed/panel/popup/site/site-head.tsx b/app/web/src/render/ed/panel/popup/site/site-head.tsx index 4f53ec22..f58d581a 100644 --- a/app/web/src/render/ed/panel/popup/site/site-head.tsx +++ b/app/web/src/render/ed/panel/popup/site/site-head.tsx @@ -9,61 +9,75 @@ export const EdSiteHead = ({ reload, orglen, conf, + local, }: { orglen: number; group: NodeModel[]; update: (val: NodeModel[]) => void; reload: (id?: string) => Promise; conf: { group: any }; + local: { search: string; render: () => void }; }) => { const p = useGlobal(EDGlobal, "EDITOR"); return ( -
-
- {orglen} Organization{orglen > 1 ? "s" : ""} -
-
{ - const neworg = prompt("New Organization Name"); - if (neworg) { - const res = await db.org.create({ - data: { - name: neworg, - org_user: { - create: { id_user: p.user.id, role: "owner" }, - }, - }, - }); - - update([]); - - setTimeout(() => { - reload(res.id); - }); - } - }} - > +
+
+
+ {orglen} Organization{orglen > 1 ? "s" : ""} +
`, - }} - >
-
New
-
+ className="text-[12px] bg-white border rounded ml-2 px-2 hover:bg-blue-100 cursor-pointer flex items-center space-x-1 " + onClick={async () => { + const neworg = prompt("New Organization Name"); + if (neworg) { + const res = await db.org.create({ + data: { + name: neworg, + org_user: { + create: { id_user: p.user.id, role: "owner" }, + }, + }, + }); -
{ - conf.group = null; - reload(); - }} - > - Refresh + update([]); + + setTimeout(() => { + reload(res.id); + }); + } + }} + > +
`, + }} + >
+
New
+
+ +
{ + conf.group = null; + reload(); + }} + > + Refresh +
+ { + local.search = e.currentTarget.value; + local.render(); + }} + />
); }; diff --git a/app/web/src/render/ed/panel/popup/site/site.tsx b/app/web/src/render/ed/panel/popup/site/site.tsx index 77c621e6..c7abdec3 100644 --- a/app/web/src/render/ed/panel/popup/site/site.tsx +++ b/app/web/src/render/ed/panel/popup/site/site.tsx @@ -161,7 +161,9 @@ const SitePicker = ({ update: (val: NodeModel[]) => void; reload: (id?: string) => Promise; }) => { - const p = useGlobal(EDGlobal, "EDITOR"); + const local = useLocal({ + search: "", + }); const orglen = group.filter((e) => e.parent === "site-root").length; return (
@@ -171,6 +173,7 @@ const SitePicker = ({ reload={reload} orglen={orglen} conf={conf} + local={local} />