UNPKG

@fluentui/react

Version:

Reusable React components for building web experiences.

93 lines 5.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ChoiceGroupBase = void 0; var tslib_1 = require("tslib"); var React = require("react"); var Label_1 = require("../../Label"); var Utilities_1 = require("../../Utilities"); var index_1 = require("./ChoiceGroupOption/index"); var react_hooks_1 = require("@fluentui/react-hooks"); var getClassNames = Utilities_1.classNamesFunction(); var getOptionId = function (option, id) { return id + "-" + option.key; }; var findOption = function (options, key) { return key === undefined ? undefined : Utilities_1.find(options, function (value) { return value.key === key; }); }; var useComponentRef = function (options, keyChecked, id, componentRef) { React.useImperativeHandle(componentRef, function () { return ({ get checkedOption() { return findOption(options, keyChecked); }, focus: function () { var optionToFocus = findOption(options, keyChecked) || options.filter(function (option) { return !option.disabled; })[0]; var elementToFocus = optionToFocus && document.getElementById(getOptionId(optionToFocus, id)); if (elementToFocus) { elementToFocus.focus(); Utilities_1.setFocusVisibility(true, elementToFocus); } }, }); }, [options, keyChecked, id]); }; var COMPONENT_NAME = 'ChoiceGroup'; exports.ChoiceGroupBase = React.forwardRef(function (props, forwardedRef) { var className = props.className, theme = props.theme, styles = props.styles, _a = props.options, options = _a === void 0 ? [] : _a, label = props.label, required = props.required, disabled = props.disabled, name = props.name, defaultSelectedKey = props.defaultSelectedKey, componentRef = props.componentRef, onChange = props.onChange; var id = react_hooks_1.useId('ChoiceGroup'); var labelId = react_hooks_1.useId('ChoiceGroupLabel'); var divProps = Utilities_1.getNativeProps(props, Utilities_1.divProperties, [ 'onChange', 'className', 'required', ]); var classNames = getClassNames(styles, { theme: theme, className: className, optionsContainIconOrImage: options.some(function (option) { return !!(option.iconProps || option.imageSrc); }), }); var ariaLabelledBy = props.ariaLabelledBy || (label ? labelId : props['aria-labelledby']); var _b = react_hooks_1.useControllableValue(props.selectedKey, defaultSelectedKey), keyChecked = _b[0], setKeyChecked = _b[1]; var _c = React.useState(), keyFocused = _c[0], setKeyFocused = _c[1]; useDebugWarnings(props); useComponentRef(options, keyChecked, id, componentRef); var onFocus = React.useCallback(function (ev, option) { var _a; if (option) { setKeyFocused(option.itemKey); (_a = option.onFocus) === null || _a === void 0 ? void 0 : _a.call(option, ev); } }, []); var onBlur = React.useCallback(function (ev, option) { var _a; setKeyFocused(undefined); (_a = option === null || option === void 0 ? void 0 : option.onBlur) === null || _a === void 0 ? void 0 : _a.call(option, ev); }, []); var onOptionChange = React.useCallback(function (evt, option) { var _a; if (!option) { return; } setKeyChecked(option.itemKey); (_a = option.onChange) === null || _a === void 0 ? void 0 : _a.call(option, evt); onChange === null || onChange === void 0 ? void 0 : onChange(evt, findOption(options, option.itemKey)); }, [onChange, options, setKeyChecked]); return (React.createElement("div", tslib_1.__assign({ className: classNames.root }, divProps, { ref: forwardedRef }), React.createElement("div", tslib_1.__assign({ role: "radiogroup" }, (ariaLabelledBy && { 'aria-labelledby': ariaLabelledBy })), label && (React.createElement(Label_1.Label, { className: classNames.label, required: required, id: labelId, disabled: disabled }, label)), React.createElement("div", { className: classNames.flexContainer }, options.map(function (option) { return (React.createElement(index_1.ChoiceGroupOption, tslib_1.__assign({ itemKey: option.key }, option, { key: option.key, onBlur: onBlur, onFocus: onFocus, onChange: onOptionChange, focused: option.key === keyFocused, checked: option.key === keyChecked, disabled: option.disabled || disabled, id: getOptionId(option, id), labelId: option.labelId || labelId + "-" + option.key, name: name || id, required: required }))); }))))); }); exports.ChoiceGroupBase.displayName = COMPONENT_NAME; function useDebugWarnings(props) { if (process.env.NODE_ENV !== 'production') { // eslint-disable-next-line react-hooks/rules-of-hooks -- build-time conditional react_hooks_1.useWarnings({ name: COMPONENT_NAME, props: props, mutuallyExclusive: { selectedKey: 'defaultSelectedKey', }, }); } } //# sourceMappingURL=ChoiceGroup.base.js.map