import React from 'react'; import { IFieldComponentProps } from '../../types'; import { TextField, TextFieldProps, Grid, FormHelperText, } from '@material-ui/core'; import FieldAssistiveText from '../../FieldAssistiveText'; export interface IShortTextComponentProps extends IFieldComponentProps, Omit< TextFieldProps, 'variant' | 'name' | 'label' | 'onBlur' | 'onChange' | 'value' | 'ref' > { format?: | 'email' | 'emailWithName' | 'phone' | 'number' | 'url' | 'twitter' | 'linkedin'; maxCharacters?: number; } export default function ShortTextComponent({ field: { onChange, onBlur, value, ref }, fieldState, formState, name, useFormMethods, errorMessage, assistiveText, disabled, format, hiddenLabel = false, maxCharacters, ...props }: IShortTextComponentProps) { let variantProps: any = {}; switch (format) { case 'email': variantProps = { type: 'email', placeholder: 'mail@domain.com', autoComplete: 'email', }; break; case 'emailWithName': variantProps = { type: 'email', placeholder: 'Name ', autoComplete: 'email', }; break; case 'phone': variantProps = { type: 'tel', placeholder: '+1234567890', autoComplete: 'tel', }; break; case 'number': variantProps = { placeholder: '1234567890', inputProps: { inputMode: 'numeric', pattern: '\\d*', }, }; break; case 'url': variantProps = { type: 'url', placeholder: 'https://antler.co', autoComplete: 'url', }; break; case 'twitter': variantProps = { placeholder: '@AntlerGlobal' }; break; case 'linkedin': variantProps = { type: 'url', placeholder: 'https://linkedin.com/in/your-name', autoComplete: 'url', }; break; default: break; } const hiddenLabelOverrideProps = hiddenLabel ? { label: '', 'aria-label': props.label as string, hiddenLabel: true } : {}; const handleChange: TextFieldProps['onChange'] = e => format === 'number' ? onChange(e.target.value === '' ? '' : Number(e.target.value)) : onChange(e.target.value); return ( {errorMessage} {assistiveText} {maxCharacters && ( maxCharacters } > {typeof value === 'string' ? value.length : 0}  /  {maxCharacters} )} ) } name={name} id={`field-${name}`} {...variantProps} {...props} {...hiddenLabelOverrideProps} disabled={disabled} inputProps={{ required: false, // https://github.com/react-hook-form/react-hook-form/issues/4485 disabled: false, readOnly: disabled, style: disabled ? { cursor: 'default' } : undefined, maxLength: maxCharacters ?? undefined, ...variantProps.inputProps, // Required for form-filler 'data-type': 'text', 'data-label': props.label ?? '', }} inputRef={ref} /> ); }