@toolpad/utils
Version:
Shared utilities used by Toolpad packages.
1 lines • 2.86 kB
Source Map (JSON)
{"version":3,"sources":["../../src/hooks/useDebouncedHandler.ts"],"sourcesContent":["import * as React from 'react';\n\ninterface Handler<P extends unknown[]> {\n (...params: P): void;\n}\n\ninterface DelayedInvocation<P extends unknown[]> {\n startTime: number;\n timeout: NodeJS.Timeout;\n params: P;\n}\n\nfunction defer<P extends unknown[]>(\n fn: React.MutableRefObject<Handler<P>>,\n params: P,\n delay: number,\n) {\n const timeout = setTimeout(() => {\n fn.current(...params);\n }, delay);\n\n return { startTime: Date.now(), timeout, params };\n}\n\n/**\n * Creates a debounced version of the handler that is passed. The invocation of [fn] is\n * delayed for [delay] milliseconds from the last invocation of the debounced function.\n *\n * This implementation adds on the lodash implementation in that it handles updates to the\n * delay value.\n */\nexport default function useDebouncedHandler<P extends unknown[]>(\n fn: Handler<P>,\n delay: number,\n): Handler<P> {\n const fnRef = React.useRef(fn);\n React.useEffect(() => {\n fnRef.current = fn;\n }, [fn]);\n\n const delayedInvocation = React.useRef<DelayedInvocation<P> | null>(null);\n\n const clearCurrent = React.useCallback(() => {\n if (delayedInvocation.current) {\n clearTimeout(delayedInvocation.current.timeout);\n delayedInvocation.current = null;\n }\n }, []);\n\n React.useEffect(() => {\n if (!delayedInvocation.current) {\n return;\n }\n\n const { startTime, params } = delayedInvocation.current;\n\n const elapsed = Date.now() - startTime;\n const newDelay = Math.max(delay - elapsed, 0);\n\n clearCurrent();\n delayedInvocation.current = defer(fnRef, params, newDelay);\n }, [delay, clearCurrent]);\n\n return React.useCallback(\n (...params: P) => {\n clearCurrent();\n delayedInvocation.current = defer(fnRef, params, delay);\n },\n [delay, clearCurrent],\n );\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,YAAuB;AAYvB,SAAS,MACP,IACA,QACA,OACA;AACA,QAAM,UAAU,WAAW,MAAM;AAC/B,OAAG,QAAQ,GAAG,MAAM;AAAA,EACtB,GAAG,KAAK;AAER,SAAO,EAAE,WAAW,KAAK,IAAI,GAAG,SAAS,OAAO;AAClD;AASe,SAAR,oBACL,IACA,OACY;AACZ,QAAM,QAAc,aAAO,EAAE;AAC7B,EAAM,gBAAU,MAAM;AACpB,UAAM,UAAU;AAAA,EAClB,GAAG,CAAC,EAAE,CAAC;AAEP,QAAM,oBAA0B,aAAoC,IAAI;AAExE,QAAM,eAAqB,kBAAY,MAAM;AAC3C,QAAI,kBAAkB,SAAS;AAC7B,mBAAa,kBAAkB,QAAQ,OAAO;AAC9C,wBAAkB,UAAU;AAAA,IAC9B;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,EAAM,gBAAU,MAAM;AACpB,QAAI,CAAC,kBAAkB,SAAS;AAC9B;AAAA,IACF;AAEA,UAAM,EAAE,WAAW,OAAO,IAAI,kBAAkB;AAEhD,UAAM,UAAU,KAAK,IAAI,IAAI;AAC7B,UAAM,WAAW,KAAK,IAAI,QAAQ,SAAS,CAAC;AAE5C,iBAAa;AACb,sBAAkB,UAAU,MAAM,OAAO,QAAQ,QAAQ;AAAA,EAC3D,GAAG,CAAC,OAAO,YAAY,CAAC;AAExB,SAAa;AAAA,IACX,IAAI,WAAc;AAChB,mBAAa;AACb,wBAAkB,UAAU,MAAM,OAAO,QAAQ,KAAK;AAAA,IACxD;AAAA,IACA,CAAC,OAAO,YAAY;AAAA,EACtB;AACF;","names":[]}