Return

All tests / src/components/SearchInput index.tsx

100% Statements 8/8
100% Branches 4/4
100% Functions 1/1
100% Lines 7/7

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 632x 2x 2x                                               2x 7x 7x                                                                 7x  
import React from 'react';
import { useIntl } from 'react-intl';
import styles from './search.module.css';
 
type Props = {
    disabled?: boolean;
    placeHolderText?: string;
    value?: string;
    onBlur?: () => void;
    onChange?: () => void;
    /** Accessible name. Defaults to the shared `search.label` message. */
    label?: string;
};
 
/**
 * @example
 *     <SearchInput />;
 *
 * @param {string} value - The value of the input
 * @param {boolean} disabled - If true, the input will be disabled
 * @param {Function} onBlur - Callback function when input is blurred
 * @param {Function} onChange - Callback function when input is changed
 * @param {string} placeHolderText - The placeholder text for the input
 * @param {string} label - Accessible name for the field
 * @returns {JSX.Element}
 */
const SearchInput = ({ value, disabled, onBlur, onChange, placeHolderText, label }: Props) => {
    const { formatMessage: f } = useIntl();
    const id = React.useId();
 
    /**
     * SDD-L06. This had no label, no aria-label and no id — a placeholder was the only cue, and a
     * placeholder is not a label: it disappears the moment anything is typed, and voice-control users
     * have no name to speak. A screen reader announced "edit, blank".
     *
     * The placeholder also defaulted to a hardcoded English 'Search', and `ArticlePanel` renders this
     * with no prop at all — so every blog post showed an English placeholder in `es` and `gl`.
     *
     * `type="search"` rather than `text` so the field reports its purpose (1.3.5), and
     * `autoComplete="off"` because there is nothing here worth restoring.
     */
    return (
        <>
            <label htmlFor={id} className="visuallyHidden">
                {label ?? f({ id: 'search.label' })}
            </label>
            <input
                id={id}
                type="search"
                autoComplete="off"
                data-testid="search-input"
                value={value}
                onBlur={onBlur}
                onChange={onChange}
                className={styles.input}
                disabled={disabled}
                placeholder={placeHolderText ?? f({ id: 'search.label' })}
            />
        </>
    );
};
export default SearchInput;