@shopify/polaris
Version:
Shopify’s product component library
98 lines (88 loc) • 2.66 kB
JavaScript
import React$1, { useRef, useState } from 'react';
import { useFeatures } from '../../utilities/features/hooks.js';
import { useUniqueId } from '../../utilities/unique-id/hooks.js';
import { classNames } from '../../utilities/css.js';
import { useToggle as useToggle$1 } from '../../utilities/use-toggle.js';
import { Choice as Choice$1, helpTextID } from '../Choice/Choice.js';
import styles from './RadioButton.scss.js';
function RadioButton({
ariaDescribedBy: ariaDescribedByProp,
label,
labelHidden,
helpText,
checked,
disabled,
onChange,
onFocus,
onBlur,
id: idProp,
name: nameProp,
value
}) {
var id = useUniqueId('RadioButton', idProp);
var name = nameProp || id;
var inputNode = useRef(null);
var [keyFocused, setKeyFocused] = useState(false);
var {
newDesignLanguage
} = useFeatures();
var {
value: mouseOver,
setTrue: handleMouseOver,
setFalse: handleMouseOut
} = useToggle$1(false);
var handleKeyUp = () => {
!keyFocused && setKeyFocused(true);
};
var handleBlur = () => {
onBlur && onBlur();
setKeyFocused(false);
};
function handleChange({
currentTarget
}) {
onChange && onChange(currentTarget.checked, id);
}
var describedBy = [];
if (helpText) {
describedBy.push(helpTextID(id));
}
if (ariaDescribedByProp) {
describedBy.push(ariaDescribedByProp);
}
var ariaDescribedBy = describedBy.length ? describedBy.join(' ') : undefined;
var inputClassName = classNames(styles.Input, newDesignLanguage && keyFocused && styles.keyFocused);
var wrapperClassName = classNames(styles.RadioButton, newDesignLanguage && styles.newDesignLanguage);
var iconMarkup = !newDesignLanguage && /*#__PURE__*/React$1.createElement("span", {
className: styles.Icon
});
var backdropClassName = classNames(styles.Backdrop, mouseOver && styles.hover);
return /*#__PURE__*/React$1.createElement(Choice$1, {
label: label,
labelHidden: labelHidden,
disabled: disabled,
id: id,
helpText: helpText,
onMouseOver: handleMouseOver,
onMouseOut: handleMouseOut
}, /*#__PURE__*/React$1.createElement("span", {
className: wrapperClassName
}, /*#__PURE__*/React$1.createElement("input", {
id: id,
name: name,
value: value,
type: "radio",
checked: checked,
disabled: disabled,
className: inputClassName,
onChange: handleChange,
onFocus: onFocus,
onKeyUp: handleKeyUp,
onBlur: handleBlur,
"aria-describedby": ariaDescribedBy,
ref: inputNode
}), /*#__PURE__*/React$1.createElement("span", {
className: backdropClassName
}), iconMarkup));
}
export { RadioButton };