src/client/components/EmailInput.tsx (50 lines of code) (raw):
import { TextInputProps } from '@guardian/source/react-components';
import React from 'react';
import { disableAutofillBackground } from '@/client/styles/Shared';
import {
InputFieldState,
InputFieldStates,
useInputValidityState,
} from '@/client/lib/hooks/useInputValidityState';
import ThemedTextInput from '@/client/components/ThemedTextInput';
interface EmailInputProps extends Omit<TextInputProps, 'label'> {
label?: string;
defaultValue?: string;
initialState?: InputFieldState;
}
const EmailInputFieldErrorMessages = {
INVALID: 'Please enter a valid email format.',
EMPTY: 'Please enter your email.',
} as const;
export const EmailInput: React.FC<EmailInputProps> = ({
label = 'Email',
initialState = InputFieldStates.VALID,
...rest
}) => {
const { onBlur, onInput, onInvalid, inputFieldState } =
useInputValidityState(initialState);
// Set the error message based on the current state.
const errorMessage = React.useMemo(() => {
switch (inputFieldState) {
case InputFieldStates.INVALID:
return EmailInputFieldErrorMessages.INVALID;
case InputFieldStates.EMPTY:
return EmailInputFieldErrorMessages.EMPTY;
}
}, [inputFieldState]);
return (
<div>
<ThemedTextInput
label={label}
name="email"
type="email"
autoComplete="email"
error={errorMessage}
cssOverrides={disableAutofillBackground}
onBlur={onBlur}
onInput={onInput}
onInvalid={onInvalid}
{...rest}
/>
</div>
);
};