{"version":3,"file":"use-debounced-callback.cjs","names":["useCallbackRef"],"sources":["../../src/use-debounced-callback/use-debounced-callback.ts"],"sourcesContent":["import { useEffect, useMemo, useRef } from 'react';\nimport { useCallbackRef } from '../utils';\n\nexport interface UseDebouncedCallbackOptions {\n  delay: number;\n  flushOnUnmount?: boolean;\n  leading?: boolean;\n}\n\nexport type UseDebouncedCallbackReturnValue<T extends (...args: any[]) => any> = ((\n  ...args: Parameters<T>\n) => void) & { flush: () => void; cancel: () => void };\n\nexport function useDebouncedCallback<T extends (...args: any[]) => any>(\n  callback: T,\n  options: number | UseDebouncedCallbackOptions\n) {\n  const { delay, flushOnUnmount, leading } =\n    typeof options === 'number'\n      ? { delay: options, flushOnUnmount: false, leading: false }\n      : options;\n\n  const handleCallback = useCallbackRef(callback);\n  const debounceTimerRef = useRef(0);\n\n  const lastCallback = useMemo(() => {\n    const currentCallback = Object.assign(\n      (...args: Parameters<T>) => {\n        window.clearTimeout(debounceTimerRef.current);\n\n        const isFirstCall = currentCallback._isFirstCall;\n        currentCallback._isFirstCall = false;\n\n        function clearTimeoutAndLeadingRef() {\n          window.clearTimeout(debounceTimerRef.current);\n          debounceTimerRef.current = 0;\n          currentCallback._isFirstCall = true;\n        }\n\n        if (leading && isFirstCall) {\n          handleCallback(...args);\n\n          const resetLeadingState = () => {\n            clearTimeoutAndLeadingRef();\n          };\n\n          const flush = () => {\n            if (debounceTimerRef.current !== 0) {\n              clearTimeoutAndLeadingRef();\n              handleCallback(...args);\n            }\n          };\n\n          const cancel = () => {\n            clearTimeoutAndLeadingRef();\n          };\n\n          currentCallback.flush = flush;\n          currentCallback.cancel = cancel;\n          debounceTimerRef.current = window.setTimeout(resetLeadingState, delay);\n          return;\n        }\n\n        if (leading && !isFirstCall) {\n          const flush = () => {\n            if (debounceTimerRef.current !== 0) {\n              clearTimeoutAndLeadingRef();\n              handleCallback(...args);\n            }\n          };\n\n          const cancel = () => {\n            clearTimeoutAndLeadingRef();\n          };\n\n          currentCallback.flush = flush;\n          currentCallback.cancel = cancel;\n\n          const resetLeadingState = () => {\n            clearTimeoutAndLeadingRef();\n          };\n          debounceTimerRef.current = window.setTimeout(resetLeadingState, delay);\n          return;\n        }\n\n        const flush = () => {\n          if (debounceTimerRef.current !== 0) {\n            clearTimeoutAndLeadingRef();\n            handleCallback(...args);\n          }\n        };\n\n        const cancel = () => {\n          clearTimeoutAndLeadingRef();\n        };\n\n        currentCallback.flush = flush;\n        currentCallback.cancel = cancel;\n        debounceTimerRef.current = window.setTimeout(flush, delay);\n      },\n      {\n        flush: () => {},\n        cancel: () => {},\n        _isFirstCall: true,\n      }\n    );\n    return currentCallback;\n  }, [handleCallback, delay, leading]);\n\n  useEffect(\n    () => () => {\n      if (flushOnUnmount) {\n        lastCallback.flush();\n      } else {\n        lastCallback.cancel();\n      }\n    },\n    [lastCallback, flushOnUnmount]\n  );\n\n  return lastCallback;\n}\n\nexport namespace useDebouncedCallback {\n  export type Options = UseDebouncedCallbackOptions;\n  export type ReturnValue<T extends (...args: any[]) => any> = UseDebouncedCallbackReturnValue<T>;\n}\n"],"mappings":";;;;AAaA,SAAgB,qBACd,UACA,SACA;CACA,MAAM,EAAE,OAAO,gBAAgB,YAC7B,OAAO,YAAY,WACf;EAAE,OAAO;EAAS,gBAAgB;EAAO,SAAS;EAAO,GACzD;CAEN,MAAM,iBAAiBA,yBAAAA,eAAe,SAAS;CAC/C,MAAM,oBAAA,GAAA,MAAA,QAA0B,EAAE;CAElC,MAAM,gBAAA,GAAA,MAAA,eAA6B;EACjC,MAAM,kBAAkB,OAAO,QAC5B,GAAG,SAAwB;AAC1B,UAAO,aAAa,iBAAiB,QAAQ;GAE7C,MAAM,cAAc,gBAAgB;AACpC,mBAAgB,eAAe;GAE/B,SAAS,4BAA4B;AACnC,WAAO,aAAa,iBAAiB,QAAQ;AAC7C,qBAAiB,UAAU;AAC3B,oBAAgB,eAAe;;AAGjC,OAAI,WAAW,aAAa;AAC1B,mBAAe,GAAG,KAAK;IAEvB,MAAM,0BAA0B;AAC9B,gCAA2B;;IAG7B,MAAM,cAAc;AAClB,SAAI,iBAAiB,YAAY,GAAG;AAClC,iCAA2B;AAC3B,qBAAe,GAAG,KAAK;;;IAI3B,MAAM,eAAe;AACnB,gCAA2B;;AAG7B,oBAAgB,QAAQ;AACxB,oBAAgB,SAAS;AACzB,qBAAiB,UAAU,OAAO,WAAW,mBAAmB,MAAM;AACtE;;AAGF,OAAI,WAAW,CAAC,aAAa;IAC3B,MAAM,cAAc;AAClB,SAAI,iBAAiB,YAAY,GAAG;AAClC,iCAA2B;AAC3B,qBAAe,GAAG,KAAK;;;IAI3B,MAAM,eAAe;AACnB,gCAA2B;;AAG7B,oBAAgB,QAAQ;AACxB,oBAAgB,SAAS;IAEzB,MAAM,0BAA0B;AAC9B,gCAA2B;;AAE7B,qBAAiB,UAAU,OAAO,WAAW,mBAAmB,MAAM;AACtE;;GAGF,MAAM,cAAc;AAClB,QAAI,iBAAiB,YAAY,GAAG;AAClC,gCAA2B;AAC3B,oBAAe,GAAG,KAAK;;;GAI3B,MAAM,eAAe;AACnB,+BAA2B;;AAG7B,mBAAgB,QAAQ;AACxB,mBAAgB,SAAS;AACzB,oBAAiB,UAAU,OAAO,WAAW,OAAO,MAAM;KAE5D;GACE,aAAa;GACb,cAAc;GACd,cAAc;GACf,CACF;AACD,SAAO;IACN;EAAC;EAAgB;EAAO;EAAQ,CAAC;AAEpC,EAAA,GAAA,MAAA,uBACc;AACV,MAAI,eACF,cAAa,OAAO;MAEpB,cAAa,QAAQ;IAGzB,CAAC,cAAc,eAAe,CAC/B;AAED,QAAO"}