Files
rustpad/static/js/url-state.js
T
2026-08-03 01:34:13 +02:00

71 lines
2.4 KiB
JavaScript

/*
* Copyright (C) 2026 Mateusz Gruszczyński @linuxiarz.pl
* Source-Available Code / Dual-Licensed.
*
* Free for non-commercial and evaluation use under terms of BSL/GPLv3.
* Commercial or production use requires a valid paid license.
* See LICENSE file in repository root for details.
*/
const VIEWS = new Set(["edit", "split", "preview"]);
const MODES = new Set(["markdown", "text"]);
const APP_URL_BASE = globalThis.location?.origin || "https://rustpad.invalid";
function appUrl(path) {
try {
const url = new URL(path, APP_URL_BASE);
return url.origin === APP_URL_BASE ? url : null;
} catch {
return null;
}
}
function relativeUrl(url) {
return `${url.pathname}${url.search}${url.hash}`;
}
export function withShareToken(path, shareToken) {
const url = appUrl(path);
if (!url) return "/";
const token = typeof shareToken === "string" ? shareToken.trim() : "";
if (token) url.searchParams.set("share", token);
else url.searchParams.delete("share");
return relativeUrl(url);
}
export function editorResourceUrl(path, { shareToken = "", view = "split", mode = "markdown" } = {}) {
const url = appUrl(path);
if (!url) return "/";
if (VIEWS.has(view)) url.searchParams.set("view", view);
if (MODES.has(mode)) url.searchParams.set("mode", mode);
const token = typeof shareToken === "string" ? shareToken.trim() : "";
if (token) url.searchParams.set("share", token);
else url.searchParams.delete("share");
return relativeUrl(url);
}
export function readEditorState() {
const params = new URLSearchParams(window.location.search);
return {
view: VIEWS.has(params.get("view")) ? params.get("view") : "split",
mode: MODES.has(params.get("mode")) ? params.get("mode") : "markdown",
};
}
export function writeEditorState(state, { replace = false } = {}) {
const url = new URL(window.location.href);
url.searchParams.set("view", state.view);
url.searchParams.set("mode", state.mode);
const method = replace ? "replaceState" : "pushState";
window.history[method]({ ...state }, "", `${url.pathname}${url.search}${url.hash}`);
window.dispatchEvent(new CustomEvent("rustpad:urlchange", { detail: { url: url.href } }));
return url.href;
}
export function currentShareUrl(state) {
const url = new URL(window.location.href);
url.searchParams.set("view", state.view);
url.searchParams.set("mode", state.mode);
return url.href;
}