187 lines
4.8 KiB
TypeScript
187 lines
4.8 KiB
TypeScript
import get from "lodash.get";
|
|
import { apiProxy } from "../../../base/load/api/api-proxy";
|
|
import { dbProxy } from "../../../base/load/db/db-proxy";
|
|
import { jscript } from "../../../utils/script/jscript";
|
|
import { devLoader } from "../../live/dev-loader";
|
|
import { LSite } from "../../live/logic/global";
|
|
import { validateLayout } from "../../live/logic/layout";
|
|
import importModule from "../tools/dynamic-import";
|
|
import { EditorGlobal, PG } from "./global";
|
|
|
|
export const w = window as unknown as {
|
|
basepath: string;
|
|
navigateOverride: (s: string) => string;
|
|
isEditor: boolean;
|
|
isMobile: boolean;
|
|
isLayout: boolean;
|
|
isDesktop: boolean;
|
|
apiHeaders: any;
|
|
exports: any;
|
|
apiurl: string;
|
|
preload: (path: string) => void;
|
|
|
|
externalAPI: {
|
|
mode: "dev" | "prod";
|
|
devUrl: string;
|
|
prodUrl: string;
|
|
};
|
|
blankGlobal: typeof EditorGlobal;
|
|
};
|
|
|
|
export const initEditor = async (p: PG, site_id: string) => {
|
|
w.isEditor = true;
|
|
if (typeof w.isLayout === "undefined") {
|
|
w.isLayout = false;
|
|
}
|
|
w.isMobile = p.mode === "mobile";
|
|
w.isDesktop = p.mode === "desktop";
|
|
w.apiHeaders = {};
|
|
w.preload = () => {};
|
|
|
|
w.navigateOverride = (_href) => {
|
|
if (_href.startsWith("/ed")) return _href;
|
|
return "";
|
|
};
|
|
|
|
if (!jscript.pending) {
|
|
jscript.init(p.render);
|
|
}
|
|
|
|
if (!p.item) {
|
|
location.reload();
|
|
return;
|
|
}
|
|
|
|
p.item.active = localStorage.getItem("prasi-item-active-id") || "";
|
|
p.item.activeOriginalId = localStorage.getItem("prasi-item-active-oid") || "";
|
|
const comp: any = {
|
|
id: localStorage.getItem("prasi-comp-active-id"),
|
|
instance_id: localStorage.getItem("prasi-comp-instance-id"),
|
|
last: localStorage.getItem("prasi-comp-active-last"),
|
|
props: localStorage.getItem("prasi-comp-active-props"),
|
|
};
|
|
if (comp.last) {
|
|
comp.last = JSON.parse(comp.last);
|
|
}
|
|
if (comp.props) {
|
|
comp.props = JSON.parse(comp.props);
|
|
}
|
|
if (comp.id) {
|
|
p.comp = comp;
|
|
}
|
|
|
|
let site = null as any;
|
|
try {
|
|
site = JSON.parse(localStorage.getItem(`prasi-site-${site_id}`) || "");
|
|
} catch (e) {}
|
|
|
|
const querySite = async () => {
|
|
const site = await devLoader.site(p as any, {
|
|
type: "siteid",
|
|
id: site_id,
|
|
});
|
|
|
|
localStorage.setItem(`prasi-site-${site_id}`, JSON.stringify(site));
|
|
return site;
|
|
};
|
|
|
|
const processSite = async (site: LSite) => {
|
|
if (!site || (site && !site.id)) return;
|
|
if (!w.exports) {
|
|
w.exports = {};
|
|
}
|
|
if (site.cgroup_ids) {
|
|
for (const id of site.cgroup_ids) {
|
|
await importModule(`${serverurl}/npm/site/${id}/site.js`);
|
|
}
|
|
}
|
|
|
|
await importModule(`${serverurl}/npm/site/${site.id}/site.js`);
|
|
p.lsite = site;
|
|
p.site.id = site.id;
|
|
p.site.js = site.js || "";
|
|
p.site.js_compiled = site.js_compiled || "";
|
|
p.site.name = site.name;
|
|
p.site.domain = site.domain;
|
|
p.site.responsive = site.responsive as any;
|
|
p.site.layout = site.layout;
|
|
p.site.layout_id = site.layout_id;
|
|
|
|
await validateLayout(p);
|
|
|
|
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 = site.config.api_url;
|
|
|
|
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;
|
|
}
|
|
|
|
w.apiurl = p.site.api_url;
|
|
api.site_dts(p.site.id).then((e: any) => {
|
|
p.site_dts = e || "";
|
|
p.render();
|
|
});
|
|
const configLocal: any = get(site, "config.prasi");
|
|
if (configLocal) {
|
|
p.site.api_prasi.db = configLocal.dburl ? configLocal.dburl : "";
|
|
p.site.api_prasi.port = configLocal.port ? configLocal.port : "";
|
|
}
|
|
execSiteJS(p);
|
|
};
|
|
|
|
if (!site || (site && !site.id)) {
|
|
const site = await querySite();
|
|
if (site) {
|
|
await processSite(site);
|
|
}
|
|
} else {
|
|
await processSite(site);
|
|
querySite();
|
|
}
|
|
|
|
p.status = "ready";
|
|
p.render();
|
|
};
|
|
|
|
export const execSiteJS = (p: PG) => {
|
|
if (p && p.site.api_url) {
|
|
p.script.siteTypes = {};
|
|
const scope: any = {
|
|
types: p.script.siteTypes,
|
|
exports: window.exports,
|
|
load: importModule,
|
|
render: p.render,
|
|
module: {
|
|
exports: {} as any,
|
|
},
|
|
};
|
|
|
|
const fn = p.site.js_compiled;
|
|
scope["api"] = apiProxy(p.site.api_url);
|
|
scope["db"] = dbProxy(p.site.api_url);
|
|
const f = new Function(...Object.keys(scope), fn);
|
|
try {
|
|
const res = f(...Object.values(scope));
|
|
|
|
for (const [k, v] of Object.entries(scope.module.exports)) {
|
|
w.exports[k] = v;
|
|
}
|
|
|
|
return res;
|
|
} catch (e) {
|
|
console.warn(e);
|
|
}
|
|
}
|
|
return null;
|
|
};
|