File size: 1,010 Bytes
16ff49b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
// 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 */
  }
}