UNPKG

design-react-kit

Version:

Componenti React per Bootstrap 5

1 lines 4.88 kB
{"version":3,"sources":["../../src/NavScroll/useSizeDetector.ts","../../src/NavScroll/debounce.ts"],"sourcesContent":["/*\n * This work derives from the React Use Navscroll library\n * Released under the MIT license by Marco Liberati\n * Code: https://github.com/dej611/react-use-navscroll\n */\n\nimport { useCallback, useEffect, useState } from 'react';\nimport { debounce } from './debounce';\nimport { useNavScrollArgs } from './types';\n\nconst DEFAULT_DELAY = 150;\n\nexport type useSizeDetectorArgs = Omit<useNavScrollArgs, 'offset'> & {\n activeId: string | null;\n hasWindow: boolean;\n setForceRecompute: (force: boolean) => void;\n updateActiveId: (id: string | null) => void;\n};\n\nexport const useSizeDetector = ({\n root,\n isHorizontal,\n activeId,\n onChange,\n setForceRecompute,\n updateActiveId,\n hasWindow\n}: useSizeDetectorArgs) => {\n const [targetSize, setTargetSize] = useState<number>(1);\n\n const useViewport =\n root == null ||\n (hasWindow && (isHorizontal ? window.innerWidth < root.clientWidth : window.innerHeight < root.clientHeight));\n\n const scrollEnd = useCallback(\n debounce(() => {\n setForceRecompute(true);\n }, DEFAULT_DELAY),\n [setForceRecompute]\n );\n\n useEffect(() => {\n if (!hasWindow) {\n return;\n }\n let observer: IntersectionObserver | null = null;\n\n const resizeWindowHandler = () => {\n setTimeout(() => {\n setTargetSize(isHorizontal ? window.innerWidth : window.innerHeight);\n }, DEFAULT_DELAY);\n };\n\n const resizeElementHandler: IntersectionObserverCallback = (entries) => {\n const [entry] = entries;\n if (!useViewport) {\n setTargetSize(isHorizontal ? entry.boundingClientRect.width : entry.boundingClientRect.height);\n }\n\n if (entry.intersectionRatio === 0) {\n if (activeId != null) {\n updateActiveId(null);\n if (onChange) {\n onChange({\n added: null,\n removed: activeId\n });\n }\n }\n }\n };\n\n addEventListener('scroll', scrollEnd);\n if (useViewport) {\n setTargetSize(isHorizontal ? window.innerWidth : window.innerHeight);\n addEventListener('resize', resizeWindowHandler);\n }\n if (root) {\n observer = new IntersectionObserver(resizeElementHandler);\n observer.observe(root);\n }\n return () => {\n if (observer) {\n observer.disconnect();\n }\n removeEventListener('resize', resizeWindowHandler);\n removeEventListener('scroll', scrollEnd);\n };\n }, [root, isHorizontal, activeId, onChange, useViewport, scrollEnd, hasWindow, updateActiveId]);\n return { targetSize, useViewport };\n};\n","/*\n * This work derives from the React Use Navscroll library\n * Released under the MIT license by Marco Liberati\n * Code: https://github.com/dej611/react-use-navscroll\n */\n\nexport const debounce = (callback: CallableFunction, wait: number) => {\n let timeoutId: NodeJS.Timeout;\n return (...args: unknown[]) => {\n clearTimeout(timeoutId);\n timeoutId = setTimeout(() => {\n callback(...args);\n }, wait);\n };\n};\n"],"mappings":"yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,qBAAAE,IAAA,eAAAC,EAAAH,GAMA,IAAAI,EAAiD,iBCA1C,IAAMC,EAAW,CAACC,EAA4BC,IAAiB,CACpE,IAAIC,EACJ,MAAO,IAAIC,IAAoB,CAC7B,aAAaD,CAAS,EACtBA,EAAY,WAAW,IAAM,CAC3BF,EAAS,GAAGG,CAAI,CAClB,EAAGF,CAAI,CACT,CACF,EDJA,IAAMG,EAAgB,IASTC,EAAkB,CAAC,CAC9B,KAAAC,EACA,aAAAC,EACA,SAAAC,EACA,SAAAC,EACA,kBAAAC,EACA,eAAAC,EACA,UAAAC,CACF,IAA2B,CACzB,GAAM,CAACC,EAAYC,CAAa,KAAI,YAAiB,CAAC,EAEhDC,EACJT,GAAQ,MACPM,IAAcL,EAAe,OAAO,WAAaD,EAAK,YAAc,OAAO,YAAcA,EAAK,cAE3FU,KAAY,eAChBC,EAAS,IAAM,CACbP,EAAkB,EAAI,CACxB,EAAGN,CAAa,EAChB,CAACM,CAAiB,CACpB,EAEA,sBAAU,IAAM,CACd,GAAI,CAACE,EACH,OAEF,IAAIM,EAAwC,KAEtCC,EAAsB,IAAM,CAChC,WAAW,IAAM,CACfL,EAAcP,EAAe,OAAO,WAAa,OAAO,WAAW,CACrE,EAAGH,CAAa,CAClB,EAEMgB,EAAsDC,GAAY,CACtE,GAAM,CAACC,CAAK,EAAID,EACXN,GACHD,EAAcP,EAAee,EAAM,mBAAmB,MAAQA,EAAM,mBAAmB,MAAM,EAG3FA,EAAM,oBAAsB,GAC1Bd,GAAY,OACdG,EAAe,IAAI,EACfF,GACFA,EAAS,CACP,MAAO,KACP,QAASD,CACX,CAAC,EAIT,EAEA,wBAAiB,SAAUQ,CAAS,EAChCD,IACFD,EAAcP,EAAe,OAAO,WAAa,OAAO,WAAW,EACnE,iBAAiB,SAAUY,CAAmB,GAE5Cb,IACFY,EAAW,IAAI,qBAAqBE,CAAoB,EACxDF,EAAS,QAAQZ,CAAI,GAEhB,IAAM,CACPY,GACFA,EAAS,WAAW,EAEtB,oBAAoB,SAAUC,CAAmB,EACjD,oBAAoB,SAAUH,CAAS,CACzC,CACF,EAAG,CAACV,EAAMC,EAAcC,EAAUC,EAAUM,EAAaC,EAAWJ,EAAWD,CAAc,CAAC,EACvF,CAAE,WAAAE,EAAY,YAAAE,CAAY,CACnC","names":["useSizeDetector_exports","__export","useSizeDetector","__toCommonJS","import_react","debounce","callback","wait","timeoutId","args","DEFAULT_DELAY","useSizeDetector","root","isHorizontal","activeId","onChange","setForceRecompute","updateActiveId","hasWindow","targetSize","setTargetSize","useViewport","scrollEnd","debounce","observer","resizeWindowHandler","resizeElementHandler","entries","entry"]}