UNPKG

@mantine/hooks

Version:

A collection of 50+ hooks for state and UI management

1 lines 5.08 kB
{"version":3,"file":"use-debounced-callback.mjs","names":[],"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,iBAAiB,eAAe,SAAS;CAC/C,MAAM,mBAAmB,OAAO,EAAE;CAElC,MAAM,eAAe,cAAc;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,uBACc;AACV,MAAI,eACF,cAAa,OAAO;MAEpB,cAAa,QAAQ;IAGzB,CAAC,cAAc,eAAe,CAC/B;AAED,QAAO"}