UNPKG

@modern-kit/react

Version:
1 lines 2.44 kB
{"version":3,"file":"index.mjs","sources":["../../../src/hooks/useConditionalEffect/index.ts"],"sourcesContent":["import {\n useEffect,\n useRef,\n type DependencyList,\n type EffectCallback,\n} from 'react';\nimport { isFunction } from '@modern-kit/utils';\n\n/**\n * @description 주어진 조건이 true일 때 effect를 실행하는 커스텀 훅입니다.\n *\n * 의존성 배열이 변경될 때마다 주어진 조건을 확인하고 true일 때 effectCallback 함수를 실행합니다.\n *\n * 조건 함수인 경우 이전 의존성 배열(prevDeps)과 현재 의존성 배열(currentDeps)을 인자로 받아 더 세밀한 조건 판단을 할 수 있습니다.\n *\n * @template D - 의존성 리스트의 타입\n * @param {EffectCallback} effectCallback - 실행할 effectCallback 함수\n * @param {D} deps - 의존성 리스트\n * @param {boolean | ((prevDeps: D | undefined, currentDeps: D) => boolean)} condition - effectCallback 함수를 실행할 조건을 결정하는 함수 또는 불리언 값.\n * @example\n * useConditionalEffect(\n * () => {\n * console.log('effect');\n * },\n * [count],\n * // 의존성 배열의 count가 증가할 때만 effect 실행\n * (prevDeps, currentDeps) => prevDeps != null && prevDeps[0] < currentDeps[0]\n * );\n */\nexport function useConditionalEffect<D extends DependencyList>(\n effectCallback: EffectCallback,\n deps: D,\n condition: boolean | ((prevDeps: D | undefined, currentDeps: D) => boolean)\n) {\n const prevDeps = useRef<D | undefined>(undefined);\n const signal = useRef(0);\n const shouldRunEffect = isFunction(condition)\n ? condition(prevDeps.current, deps)\n : condition;\n\n useEffect(\n () => {\n if (!shouldRunEffect) return;\n\n return effectCallback();\n },\n // eslint-disable-next-line react-hooks/exhaustive-deps\n [shouldRunEffect ? ++signal.current : signal.current]\n );\n\n prevDeps.current = deps;\n}\n"],"names":[],"mappings":";;;AA6BO,SAAS,oBAAA,CACd,cAAA,EACA,IAAA,EACA,SAAA,EACA;AACA,EAAA,MAAM,QAAA,GAAW,OAAsB,MAAS,CAAA;AAChD,EAAA,MAAM,MAAA,GAAS,OAAO,CAAC,CAAA;AACvB,EAAA,MAAM,eAAA,GAAkB,WAAW,SAAS,CAAA,GACxC,UAAU,QAAA,CAAS,OAAA,EAAS,IAAI,CAAA,GAChC,SAAA;AAEJ,EAAA,SAAA;AAAA,IACE,MAAM;AACJ,MAAA,IAAI,CAAC,eAAA,EAAiB;AAEtB,MAAA,OAAO,cAAA,EAAe;AAAA,IACxB,CAAA;AAAA;AAAA,IAEA,CAAC,eAAA,GAAkB,EAAE,MAAA,CAAO,OAAA,GAAU,OAAO,OAAO;AAAA,GACtD;AAEA,EAAA,QAAA,CAAS,OAAA,GAAU,IAAA;AACrB;;;;"}