UNPKG

@mantine/core

Version:

React components library focused on usability, accessibility and developer experience

76 lines (75 loc) 2.7 kB
"use client"; const require_DirectionProvider = require("../../core/DirectionProvider/DirectionProvider.cjs"); let react = require("react"); let _floating_ui_react = require("@floating-ui/react"); //#region packages/@mantine/core/src/components/Cascader/use-cascader-safe-area.ts function useCascaderSafeArea({ safeAreaPolygon, onFlush }) { const { dir } = require_DirectionProvider.useDirection(); const enabled = Boolean(safeAreaPolygon); const optionsRef = (0, react.useRef)(void 0); optionsRef.current = typeof safeAreaPolygon === "object" ? safeAreaPolygon : void 0; const dirRef = (0, react.useRef)(dir); dirRef.current = dir; const onFlushRef = (0, react.useRef)(onFlush); onFlushRef.current = onFlush; const blockedLevelRef = (0, react.useRef)(null); const pendingRef = (0, react.useRef)(null); const cleanupRef = (0, react.useRef)(() => {}); const generationRef = (0, react.useRef)(0); const disarm = (0, react.useCallback)(() => { generationRef.current += 1; cleanupRef.current(); cleanupRef.current = () => {}; blockedLevelRef.current = null; pendingRef.current = null; }, []); const arm = (0, react.useCallback)(({ level, reference, floating, clientX, clientY }) => { disarm(); const generation = generationRef.current; const ownerDocument = floating.ownerDocument; const handleMouseMove = (0, _floating_ui_react.safePolygon)(optionsRef.current)({ x: clientX, y: clientY, placement: dirRef.current === "rtl" ? "left-start" : "right-start", elements: { domReference: reference, floating }, onClose: () => { if (generationRef.current !== generation) return; const pending = pendingRef.current; pendingRef.current = null; disarm(); if (pending) onFlushRef.current(pending.level, pending.option); } }); blockedLevelRef.current = level; ownerDocument.addEventListener("mousemove", handleMouseMove); cleanupRef.current = () => ownerDocument.removeEventListener("mousemove", handleMouseMove); }, [disarm]); (0, react.useEffect)(() => disarm, [disarm]); (0, react.useEffect)(() => { if (!enabled) disarm(); }, [enabled, disarm]); const isBlocked = (level) => blockedLevelRef.current !== null && level <= blockedLevelRef.current; const setPending = (level, option) => { pendingRef.current = { level, option }; }; const clearPending = (level, option) => { if (pendingRef.current?.level === level && pendingRef.current?.option.value === option.value) pendingRef.current = null; }; return { enabled, arm, disarm, isBlocked, setPending, clearPending }; } //#endregion exports.useCascaderSafeArea = useCascaderSafeArea; //# sourceMappingURL=use-cascader-safe-area.cjs.map