{"version":3,"file":"index.mjs","names":[],"sources":["../../../src/hooks/useTimeout/index.ts"],"sourcesContent":["import { useCallback, useEffect, useRef } from 'react';\nimport { usePreservedCallback } from '../usePreservedCallback';\nimport { getTimeoutOptions, TimeoutOptions } from './useTimeout.utils';\n\ninterface UseTimeoutReturnType {\n  set: () => void;\n  clear: () => void;\n  reset: () => void;\n}\n\n/**\n * @description `useTimeout`훅은 지정된 지연 시간 후에 콜백 함수를 호출하는 커스텀 훅입니다.\n *\n * @param {() => void} callback - delay 후에 실행될 함수입니다.\n * @param {number | TimeoutOptions} options - 밀리초(ms) 단위의 지연 시간 또는 옵션 객체입니다.\n * 숫자일 경우 시간 간격으로 사용되며, 객체일 경우 `delay`와 `enabled` 속성을 설정할 수 있습니다.\n *\n * @return {UseTimeoutReturnType} set, reset, clear 함수를 포함하는 객체를 반환합니다.\n * - set: timeout을 설정하는 함수입니다.\n * - reset: timeout을 재설정하는 함수입니다.\n * - clear: timeout을 초기화하는 함수입니다.\n *\n * @example\n * // 마운트 후 0.3초 후 callback 함수 실행\n * useTimeout(callback, 300);\n *\n * // 마운트 후 0.3초 후 callback 함수 실행\n * useTimeout(callback, { delay: 300 });\n *\n * // enabled가 true라면, 0.3초 후 callback 함수 실행\n * useTimeout(callback, { delay: 300, enabled: condition });\n *\n * @example\n * // 직접 timeout 핸들링 할 수 있는 함수 제공\n * const { set, reset, clear } = useTimeout(callback, { delay: 300, enabled: condition });\n */\nexport function useTimeout(\n  callback: () => void,\n  options: number\n): UseTimeoutReturnType;\n\nexport function useTimeout(\n  callback: () => void,\n  options: TimeoutOptions\n): UseTimeoutReturnType;\n\nexport function useTimeout(\n  callback: () => void,\n  options: number | TimeoutOptions\n): UseTimeoutReturnType {\n  const timeoutRef = useRef<number | null>(null);\n\n  const callbackAction = usePreservedCallback(callback);\n\n  const { delay, enabled } = getTimeoutOptions(options);\n\n  const set = useCallback(() => {\n    timeoutRef.current = window.setTimeout(callbackAction, delay);\n  }, [callbackAction, delay]);\n\n  const clear = useCallback(() => {\n    if (timeoutRef.current) {\n      clearTimeout(timeoutRef.current);\n      timeoutRef.current = null;\n    }\n  }, []);\n\n  const reset = useCallback(() => {\n    clear();\n    set();\n  }, [clear, set]);\n\n  useEffect(() => {\n    if (!enabled) return;\n\n    set();\n    return () => clear();\n  }, [set, clear, enabled]);\n\n  return { set, reset, clear };\n}\n"],"mappings":";;;;AA8CA,SAAgB,WACd,UACA,SACsB;CACtB,MAAM,aAAa,OAAsB,KAAK;CAE9C,MAAM,iBAAiB,qBAAqB,SAAS;CAErD,MAAM,EAAE,OAAO,YAAY,kBAAkB,QAAQ;CAErD,MAAM,MAAM,kBAAkB;EAC5B,WAAW,UAAU,OAAO,WAAW,gBAAgB,MAAM;IAC5D,CAAC,gBAAgB,MAAM,CAAC;CAE3B,MAAM,QAAQ,kBAAkB;EAC9B,IAAI,WAAW,SAAS;GACtB,aAAa,WAAW,QAAQ;GAChC,WAAW,UAAU;;IAEtB,EAAE,CAAC;CAEN,MAAM,QAAQ,kBAAkB;EAC9B,OAAO;EACP,KAAK;IACJ,CAAC,OAAO,IAAI,CAAC;CAEhB,gBAAgB;EACd,IAAI,CAAC,SAAS;EAEd,KAAK;EACL,aAAa,OAAO;IACnB;EAAC;EAAK;EAAO;EAAQ,CAAC;CAEzB,OAAO;EAAE;EAAK;EAAO;EAAO"}