"use client"; import { useSession } from "next-auth/react"; import { useEffect, useState } from "react"; import type { SessionWithTokens } from "@/config/authConfig"; import { type ChartBoardId, CHART_BOARD_DEFAULT_REFRESH_INTERVAL_SEC, loadChartBoardRefreshPrefs, saveChartBoardRefreshPrefs, } from "./chartBoardRefreshPrefs"; /** Session id may be string or number from JWT / callbacks — never assume .trim exists. */ function normalizeKeyPart(v: unknown): string | undefined { if (v == null) return undefined; const s = typeof v === "string" ? v : String(v); const t = s.trim(); return t.length > 0 ? t : undefined; } function resolveUserKey(session: SessionWithTokens | null): string | undefined { const id = normalizeKeyPart(session?.id); if (id) return `id:${id}`; const email = normalizeKeyPart(session?.user?.email); if (email) return `email:${email.toLowerCase()}`; return undefined; } export function useChartBoardRefreshPrefs(boardId: ChartBoardId) { const { data: session } = useSession() as { data: SessionWithTokens | null }; const userKeyPart = resolveUserKey(session); const [autoRefreshOn, setAutoRefreshOn] = useState(false); const [refreshIntervalSec, setRefreshIntervalSec] = useState(CHART_BOARD_DEFAULT_REFRESH_INTERVAL_SEC); const [hydrated, setHydrated] = useState(false); useEffect(() => { const prefs = loadChartBoardRefreshPrefs(boardId, userKeyPart); setAutoRefreshOn(prefs.autoRefreshOn); setRefreshIntervalSec(prefs.refreshIntervalSec); setHydrated(true); }, [boardId, userKeyPart]); useEffect(() => { if (!hydrated) return; saveChartBoardRefreshPrefs(boardId, userKeyPart, { autoRefreshOn, refreshIntervalSec, }); }, [hydrated, boardId, userKeyPart, autoRefreshOn, refreshIntervalSec]); return { autoRefreshOn, setAutoRefreshOn, refreshIntervalSec, setRefreshIntervalSec, /** Logged-in user key for storage; undefined if not available */ userKeyPart, hydrated, }; }