@base-ui-components/react
Version:
Base UI is a library of headless ('unstyled') React components and low-level hooks. You gain complete control over your app's CSS and accessibility features.
129 lines (128 loc) • 5.41 kB
JavaScript
;
'use client';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useDialogRoot = useDialogRoot;
var React = _interopRequireWildcard(require("react"));
var _react2 = require("@floating-ui/react");
var _useControlled = require("../../utils/useControlled");
var _useEventCallback = require("../../utils/useEventCallback");
var _useTransitionStatus = require("../../utils/useTransitionStatus");
var _useOpenInteractionType = require("../../utils/useOpenInteractionType");
var _mergeReactProps = require("../../utils/mergeReactProps");
var _useAfterExitAnimation = require("../../utils/useAfterExitAnimation");
var _translateOpenChangeReason = require("../../utils/translateOpenChangeReason");
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
function useDialogRoot(parameters) {
const {
defaultOpen,
dismissible,
modal,
onNestedDialogClose,
onNestedDialogOpen,
onOpenChange: onOpenChangeParameter,
open: openParam
} = parameters;
const [open, setOpenUnwrapped] = (0, _useControlled.useControlled)({
controlled: openParam,
default: defaultOpen,
name: 'DialogRoot',
state: 'open'
});
const popupRef = React.useRef(null);
const [titleElementId, setTitleElementId] = React.useState(undefined);
const [descriptionElementId, setDescriptionElementId] = React.useState(undefined);
const [triggerElement, setTriggerElement] = React.useState(null);
const [popupElement, setPopupElement] = React.useState(null);
const [popupElementId, setPopupElementId] = React.useState(undefined);
const {
mounted,
setMounted,
transitionStatus
} = (0, _useTransitionStatus.useTransitionStatus)(open);
const setOpen = (0, _useEventCallback.useEventCallback)((nextOpen, event, reason) => {
onOpenChangeParameter?.(nextOpen, event, reason);
setOpenUnwrapped(nextOpen);
});
(0, _useAfterExitAnimation.useAfterExitAnimation)({
open,
animatedElementRef: popupRef,
onFinished: () => setMounted(false)
});
const handleFloatingUIOpenChange = (nextOpen, event, reason) => {
setOpen(nextOpen, event, (0, _translateOpenChangeReason.translateOpenChangeReason)(reason));
};
const context = (0, _react2.useFloatingRootContext)({
elements: {
reference: triggerElement,
floating: popupElement
},
open,
onOpenChange: handleFloatingUIOpenChange
});
const [ownNestedOpenDialogs, setOwnNestedOpenDialogs] = React.useState(0);
const isTopmost = ownNestedOpenDialogs === 0;
const click = (0, _react2.useClick)(context);
const dismiss = (0, _react2.useDismiss)(context, {
outsidePressEvent: 'mousedown',
outsidePress: isTopmost && dismissible,
escapeKey: isTopmost
});
const {
getReferenceProps,
getFloatingProps
} = (0, _react2.useInteractions)([click, dismiss]);
React.useEffect(() => {
if (onNestedDialogOpen && open) {
onNestedDialogOpen(ownNestedOpenDialogs);
}
if (onNestedDialogClose && !open) {
onNestedDialogClose();
}
return () => {
if (onNestedDialogClose && open) {
onNestedDialogClose();
}
if (onNestedDialogOpen && !open) {
onNestedDialogOpen(ownNestedOpenDialogs);
}
};
}, [open, onNestedDialogClose, onNestedDialogOpen, ownNestedOpenDialogs]);
const handleNestedDialogOpen = React.useCallback(ownChildrenCount => {
setOwnNestedOpenDialogs(ownChildrenCount + 1);
}, []);
const handleNestedDialogClose = React.useCallback(() => {
setOwnNestedOpenDialogs(0);
}, []);
const {
openMethod,
triggerProps
} = (0, _useOpenInteractionType.useOpenInteractionType)(open);
return React.useMemo(() => {
return {
modal,
setOpen,
open,
titleElementId,
setTitleElementId,
descriptionElementId,
setDescriptionElementId,
popupElementId,
setPopupElementId,
onNestedDialogOpen: handleNestedDialogOpen,
onNestedDialogClose: handleNestedDialogClose,
nestedOpenDialogCount: ownNestedOpenDialogs,
openMethod,
mounted,
transitionStatus,
getTriggerProps: externalProps => getReferenceProps((0, _mergeReactProps.mergeReactProps)(externalProps, triggerProps)),
getPopupProps: getFloatingProps,
setTriggerElement,
setPopupElement,
popupRef,
floatingRootContext: context
};
}, [modal, open, setOpen, titleElementId, descriptionElementId, popupElementId, handleNestedDialogClose, handleNestedDialogOpen, ownNestedOpenDialogs, openMethod, mounted, transitionStatus, getReferenceProps, getFloatingProps, setTriggerElement, setPopupElement, triggerProps, popupRef, context]);
}