| |
| |
| |
| |
| |
| |
|
|
| import { useEffect, useState } from 'react'; |
|
|
| export default function useLocalStorage<T>(key: string, defaultValue: T): [T, (value: T) => void] { |
| const [value, setValue] = useState(defaultValue); |
|
|
| useEffect(() => { |
| const item = localStorage.getItem(key); |
|
|
| if (!item) { |
| localStorage.setItem(key, JSON.stringify(defaultValue)); |
| } |
|
|
| setValue(item ? JSON.parse(item) : defaultValue); |
|
|
| function handler(e: StorageEvent) { |
| if (e.key !== key) { |
| return; |
| } |
|
|
| const lsi = localStorage.getItem(key); |
| setValue(JSON.parse(lsi ?? '')); |
| } |
|
|
| window.addEventListener('storage', handler); |
|
|
| return () => { |
| window.removeEventListener('storage', handler); |
| }; |
| |
| }, []); |
|
|
| const setValueWrap = (value: T) => { |
| try { |
| setValue(value); |
|
|
| localStorage.setItem(key, JSON.stringify(value)); |
| if (typeof window !== 'undefined') { |
| window.dispatchEvent(new StorageEvent('storage', { key })); |
| } |
| } catch (e) { |
| console.error(e); |
| } |
| }; |
|
|
| return [value, setValueWrap]; |
| } |
|
|