import React, { ReactNode, useState } from 'react'; import { Text, TextInput, View, TextInputProps } from 'react-native'; import InformationGray from '../icons/information-gray.svg'; import InformationError from '../icons/information-error.svg'; import WarningAlert from '../icons/warning-alert.svg'; import SuccessCheckmark from '../icons/success-checkmark.svg'; import { classNames } from '../utils'; export enum InputStateEnum { DEFAULT = 'DEFAULT', ERROR = 'ERROR', WARNING = 'WARNING', SUCCESS = 'SUCCESS', } export interface InputProps extends TextInputProps { status?: InputStateEnum; accessoryLeft?: React.ReactElement | (() => React.ReactElement) | ReactNode; accessoryRight?: React.ReactElement | (() => React.ReactElement) | ReactNode; label?: string; placeholder?: string; caption?: string; editable?: boolean; value: string; containerClassnames?: string; inputContainerClassnames?: string; onFocus?: () => void; onBlur?: () => void; onChangeText: (text: string) => void; } const RenderFeedbackText = ( feedbackState: InputStateEnum, text: string, editable ) => { let textColorClass = 'text-[#737373]'; let icon = ; if (feedbackState === InputStateEnum.SUCCESS) { icon = ; textColorClass = 'text-success-500'; } if (feedbackState === InputStateEnum.WARNING) { icon = ; textColorClass = 'text-warning-500'; } if (feedbackState === InputStateEnum.ERROR) { icon = ; textColorClass = 'text-error-500'; } if (!editable) { textColorClass = 'text-neutral-500'; } return ( {icon} {text} ); }; export const Input = React.forwardRef( ( { status = InputStateEnum.DEFAULT, accessoryLeft, accessoryRight, label, placeholder = 'Enter something...', caption, editable = true, containerClassnames, inputContainerClassnames, onFocus, onBlur, value, onChangeText, ...textInputProps }, ref ) => { const [isFocused, setIsFocused] = useState(false); const handleOnFocus = () => { setIsFocused(true); onFocus?.(); }; const handleOnBlur = () => { setIsFocused(false); onBlur?.(); }; const getBorderColor = () => { switch (status) { case InputStateEnum.ERROR: return 'border-error-500'; case InputStateEnum.WARNING: return 'border-warning-500'; case InputStateEnum.SUCCESS: return 'border-success-500'; default: return 'border-neutral-500'; } }; return ( {label && {label}} {accessoryLeft && ( {typeof accessoryLeft === 'function' ? accessoryLeft() : accessoryLeft} )} {accessoryRight && ( {typeof accessoryRight === 'function' ? accessoryRight() : accessoryRight} )} {caption && RenderFeedbackText(status, caption, editable)} ); } );