Spaces:
Running
Running
| // One-time guidance memory: which partner nudges and per-case brief overlays this | |
| // browser has already seen. Falls back to an in-memory set in private mode, so | |
| // everything still fires exactly once per session there. | |
| const KEY = 'cz-tips' | |
| const CAP = 100 | |
| const mem = new Set<string>() | |
| function stored(): string[] { | |
| try { | |
| const raw = localStorage.getItem(KEY) | |
| if (!raw) return [] | |
| const data = JSON.parse(raw) as { v: 1; seen: string[] } | |
| if (data?.v !== 1 || !Array.isArray(data.seen)) return [] | |
| return data.seen.filter((x) => typeof x === 'string') | |
| } catch { | |
| return [] | |
| } | |
| } | |
| export function hasSeen(key: string): boolean { | |
| return mem.has(key) || stored().includes(key) | |
| } | |
| export function markSeen(key: string): void { | |
| mem.add(key) | |
| try { | |
| const seen = stored().filter((x) => x !== key) | |
| seen.push(key) | |
| localStorage.setItem(KEY, JSON.stringify({ v: 1, seen: seen.slice(-CAP) })) | |
| } catch { | |
| /* private mode — the in-memory set covers this session */ | |
| } | |
| } | |