{"version":3,"sources":["../../src/use-web-observer/index.ts"],"sourcesContent":["import { useEffect, useRef } from 'react'\nimport { useLatest } from '../use-latest'\nimport { usePausable } from '../use-pausable'\nimport { useSupported } from '../use-supported'\nimport { useTargetElement } from '../use-target-element'\nimport { noop } from '../utils/basic'\n\nimport type { MutableRefObject } from 'react'\nimport type { Pausable } from '../use-pausable'\nimport type { ElementTarget } from '../use-target-element'\n\nexport interface UseWebObserverOptions {\n  /**\n   * Start the observer immediate after calling this function\n   *\n   * @defaultValue true\n   */\n  immediate?: boolean\n  /**\n   * Additional `isSupported` judgement\n   */\n  supported?: () => boolean\n}\n\nexport interface UseWebObserverReturns<Observer> extends Pausable {\n  /**\n   * ref that holds the observer instance\n   */\n  observerRef: MutableRefObject<Observer | null>\n  /**\n   * Check if the observer is supported in the current environment\n   */\n  isSupported: boolean\n}\n\nexport type WebObserverType =\n  | 'IntersectionObserver'\n  | 'MutationObserver'\n  | 'ResizeObserver'\n  | 'PerformanceObserver'\n  | 'ReportingObserver'\n\n/**\n * A low level React Hooks that helps to use Observer with ease. Available Observer:\n *\n * ```tsx\n * export type WebObserverType =\n *   | 'IntersectionObserver'\n *   | 'MutationObserver'\n *   | 'ResizeObserver'\n *   | 'PerformanceObserver'\n *   | 'ReportingObserver'\n * ```\n *\n * You should **NOT** use this Hook directly, use the high level Hooks below instead:\n *\n * - [useIntersectionObserver](https://sheinsight.github.io/react-use/reference/use-intersection-observer)\n * - [useMutationObserver](https://sheinsight.github.io/react-use/reference/use-mutation-observer)\n * - [useResizeObserver](https://sheinsight.github.io/react-use/reference/use-resize-observer)\n * - [usePerformanceObserver](https://sheinsight.github.io/react-use/reference/use-performance-observer)\n * - [useReportingObserver](https://sheinsight.github.io/react-use/reference/use-reporting-observer)\n *\n */\nexport function useWebObserver(\n  observer: 'IntersectionObserver',\n  target: ElementTarget,\n  callback: IntersectionObserverCallback,\n  options?: UseWebObserverOptions,\n  initOptions?: IntersectionObserverInit,\n  observerOptions?: undefined,\n): UseWebObserverReturns<IntersectionObserver>\nexport function useWebObserver(\n  observer: 'MutationObserver',\n  target: ElementTarget,\n  callback: MutationCallback,\n  options?: UseWebObserverOptions,\n  initOptions?: undefined,\n  observerOptions?: MutationObserverInit,\n): UseWebObserverReturns<MutationObserver>\nexport function useWebObserver(\n  observer: 'ResizeObserver',\n  target: ElementTarget,\n  callback: ResizeObserverCallback,\n  options?: UseWebObserverOptions,\n  initOptions?: undefined,\n  observerOptions?: ResizeObserverOptions,\n): UseWebObserverReturns<ResizeObserver>\nexport function useWebObserver(\n  observer: 'PerformanceObserver',\n  target: undefined,\n  callback: PerformanceObserverCallback,\n  options?: UseWebObserverOptions,\n  initOptions?: undefined,\n  observerOptions?: PerformanceObserverInit,\n): UseWebObserverReturns<PerformanceObserver>\nexport function useWebObserver(\n  observer: 'ReportingObserver',\n  target: undefined,\n  callback: ReportingObserverCallback,\n  options?: UseWebObserverOptions,\n  initOptions?: ReportingObserverOptions,\n  observerOptions?: undefined,\n): UseWebObserverReturns<ReportingObserver>\nexport function useWebObserver(...args: any[]): any {\n  const [observer, target, callback, options = {}, initOptions = {}, observerOptions = {}] = args\n  const { immediate = true, supported = () => true } = options\n\n  const isSupported = useSupported(() => observer in window && latest.current.supported())\n  const observerRef = useRef<any | null>(null)\n\n  const stopObserver = () => {\n    if (observerRef.current) {\n      observerRef.current?.disconnect()\n      observerRef.current = null\n    }\n  }\n\n  const element = useTargetElement(target, {\n    onChange() {\n      pausable.pause()\n      pausable.resume()\n    },\n  })\n\n  const latest = useLatest({ supported, callback, initOptions, observerOptions })\n\n  const pausable = usePausable(false, stopObserver, (ref) => {\n    ref.current = false\n\n    const { initOptions, observerOptions } = latest.current\n\n    const hasNoElements = ['PerformanceObserver', 'ReportingObserver'].includes(observer)\n\n    if (element.current || hasNoElements) {\n      const Observer = window[observer] as any\n\n      if (!Observer) return\n\n      observerRef.current = new Observer((...args: any[]) => latest.current.callback(...args), initOptions)\n\n      if (element.current) {\n        observerRef.current?.observe(element.current, observerOptions)\n      } else {\n        observerRef.current?.observe(observerOptions)\n      }\n\n      ref.current = true\n    }\n  })\n\n  useEffect(() => {\n    if (immediate) {\n      pausable.resume()\n    }\n\n    return immediate ? () => pausable.pause() : noop\n  }, [immediate])\n\n  return {\n    ...pausable,\n    observerRef,\n    isSupported,\n  }\n}\n"],"names":["useWebObserver","args","observer","target","callback","options","initOptions","observerOptions","immediate","supported","isSupported","useSupported","window","latest","current","observerRef","useRef","stopObserver","disconnect","element","useTargetElement","onChange","pausable","pause","resume","useLatest","usePausable","ref","hasNoElements","includes","Observer","observe","useEffect","noop"],"mappings":";;;;+BAuGgBA;;;eAAAA;;;qBAvGkB;yBACR;2BACE;4BACC;gCACI;qBACZ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkGd,SAASA;IAAe,IAAA,IAAA,OAAA,UAAA,QAAA,AAAGC,OAAH,UAAA,OAAA,OAAA,GAAA,OAAA,MAAA;QAAGA,KAAH,QAAA,SAAA,CAAA,KAAc;;IAC3C,IAA2FA,yBAAAA,UAApFC,WAAoFD,UAA1EE,SAA0EF,UAAlEG,WAAkEH,UAAxDI,MAAwDJ,UAAxDI,UAAAA,iBAAU,CAAC,IAAXA,KAAcC,OAA0CL,UAA1CK,cAAAA,kBAAc,CAAC,IAAfA,MAAkBC,OAAwBN,UAAxBM,kBAAAA,kBAAkB,CAAC,IAAnBA;IACnE,yBAAqDF,QAA7CG,WAAAA,4CAAY,gDAAiCH,QAA3BI,WAAAA,4CAAY;eAAM;;IAE5C,IAAMC,cAAcC,IAAAA,0BAAY,EAAC;eAAMT,YAAYU,UAAUC,OAAOC,OAAO,CAACL,SAAS;;IACrF,IAAMM,cAAcC,IAAAA,aAAM,EAAa;IAEvC,IAAMC,eAAe;QACnB,IAAIF,YAAYD,OAAO,EAAE;gBACvBC;aAAAA,uBAAAA,YAAYD,OAAO,cAAnBC,2CAAAA,qBAAqBG,UAAU;YAC/BH,YAAYD,OAAO,GAAG;QACxB;IACF;IAEA,IAAMK,UAAUC,IAAAA,kCAAgB,EAACjB,QAAQ;QACvCkB,UAAAA,SAAAA;YACEC,SAASC,KAAK;YACdD,SAASE,MAAM;QACjB;IACF;IAEA,IAAMX,SAASY,IAAAA,oBAAS,EAAC;QAAEhB,WAAAA;QAAWL,UAAAA;QAAUE,aAAAA;QAAaC,iBAAAA;IAAgB;IAE7E,IAAMe,WAAWI,IAAAA,wBAAW,EAAC,OAAOT,cAAc,SAACU;QACjDA,IAAIb,OAAO,GAAG;QAEd,IAAyCD,kBAAAA,OAAOC,OAAO,EAA/CR,cAAiCO,gBAAjCP,aAAaC,kBAAoBM,gBAApBN;QAErB,IAAMqB,gBAAgB;YAAC;YAAuB;SAAoB,CAACC,QAAQ,CAAC3B;QAE5E,IAAIiB,QAAQL,OAAO,IAAIc,eAAe;gBAKmBf;YAJvD,IAAMiB,WAAWlB,MAAM,CAACV,SAAS;YAEjC,IAAI,CAAC4B,UAAU;YAEff,YAAYD,OAAO,GAAG,IAAIgB,SAAS;iDAAI7B;oBAAAA;;uBAAgBY,CAAAA,mBAAAA,OAAOC,OAAO,EAACV,QAAQ,OAAvBS,kBAAwB,qBAAGZ;eAAOK;YAEzF,IAAIa,QAAQL,OAAO,EAAE;oBACnBC;iBAAAA,uBAAAA,YAAYD,OAAO,cAAnBC,2CAAAA,qBAAqBgB,OAAO,CAACZ,QAAQL,OAAO,EAAEP;YAChD,OAAO;oBACLQ;iBAAAA,wBAAAA,YAAYD,OAAO,cAAnBC,4CAAAA,sBAAqBgB,OAAO,CAACxB;YAC/B;YAEAoB,IAAIb,OAAO,GAAG;QAChB;IACF;IAEAkB,IAAAA,gBAAS,EAAC;QACR,IAAIxB,WAAW;YACbc,SAASE,MAAM;QACjB;QAEA,OAAOhB,YAAY;mBAAMc,SAASC,KAAK;YAAKU,WAAI;IAClD,GAAG;QAACzB;KAAU;IAEd,OAAO,wCACFc;QACHP,aAAAA;QACAL,aAAAA;;AAEJ"}