AkurAI Build
Menu

Public repository / 3af23b0e937520000e1aa43c7e2eb9de2675abd1

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 }),
  };
}