UNPKG

@botonic/react

Version:

Build Chatbots using React

56 lines (44 loc) 1.44 kB
import { useCallback, useEffect, useState } from 'react' // Code taken from https://github.com/leny/react-use-storage/blob/master/src/index.js const IS_BROWSER = typeof window !== 'undefined' && typeof navigator !== 'undefined' && typeof document !== 'undefined' export function useStorageState(storage, key, defaultValue) { let evtTarget try { evtTarget = new EventTarget() } catch { evtTarget = (IS_BROWSER ? document : {})?.createElement?.('phony') } const raw = storage?.getItem(key) const [value, setValue] = useState(raw ? JSON.parse(raw) : defaultValue) const updater = useCallback( (updatedValue, remove = false) => { setValue(updatedValue) storage[remove ? 'removeItem' : 'setItem']( key, JSON.stringify(updatedValue) ) evtTarget.dispatchEvent( new CustomEvent('storage_change', { detail: { key } }) ) }, [key] ) defaultValue != null && !raw && updater(defaultValue) useEffect(() => { const listener = ({ detail }) => { if (detail.key === key) { const lraw = storage?.getItem(key) lraw !== raw && setValue(JSON.parse(lraw)) } } evtTarget.addEventListener('storage_change', listener) return () => evtTarget.removeEventListener('storage_change', listener) }) if (storage === null) { return [undefined, undefined] } return [value, updater, () => updater(null, true)] }