// localStorage layer for the /jobs screen's client-side filter bar. Strict // parser — any malformed/wrong-version value resets to defaults, mirroring // common/components/exportFilterStorage.ts. The defaults hide the noisy // refresh-report kind, so the table reads as the work you actually triggered. const KEY = "ytdlp-tb:jobs-filters"; const VERSION = 1; // Kinds hidden out of the box. refresh-report is the debounced report-regen job // that fires after almost every action, so it dominates the list otherwise. export const DEFAULT_HIDDEN_KINDS = ["refresh-report"]; export type JobsFilterState = { v: 1; hiddenKinds: string[]; hiddenStatuses: string[]; search: string; }; export function defaultJobsFilters(): JobsFilterState { return { v: VERSION, hiddenKinds: [...DEFAULT_HIDDEN_KINDS], hiddenStatuses: [], search: "", }; } function isStringArray(v: unknown): v is string[] { return Array.isArray(v) && v.every((x) => typeof x === "string"); } function parseStored(raw: string): JobsFilterState | null { let parsed: unknown; try { parsed = JSON.parse(raw); } catch { return null; } if (!parsed || typeof parsed !== "object") return null; const r = parsed as Record; if (r.v !== VERSION) return null; if (!isStringArray(r.hiddenKinds)) return null; if (!isStringArray(r.hiddenStatuses)) return null; if (typeof r.search !== "string") return null; return { v: VERSION, hiddenKinds: r.hiddenKinds.slice(), hiddenStatuses: r.hiddenStatuses.slice(), search: r.search, }; } export function loadJobsFilters(): JobsFilterState { if (typeof window === "undefined") return defaultJobsFilters(); let raw: string | null = null; try { raw = window.localStorage.getItem(KEY); } catch { return defaultJobsFilters(); } if (raw === null) return defaultJobsFilters(); const parsed = parseStored(raw); if (!parsed) { // Reset on malformed payloads per spec. try { window.localStorage.removeItem(KEY); } catch { /* ignore */ } return defaultJobsFilters(); } return parsed; } export function saveJobsFilters(state: JobsFilterState): void { if (typeof window === "undefined") return; try { window.localStorage.setItem(KEY, JSON.stringify(state)); } catch { /* quota/serialization errors are non-fatal */ } } export function clearJobsFilters(): void { if (typeof window === "undefined") return; try { window.localStorage.removeItem(KEY); } catch { /* ignore */ } }