Kaballas's picture
initialize project structure with essential configurations and components
56b6519
raw
history blame
2.15 kB
import { ExclamationCircleIcon } from '@heroicons/react/24/outline';
import { ChangeEvent, useState } from 'react';
type SimpleInputProps = {
label?: string;
id: string;
name: string;
type: 'text' | 'number' | 'password';
placeholder: string;
value: string;
onChange: (value: string) => void;
disabled?: boolean;
requiredAlert?: boolean;
requiredField?: boolean;
};
const SimpleInput: React.FC<SimpleInputProps> = ({
label,
id,
name,
type,
placeholder,
value,
onChange,
disabled = false,
requiredAlert = false,
requiredField = false,
}) => {
const [isFocused, setIsFocused] = useState(false);
return (
<div>
{label ? (
<label
className="text-sm font-medium leading-6 text-gray-300"
htmlFor={id}
>
{label + ' '}
{requiredField ? <span className="text-red-500 text-lg">*</span> : ''}
</label>
) : null}
<div className="relative z-10 mt-2 rounded-md shadow-sm">
<input
className={`bg-gray-800 block w-full rounded-md py-1.5 p-2 placeholder:text-gray-400 sm:text-sm sm:leading-6 ${
requiredAlert && value === '' && !isFocused
? 'ring-1 ring-red-500'
: ''
}`}
disabled={disabled}
id={id}
name={name}
onBlur={() => setIsFocused(false)}
onChange={(e: ChangeEvent<HTMLInputElement>) =>
onChange(e.target.value)
}
onFocus={() => setIsFocused(true)}
placeholder={placeholder}
required={requiredField}
type={type}
value={value}
/>
{!isFocused && requiredAlert && value === '' ? (
<span className="absolute right-3 top-0 mt-2 ml-2 text-red-500">
<ExclamationCircleIcon className="size-5" />
</span>
) : null}
{!isFocused && requiredField && !requiredAlert && value === '' ? (
<span className="absolute right-3 top-0 mt-2 ml-2 text-red-500 text-lg">
*
</span>
) : null}
</div>
</div>
);
};
export default SimpleInput;