UNPKG

@yamada-ui/use-local-storage

Version:

Yamada UI useLocalStorage custom hook

1 lines 6.09 kB
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { useWindowEvent } from \"@yamada-ui/use-window-event\"\nimport { isFunction } from \"@yamada-ui/utils\"\nimport { useCallback, useEffect, useState } from \"react\"\n\nexport type StorageType = \"localStorage\" | \"sessionStorage\"\n\nexport interface StorageProps<T> {\n key: string\n defaultValue?: T\n deserialize?: (value: string | undefined) => T\n getInitialValueInEffect?: boolean\n serialize?: (value: T) => string\n}\n\nconst serializeJSON = <T>(value: T, name: string) => {\n try {\n return JSON.stringify(value)\n } catch {\n throw new Error(`useLocalStorage ${name}: Failed to serialize the value`)\n }\n}\n\nconst deserializeJSON = (value: string | undefined) => {\n if (!value) return value\n\n try {\n return JSON.parse(value)\n } catch {\n return value\n }\n}\n\nexport const createStorage = <T>(type: StorageType, name: string) => {\n const eventName =\n type === \"localStorage\" ? \"ui-local-storage\" : \"ui-session-storage\"\n\n return ({\n key,\n defaultValue = undefined,\n deserialize = deserializeJSON,\n getInitialValueInEffect = true,\n serialize = (value: T) => serializeJSON(value, name),\n }: StorageProps<T>) => {\n const readStorageValue = useCallback(\n (skipStorage?: boolean): T => {\n if (\n typeof window === \"undefined\" ||\n !(type in window) ||\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n window[type] == null ||\n skipStorage\n ) {\n return (defaultValue ?? \"\") as T\n }\n\n const storageValue = window[type].getItem(key)\n\n return storageValue !== null\n ? deserialize(storageValue)\n : ((defaultValue ?? \"\") as T)\n },\n [key, deserialize, defaultValue],\n )\n\n const [value, setValue] = useState<T>(\n readStorageValue(getInitialValueInEffect),\n )\n\n const setStorageValue = useCallback(\n (valOrFunc: ((prevState: T) => T) | T) => {\n if (isFunction(valOrFunc)) {\n setValue((current) => {\n const result = valOrFunc(current)\n\n window[type].setItem(key, serialize(result))\n window.dispatchEvent(\n new CustomEvent(eventName, {\n detail: { key, value: valOrFunc(current) },\n }),\n )\n\n return result\n })\n } else {\n window[type].setItem(key, serialize(valOrFunc))\n window.dispatchEvent(\n new CustomEvent(eventName, { detail: { key, value: valOrFunc } }),\n )\n\n setValue(valOrFunc)\n }\n },\n [key, serialize],\n )\n\n const removeStorageValue = useCallback(() => {\n window[type].removeItem(key)\n setValue(defaultValue as T)\n }, [defaultValue, key])\n\n useWindowEvent(\"storage\", (ev) => {\n if (ev.storageArea === window[type] && ev.key === key)\n setValue(deserialize(ev.newValue ?? undefined))\n })\n\n useWindowEvent(eventName, (ev) => {\n if (ev.detail.key === key) setValue(ev.detail.value)\n })\n\n useEffect(() => {\n if (defaultValue !== undefined && value === undefined)\n setStorageValue(defaultValue)\n }, [defaultValue, value, setStorageValue])\n\n useEffect(() => {\n if (getInitialValueInEffect) setValue(readStorageValue())\n }, [getInitialValueInEffect, readStorageValue])\n\n return [\n value === undefined ? defaultValue : value,\n setStorageValue,\n removeStorageValue,\n ] as const\n }\n}\n\n/**\n * `useLocalStorage` is a custom hook for storing, updating, and retrieving values in local storage.\n *\n * @see Docs https://yamada-ui.com/hooks/use-local-storage\n */\nexport const useLocalStorage = <T = string>(props: StorageProps<T>) =>\n createStorage<T>(\"localStorage\", \"use-local-storage\")(props)\n"],"mappings":"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","names":[]}