| import { atom } from 'jotai'; |
| import { atomWithStorage } from 'jotai/utils'; |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| export function createStorageAtom<T>(key: string, defaultValue: T) { |
| return atomWithStorage<T>(key, defaultValue, undefined, { |
| getOnInit: true, |
| }); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| export function createStorageAtomWithEffect<T>( |
| key: string, |
| defaultValue: T, |
| onWrite: (value: T) => void, |
| ) { |
| const baseAtom = createStorageAtom(key, defaultValue); |
|
|
| return atom( |
| (get) => get(baseAtom), |
| (get, set, newValue: T) => { |
| set(baseAtom, newValue); |
| if (typeof window !== 'undefined') { |
| onWrite(newValue); |
| } |
| }, |
| ); |
| } |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| export function initializeFromStorage<T>( |
| key: string, |
| defaultValue: T, |
| onInit?: (value: T) => void, |
| ): T { |
| if (typeof window === 'undefined' || typeof localStorage === 'undefined') { |
| return defaultValue; |
| } |
|
|
| try { |
| const savedValue = localStorage.getItem(key); |
| const value = savedValue ? (JSON.parse(savedValue) as T) : defaultValue; |
|
|
| if (onInit) { |
| onInit(value); |
| } |
|
|
| return value; |
| } catch (error) { |
| console.error(`Error initializing ${key} from localStorage, using default. Error:`, error); |
|
|
| |
| try { |
| localStorage.setItem(key, JSON.stringify(defaultValue)); |
| } catch (setError) { |
| console.error(`Error resetting corrupted ${key} in localStorage:`, setError); |
| } |
|
|
| if (onInit) { |
| onInit(defaultValue); |
| } |
|
|
| return defaultValue; |
| } |
| } |
|
|