From 617da68ab523f8dc3c73dc6e6d5d9dd29eedeedf Mon Sep 17 00:00:00 2001 From: Carlos Valente Date: Fri, 15 Aug 2025 20:28:36 +0200 Subject: [PATCH] fix: storage key conflict across stages --- apps/client/src/common/stores/clientStore.ts | 4 +++- apps/client/src/common/stores/viewOptions.ts | 2 +- apps/client/src/common/utils/localStorage.ts | 7 +++++++ .../sources-panel/import-map/importMapUtils.ts | 4 ++-- .../cuesheet/cuesheet-table/useColumnManager.tsx | 16 ++++++++++++---- 5 files changed, 25 insertions(+), 8 deletions(-) diff --git a/apps/client/src/common/stores/clientStore.ts b/apps/client/src/common/stores/clientStore.ts index 07c8cb228..01210d03e 100644 --- a/apps/client/src/common/stores/clientStore.ts +++ b/apps/client/src/common/stores/clientStore.ts @@ -1,6 +1,8 @@ import { ClientList } from 'ontime-types'; import { create } from 'zustand'; +import { makeStageKey } from '../utils/localStorage'; + interface ClientStore { name?: string; setName: (newValue: string) => void; @@ -15,7 +17,7 @@ interface ClientStore { setClients: (clients: ClientList) => void; } -const clientNameKey = 'ontime-client-name'; +const clientNameKey = makeStageKey('client-name'); function persistNameInStorage(newValue: string) { localStorage.setItem(clientNameKey, newValue); diff --git a/apps/client/src/common/stores/viewOptions.ts b/apps/client/src/common/stores/viewOptions.ts index 2cc0ac9be..8c1e6d608 100644 --- a/apps/client/src/common/stores/viewOptions.ts +++ b/apps/client/src/common/stores/viewOptions.ts @@ -3,7 +3,7 @@ import { create } from 'zustand'; import { booleanFromLocalStorage } from '../utils/localStorage'; enum LocalEventKeys { - Mirror = 'ontime-view-mirror', + Mirror = 'view-mirror', } type ViewOptionsStore = { diff --git a/apps/client/src/common/utils/localStorage.ts b/apps/client/src/common/utils/localStorage.ts index 3b2438d03..625d9955d 100644 --- a/apps/client/src/common/utils/localStorage.ts +++ b/apps/client/src/common/utils/localStorage.ts @@ -1,3 +1,5 @@ +import { baseURI } from '../../externals'; + export function booleanFromLocalStorage(key: string, fallback: boolean): boolean { const valueInStorage = localStorage.getItem(key); if (valueInStorage) { @@ -7,3 +9,8 @@ export function booleanFromLocalStorage(key: string, fallback: boolean): boolean return fallback; } } + +export function makeStageKey(key: string) { + if (baseURI) return `${baseURI}-${key}`; + return key; +} diff --git a/apps/client/src/features/app-settings/panel/manage-panel/sources-panel/import-map/importMapUtils.ts b/apps/client/src/features/app-settings/panel/manage-panel/sources-panel/import-map/importMapUtils.ts index afddb5aed..eb0f92a2c 100644 --- a/apps/client/src/features/app-settings/panel/manage-panel/sources-panel/import-map/importMapUtils.ts +++ b/apps/client/src/features/app-settings/panel/manage-panel/sources-panel/import-map/importMapUtils.ts @@ -64,11 +64,11 @@ export function convertToImportMap(namedImportMap: NamedImportMap): ImportMap { } export function persistImportMap(options: NamedImportMap) { - localStorage.setItem('ontime-import-options', JSON.stringify(options)); + localStorage.setItem('import-options', JSON.stringify(options)); } function getPersistImportMap(): unknown { - const options = localStorage.getItem('ontime-import-options'); + const options = localStorage.getItem('import-options'); if (!options) { throw new Error('no import options found'); } diff --git a/apps/client/src/views/cuesheet/cuesheet-table/useColumnManager.tsx b/apps/client/src/views/cuesheet/cuesheet-table/useColumnManager.tsx index 5df133153..a30748fc1 100644 --- a/apps/client/src/views/cuesheet/cuesheet-table/useColumnManager.tsx +++ b/apps/client/src/views/cuesheet/cuesheet-table/useColumnManager.tsx @@ -4,21 +4,29 @@ import { ColumnDef } from '@tanstack/react-table'; import { OntimeEntry } from 'ontime-types'; import { debounce } from '../../../common/utils/debounce'; +import { makeStageKey } from '../../../common/utils/localStorage'; + +const tableSizesKey = makeStageKey('cuesheet-sizes'); +const tableHiddenKey = makeStageKey('cuesheet-hidden'); +const tableOrderKey = makeStageKey('cuesheet-order'); const saveSizesToStorage = debounce((sizes: Record) => { - localStorage.setItem('table-sizes', JSON.stringify(sizes)); + localStorage.setItem(tableSizesKey, JSON.stringify(sizes)); }, 500); export default function useColumnManager(columns: ColumnDef[]) { - const [columnVisibility, setColumnVisibility] = useLocalStorage({ key: 'table-hidden', defaultValue: {} }); + const [columnVisibility, setColumnVisibility] = useLocalStorage({ + key: tableHiddenKey, + defaultValue: {}, + }); const [columnOrder, saveColumnOrder] = useLocalStorage({ - key: 'table-order', + key: tableOrderKey, defaultValue: columns.map((col) => col.id as string), }); const [columnSizing, setColumnSizingState] = useState(() => { try { - const stored = localStorage.getItem('table-sizes'); + const stored = localStorage.getItem(tableSizesKey); return stored ? JSON.parse(stored) : {}; } catch { return {};