| import { atom } from 'recoil'; |
|
|
| |
| export function atomWithLocalStorage<T>(key: string, defaultValue: T) { |
| return atom<T>({ |
| key, |
| default: defaultValue, |
| effects_UNSTABLE: [ |
| ({ setSelf, onSet }) => { |
| const savedValue = localStorage.getItem(key); |
| if (savedValue !== null) { |
| try { |
| const parsedValue = JSON.parse(savedValue); |
| setSelf(parsedValue); |
| } catch (e) { |
| console.error( |
| `Error parsing localStorage key "${key}", \`savedValue\`: defaultValue, error:`, |
| e, |
| ); |
| localStorage.setItem(key, JSON.stringify(defaultValue)); |
| setSelf(defaultValue); |
| } |
| } |
|
|
| onSet((newValue: T) => { |
| localStorage.setItem(key, JSON.stringify(newValue)); |
| }); |
| }, |
| ], |
| }); |
| } |
|
|