import React, { useCallback, useMemo, useState } from 'react'; import { nanoid } from 'nanoid'; import { Testable, useBuildTestId } from '../../modules/testing'; import { Container, Description, Input, InputContainer, State, Left, Right, Size, Label, } from './styled'; export type Props = Omit< React.InputHTMLAttributes, 'defaultValue' | 'value' | 'size' > & Testable & { label?: React.ReactNode; description?: React.ReactNode; state?: State; value: NonNullable['value']>; left?: React.ReactNode; right?: React.ReactNode; size: Size; }; export const Component = ({ className, label, description, 'data-testid': testId, onFocus, onBlur, state = 'normal', left, right, size, id: idProp, ...props }: Props) => { const { buildTestId } = useBuildTestId({ id: testId }); const id = useMemo(() => idProp || `id-${nanoid()}`, [idProp]); const [isFocused, setFocused] = useState(false); const focus = useCallback>( (evt) => { setFocused(true); onFocus?.(evt); }, [onFocus], ); const blur = useCallback>( (evt) => { setFocused(false); onBlur?.(evt); }, [onBlur], ); return ( {!!label && ( )} {left && {left}} {right && {right}} {!!description && ( {description} )} ); }; Component.displayName = 'TextInput';