/** * @file splitViewStorage.ts * @description Persists the Workspace page's split-terminal layout (1/2/4 * panes) and each pane's chosen lane id to localStorage, so the layout * survives a page reload. Follows the same read/write-with-fallback * convention as useTheme.ts. * @author Nguyễn Ngọc Trí Vĩ */ export type SplitLayout = 1 | 2 | 4; export interface SplitViewState { layout: SplitLayout; paneLaneIds: (number | null)[]; } const STORAGE_KEY = "ccam.workspace.splitView"; export function defaultSplitViewState(): SplitViewState { return { layout: 1, paneLaneIds: [null] }; } function isValidLayout(value: unknown): value is SplitLayout { return value === 1 || value === 2 || value === 4; } function isValidState(value: unknown): value is SplitViewState { if (!value || typeof value !== "object") return false; const v = value as Record; return ( isValidLayout(v.layout) && Array.isArray(v.paneLaneIds) && v.paneLaneIds.every((id) => id === null || typeof id === "number") ); } export function readSplitViewState(): SplitViewState { try { const raw = localStorage.getItem(STORAGE_KEY); if (!raw) return defaultSplitViewState(); const parsed: unknown = JSON.parse(raw); return isValidState(parsed) ? parsed : defaultSplitViewState(); } catch { return defaultSplitViewState(); } } export function writeSplitViewState(state: SplitViewState): void { try { localStorage.setItem(STORAGE_KEY, JSON.stringify(state)); } catch { /* ignore quota / disabled storage */ } }