UNPKG

tethysfaceid

Version:

1 lines 2.37 kB
{"ast":null,"code":"\"use strict\";\n\nvar _interopRequireDefault = require(\"@babel/runtime/helpers/interopRequireDefault\");\n\nexports.__esModule = true;\nexports.useIntersection = useIntersection;\n\nvar _react = require(\"react\");\n\nvar _requestIdleCallback = _interopRequireDefault(require(\"./request-idle-callback\"));\n\nconst hasIntersectionObserver = typeof IntersectionObserver !== 'undefined';\n\nfunction useIntersection({\n rootMargin,\n disabled\n}) {\n const isDisabled = disabled || !hasIntersectionObserver;\n const unobserve = (0, _react.useRef)();\n const [visible, setVisible] = (0, _react.useState)(false);\n const setRef = (0, _react.useCallback)(el => {\n if (unobserve.current) {\n unobserve.current();\n unobserve.current = undefined;\n }\n\n if (isDisabled || visible) return;\n\n if (el && el.tagName) {\n unobserve.current = observe(el, isVisible => isVisible && setVisible(isVisible), {\n rootMargin\n });\n }\n }, [isDisabled, rootMargin, visible]);\n (0, _react.useEffect)(() => {\n if (!hasIntersectionObserver) {\n if (!visible) (0, _requestIdleCallback.default)(() => setVisible(true));\n }\n }, [visible]);\n return [setRef, visible];\n}\n\nfunction observe(element, callback, options) {\n const {\n id,\n observer,\n elements\n } = createObserver(options);\n elements.set(element, callback);\n observer.observe(element);\n return function unobserve() {\n observer.unobserve(element); // Destroy observer when there's nothing left to watch:\n\n if (elements.size === 0) {\n observer.disconnect();\n observers.delete(id);\n }\n };\n}\n\nconst observers = new Map();\n\nfunction createObserver(options) {\n const id = options.rootMargin || '';\n let instance = observers.get(id);\n\n if (instance) {\n return instance;\n }\n\n const elements = new Map();\n const observer = new IntersectionObserver(entries => {\n entries.forEach(entry => {\n const callback = elements.get(entry.target);\n const isVisible = entry.isIntersecting || entry.intersectionRatio > 0;\n\n if (callback && isVisible) {\n callback(isVisible);\n }\n });\n }, options);\n observers.set(id, instance = {\n id,\n observer,\n elements\n });\n return instance;\n}","map":null,"metadata":{},"sourceType":"script"}