"use client"; import { FocusEventHandler, forwardRef, ForwardRefRenderFunction, MouseEventHandler, useCallback, useState, } from "react"; import { InputFieldProps, InputProps } from "./types"; import { MaterialIcon } from "@shared/components/material-icon"; import { Text } from "@shared/components/text"; import { cx } from "@shared/utils"; export const InputField: ForwardRefRenderFunction< HTMLInputElement, InputFieldProps > = (props, ref) => { const { className, size, required, placeholder, label, state, errorText, prefixIconName, prefixIconFill = true, suffixIconFill = false, prefixIconSize = 24, suffixIconName, suffixIconSize = 24, containerClassName, prefixIconClassName, loading, hasError, type, // Filter out all non-DOM props ...rest } = props; // Use hasError to override state if provided const effectiveState = hasError ? "error" : state; const sizeClasses = { sm: "h-[48px] px-3 py-2", slim: "h-12", medium: "h-14", large: "h-[60px]", }; const [isHovered, setIsHovered] = useState(false); const [isFocused, setIsFocused] = useState(false); const [inputType, setInputType] = useState(type || "text"); const handleMouseOver = () => setIsHovered(true); const handleMouseOut = () => setIsHovered(false); const handleFocus: FocusEventHandler = e => { rest.onFocus?.(e); setIsFocused(true); }; const handleBlur: FocusEventHandler = e => { rest.onBlur?.(e); setIsFocused(false); }; const togglePasswordVisibility = useCallback< MouseEventHandler >(e => { e.stopPropagation(); setInputType(prevType => (prevType === "password" ? "text" : "password")); }, []); return (
{label ? ( ) : null}
{prefixIconName ? (
) : null} {suffixIconName ? (
) : null}
{effectiveState === "error" && errorText && errorText != "" ? ( {errorText || "Error"} ) : null}
); }; export const Input = forwardRef(InputField); Input.displayName = "Input"; export type { InputFieldProps, InputProps };