124 lines
2.9 KiB
JavaScript
124 lines
2.9 KiB
JavaScript
// static/js/storage.js
|
|
// Centralized localStorage access with key constants and JSON parse safety
|
|
|
|
// ── Key constants ──
|
|
export const KEYS = {
|
|
THEME: 'odysseus-theme',
|
|
TOGGLES: 'odysseus-toggles',
|
|
SIDEBAR_COLLAPSED: 'sidebar-collapsed',
|
|
SIDEBAR_WIDTH: 'sidebar-width',
|
|
SIDEBAR_SIDE: 'sidebar-side',
|
|
CURRENT_SESSION: 'currentSessionId',
|
|
COMPARE_SAVE: 'compare-save-results',
|
|
COMPARE_CHAT: 'compare-continue-chat',
|
|
COMPARE_BLIND: 'compare-blind',
|
|
COMPARE_RANDOM: 'compare-randomize',
|
|
MODELS_EXPANDED: 'odysseus-model-expanded',
|
|
MODEL_ENDPOINTS: 'odysseus-model-endpoints',
|
|
MODEL_SELECTED: 'odysseus-selected-model',
|
|
SORT_ORDER: 'odysseus-sessions-sort',
|
|
CHAT_SEARCH_SCOPE: 'odysseus-search-scope',
|
|
INCOGNITO: 'odysseus-incognito',
|
|
RAG_ACTIVE: 'odysseus-rag-active',
|
|
MCP_ACTIVE: 'odysseus-mcp-active',
|
|
SECTION_ORDER: 'sidebar-section-order',
|
|
ADMIN_LAST_TAB: 'admin-last-tab',
|
|
DENSITY: 'odysseus-density'
|
|
};
|
|
|
|
/**
|
|
* Safely get and parse a JSON value from localStorage.
|
|
* Returns fallback on any error.
|
|
*/
|
|
export function getJSON(key, fallback) {
|
|
try {
|
|
const raw = localStorage.getItem(key);
|
|
if (raw === null) return fallback !== undefined ? fallback : null;
|
|
return JSON.parse(raw);
|
|
} catch (e) {
|
|
console.warn('[Storage] Failed to parse key "' + key + '":', e.message);
|
|
return fallback !== undefined ? fallback : null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Set a JSON-serialized value in localStorage.
|
|
*/
|
|
export function setJSON(key, value) {
|
|
try {
|
|
localStorage.setItem(key, JSON.stringify(value));
|
|
} catch (e) {
|
|
console.warn('[Storage] Failed to set key "' + key + '":', e.message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Get a raw string value from localStorage.
|
|
*/
|
|
export function get(key, fallback) {
|
|
try {
|
|
const val = localStorage.getItem(key);
|
|
return val !== null ? val : (fallback !== undefined ? fallback : null);
|
|
} catch (e) {
|
|
return fallback !== undefined ? fallback : null;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Set a raw string value in localStorage.
|
|
*/
|
|
export function set(key, value) {
|
|
try {
|
|
localStorage.setItem(key, value);
|
|
} catch (e) {
|
|
console.warn('[Storage] Failed to set key "' + key + '":', e.message);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Remove a key from localStorage.
|
|
*/
|
|
export function remove(key) {
|
|
try {
|
|
localStorage.removeItem(key);
|
|
} catch (e) {
|
|
// Ignore removal errors
|
|
}
|
|
}
|
|
|
|
// ── Toggle state helpers ──
|
|
|
|
export function loadToggleState() {
|
|
return getJSON(KEYS.TOGGLES, {});
|
|
}
|
|
|
|
export function saveToggleState(state) {
|
|
setJSON(KEYS.TOGGLES, state);
|
|
}
|
|
|
|
export function getToggle(name, fallback) {
|
|
const state = loadToggleState();
|
|
return state[name] !== undefined ? state[name] : (fallback !== undefined ? fallback : false);
|
|
}
|
|
|
|
export function setToggle(name, value) {
|
|
const state = loadToggleState();
|
|
state[name] = value;
|
|
saveToggleState(state);
|
|
}
|
|
|
|
const Storage = {
|
|
KEYS,
|
|
getJSON,
|
|
setJSON,
|
|
get,
|
|
set,
|
|
remove,
|
|
loadToggleState,
|
|
saveToggleState,
|
|
getToggle,
|
|
setToggle
|
|
};
|
|
|
|
export default Storage;
|