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.

93 lines (92 loc) 3.54 kB
"use strict"; 'use client'; Object.defineProperty(exports, "__esModule", { value: true }); exports.useRadioRoot = useRadioRoot; var React = _interopRequireWildcard(require("react")); var _mergeReactProps = require("../../utils/mergeReactProps"); var _visuallyHidden = require("../../utils/visuallyHidden"); var _RadioGroupContext = require("../../radio-group/RadioGroupContext"); var _FieldRootContext = require("../../field/root/FieldRootContext"); 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 useRadioRoot(params) { const { disabled, readOnly, value, required } = params; const { checkedValue, setCheckedValue, onValueChange, touched, setTouched } = (0, _RadioGroupContext.useRadioGroupContext)(); const { setDirty, validityData, setTouched: setFieldTouched } = (0, _FieldRootContext.useFieldRootContext)(); const checked = checkedValue === value; const inputRef = React.useRef(null); const getRootProps = React.useCallback((externalProps = {}) => (0, _mergeReactProps.mergeReactProps)(externalProps, { role: 'radio', type: 'button', 'aria-checked': checked, 'aria-required': required || undefined, 'aria-disabled': disabled || undefined, 'aria-readonly': readOnly || undefined, disabled, onKeyDown(event) { if (event.key === 'Enter') { event.preventDefault(); } }, onClick(event) { if (event.defaultPrevented || disabled || readOnly) { return; } event.preventDefault(); inputRef.current?.click(); }, onFocus(event) { if (event.defaultPrevented || disabled || readOnly || !touched) { return; } inputRef.current?.click(); setTouched(false); } }), [checked, disabled, readOnly, required, touched, setTouched]); const getInputProps = React.useCallback((externalProps = {}) => (0, _mergeReactProps.mergeReactProps)(externalProps, { type: 'radio', ref: inputRef, tabIndex: -1, style: _visuallyHidden.visuallyHidden, 'aria-hidden': true, disabled, checked, required, readOnly, onChange(event) { // Workaround for https://github.com/facebook/react/issues/9023 if (event.nativeEvent.defaultPrevented) { return; } if (disabled || readOnly || value == null) { return; } setFieldTouched(true); setDirty(value !== validityData.initialValue); setCheckedValue(value); onValueChange?.(value, event.nativeEvent); } }), [disabled, checked, required, readOnly, value, setFieldTouched, setDirty, validityData.initialValue, setCheckedValue, onValueChange]); return React.useMemo(() => ({ checked, getRootProps, getInputProps }), [checked, getRootProps, getInputProps]); }