{"version":3,"file":"use-debounced-value.mjs","names":[],"sources":["../../src/use-debounced-value/use-debounced-value.ts"],"sourcesContent":["import { useCallback, useEffect, useRef, useState } from 'react';\n\nexport interface UseDebouncedValueOptions {\n  leading?: boolean;\n}\n\nexport interface UseDebouncedValueHandlers {\n  cancel: () => void;\n  flush: () => void;\n}\n\nexport type UseDebouncedValueReturnValue<T> = [T, () => void, UseDebouncedValueHandlers];\n\nexport function useDebouncedValue<T = any>(\n  value: T,\n  wait: number,\n  options: UseDebouncedValueOptions = { leading: false }\n): UseDebouncedValueReturnValue<T> {\n  const [_value, setValue] = useState(value);\n  const mountedRef = useRef(false);\n  const timeoutRef = useRef<number | null>(null);\n  const cooldownRef = useRef(false);\n\n  const latestValueRef = useRef(value);\n  latestValueRef.current = value;\n\n  const cancel = useCallback(() => {\n    window.clearTimeout(timeoutRef.current!);\n    timeoutRef.current = null;\n    cooldownRef.current = false;\n  }, []);\n\n  const flush = useCallback(() => {\n    if (timeoutRef.current) {\n      cancel();\n      cooldownRef.current = false;\n      setValue(latestValueRef.current);\n    }\n  }, []);\n\n  useEffect(() => {\n    if (mountedRef.current) {\n      if (!cooldownRef.current && options.leading) {\n        cooldownRef.current = true;\n        setValue(value);\n        timeoutRef.current = window.setTimeout(() => {\n          cooldownRef.current = false;\n        }, wait);\n      } else {\n        cancel();\n        timeoutRef.current = window.setTimeout(() => {\n          cooldownRef.current = false;\n          setValue(value);\n        }, wait);\n      }\n    }\n  }, [value, options.leading, wait]);\n\n  useEffect(() => {\n    mountedRef.current = true;\n    return cancel;\n  }, []);\n\n  return [_value, cancel, { cancel, flush }];\n}\n\nexport namespace useDebouncedValue {\n  export type Handlers = UseDebouncedValueHandlers;\n  export type Options = UseDebouncedValueOptions;\n  export type ReturnValue<T> = UseDebouncedValueReturnValue<T>;\n}\n"],"mappings":";;;AAaA,SAAgB,kBACd,OACA,MACA,UAAoC,EAAE,SAAS,MAAM,GACpB;CACjC,MAAM,CAAC,QAAQ,YAAY,SAAS,KAAK;CACzC,MAAM,aAAa,OAAO,KAAK;CAC/B,MAAM,aAAa,OAAsB,IAAI;CAC7C,MAAM,cAAc,OAAO,KAAK;CAEhC,MAAM,iBAAiB,OAAO,KAAK;CACnC,eAAe,UAAU;CAEzB,MAAM,SAAS,kBAAkB;EAC/B,OAAO,aAAa,WAAW,OAAQ;EACvC,WAAW,UAAU;EACrB,YAAY,UAAU;CACxB,GAAG,CAAC,CAAC;CAEL,MAAM,QAAQ,kBAAkB;EAC9B,IAAI,WAAW,SAAS;GACtB,OAAO;GACP,YAAY,UAAU;GACtB,SAAS,eAAe,OAAO;EACjC;CACF,GAAG,CAAC,CAAC;CAEL,gBAAgB;EACd,IAAI,WAAW,SACb,IAAI,CAAC,YAAY,WAAW,QAAQ,SAAS;GAC3C,YAAY,UAAU;GACtB,SAAS,KAAK;GACd,WAAW,UAAU,OAAO,iBAAiB;IAC3C,YAAY,UAAU;GACxB,GAAG,IAAI;EACT,OAAO;GACL,OAAO;GACP,WAAW,UAAU,OAAO,iBAAiB;IAC3C,YAAY,UAAU;IACtB,SAAS,KAAK;GAChB,GAAG,IAAI;EACT;CAEJ,GAAG;EAAC;EAAO,QAAQ;EAAS;CAAI,CAAC;CAEjC,gBAAgB;EACd,WAAW,UAAU;EACrB,OAAO;CACT,GAAG,CAAC,CAAC;CAEL,OAAO;EAAC;EAAQ;EAAQ;GAAE;GAAQ;EAAM;CAAC;AAC3C"}