diff --git a/packages/twenty-front/src/modules/ui/utilities/state/jotai/utils/createAtomFamilyState.ts b/packages/twenty-front/src/modules/ui/utilities/state/jotai/utils/createAtomFamilyState.ts index cecd0c76b11..710c78bd39c 100644 --- a/packages/twenty-front/src/modules/ui/utilities/state/jotai/utils/createAtomFamilyState.ts +++ b/packages/twenty-front/src/modules/ui/utilities/state/jotai/utils/createAtomFamilyState.ts @@ -1,8 +1,22 @@ import { atom } from 'jotai'; -import { atomWithStorage } from 'jotai/utils'; +import { atomWithStorage, createJSONStorage } from 'jotai/utils'; import { type FamilyState } from '@/ui/utilities/state/jotai/types/FamilyState'; +const createSafeLocalStorage = () => + createJSONStorage(() => ({ + getItem: (key: string) => localStorage.getItem(key), + setItem: (key: string, value: string) => { + try { + localStorage.setItem(key, value); + } catch { + // Silently ignore QuotaExceededError — the in-memory Jotai state + // remains correct; persistence is best-effort. + } + }, + removeItem: (key: string) => localStorage.removeItem(key), + })); + export const createAtomFamilyState = ({ key, defaultValue, @@ -36,7 +50,7 @@ export const createAtomFamilyState = ({ ? atomWithStorage( atomKey, defaultValue, - undefined, + createSafeLocalStorage(), localStorageOptions ?? undefined, ) : atom(defaultValue); diff --git a/packages/twenty-front/src/modules/ui/utilities/state/jotai/utils/createAtomState.ts b/packages/twenty-front/src/modules/ui/utilities/state/jotai/utils/createAtomState.ts index c9cdac315c3..bf6e876b963 100644 --- a/packages/twenty-front/src/modules/ui/utilities/state/jotai/utils/createAtomState.ts +++ b/packages/twenty-front/src/modules/ui/utilities/state/jotai/utils/createAtomState.ts @@ -1,5 +1,5 @@ import { atom, type WritableAtom } from 'jotai'; -import { atomWithStorage } from 'jotai/utils'; +import { atomWithStorage, createJSONStorage } from 'jotai/utils'; import { isDefined } from 'twenty-shared/utils'; import { type State } from '@/ui/utilities/state/jotai/types/State'; @@ -52,10 +52,22 @@ export const createAtomState = ({ { getOnInit: true }, ) as StateAtom; } else if (useLocalStorage) { + const safeStorage = createJSONStorage(() => ({ + getItem: (k: string) => localStorage.getItem(k), + setItem: (k: string, v: string) => { + try { + localStorage.setItem(k, v); + } catch { + // Silently ignore QuotaExceededError — the in-memory Jotai state + // remains correct; persistence is best-effort. + } + }, + removeItem: (k: string) => localStorage.removeItem(k), + })); baseAtom = atomWithStorage( key, defaultValue, - undefined, + safeStorage, localStorageOptions ?? undefined, ) as StateAtom; } else {