81 lines
1.6 KiB
JavaScript
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,
|
|
};
|
|
})();
|