{"version":3,"file":"index.mjs","names":[],"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"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA6BA,SAAgB,qBACd,gBACA,MACA,WACA;CACA,MAAM,WAAW,OAAsB,KAAA,EAAU;CACjD,MAAM,SAAS,OAAO,EAAE;CACxB,MAAM,kBAAkB,WAAW,UAAU,GACzC,UAAU,SAAS,SAAS,KAAK,GACjC;CAEJ,gBACQ;EACJ,IAAI,CAAC,iBAAiB;EAEtB,OAAO,gBAAgB;IAGzB,CAAC,kBAAkB,EAAE,OAAO,UAAU,OAAO,QAAQ,CACtD;CAED,SAAS,UAAU"}