98 lines
2.4 KiB
TypeScript
98 lines
2.4 KiB
TypeScript
import { css, extractCss } from "goober";
|
|
import { waitUntil } from "web-utils";
|
|
|
|
export const defineWindow = async (awaitServerUrl = true) => {
|
|
let w = typeof window === "object" ? window : (globalThis as any);
|
|
|
|
if (awaitServerUrl) await waitUntil(() => w.__SRV_URL__);
|
|
|
|
w.prasiContext = {
|
|
global: {},
|
|
render() {},
|
|
};
|
|
|
|
const location = window["location"];
|
|
|
|
const host =
|
|
0 === location.protocol.indexOf("http") ? location.hostname : "localhost",
|
|
scheme =
|
|
"https:" != location.protocol || /localhost|127.0.0.1|0.0.0.0/.test(host)
|
|
? "http"
|
|
: "https";
|
|
|
|
if (w.__SRV_URL__) {
|
|
w.serverurl = w.__SRV_URL__;
|
|
const serverURL = new URL(w.serverurl);
|
|
if (
|
|
serverURL.hostname === "localhost" ||
|
|
serverURL.hostname === "127.0.0.1"
|
|
) {
|
|
serverURL.hostname = location.hostname;
|
|
serverURL.pathname = serverURL.pathname === "/" ? "" : serverURL.pathname;
|
|
w.serverurl = serverURL.toString();
|
|
if (w.serverurl.endsWith("/")) {
|
|
w.serverurl = w.serverurl.substring(0, w.serverurl.length - 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
const port = location.port;
|
|
w.baseurl = scheme + "://" + host + (port ? ":" + port : "") + "/";
|
|
w.basepath = "/";
|
|
w.css = css;
|
|
w.extractCss = extractCss;
|
|
w.pathname = location.pathname;
|
|
|
|
w.cx = (...classNames: any[]) => {
|
|
const result: string[] = [];
|
|
|
|
classNames
|
|
.filter((e) => {
|
|
if (e) {
|
|
if (typeof e === "string" && e.trim()) return true;
|
|
else return true;
|
|
}
|
|
return false;
|
|
})
|
|
.forEach((e) => {
|
|
if (Array.isArray(e)) {
|
|
for (const f of e) {
|
|
if (typeof f === "string" && f.trim()) {
|
|
result.push(f.trim());
|
|
}
|
|
}
|
|
} else result.push(e.trim());
|
|
});
|
|
return result.join(" ");
|
|
};
|
|
|
|
w.navigate = (href: string) => {
|
|
let _href = href;
|
|
|
|
if (typeof w.navigateOverride === "function") {
|
|
_href = w.navigateOverride(href);
|
|
if (!_href) return null;
|
|
}
|
|
|
|
history.pushState({}, "", _href);
|
|
w.pathname = href;
|
|
|
|
if (w.prasiContext && w.prasiContext.render) {
|
|
w.prasiContext.render();
|
|
}
|
|
};
|
|
|
|
if (typeof window === "object") {
|
|
window.addEventListener("popstate", () => {
|
|
if (w.preventPopRender) {
|
|
w.preventPopRender = false;
|
|
return;
|
|
}
|
|
if (w.rootRender) {
|
|
w.pathname = location.pathname;
|
|
w.rootRender();
|
|
}
|
|
});
|
|
}
|
|
};
|