UNPKG

@mantine/core

Version:

React components library focused on usability, accessibility and developer experience

76 lines (75 loc) 2.51 kB
"use client"; import { useDirection } from "../../core/DirectionProvider/DirectionProvider.mjs"; import { useCallback, useEffect, useRef } from "react"; import { safePolygon } from "@floating-ui/react"; //#region packages/@mantine/core/src/components/Cascader/use-cascader-safe-area.ts function useCascaderSafeArea({ safeAreaPolygon, onFlush }) { const { dir } = useDirection(); const enabled = Boolean(safeAreaPolygon); const optionsRef = useRef(void 0); optionsRef.current = typeof safeAreaPolygon === "object" ? safeAreaPolygon : void 0; const dirRef = useRef(dir); dirRef.current = dir; const onFlushRef = useRef(onFlush); onFlushRef.current = onFlush; const blockedLevelRef = useRef(null); const pendingRef = useRef(null); const cleanupRef = useRef(() => {}); const generationRef = useRef(0); const disarm = useCallback(() => { generationRef.current += 1; cleanupRef.current(); cleanupRef.current = () => {}; blockedLevelRef.current = null; pendingRef.current = null; }, []); const arm = useCallback(({ level, reference, floating, clientX, clientY }) => { disarm(); const generation = generationRef.current; const ownerDocument = floating.ownerDocument; const handleMouseMove = 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]); useEffect(() => disarm, [disarm]); 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 export { useCascaderSafeArea }; //# sourceMappingURL=use-cascader-safe-area.mjs.map