{"version":3,"file":"index.cjs","names":["StorageManager","subscribe","getSnapshot","getServerSnapshot","getParsedState"],"sources":["../../../src/hooks/useLocalStorage/index.ts"],"sourcesContent":["import { isFunction } from '@modern-kit/utils';\nimport {\n  Dispatch,\n  SetStateAction,\n  useCallback,\n  useMemo,\n  useSyncExternalStore,\n} from 'react';\nimport {\n  getParsedState,\n  getServerSnapshot,\n  getSnapshot,\n  localStorageEventHandler,\n  subscribe,\n} from './useLocalStorage.utils';\nimport { useVisibilityChange } from '../useVisibilityChange';\nimport { StorageManager } from '@modern-kit/utils';\n\nconst storageManager = new StorageManager('localStorage');\n\ninterface UseLocalStorageWithoutInitialValueOptions {\n  key: string;\n  visibilityChange?: boolean;\n}\n\ninterface UseLocalStorageWithInitialValueOptions<T> {\n  key: string;\n  initialValue: T | (() => T);\n  visibilityChange?: boolean;\n}\n\ntype UseLocalStorageOptions<T> =\n  | UseLocalStorageWithoutInitialValueOptions\n  | UseLocalStorageWithInitialValueOptions<T>;\n\n/**\n * @description `useLocalStorage` 훅은 지정된 `key`를 사용하여 `localStorage`에 데이터를 저장하고 불러오는 기능을 제공합니다.\n *\n * @template T - `state`의 데이터 타입입니다.\n *\n * @param {UseLocalStorageWithInitialValueOptions<T>} options - initialValue를 포함한 useLocalStorage 훅의 속성입니다.\n * @param {string} options.key - `localStorage`에서 데이터를 저장하고 가져올 때 사용하는 키입니다. 필수 속성입니다.\n * @param {T | (() => T)} options.initialValue - `state`의 초기 값을 설정합니다. 함수로 전달할 경우 함수의 반환값이 초기 값으로 사용됩니다.\n * @param {boolean} [options.visibilityChange=false] - 브라우저 탭의 가시성 변경 이벤트를 감지하여 가시성 상태가 되면 `state`를 동기화합니다. 사용 케이스로 `sessionStorage`와 다르게 탭 간 공유되는 저장소이기 때문에 탭 간 동기화가 필요할 때 사용합니다.\n *\n * @returns {{\n *  state: T;\n *  setState: Dispatch<SetStateAction<T>>;\n *  removeState: () => void;\n * }}\n * - `state`: 현재 `localStorage`에 저장된 값입니다. 값이 없을 경우 initialValue로 초기화됩니다.\n * - `setState`: `localStorage`에 저장된 값을 업데이트합니다. 새로운 값 또는 이전 상태를 인자로 받는 함수를 전달할 수 있습니다.\n * - `removeState`: `localStorage`에서 해당 `key`의 값을 삭제합니다.\n *\n * @example\n * const { state, setState, removeState } = useLocalStorage<string>({\n *   key: 'username',\n *   initialValue: 'Guest',\n * });\n *\n * state; // string\n */\nexport function useLocalStorage<T>({\n  key,\n  initialValue,\n  visibilityChange,\n}: UseLocalStorageWithInitialValueOptions<T>): {\n  state: T;\n  setState: Dispatch<SetStateAction<T>>;\n  removeState: () => void;\n};\n\n/**\n * @description `useLocalStorage` 훅은 지정된 `key`를 사용하여 `localStorage`에 데이터를 저장하고 불러오는 기능을 제공합니다.\n *\n * @template T - `state`의 데이터 타입입니다.\n *\n * @param {UseLocalStorageWithoutInitialValueOptions} options - initialValue가 없는 useLocalStorage 훅의 속성입니다.\n * @param {string} options.key - `localStorage`에서 데이터를 저장하고 가져올 때 사용하는 키입니다. 필수 속성입니다.\n * @param {boolean} [options.visibilityChange=false] - 브라우저 탭의 가시성 변경 이벤트를 감지하여 가시성 상태가 되면 `state`를 동기화합니다.\n * 사용 케이스로 `sessionStorage`와 다르게 탭 간 공유되는 저장소이기 때문에 탭 간 동기화가 필요할 때 사용합니다.\n *\n * @returns {{\n *  state: T | null;\n *  setState: Dispatch<SetStateAction<T | null>>;\n *  removeState: () => void;\n * }}\n * - `state`: 현재 `localStorage`에 저장된 값입니다. 값이 없을 경우 `null`을 반환합니다.\n * - `setState`: `localStorage`에 저장된 값을 업데이트합니다. 새로운 값 또는 이전 상태를 인자로 받는 함수를 전달할 수 있습니다.\n * - `removeState`: `localStorage`에서 해당 `key`의 값을 삭제합니다.\n *\n * @example\n * const { state, setState, removeState } = useLocalStorage<string>({\n *   key: 'username',\n * });\n *\n * state; // string | null\n */\nexport function useLocalStorage<T = unknown>({\n  key,\n  visibilityChange,\n}: UseLocalStorageWithoutInitialValueOptions): {\n  state: T | null;\n  setState: Dispatch<SetStateAction<T | null>>;\n  removeState: () => void;\n};\n\nexport function useLocalStorage<T>(options: UseLocalStorageOptions<T>) {\n  const { key, visibilityChange = false } = options;\n  const initialValue = 'initialValue' in options ? options.initialValue : null;\n\n  const initialValueToUse = useMemo(() => {\n    return isFunction(initialValue) ? initialValue() : initialValue;\n  }, [initialValue]);\n\n  const externalStoreState = useSyncExternalStore(\n    subscribe,\n    () => getSnapshot(key),\n    () => getServerSnapshot(initialValueToUse)\n  );\n\n  const state = useMemo(() => {\n    return getParsedState<T>(externalStoreState, initialValueToUse);\n  }, [externalStoreState, initialValueToUse]);\n\n  const setState = useCallback(\n    (value: SetStateAction<T | null>) => {\n      try {\n        const prevStateString = getSnapshot(key);\n        const prevState = getParsedState<T>(prevStateString, initialValueToUse);\n        const valueToUse = isFunction(value) ? value(prevState) : value;\n\n        storageManager.setItem(key, valueToUse);\n        localStorageEventHandler.dispatchEvent();\n      } catch (err) {\n        throw new Error(\n          `로컬 스토리지 \"${key}\" key에 데이터를 저장하는데 실패했습니다\"`, {\n          cause: err,\n        }\n        );\n      }\n    },\n    [key, initialValueToUse]\n  );\n\n  const removeState = useCallback(() => {\n    try {\n      storageManager.removeItem(key);\n      localStorageEventHandler.dispatchEvent();\n    } catch (err) {\n      throw new Error(\n        `로컬 스토리지 \"${key}\" key의 데이터를 삭제하는데 실패했습니다\"`, {\n        cause: err,\n      });\n    }\n  }, [key]);\n\n  const handleVisibilityChange = useCallback(() => {\n    localStorageEventHandler.dispatchEvent();\n  }, []);\n\n  useVisibilityChange({\n    onShow: handleVisibilityChange,\n    enabled: visibilityChange,\n  });\n\n  return { state, setState, removeState };\n}\n"],"mappings":";;;;;;AAkBA,MAAM,iBAAiB,IAAIA,kBAAAA,eAAe,eAAe;AAyFzD,SAAgB,gBAAmB,SAAoC;CACrE,MAAM,EAAE,KAAK,mBAAmB,UAAU;CAC1C,MAAM,eAAe,kBAAkB,UAAU,QAAQ,eAAe;CAExE,MAAM,qBAAA,GAAA,MAAA,eAAkC;EACtC,QAAA,GAAA,kBAAA,YAAkB,aAAa,GAAG,cAAc,GAAG;IAClD,CAAC,aAAa,CAAC;CAElB,MAAM,sBAAA,GAAA,MAAA,sBACJC,8BAAAA,iBACMC,8BAAAA,YAAY,IAAI,QAChBC,8BAAAA,kBAAkB,kBAAkB,CAC3C;CAED,MAAM,SAAA,GAAA,MAAA,eAAsB;EAC1B,OAAOC,8BAAAA,eAAkB,oBAAoB,kBAAkB;IAC9D,CAAC,oBAAoB,kBAAkB,CAAC;CAE3C,MAAM,YAAA,GAAA,MAAA,cACH,UAAoC;EACnC,IAAI;GAEF,MAAM,YAAYA,8BAAAA,eADMF,8BAAAA,YAAY,IACe,EAAE,kBAAkB;GACvE,MAAM,cAAA,GAAA,kBAAA,YAAwB,MAAM,GAAG,MAAM,UAAU,GAAG;GAE1D,eAAe,QAAQ,KAAK,WAAW;GACvC,8BAAA,yBAAyB,eAAe;WACjC,KAAK;GACZ,MAAM,IAAI,MACR,YAAY,IAAI,4BAA4B,EAC5C,OAAO,KACR,CACA;;IAGL,CAAC,KAAK,kBAAkB,CACzB;CAED,MAAM,eAAA,GAAA,MAAA,mBAAgC;EACpC,IAAI;GACF,eAAe,WAAW,IAAI;GAC9B,8BAAA,yBAAyB,eAAe;WACjC,KAAK;GACZ,MAAM,IAAI,MACR,YAAY,IAAI,4BAA4B,EAC5C,OAAO,KACR,CAAC;;IAEH,CAAC,IAAI,CAAC;CAMT,cAAA,oBAAoB;EAClB,SAAA,GAAA,MAAA,mBAL+C;GAC/C,8BAAA,yBAAyB,eAAe;KACvC,EAAE,CAG2B;EAC9B,SAAS;EACV,CAAC;CAEF,OAAO;EAAE;EAAO;EAAU;EAAa"}