{ "version": 3, "sources": ["../../../utils/dynload.ts"], "sourcesContent": ["// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-3.0-or-later\nimport {\n d,\n e as getElementById,\n get,\n hideSitePane,\n PopStateHandlers,\n setLastLocation,\n} from \"@utils/utils.js\";\n\nconst contentContainer = getElementById(\"main\") as HTMLDivElement;\n\nlet urlData = {};\n\nconst lastLoaded: [] | [string] = [];\n\ninterface DynloadData {\n body: string;\n css: string;\n redirect: string;\n scripts: { type: string; src: string | null }[];\n scrollPos?: [number, number];\n short_title: string;\n stylesheets: string[];\n title: string;\n url: string;\n}\n\nfunction dynLoadOnData(\n data: DynloadData | undefined,\n onpopstate: boolean,\n) {\n if (!data) {\n console.error(\"No data received\");\n return;\n }\n if (data.redirect) {\n location.href = data.redirect;\n return;\n }\n const url = data.url;\n if (!url) {\n console.error(\"No URL in data \", data);\n return;\n }\n console.log(\"Handling data\", data);\n if (!onpopstate) {\n if (lastLoaded.length === 1 && lastLoaded[0] === url) {\n console.log(\"URL is the same as last loaded, ignoring\");\n return;\n }\n history.pushState(\n { data, url, stateType: \"dynLoad\" },\n data.title,\n url,\n );\n setLastLocation(url);\n }\n if (!data.body) {\n location.reload();\n return;\n }\n\n // d.onkeyup = () => {}; // not used in any JS file\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n d.onkeydown = () => {}; // remove keydown listeners\n\n contentContainer.innerHTML = data.body;\n if (data.css) {\n const style = d.createElement(\"style\");\n style.innerHTML = data.css;\n contentContainer.appendChild(style);\n }\n for (const scriptURL of data.stylesheets) {\n const link = d.createElement(\"link\");\n link.rel = \"stylesheet\";\n link.type = \"text/css\";\n link.href = scriptURL;\n contentContainer.appendChild(link);\n }\n for (const script of data.scripts) {\n if (script.src) {\n const scriptElement = d.createElement(\"script\");\n scriptElement.type = script.type;\n scriptElement.src = script.src;\n contentContainer.appendChild(scriptElement);\n } else {\n console.error(\"Script without src\", script);\n }\n }\n\n hideSitePane();\n\n d.title = data.title;\n const titleElement = getElementById(\"title\");\n if (titleElement) {\n titleElement.setAttribute(\n \"short_title\",\n data.short_title || data.title,\n );\n titleElement.innerText = data.title;\n }\n urlData = data;\n return true;\n}\n\nfunction dynLoad(url: string) {\n console.log(\"Loading URL\", url);\n history.replaceState( // save current scrollPos\n {\n data: urlData,\n url: location.href,\n scrollPos: [\n d.documentElement.scrollLeft || d.body.scrollLeft,\n d.documentElement.scrollTop || d.body.scrollTop,\n ],\n stateType: \"dynLoad\",\n },\n d.title,\n location.href,\n );\n return dynLoadSwitchToURL(url);\n}\n\nasync function dynLoadSwitchToURL(url: string, allowSameUrl = false) {\n if (!allowSameUrl && url === location.href) {\n console.log(\"URL is the same as current, just hide site pane\");\n hideSitePane();\n return;\n }\n contentContainer.prepend(\n \"Laden... Wenn dies zu lange (über ein paar Sekunden) dauert, lade bitte die Seite neu.\",\n );\n await get(\n url,\n \"\",\n (data: DynloadData) => dynLoadOnData(data, false),\n (error: unknown) => {\n console.log(error);\n if (url === location.href) {\n location.reload();\n } else {\n location.href = url;\n }\n },\n \"application/vnd.asozial.dynload+json\",\n );\n}\n\nasync function dynLoadOnPopState(event: PopStateEvent) {\n if (event.state) {\n const state = event.state as DynloadData;\n console.log(\"Popstate\", state);\n if (\n !((event.state as { data: string }).data &&\n dynLoadOnData(state, true))\n ) {\n // when the data did not get handled properly\n await dynLoadSwitchToURL(\n state.url || location.href,\n true,\n );\n }\n if (state.scrollPos) {\n scrollTo(\n state.scrollPos[0],\n state.scrollPos[1],\n );\n return;\n }\n }\n console.error(\"Couldn't handle state.\", event.state);\n location.reload();\n}\n\nPopStateHandlers[\"dynLoad\"] = dynLoadOnPopState;\n\nd.addEventListener(\"click\", (e: DocumentEventMap[\"click\"]) => {\n const anchor = (e.target as HTMLElement | undefined)?.closest(\"a\") as\n | HTMLAnchorElement\n | undefined;\n console.debug({ msg: \"clicked on: \", target: e.target, anchor });\n\n if (\n // anchor not found\n !anchor ||\n // not supposed to be opened inline\n anchor.target === \"_blank\" ||\n // link should not be dynloaded\n anchor.hasAttribute(\"no-dynload\")\n ) {\n console.debug(\"Ignoring click.\");\n return;\n }\n\n const anchor_url = (anchor.href.startsWith(\"/\") ? location.origin : \"\") +\n anchor.href;\n\n if (\n // URL to the same page, but with hash\n anchor_url.startsWith(\"#\") ||\n anchor_url.startsWith(`${location.href.split(\"#\")[0]}#`) ||\n // link is to different domain\n !anchor_url.startsWith(location.origin)\n ) {\n console.log({ msg: \"cannot handle click\", anchor, anchor_url });\n return;\n }\n\n e.preventDefault();\n\n void dynLoad(anchor_url).then(() => {\n console.log(\"blurring\", anchor);\n anchor.blur();\n });\n});\n"], "mappings": "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", "names": ["d", "getElementById", "get", "hideSitePane", "PopStateHandlers", "setLastLocation", "contentContainer", "urlData", "lastLoaded", "dynLoadOnData", "data", "onpopstate", "url", "style", "scriptURL", "link", "script", "scriptElement", "titleElement", "dynLoad", "dynLoadSwitchToURL", "allowSameUrl", "error", "dynLoadOnPopState", "event", "state", "e", "_a", "anchor", "anchor_url"] }