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.

78 lines (77 loc) 3.29 kB
"use strict"; 'use client'; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default; Object.defineProperty(exports, "__esModule", { value: true }); exports.DialogTrigger = void 0; var _formatErrorMessage2 = _interopRequireDefault(require("@base-ui-components/utils/formatErrorMessage")); var React = _interopRequireWildcard(require("react")); var _DialogRootContext = require("../root/DialogRootContext"); var _useButton = require("../../use-button/useButton"); var _useRenderElement = require("../../utils/useRenderElement"); var _popupStateMapping = require("../../utils/popupStateMapping"); var _constants = require("../../utils/constants"); var _popups = require("../../utils/popups"); var _useBaseUiId = require("../../utils/useBaseUiId"); var _floatingUiReact = require("../../floating-ui-react"); /** * A button that opens the dialog. * Renders a `<button>` element. * * Documentation: [Base UI Dialog](https://base-ui.com/react/components/dialog) */ const DialogTrigger = exports.DialogTrigger = /*#__PURE__*/React.forwardRef(function DialogTrigger(componentProps, forwardedRef) { const { render, className, disabled = false, nativeButton = true, id: idProp, payload, handle, ...elementProps } = componentProps; const dialogRootContext = (0, _DialogRootContext.useDialogRootContext)(true); const store = handle?.store ?? dialogRootContext?.store; if (!store) { throw /* FIXME (minify-errors-in-prod): Unminifyable error in production! */new Error(process.env.NODE_ENV !== "production" ? 'Base UI: <Dialog.Trigger> must be used within <Dialog.Root> or provided with a handle.' : (0, _formatErrorMessage2.default)(79)); } const thisTriggerId = (0, _useBaseUiId.useBaseUiId)(idProp); const floatingContext = store.useState('floatingRootContext'); const isOpenedByThisTrigger = store.useState('isOpenedByTrigger', thisTriggerId); const [triggerElement, setTriggerElement] = React.useState(null); const { registerTrigger, isMountedByThisTrigger } = (0, _popups.useTriggerDataForwarding)(thisTriggerId, triggerElement, store, { payload }); const { getButtonProps, buttonRef } = (0, _useButton.useButton)({ disabled, native: nativeButton }); const click = (0, _floatingUiReact.useClick)(floatingContext, { enabled: floatingContext != null }); const localInteractionProps = (0, _floatingUiReact.useInteractions)([click]); const state = React.useMemo(() => ({ disabled, open: isOpenedByThisTrigger }), [disabled, isOpenedByThisTrigger]); const rootTriggerProps = store.useState('triggerProps', isMountedByThisTrigger); return (0, _useRenderElement.useRenderElement)('button', componentProps, { state, ref: [buttonRef, forwardedRef, registerTrigger, setTriggerElement], props: [localInteractionProps.getReferenceProps(), rootTriggerProps, { [_constants.CLICK_TRIGGER_IDENTIFIER]: '', id: thisTriggerId }, elementProps, getButtonProps], stateAttributesMapping: _popupStateMapping.triggerOpenStateMapping }); }); if (process.env.NODE_ENV !== "production") DialogTrigger.displayName = "DialogTrigger";