input-field-zn
Version:
A lightweight and customizable React input field component with built-in icons for user, email, and password inputs. Includes password visibility toggle (eye/eye-slash) and modern styling support for easy integration in any form.
109 lines (100 loc) • 2.74 kB
JSX
import React, { useState } from "react";
import userIcon from "./assets/user.png";
import emailIcon from "./assets/email.png";
import passwordIcon from "./assets/password.png";
import eyeIcon from "./assets/eye.png";
import eyeSlashIcon from "./assets/eye-slash.png";
import "./index.css";
const InputField = (props) => {
//default icons
const fieldIcons = {
user: userIcon,
email: emailIcon,
password: passwordIcon,
eye: eyeIcon,
eyeSlash: eyeSlashIcon,
};
const [passwordShown, setPasswordShown] = useState(false);
const {
value,
name,
type,
placeholder = "Enter text",
onChange,
className,
...rest
} = props;
const {
icon = false,
width = "22px",
top = "7px",
left = "6px",
right = "6px",
iconPosition = "left",
iconPath,
iconName = "user",
iconEye = false,
iconEyePath = [eyeIcon, eyeSlashIcon],
iconClassName = "",
iconTint = 0.3,
iconEyeTint = 0.3,
} = props?.iconOverRide || {};
//Field icon url
const iconURI = iconPath || fieldIcons[iconName];
//Password Eye icon url
const iconEyeURI = iconEyePath;
//Handle on Eye to show/hide password
const handleShowPassword = () => {
setPasswordShown(!passwordShown);
};
//Return input type conditionally
const returnType = (inputType) => {
let updateType = inputType;
if (inputType === "password") {
updateType = !passwordShown ? "password" : "text";
}
return updateType;
};
return (
<div className={`inf-container ${className}`}>
<input
className="inf-input"
type={returnType(type)}
name={name}
value={value}
onChange={onChange}
placeholder={placeholder}
style={{
paddingLeft: icon && iconPosition === "left" ? "28px" : "8px",
paddingRight: icon && iconPosition === "right" ? "28px" : "8px",
}}
{...rest}
/>
{icon && (
<img
className={`inf-img ${iconClassName}`}
src={iconURI}
style={{
width: width,
[iconPosition]: left,
top: top,
right: right,
filter: `invert(${iconTint})`,
}}
alt={name}
/>
)}
{/* Eye Icon */}
{iconEye && (
<img
onClick={handleShowPassword}
className={`inf-img inf-eye-slash ${iconClassName}`}
src={passwordShown ? iconEyeURI[0] : iconEyeURI[1]}
style={{ filter: `invert(${iconEyeTint})` }}
alt={name}
/>
)}
</div>
);
};
export default InputField;