FPSMS-frontend
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 

62 rindas
2.0 KiB

  1. "use client";
  2. import { useSession } from "next-auth/react";
  3. import { useEffect, useState } from "react";
  4. import type { SessionWithTokens } from "@/config/authConfig";
  5. import {
  6. type ChartBoardId,
  7. CHART_BOARD_DEFAULT_REFRESH_INTERVAL_SEC,
  8. loadChartBoardRefreshPrefs,
  9. saveChartBoardRefreshPrefs,
  10. } from "./chartBoardRefreshPrefs";
  11. /** Session id may be string or number from JWT / callbacks — never assume .trim exists. */
  12. function normalizeKeyPart(v: unknown): string | undefined {
  13. if (v == null) return undefined;
  14. const s = typeof v === "string" ? v : String(v);
  15. const t = s.trim();
  16. return t.length > 0 ? t : undefined;
  17. }
  18. function resolveUserKey(session: SessionWithTokens | null): string | undefined {
  19. const id = normalizeKeyPart(session?.id);
  20. if (id) return `id:${id}`;
  21. const email = normalizeKeyPart(session?.user?.email);
  22. if (email) return `email:${email.toLowerCase()}`;
  23. return undefined;
  24. }
  25. export function useChartBoardRefreshPrefs(boardId: ChartBoardId) {
  26. const { data: session } = useSession() as { data: SessionWithTokens | null };
  27. const userKeyPart = resolveUserKey(session);
  28. const [autoRefreshOn, setAutoRefreshOn] = useState(false);
  29. const [refreshIntervalSec, setRefreshIntervalSec] = useState(CHART_BOARD_DEFAULT_REFRESH_INTERVAL_SEC);
  30. const [hydrated, setHydrated] = useState(false);
  31. useEffect(() => {
  32. const prefs = loadChartBoardRefreshPrefs(boardId, userKeyPart);
  33. setAutoRefreshOn(prefs.autoRefreshOn);
  34. setRefreshIntervalSec(prefs.refreshIntervalSec);
  35. setHydrated(true);
  36. }, [boardId, userKeyPart]);
  37. useEffect(() => {
  38. if (!hydrated) return;
  39. saveChartBoardRefreshPrefs(boardId, userKeyPart, {
  40. autoRefreshOn,
  41. refreshIntervalSec,
  42. });
  43. }, [hydrated, boardId, userKeyPart, autoRefreshOn, refreshIntervalSec]);
  44. return {
  45. autoRefreshOn,
  46. setAutoRefreshOn,
  47. refreshIntervalSec,
  48. setRefreshIntervalSec,
  49. /** Logged-in user key for storage; undefined if not available */
  50. userKeyPart,
  51. hydrated,
  52. };
  53. }