@modern-kit/react
Version:
1 lines • 2.19 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../../../src/hooks/usePreservedState/index.ts"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { usePreservedCallback } from '../usePreservedCallback';\nimport { isEqual } from '@modern-kit/utils';\n\n/**\n * @description `usePreservedState`는 주어진 값과 비교 함수(comparator)를 사용하여 상태를 보존하는 커스텀 훅입니다.\n *\n * 이 훅은 주어진 값이 변경될 때마다 비교 함수(comparator)를 통해 이전 상태와 새로운 값을 비교하여,\n * 값이 다르다고 판단될 때에만 상태를 업데이트합니다. 이를 통해 불필요한 상태 업데이트를 방지할 수 있습니다.\n *\n * @template T - 상태로 보존할 값의 타입.\n * @param {T} value - 보존하고자 하는 초기 값.\n * @param {(source: T, target: T) => boolean} [comparator=isEqual] - 상태 비교를 위한 함수.\n * @returns {T} 보존된 상태 값을 반환합니다.\n *\n * @example\n * // default comparator\n * const preservedState = usePreservedState({\n * group: 'bgzt',\n * });\n *\n * @example\n * // custom comparator\n * const preservedState = usePreservedState({\n * group: 'bgzt',\n * }, (a, b) => a.group === b.group);\n */\nexport function usePreservedState<T>(\n value: T,\n comparator: (source: T, target: T) => boolean = isEqual\n): T {\n const [preservedState, setPreservedState] = useState(value);\n const callbackComparator = usePreservedCallback(comparator);\n\n useEffect(() => {\n if (!callbackComparator(preservedState, value)) {\n setPreservedState(value);\n }\n }, [callbackComparator, preservedState, value]);\n\n return preservedState;\n}\n"],"names":["isEqual","useState","usePreservedCallback","useEffect"],"mappings":";;;;;;AA2BO,SAAS,iBAAA,CACd,KAAA,EACA,UAAA,GAAgDA,aAAA,EAC7C;AACH,EAAA,MAAM,CAAC,cAAA,EAAgB,iBAAiB,CAAA,GAAIC,eAAS,KAAK,CAAA;AAC1D,EAAA,MAAM,kBAAA,GAAqBC,+CAAqB,UAAU,CAAA;AAE1D,EAAAC,eAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,kBAAA,CAAmB,cAAA,EAAgB,KAAK,CAAA,EAAG;AAC9C,MAAA,iBAAA,CAAkB,KAAK,CAAA;AAAA,IACzB;AAAA,EACF,CAAA,EAAG,CAAC,kBAAA,EAAoB,cAAA,EAAgB,KAAK,CAAC,CAAA;AAE9C,EAAA,OAAO,cAAA;AACT;;;;"}