59 lines
1.4 KiB
TypeScript
59 lines
1.4 KiB
TypeScript
import React, { useState } from 'react';
|
|
|
|
interface PasswordInputProps {
|
|
id: string;
|
|
name?: string;
|
|
value: string;
|
|
onChange: (e: React.ChangeEvent<HTMLInputElement>) => void;
|
|
required?: boolean;
|
|
placeholder?: string;
|
|
className?: string;
|
|
label?: string;
|
|
}
|
|
|
|
const PasswordInput: React.FC<PasswordInputProps> = ({
|
|
id,
|
|
name,
|
|
value,
|
|
onChange,
|
|
required = false,
|
|
placeholder,
|
|
className = 'form-control',
|
|
label
|
|
}) => {
|
|
const [showPassword, setShowPassword] = useState(false);
|
|
|
|
return (
|
|
<div className="mb-3">
|
|
{label && (
|
|
<label htmlFor={id} className="form-label">
|
|
{label}
|
|
</label>
|
|
)}
|
|
<div className="position-relative">
|
|
<input
|
|
type={showPassword ? 'text' : 'password'}
|
|
className={className}
|
|
id={id}
|
|
name={name || id}
|
|
value={value}
|
|
onChange={onChange}
|
|
required={required}
|
|
placeholder={placeholder}
|
|
/>
|
|
<button
|
|
type="button"
|
|
className="btn btn-link position-absolute end-0 top-50 translate-middle-y text-secondary p-0 pe-2"
|
|
onClick={() => setShowPassword(!showPassword)}
|
|
style={{ zIndex: 10, textDecoration: 'none' }}
|
|
tabIndex={-1}
|
|
>
|
|
<i className={`bi ${showPassword ? 'bi-eye' : 'bi-eye-slash'}`}></i>
|
|
</button>
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|
|
|
|
export default PasswordInput;
|