Menu
Public repository / 4f0b1d374fab4075f2b552b5f250bca5f28afee9
AkurAI-Mail / src/framework/folder-expand.js
Latest change 10d19fe0941c186ec244d1f0e2af6b19200dcb0c - OLI-248: pure webmail logic as plain ES modules with JSDoc types; inline icon module by Ólafur Búi Ólafsson
// Per-folder collapse state for the folder tree, remembered in a Storage-like object (plain ESM, no build step).
export const EXPANDED_KEY = "akurai-mail-folder-expanded";
/** @typedef {{ getItem(key: string): string | null, setItem(key: string, value: string): void }} StorageLike */
/**
* @param {StorageLike} [storage]
* @returns {Record<string, boolean>}
*/
function load(storage) {
try {
return JSON.parse(storage?.getItem(EXPANDED_KEY) ?? "{}");
} catch {
return {};
}
}
/**
* Per-folder collapse state persisted to the given Storage-like object.
* @param {StorageLike} [storage]
*/
export function createFolderExpand(storage) {
const expanded = load(storage);
return {
/** @param {string} path */
isOpen: (path) => expanded[path] ?? true,
/** @param {string} path */
toggle(path) {
expanded[path] = !(expanded[path] ?? true);
storage?.setItem(EXPANDED_KEY, JSON.stringify(expanded));
},
state: () => ({ ...expanded }),
};
}