UNPKG

@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
"use strict"; '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]); }