File size: 1,840 Bytes
77fd7a1
 
 
3206d59
77fd7a1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// PasswordInputField.tsx
import React, { useState, useImperativeHandle } from "react";
import BaseInputField from "./BaseInputField";
import PasswordVisibilityIcon from "../../Icons/passwordEyeIcon/PasswordVisibilityIcon";

interface PasswordInputFieldProps {
  label: string;
  width?: string;
  inputRef?: React.Ref<HTMLInputElement>;
  onKeyDown?: React.KeyboardEventHandler<HTMLInputElement>;
}

export interface PasswordInputFieldRef {
  togglePasswordVisibility: () => void;
}

function PasswordInputField(
  props: Readonly<PasswordInputFieldProps>,
  ref: React.Ref<PasswordInputFieldRef>,
) {
  const [passwordValue, setPasswordValue] = useState<string>("");
  const [isPasswordVisible, setIsPasswordVisible] = useState<boolean>(false);

  const { width = "250px" } = props;

  function handlePasswordChange(
    event: React.ChangeEvent<HTMLInputElement>,
  ): void {
    setPasswordValue(event.target.value);
  }

  const togglePasswordVisibility = React.useCallback((): void => {
    setIsPasswordVisible((prevState: boolean) => !prevState);
  }, []);

  function handleIconMouseDown(
    event: React.MouseEvent<HTMLDivElement, MouseEvent>,
  ): void {
    event.preventDefault();
    togglePasswordVisibility();
  }

  useImperativeHandle(ref, () => ({
    togglePasswordVisibility,
  }));

  const inputType = isPasswordVisible ? "text" : "password";

  return (
    <BaseInputField
      label={props.label}
      value={passwordValue}
      type={inputType}
      onChange={handlePasswordChange}
      width={width}
      inputRef={props.inputRef}
      onKeyDown={props.onKeyDown}
      autoComplete={"password"}
    >
      <PasswordVisibilityIcon
        isVisible={isPasswordVisible}
        onMouseDown={handleIconMouseDown}
      />
    </BaseInputField>
  );
}

export default React.forwardRef(PasswordInputField);