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)}
);
}
);