{"version":3,"file":"index.cjs","names":["usePreservedCallback","getIntervalOptions"],"sources":["../../../src/hooks/useInterval/index.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\nimport { usePreservedCallback } from '../usePreservedCallback';\nimport { getIntervalOptions } from './useInterval.utils';\nimport {\n  type UseIntervalReturnType,\n  type IntervalOptions,\n} from './useInterval.types';\n\n/**\n * @description `useInterval` 훅은 지정된 시간 간격으로 특정 작업을 수행할 수 있게 해주는 훅입니다.\n *\n * @param {() => void} callback - 지정된 시간 간격마다 실행될 콜백 함수입니다.\n * @param {number | IntervalOptions} options - 시간 간격을 나타내는 밀리초 단위의 숫자 또는 설정 객체입니다.\n * 숫자일 경우 시간 간격으로 사용되며, 객체일 경우 `delay`와 `enabled` 속성을 설정할 수 있습니다.\n *\n * @returns {UseIntervalReturnType} `reset`, `set`, `clear`를 포함한 객체를 반환합니다.\n * - `set`: interval을 설정하는 함수입니다.\n * - `reset`: interval을 재설정하는 함수입니다.\n * - `clear`: interval을 초기화하는 함수입니다.\n *\n * @example\n * // 마운트 후 0.3초 간격으로 callback 실행\n * useInterval(callback, 300);\n *\n * // 마운트 후 0.3초 간격으로 callback 실행\n * useInterval(callback, { delay: 300 });\n *\n * // enabled true라면, 0.3초 간격으로 callback 함수 실행\n * useInterval(callback, { delay: 300, enabled: condition });\n *\n * @example\n * // 직접 interval을 핸들링 할 수 있는 함수 제공\n * const { set, reset, clear } = useInterval(callback, { delay: 300, enabled: condition });\n */\nexport function useInterval(\n  callback: () => void,\n  options: number\n): UseIntervalReturnType;\n\nexport function useInterval(\n  callback: () => void,\n  options: IntervalOptions\n): UseIntervalReturnType;\n\nexport function useInterval(\n  callback: () => void,\n  options: number | IntervalOptions\n): UseIntervalReturnType {\n  const intervalRef = useRef<number | null>(null);\n\n  const preservedCallback = usePreservedCallback(callback);\n\n  const { delay, enabled } = getIntervalOptions(options);\n\n  const set = useCallback(() => {\n    intervalRef.current = window.setInterval(preservedCallback, delay);\n  }, [preservedCallback, delay]);\n\n  const clear = useCallback(() => {\n    if (intervalRef.current) {\n      clearInterval(intervalRef.current);\n      intervalRef.current = null;\n    }\n  }, []);\n\n  const reset = useCallback(() => {\n    clear();\n    set();\n  }, [clear, set]);\n\n  useEffect(() => {\n    if (delay < 0 || !enabled) return;\n\n    set();\n    return () => clear();\n  }, [clear, set, enabled, delay]);\n\n  return { set, reset, clear };\n}\n"],"mappings":";;;;;AA4CA,SAAgB,YACd,UACA,SACuB;CACvB,MAAM,eAAA,GAAA,MAAA,QAAoC,KAAK;CAE/C,MAAM,oBAAoBA,cAAAA,qBAAqB,SAAS;CAExD,MAAM,EAAE,OAAO,YAAYC,0BAAAA,mBAAmB,QAAQ;CAEtD,MAAM,OAAA,GAAA,MAAA,mBAAwB;EAC5B,YAAY,UAAU,OAAO,YAAY,mBAAmB,MAAM;IACjE,CAAC,mBAAmB,MAAM,CAAC;CAE9B,MAAM,SAAA,GAAA,MAAA,mBAA0B;EAC9B,IAAI,YAAY,SAAS;GACvB,cAAc,YAAY,QAAQ;GAClC,YAAY,UAAU;;IAEvB,EAAE,CAAC;CAEN,MAAM,SAAA,GAAA,MAAA,mBAA0B;EAC9B,OAAO;EACP,KAAK;IACJ,CAAC,OAAO,IAAI,CAAC;CAEhB,CAAA,GAAA,MAAA,iBAAgB;EACd,IAAI,QAAQ,KAAK,CAAC,SAAS;EAE3B,KAAK;EACL,aAAa,OAAO;IACnB;EAAC;EAAO;EAAK;EAAS;EAAM,CAAC;CAEhC,OAAO;EAAE;EAAK;EAAO;EAAO"}