UNPKG

@shopify/polaris

Version:

Shopify’s product component library

98 lines (88 loc) 2.66 kB
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 };