@modern-kit/react
Version:
1 lines • 6.03 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../../../src/hooks/useSessionStorage/useSessionStorage.utils.ts","../../../src/hooks/useSessionStorage/index.ts"],"sourcesContent":["const CUSTOM_EVENT_KEYS = 'modern-kit-session-storage';\n\nexport const sessionStorageEventHandler = {\n key: CUSTOM_EVENT_KEYS,\n subscribe: (callback: () => void) => {\n window.addEventListener(CUSTOM_EVENT_KEYS, callback);\n },\n unsubscribe: (callback: () => void) => {\n window.removeEventListener(CUSTOM_EVENT_KEYS, callback);\n },\n dispatchEvent: () => {\n window.dispatchEvent(new StorageEvent(CUSTOM_EVENT_KEYS));\n },\n};\n\nexport const getSnapshot = (key: string) => {\n return window.sessionStorage.getItem(key);\n};\n\n// SSR 환경에서 initialValue를 반환\nexport const getServerSnapshot = <T>(initialValue: T | null) => {\n return JSON.stringify(initialValue);\n};\n\nexport const subscribe = (callback: () => void) => {\n sessionStorageEventHandler.subscribe(callback);\n return () => {\n sessionStorageEventHandler.unsubscribe(callback);\n };\n};\n","import { isFunction, parseJSON } from '@modern-kit/utils';\nimport {\n Dispatch,\n SetStateAction,\n useCallback,\n useMemo,\n useSyncExternalStore,\n} from 'react';\nimport {\n getServerSnapshot,\n getSnapshot,\n sessionStorageEventHandler,\n subscribe,\n} from './useSessionStorage.utils';\n\ninterface UseSessionStorageWithoutInitialValueProps {\n key: string;\n}\n\ninterface UseSessionStorageWithInitialValueProps<T> {\n key: string;\n initialValue: T | (() => T);\n}\n\ntype UseSessionStorageProps<T> =\n | UseSessionStorageWithoutInitialValueProps\n | UseSessionStorageWithInitialValueProps<T>;\n\nexport function useSessionStorage<T>({\n key,\n initialValue,\n}: UseSessionStorageWithInitialValueProps<T>): {\n state: T;\n setState: Dispatch<SetStateAction<T>>;\n removeState: () => void;\n};\n\nexport function useSessionStorage<T = unknown>({\n key,\n}: UseSessionStorageWithoutInitialValueProps): {\n state: T | null;\n setState: Dispatch<SetStateAction<T | null>>;\n removeState: () => void;\n};\n\nexport function useSessionStorage<T>(props: UseSessionStorageProps<T>) {\n const { key } = props;\n const initialValue = 'initialValue' in props ? props.initialValue : null;\n\n const initialValueToUse = isFunction(initialValue)\n ? initialValue()\n : initialValue;\n\n const externalStoreState = useSyncExternalStore(\n subscribe,\n () => getSnapshot(key),\n () => getServerSnapshot(initialValueToUse)\n );\n\n const state = useMemo(() => {\n return externalStoreState\n ? parseJSON<T>(externalStoreState)\n : initialValueToUse;\n }, [externalStoreState, initialValueToUse]);\n\n const setState = useCallback(\n (value: SetStateAction<T | null>) => {\n try {\n const prevStateString = getSnapshot(key);\n const prevState = prevStateString\n ? parseJSON<T>(prevStateString)\n : initialValueToUse;\n const valueToUse = isFunction(value) ? value(prevState) : value;\n\n window.sessionStorage.setItem(key, JSON.stringify(valueToUse));\n sessionStorageEventHandler.dispatchEvent();\n } catch (err) {\n throw new Error(\n `세션 스토리지 \"${key}\" key에 데이터를 저장하는데 실패했습니다: ${err}`\n );\n }\n },\n [key, initialValueToUse]\n );\n\n const removeState = useCallback(() => {\n try {\n window.sessionStorage.removeItem(key);\n sessionStorageEventHandler.dispatchEvent();\n } catch (err) {\n throw new Error(\n `세션 스토리지 \"${key}\" key의 데이터를 삭제하는데 실패했습니다: ${err}`\n );\n }\n }, [key]);\n\n return { state, setState, removeState };\n}\n"],"names":["isFunction","useSyncExternalStore","useMemo","parseJSON","useCallback"],"mappings":"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"}