| | |
| | |
| | |
| | |
| | |
| | |
| |
|
| | 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]; |
| | } |
| |
|