2026-01-16 22:53:04 +01:00

81 lines
1.6 KiB
JavaScript

// public/assets/prefs.js
/* English comments: user preference storage and sync */
(function () {
const DEFAULT_PREFS = {
language: 'en',
theme: 'dark',
table_mode: 'pagination',
table_page_size: 50,
tables: {},
};
let prefs = { ...DEFAULT_PREFS };
let loaded = false;
let saveTimer = null;
function mergePrefs(next) {
if (!next || typeof next !== 'object') return;
prefs = {
...prefs,
...next,
tables: { ...(prefs.tables || {}), ...(next.tables || {}) },
};
}
async function load() {
if (loaded) return prefs;
const res = await window.Api.request('/api/account', { method: 'GET' });
const data = res?.data || res || {};
mergePrefs(data.ui || {});
loaded = true;
return prefs;
}
function get() {
return prefs;
}
function getTable(id) {
if (!id) return {};
return (prefs.tables && prefs.tables[id]) ? prefs.tables[id] : {};
}
function scheduleSave() {
if (!loaded) return;
if (saveTimer) clearTimeout(saveTimer);
saveTimer = setTimeout(() => {
saveTimer = null;
save().catch(() => {});
}, 500);
}
async function save() {
if (!loaded) return;
await window.Api.request('/api/account', {
method: 'POST',
body: { ui: prefs },
});
}
function setTable(id, data) {
if (!id) return;
prefs.tables = { ...(prefs.tables || {}), [id]: { ...(prefs.tables?.[id] || {}), ...data } };
scheduleSave();
}
function setUi(key, value) {
if (!key) return;
prefs[key] = value;
scheduleSave();
}
window.UserPrefs = {
load,
get,
getTable,
setTable,
setUi,
};
})();