import { u } from "./base.js";
const ENDPOINT = u("api/settings/preferences");
export const DEFAULTS = Object.freeze({
renderer: "xterm",
theme: "tomorrow-night-soft",
default_view: "xterm",
osc133_hint_dismissed: false,
listen_voice: "",
listen_rate: 1.0,
listen_pitch: 1.0,
selected_node: "",
});
let state = { ...DEFAULTS };
export function get(key) {
return key in state ? state[key] : DEFAULTS[key];
}
export function snapshot() {
return { ...state };
}
export async function hydrate() {
try {
const resp = await fetch(ENDPOINT, {
headers: { Accept: "application/json" },
});
if (resp.ok) {
const server = await resp.json();
state = { ...DEFAULTS, ...server };
}
} catch (_) {
}
return state;
}
let writeQueue = Promise.resolve();
async function persist(key, value) {
let base = state;
try {
const resp = await fetch(ENDPOINT, {
headers: { Accept: "application/json" },
});
if (resp.ok) {
base = { ...DEFAULTS, ...(await resp.json()) };
}
} catch (_) {
}
const merged = { ...base, [key]: value };
state = merged;
try {
await fetch(ENDPOINT, {
method: "PUT",
headers: { "Content-Type": "application/json" },
body: JSON.stringify(merged),
});
} catch (_) {
}
}
export function set(key, value) {
state = { ...state, [key]: value };
try {
window.dispatchEvent(
new CustomEvent("mobux:prefschange", { detail: { key, value } }),
);
} catch (_) {}
writeQueue = writeQueue.then(() => persist(key, value));
return writeQueue;
}
if (typeof window !== "undefined") {
window.__mobuxPrefs = { get, set, snapshot, hydrate, DEFAULTS };
}