/** * @file innerReposPref — whether the Changes panel lists the git repositories * INSIDE a workspace folder (a parent folder of several repos, one section * each via `GET /api/lanes/:id/repos`) or only the folder's own git. Off by * default ("own"): the panel neither walks the folder nor shows them until * the account turns it on in Settings → Git → Changes panel. One account * preference, `agenthub.changes.innerRepos` (`lib/userPrefs.ts`, * `server/routes/me.js`), read through `useSyncExternalStore` and re-read * when the account's preferences load (`PREFS_EVENT`) or another tab writes. * @author Nguyễn Ngọc Trí Vĩ */ import { useSyncExternalStore } from "react"; import { PREFS_EVENT } from "./workspaceGroups"; export const INNER_REPOS_KEY = "agenthub.changes.innerRepos"; export type InnerReposMode = "all" | "own"; const listeners = new Set<() => void>(); export function readInnerReposMode(): InnerReposMode { try { return localStorage.getItem(INNER_REPOS_KEY) === "all" ? "all" : "own"; } catch { return "own"; } } export function writeInnerReposMode(mode: InnerReposMode): void { try { // The default is stored as no value, so an account that never chose keeps following it. if (mode === "all") localStorage.setItem(INNER_REPOS_KEY, "all"); else localStorage.removeItem(INNER_REPOS_KEY); } catch { /* disabled storage: nothing to remember */ } listeners.forEach((l) => l()); } function subscribe(l: () => void) { listeners.add(l); const onStorage = (e: StorageEvent) => { if (e.key === INNER_REPOS_KEY || e.key === null) l(); }; window.addEventListener("storage", onStorage); window.addEventListener(PREFS_EVENT, l); return () => { listeners.delete(l); window.removeEventListener("storage", onStorage); window.removeEventListener(PREFS_EVENT, l); }; } export function useInnerReposMode(): InnerReposMode { return useSyncExternalStore(subscribe, readInnerReposMode); }