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.

128 lines (126 loc) 4.67 kB
"use strict"; 'use client'; var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard").default; Object.defineProperty(exports, "__esModule", { value: true }); exports.ComboboxClear = void 0; var React = _interopRequireWildcard(require("react")); var _store = require("@base-ui-components/utils/store"); var _ComboboxRootContext = require("../root/ComboboxRootContext"); var _useRenderElement = require("../../utils/useRenderElement"); var _store2 = require("../store"); var _useButton = require("../../use-button"); var _FieldRootContext = require("../../field/root/FieldRootContext"); var _useTransitionStatus = require("../../utils/useTransitionStatus"); var _stateAttributesMapping = require("../../utils/stateAttributesMapping"); var _useOpenChangeComplete = require("../../utils/useOpenChangeComplete"); var _createBaseUIEventDetails = require("../../utils/createBaseUIEventDetails"); var _popupStateMapping = require("../../utils/popupStateMapping"); const stateAttributesMapping = { ..._stateAttributesMapping.transitionStatusMapping, ..._popupStateMapping.triggerOpenStateMapping }; /** * Clears the value when clicked. * Renders a `<button>` element. */ const ComboboxClear = exports.ComboboxClear = /*#__PURE__*/React.forwardRef(function ComboboxClear(componentProps, forwardedRef) { const { render, className, disabled: disabledProp = false, nativeButton = true, keepMounted = false, ...elementProps } = componentProps; const { disabled: fieldDisabled } = (0, _FieldRootContext.useFieldRootContext)(); const store = (0, _ComboboxRootContext.useComboboxRootContext)(); const selectionMode = (0, _store.useStore)(store, _store2.selectors.selectionMode); const comboboxDisabled = (0, _store.useStore)(store, _store2.selectors.disabled); const readOnly = (0, _store.useStore)(store, _store2.selectors.readOnly); const clearRef = (0, _store.useStore)(store, _store2.selectors.clearRef); const open = (0, _store.useStore)(store, _store2.selectors.open); const selectedValue = (0, _store.useStore)(store, _store2.selectors.selectedValue); const inputValue = (0, _ComboboxRootContext.useComboboxInputValueContext)(); let visible = false; if (selectionMode === 'none') { visible = inputValue !== ''; } else if (selectionMode === 'single') { visible = selectedValue != null; } else { visible = Array.isArray(selectedValue) && selectedValue.length > 0; } const disabled = fieldDisabled || comboboxDisabled || disabledProp; const { buttonRef, getButtonProps } = (0, _useButton.useButton)({ native: nativeButton, disabled }); const { mounted, transitionStatus, setMounted } = (0, _useTransitionStatus.useTransitionStatus)(visible); const state = React.useMemo(() => ({ disabled, open, transitionStatus }), [disabled, open, transitionStatus]); (0, _useOpenChangeComplete.useOpenChangeComplete)({ open: visible, ref: clearRef, onComplete() { if (!visible) { setMounted(false); } } }); const element = (0, _useRenderElement.useRenderElement)('button', componentProps, { state, ref: [forwardedRef, buttonRef, clearRef], props: [{ tabIndex: -1, hidden: !mounted, children: 'x', disabled, 'aria-readonly': readOnly || undefined, // Avoid stealing focus from the input. onMouseDown(event) { event.preventDefault(); }, onClick(event) { if (disabled || readOnly) { return; } const keyboardActiveRef = store.state.keyboardActiveRef; store.state.setInputValue('', (0, _createBaseUIEventDetails.createChangeEventDetails)('clear-press', event.nativeEvent)); if (selectionMode !== 'none') { store.state.setSelectedValue(Array.isArray(selectedValue) ? [] : null, (0, _createBaseUIEventDetails.createChangeEventDetails)('clear-press', event.nativeEvent)); store.state.setIndices({ activeIndex: null, selectedIndex: null, type: keyboardActiveRef.current ? 'keyboard' : 'pointer' }); } else { store.state.setIndices({ activeIndex: null, type: keyboardActiveRef.current ? 'keyboard' : 'pointer' }); } store.state.inputRef.current?.focus(); } }, elementProps, getButtonProps], stateAttributesMapping }); const shouldRender = keepMounted || mounted; if (!shouldRender) { return null; } return element; }); if (process.env.NODE_ENV !== "production") ComboboxClear.displayName = "ComboboxClear";