import { get, writable } from "svelte/store" import { baseURL } from "../config" /*********** location **************************/ const initLoc = { path: (typeof window !== "undefined" && window.location?.pathname) || "/", url: `${baseURL}${(typeof window !== "undefined" && window.location?.pathname) || "/"}`, search: (typeof window !== "undefined" && window.location?.search) || "", hash: (typeof window !== "undefined" && window.location?.hash) || "", push: false, pop: false, } export const location = writable(initLoc) const publishLocation = (_p?: string) => { let _s: string let _h: string if (_p) { const parts = _p.split("#") _p = parts.shift() _h = parts.join() if (_h) _h = "#" + _h const parts2 = _p.split("?") _p = parts2.shift() _s = parts2.join() if (_s) _s = "?" + _s } const newLocation: LocationStore = { path: _p || (typeof window !== "undefined" && window.location?.pathname), search: _p ? _s : typeof window !== "undefined" && window.location?.search, hash: _p ? _h : typeof window !== "undefined" && window.location?.hash, push: !!_p, pop: !_p, previousLocation: get(location), url: "", } newLocation.url = `${baseURL}${newLocation.path}${newLocation.search ? "?" + newLocation.search : ""}` location.set(newLocation) } if (typeof history !== "undefined") { if (typeof Proxy !== "undefined") { // modern browser const historyApply = ( target: (this: any, ...args: readonly any[]) => unknown, thisArg: any, argumentsList: string | readonly any[] ) => { publishLocation(argumentsList && argumentsList.length >= 2 && argumentsList[2]) Reflect.apply(target, thisArg, argumentsList) } history.pushState = new Proxy(history.pushState, { apply: historyApply, }) history.replaceState = new Proxy(history.replaceState, { apply: historyApply, }) } else { // ie11 const pushStateFn = history.pushState const replaceStateFn = history.replaceState history.pushState = function (data: any, title: string, url?: string) { publishLocation(url) // @ts-ignore return pushStateFn.apply(history, arguments) } history.replaceState = function (data: any, title: string, url?: string) { publishLocation(url) // @ts-ignore return replaceStateFn.apply(history, arguments) } } } // else ssr -> no history handling typeof window !== "undefined" && window.addEventListener("popstate", (event) => { publishLocation() }) /********************** override for admin ui *****************/ export const apiBaseOverride = writable(null) /********************** navigation cache **********************/ export const navigationCache = writable<{ [path: string]: NavigationElement }>({}) ///// Notifications export const notifications = writable([]) export function newNotification(n: NotificationEntry): NotificationEntry { notifications.update((_n) => { _n.push(n) let timeout = n.timeout if (!timeout) { if (n.class === "error") timeout = 6000 else timeout = 3500 } if (timeout > 0) { setTimeout(() => { removeNotification(n) }, timeout) } return _n }) return n } export function removeNotification(n: NotificationEntry) { notifications.update((_n) => { return _n.filter((v) => { return v !== n }) }) } location.subscribe((l) => { notifications.update((_n) => { return _n.filter((v) => { return !v.removeOnNewLocation }) }) }) export const openModal = writable(false) export const isMobile = writable(false) export const actionApproval = writable(null)