FPSMS-frontend
Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.
 
 

89 linhas
2.6 KiB

  1. export type ChartBoardId = "joborder" | "process" | "equipment";
  2. export interface ChartBoardRefreshPrefs {
  3. autoRefreshOn: boolean;
  4. refreshIntervalSec: number;
  5. }
  6. export const CHART_BOARD_REFRESH_INTERVAL_SEC_OPTIONS = [30, 45, 60, 90, 120, 300] as const;
  7. export const CHART_BOARD_DEFAULT_REFRESH_INTERVAL_SEC = 45;
  8. const ALLOWED_INTERVALS = new Set<number>(CHART_BOARD_REFRESH_INTERVAL_SEC_OPTIONS);
  9. function storageKeySession(boardId: ChartBoardId): string {
  10. return `fpsms:chartBoardRefresh:${boardId}`;
  11. }
  12. function storageKeyUser(boardId: ChartBoardId, userKey: string): string {
  13. return `fpsms:chartBoardRefresh:${boardId}:user:${userKey}`;
  14. }
  15. export function sanitizeChartBoardRefreshInterval(sec: number): number {
  16. const n = Number(sec);
  17. if (ALLOWED_INTERVALS.has(n)) return n;
  18. return CHART_BOARD_DEFAULT_REFRESH_INTERVAL_SEC;
  19. }
  20. function parsePrefs(raw: string | null): ChartBoardRefreshPrefs | null {
  21. if (!raw) return null;
  22. try {
  23. const p = JSON.parse(raw) as Partial<ChartBoardRefreshPrefs>;
  24. return {
  25. autoRefreshOn: Boolean(p.autoRefreshOn),
  26. refreshIntervalSec: sanitizeChartBoardRefreshInterval(Number(p.refreshIntervalSec)),
  27. };
  28. } catch {
  29. return null;
  30. }
  31. }
  32. /**
  33. * Logged in: read/write **localStorage** per account key.
  34. * Not logged in: **sessionStorage** for this browser tab/session.
  35. */
  36. export function loadChartBoardRefreshPrefs(
  37. boardId: ChartBoardId,
  38. userKeyPart: string | undefined,
  39. ): ChartBoardRefreshPrefs {
  40. const defaults: ChartBoardRefreshPrefs = {
  41. autoRefreshOn: false,
  42. refreshIntervalSec: CHART_BOARD_DEFAULT_REFRESH_INTERVAL_SEC,
  43. };
  44. if (typeof window === "undefined") {
  45. return defaults;
  46. }
  47. try {
  48. if (userKeyPart) {
  49. const u = parsePrefs(localStorage.getItem(storageKeyUser(boardId, userKeyPart)));
  50. if (u) return u;
  51. }
  52. const s = parsePrefs(sessionStorage.getItem(storageKeySession(boardId)));
  53. if (s) return s;
  54. } catch {
  55. /* ignore quota / private mode */
  56. }
  57. return defaults;
  58. }
  59. export function saveChartBoardRefreshPrefs(
  60. boardId: ChartBoardId,
  61. userKeyPart: string | undefined,
  62. prefs: ChartBoardRefreshPrefs,
  63. ): void {
  64. if (typeof window === "undefined") return;
  65. const payload = JSON.stringify({
  66. autoRefreshOn: prefs.autoRefreshOn,
  67. refreshIntervalSec: sanitizeChartBoardRefreshInterval(prefs.refreshIntervalSec),
  68. });
  69. try {
  70. if (userKeyPart) {
  71. localStorage.setItem(storageKeyUser(boardId, userKeyPart), payload);
  72. sessionStorage.removeItem(storageKeySession(boardId));
  73. } else {
  74. sessionStorage.setItem(storageKeySession(boardId), payload);
  75. }
  76. } catch {
  77. /* ignore */
  78. }
  79. }