@mantine/core
Version:
React components library focused on usability, accessibility and developer experience
76 lines (75 loc) • 2.7 kB
JavaScript
"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