/** * External dependencies */ import PropTypes from 'prop-types'; import { Fragment } from 'react'; import classNames from 'classnames'; /** * Component used to render an accessible text given a label and/or a * screenReaderLabel. The wrapper element and wrapper props can also be * specified via props. */ const Label = ( { label, screenReaderLabel, wrapperElement, wrapperProps, } ) => { let Wrapper; const hasLabel = typeof label !== 'undefined' && label !== null; const hasScreenReaderLabel = typeof screenReaderLabel !== 'undefined' && screenReaderLabel !== null; if ( ! hasLabel && hasScreenReaderLabel ) { Wrapper = wrapperElement || 'span'; wrapperProps = { ...wrapperProps, className: classNames( wrapperProps.className, 'screen-reader-text' ), }; return { screenReaderLabel }; } Wrapper = wrapperElement || Fragment; if ( hasLabel && hasScreenReaderLabel && label !== screenReaderLabel ) { return ( { screenReaderLabel } ); } return { label }; }; Label.propTypes = { label: PropTypes.node, screenReaderLabel: PropTypes.node, wrapperElement: PropTypes.elementType, wrapperProps: PropTypes.object, }; Label.defaultProps = { wrapperProps: {}, }; export default Label;