{"version":3,"sources":["../../src/useDebounceCallback/useDebouncedCallback.ts"],"names":["useRef","useCallback","useEffect","useDebouncedCallback","callback","delay","options","_a","maxWaitHandler","leading","trailing","maxWait","maxWaitArgs","leadingCall","functionTimeoutHandler","isComponentUnmounted","debouncedFunction","cancelDebouncedCallback","debouncedCallback","args","shouldCallFunction","callbackArgs","callPending","useDebouncedCallback_default"],"mappings":"8BAAA,OAAS,UAAAA,EAAQ,eAAAC,EAAa,aAAAC,MAAiB,QAI/C,MAAMC,EAA6C,CAACC,EAAUC,EAAOC,IAAY,CAJjF,IAAAC,EAKE,MAAMC,EAAiBR,EAAuB,MAAS,EAEjDS,EAAUH,GAAA,YAAAA,EAAS,QAEnBI,GAAWH,EAAAD,GAAA,YAAAA,EAAS,WAAT,KAAAC,EAAqB,GAEhCI,EAAUL,GAAA,YAAAA,EAAS,QAEnBM,EAAcZ,EAAc,CAAC,CAAC,EAE9Ba,EAAcb,EAAO,EAAK,EAE1Bc,EAAyBd,EAAuB,MAAS,EAEzDe,EAAuBf,EAAO,EAAK,EAEnCgB,EAAoBhB,EAAOI,CAAQ,EAEnCa,EAA2ChB,EAAY,IAAM,CACjE,aAAaa,EAAuB,OAAO,EAE3C,aAAaN,EAAe,OAAO,EAEnCA,EAAe,QAAU,OAEzBI,EAAY,QAAU,CAAC,EAEvBE,EAAuB,QAAU,OAEjCD,EAAY,QAAU,EACxB,EAAG,CAAC,CAAC,EAELX,EACE,IAAM,IAAM,CACVa,EAAqB,QAAU,EACjC,EACA,CAAC,CACH,EAEA,MAAMG,EAAqCjB,EACzC,IAAIkB,IAAS,CACXP,EAAY,QAAUO,EAEtB,aAAaL,EAAuB,OAAO,EAEvCD,EAAY,UACdA,EAAY,QAAU,IAGpB,CAACC,EAAuB,SAAWL,GAAW,CAACI,EAAY,UAC7DG,EAAkB,QAAQ,GAAGG,CAAI,EAEjCN,EAAY,QAAU,IAGxBC,EAAuB,QAAU,OAAO,WAAW,IAAM,CACvD,IAAIM,EAAqB,GAErBX,GAAWI,EAAY,UACzBO,EAAqB,IAGvBH,EAAwB,EAEpB,CAACF,EAAqB,SAAWL,GAAYU,GAC/CJ,EAAkB,QAAQ,GAAGG,CAAI,CAErC,EAAGd,CAAK,EAEJM,GAAW,CAACH,EAAe,SAAWE,IACxCF,EAAe,QAAU,OAAO,WAAW,IAAM,CAC/C,MAAMa,EAAeT,EAAY,QAEjCK,EAAwB,EAEnBF,EAAqB,SACxBC,EAAkB,QAAQ,MAAM,KAAMK,CAAY,CAEtD,EAAGV,CAAO,EAEd,EACA,CAACA,EAASN,EAAOY,EAAyBR,EAASC,CAAQ,CAC7D,EAEMY,EAA+BrB,EAAY,IAAM,CAChDa,EAAuB,UAI5BE,EAAkB,QAAQ,MAAM,KAAMJ,EAAY,OAAO,EAEzDK,EAAwB,EAC1B,EAAG,CAACA,CAAuB,CAAC,EAE5B,MAAO,CAACC,EAAsCD,EAAyBK,CAAW,CACpF,EAEA,IAAOC,EAAQpB","sourcesContent":["import { useRef, useCallback, useEffect } from 'react';\nimport type { GeneralFunction } from '@asherng/common-types';\nimport type { UseDebouncedCallback, SetTimeOutType } from './types';\n\nconst useDebouncedCallback: UseDebouncedCallback = (callback, delay, options) => {\n  const maxWaitHandler = useRef<SetTimeOutType>(undefined);\n\n  const leading = options?.leading;\n\n  const trailing = options?.trailing ?? true;\n\n  const maxWait = options?.maxWait;\n\n  const maxWaitArgs = useRef<any[]>([]);\n\n  const leadingCall = useRef(false);\n\n  const functionTimeoutHandler = useRef<SetTimeOutType>(undefined);\n\n  const isComponentUnmounted = useRef(false);\n\n  const debouncedFunction = useRef(callback);\n\n  const cancelDebouncedCallback: GeneralFunction = useCallback(() => {\n    clearTimeout(functionTimeoutHandler.current);\n\n    clearTimeout(maxWaitHandler.current);\n\n    maxWaitHandler.current = undefined;\n\n    maxWaitArgs.current = [];\n\n    functionTimeoutHandler.current = undefined;\n\n    leadingCall.current = false;\n  }, []);\n\n  useEffect(\n    () => () => {\n      isComponentUnmounted.current = true;\n    },\n    []\n  );\n\n  const debouncedCallback: GeneralFunction = useCallback(\n    (...args) => {\n      maxWaitArgs.current = args;\n\n      clearTimeout(functionTimeoutHandler.current);\n\n      if (leadingCall.current) {\n        leadingCall.current = false;\n      }\n\n      if (!functionTimeoutHandler.current && leading && !leadingCall.current) {\n        debouncedFunction.current(...args);\n\n        leadingCall.current = true;\n      }\n\n      functionTimeoutHandler.current = window.setTimeout(() => {\n        let shouldCallFunction = true;\n\n        if (leading && leadingCall.current) {\n          shouldCallFunction = false;\n        }\n\n        cancelDebouncedCallback();\n\n        if (!isComponentUnmounted.current && trailing && shouldCallFunction) {\n          debouncedFunction.current(...args);\n        }\n      }, delay);\n\n      if (maxWait && !maxWaitHandler.current && trailing) {\n        maxWaitHandler.current = window.setTimeout(() => {\n          const callbackArgs = maxWaitArgs.current;\n\n          cancelDebouncedCallback();\n\n          if (!isComponentUnmounted.current) {\n            debouncedFunction.current.apply(null, callbackArgs);\n          }\n        }, maxWait);\n      }\n    },\n    [maxWait, delay, cancelDebouncedCallback, leading, trailing]\n  );\n\n  const callPending: GeneralFunction = useCallback(() => {\n    if (!functionTimeoutHandler.current) {\n      return;\n    }\n\n    debouncedFunction.current.apply(null, maxWaitArgs.current);\n\n    cancelDebouncedCallback();\n  }, [cancelDebouncedCallback]);\n\n  return [debouncedCallback as typeof callback, cancelDebouncedCallback, callPending];\n};\n\nexport default useDebouncedCallback;\n"]}