{"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":[]}