MaskedInput.tsx 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. import type { ChangeEvent } from 'react';
  2. import { useState, type JSX } from 'react';
  3. import type { UseFormRegister, FieldValues } from 'react-hook-form';
  4. import styles from './MaskedInput.module.scss';
  5. type Props = {
  6. name?: string
  7. readOnly: boolean
  8. value?: string
  9. onChange?: (e: ChangeEvent<HTMLInputElement>) => void
  10. tabIndex?: number | undefined
  11. register?: UseFormRegister<FieldValues>
  12. fieldName?: string
  13. };
  14. export default function MaskedInput(props: Props): JSX.Element {
  15. const [passwordShown, setPasswordShown] = useState(false);
  16. const togglePassword = () => {
  17. setPasswordShown(!passwordShown);
  18. };
  19. const {
  20. name, readOnly, value, onChange, tabIndex, register, fieldName,
  21. } = props;
  22. // Use register if provided, otherwise use value/onChange
  23. const inputProps = register && fieldName
  24. ? register(fieldName)
  25. : {
  26. name,
  27. value,
  28. onChange,
  29. };
  30. return (
  31. <div className={styles.MaskedInput}>
  32. <input
  33. className="form-control"
  34. type={passwordShown ? 'text' : 'password'}
  35. readOnly={readOnly}
  36. tabIndex={tabIndex}
  37. {...inputProps}
  38. />
  39. <span onClick={togglePassword} className={styles.PasswordReveal}>
  40. {passwordShown ? (
  41. <span className="material-symbols-outlined">visibility</span>
  42. ) : (
  43. <span className="material-symbols-outlined">visibility_off</span>
  44. )}
  45. </span>
  46. </div>
  47. );
  48. }