@yamada-ui/react
Version:
React UI components of the Yamada, by the Yamada, for the Yamada built with React and Emotion
1 lines • 5.62 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","names":["value"],"sources":["../../../../src/hooks/use-local-storage/index.ts"],"sourcesContent":["\"use client\"\n\nimport { useCallback, useEffect, useState } from \"react\"\nimport { isFunction } from \"../../utils\"\nimport { useWindowEvent } from \"../use-window-event\"\n\nexport type StorageType = \"localStorage\" | \"sessionStorage\"\n\nexport interface StorageProps<Y> {\n key: string\n defaultValue?: Y\n deserialize?: (value: string | undefined) => Y\n getInitialValueInEffect?: boolean\n serialize?: (value: Y) => string\n}\n\nconst serializeJSON = <Y>(value: Y, 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 = <Y>(type: StorageType, name: string) => {\n const eventName =\n type === \"localStorage\" ? \"local-storage\" : \"session-storage\"\n\n return ({\n key,\n defaultValue = undefined,\n deserialize = deserializeJSON,\n getInitialValueInEffect = true,\n serialize = (value: Y) => serializeJSON(value, name),\n }: StorageProps<Y>) => {\n const readStorageValue = useCallback(\n (skipStorage?: boolean): Y => {\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 Y\n }\n\n const storageValue = window[type].getItem(key)\n\n return storageValue !== null\n ? deserialize(storageValue)\n : ((defaultValue ?? \"\") as Y)\n },\n [key, deserialize, defaultValue],\n )\n\n const [value, setValue] = useState<Y>(\n readStorageValue(getInitialValueInEffect),\n )\n\n const setStorageValue = useCallback(\n (valOrFn: ((prevState: Y) => Y) | Y) => {\n if (isFunction(valOrFn)) {\n setValue((current) => {\n const result = valOrFn(current)\n\n window[type].setItem(key, serialize(result))\n window.dispatchEvent(\n new CustomEvent(eventName, {\n detail: { key, value: valOrFn(current) },\n }),\n )\n\n return result\n })\n } else {\n window[type].setItem(key, serialize(valOrFn))\n window.dispatchEvent(\n new CustomEvent(eventName, { detail: { key, value: valOrFn } }),\n )\n\n setValue(valOrFn)\n }\n },\n [key, serialize],\n )\n\n const removeStorageValue = useCallback(() => {\n window[type].removeItem(key)\n setValue(defaultValue as Y)\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 https://yamada-ui.com/docs/hooks/use-local-storage\n */\nexport const useLocalStorage = <Y = string>(props: StorageProps<Y>) =>\n createStorage<Y>(\"localStorage\", \"use-local-storage\")(props)\n"],"mappings":";;;;;;;;;;AAgBA,MAAM,iBAAoB,OAAU,SAAiB;AACnD,KAAI;AACF,SAAO,KAAK,UAAU,MAAM;SACtB;AACN,QAAM,IAAI,MAAM,mBAAmB,KAAK,iCAAiC;;;AAI7E,MAAM,mBAAmB,UAA8B;AACrD,KAAI,CAAC,MAAO,QAAO;AAEnB,KAAI;AACF,SAAO,KAAK,MAAM,MAAM;SAClB;AACN,SAAO;;;AAIX,MAAa,iBAAoB,MAAmB,SAAiB;CACnE,MAAM,YACJ,SAAS,iBAAiB,kBAAkB;AAE9C,SAAQ,EACN,KACA,eAAe,QACf,cAAc,iBACd,0BAA0B,MAC1B,aAAa,YAAa,cAAcA,SAAO,KAAK,OAC/B;EACrB,MAAM,2CACH,gBAA6B;AAC5B,OACE,OAAO,WAAW,eAClB,EAAE,QAAQ,WAEV,OAAO,SAAS,QAChB,YAEA,QAAQ,gBAAgB;GAG1B,MAAM,eAAe,OAAO,MAAM,QAAQ,IAAI;AAE9C,UAAO,iBAAiB,OACpB,YAAY,aAAa,GACvB,gBAAgB;KAExB;GAAC;GAAK;GAAa;GAAa,CACjC;EAED,MAAM,CAAC,OAAO,gCACZ,iBAAiB,wBAAwB,CAC1C;EAED,MAAM,0CACH,YAAuC;AACtC,yDAAe,QAAQ,CACrB,WAAU,YAAY;IACpB,MAAM,SAAS,QAAQ,QAAQ;AAE/B,WAAO,MAAM,QAAQ,KAAK,UAAU,OAAO,CAAC;AAC5C,WAAO,cACL,IAAI,YAAY,WAAW,EACzB,QAAQ;KAAE;KAAK,OAAO,QAAQ,QAAQ;KAAE,EACzC,CAAC,CACH;AAED,WAAO;KACP;QACG;AACL,WAAO,MAAM,QAAQ,KAAK,UAAU,QAAQ,CAAC;AAC7C,WAAO,cACL,IAAI,YAAY,WAAW,EAAE,QAAQ;KAAE;KAAK,OAAO;KAAS,EAAE,CAAC,CAChE;AAED,aAAS,QAAQ;;KAGrB,CAAC,KAAK,UAAU,CACjB;EAED,MAAM,kDAAuC;AAC3C,UAAO,MAAM,WAAW,IAAI;AAC5B,YAAS,aAAkB;KAC1B,CAAC,cAAc,IAAI,CAAC;AAEvB,sDAAe,YAAY,OAAO;AAChC,OAAI,GAAG,gBAAgB,OAAO,SAAS,GAAG,QAAQ,IAChD,UAAS,YAAY,GAAG,YAAY,OAAU,CAAC;IACjD;AAEF,sDAAe,YAAY,OAAO;AAChC,OAAI,GAAG,OAAO,QAAQ,IAAK,UAAS,GAAG,OAAO,MAAM;IACpD;AAEF,6BAAgB;AACd,OAAI,iBAAiB,UAAa,UAAU,OAC1C,iBAAgB,aAAa;KAC9B;GAAC;GAAc;GAAO;GAAgB,CAAC;AAE1C,6BAAgB;AACd,OAAI,wBAAyB,UAAS,kBAAkB,CAAC;KACxD,CAAC,yBAAyB,iBAAiB,CAAC;AAE/C,SAAO;GACL,UAAU,SAAY,eAAe;GACrC;GACA;GACD;;;;;;;;AASL,MAAa,mBAA+B,UAC1C,cAAiB,gBAAgB,oBAAoB,CAAC,MAAM"}