{"version":3,"file":"useIO.mjs","sources":[""],"sourcesContent":["import type { RefObject } from \"react\";\r\nimport { useState, useLayoutEffect } from \"react\";\r\nimport { getDocument } from \"ssr-window\";\r\nimport { getElRefHelper } from \"./getElRefHelper\";\r\n\r\nexport interface IUseIOProps {\r\n  /** Функция, вызываемая при попадании элемента во viewPort */\r\n   \r\n  callback: IntersectionObserverCallback;\r\n  /** Референс элемента */\r\n  ref?: RefObject<Element | null>;\r\n  /** Массив зависимостей */\r\n  deps?: unknown[];\r\n  /** Конфигурация наблюдателя */\r\n   \r\n  options?: IntersectionObserverInit;\r\n}\r\n\r\nexport interface IUseIOReturn {\r\n  /** Экземпляр IntersectionObserver */\r\n  observer: IntersectionObserver | null;\r\n  /** Функция для установки наблюдателя */\r\n  setObserver: (observer: IntersectionObserver | null) => void;\r\n}\r\n\r\n/**\n * Добавляет `IntersectionObserver` для компонента\n * @returns {IUseIOReturn} Возвращает созданный `IntersectionObserver` (или `null`) и функцию `setObserver` для ручного обновления экземпляра.\n * @example\n * import { useRef } from \"react\";\r\n * import { useIO } from \"@delement/ui/utils/react\";\r\n *\r\n * const App = () => {\r\n *\r\n *   const ref = useRef(null);\r\n *   const { observer, setObserver } = useIO({ ref, callback: (e) => console.debug(e) });\r\n *\r\n *   useEffect(() => {\r\n *     if (observer) {\r\n *        observer.observe(ref.current);\r\n *        return () => observer.unobserve(ref.current);\r\n *     }\r\n *   }, [ observer ]);\r\n *\r\n *   return <div ref={ref} />\r\n * }\r\n */\r\nexport const useIO = (props: IUseIOProps): IUseIOReturn => {\r\n\r\n  const {\r\n    callback,\r\n    ref,\r\n    deps = [],\r\n    options = {\r\n      threshold: 0,\r\n      rootMargin: \"0px\",\r\n    },\r\n  } = props || {};\r\n\r\n  const [ observer, setObserver ] = useState<IntersectionObserver | null>(null);\r\n\r\n  useLayoutEffect(() => {\n    const root = getElRefHelper(ref) || getDocument();\n    if (root && typeof callback === \"function\" && typeof IntersectionObserver !== \"undefined\") {\n       \r\n      const params: IntersectionObserverInit = {\r\n        root: root as Element | Document | null,\r\n        ...options,\r\n      };\r\n      const IO = new IntersectionObserver(callback, params);\n      setObserver(IO);\n      return () => IO.disconnect();\n    }\n  }, deps);\n\r\n  return { observer, setObserver };\r\n};\r\n"],"names":["useIO","props","callback","ref","deps","options","threshold","rootMargin","observer","setObserver","useState","useLayoutEffect","root","getElRefHelper","getDocument","IntersectionObserver","params","IO","disconnect"],"mappings":";;;;;;;;;;;;;;;;;;;;;;GA+CO,MAAMA,MAASC,QAEpB,MAAMC,SACJA,SAAQC,IACRA,IAAGC,KACHA,KAAO,GAAEC,QACTA,QAAU,CACRC,UAAW,EACXC,WAAY,QAEZN,OAAS,CAAA,EAEb,MAAQO,SAAUC,aAAgBC,SAAsC,MAExEC,gBAAgB,KACd,MAAMC,KAAOC,eAAeV,MAAQW,cACpC,GAAIF,aAAeV,WAAa,mBAAqBa,uBAAyB,YAAa,CAEzF,MAAMC,OAAmC,CACvCJ,KAAMA,QACHP,SAEL,MAAMY,GAAK,IAAIF,qBAAqBb,SAAUc,QAC9CP,YAAYQ,IACZ,MAAO,IAAMA,GAAGC,YAClB,GACCd,MAEH,MAAO,CAAEI,kBAAUC"}