@@ -3,6 +3,7 @@ import React, {
3
3
ComponentProps ,
4
4
FocusEvent ,
5
5
useCallback ,
6
+ useEffect ,
6
7
useMemo ,
7
8
useState ,
8
9
} from "react" ;
@@ -22,8 +23,8 @@ import { EyeIcon, EyeIconSlash } from "./PasswordIcon";
22
23
import { PasswordMeter } from "./PasswordMeter" ;
23
24
import "./PasswordInput.scss" ;
24
25
25
- export const validatePassword = ( password : string ) => {
26
- const score = calculateScore ( password ) ;
26
+ export const validatePassword = ( password : string , customErrorMessage = "" ) => {
27
+ const score = calculateScore ( password , customErrorMessage ) ;
27
28
let errorMessage = "" ;
28
29
29
30
const options = { dictionary : { ...dictionary } } ;
@@ -36,9 +37,14 @@ export const validatePassword = (password: string) => {
36
37
errorMessage = passwordErrorMessage . invalidLength ;
37
38
} else if ( ! isPasswordValid ( password ) ) {
38
39
errorMessage = passwordErrorMessage . missingCharacter ;
39
- } else {
40
+ }
41
+ else if ( customErrorMessage ) {
42
+ errorMessage = customErrorMessage ;
43
+ }
44
+ else {
40
45
errorMessage = warningMessages [ feedback . warning as passwordKeys ] ?? "" ;
41
46
}
47
+
42
48
return { errorMessage, score } ;
43
49
} ;
44
50
@@ -47,6 +53,7 @@ type InputProps = ComponentProps<typeof Input>;
47
53
interface PasswordInputProps extends Omit < InputProps , "rightPlaceholder" > {
48
54
hidePasswordMeter ?: boolean ;
49
55
hint ?: string ;
56
+ customErrorMessage ?: string ;
50
57
}
51
58
52
59
const PasswordVariant : Record < TScore , InputProps [ "variant" ] > = {
@@ -55,6 +62,7 @@ const PasswordVariant: Record<TScore, InputProps["variant"]> = {
55
62
2 : "warning" ,
56
63
3 : "success" ,
57
64
4 : "success" ,
65
+ 5 : "error" ,
58
66
} ;
59
67
60
68
/**
@@ -86,19 +94,25 @@ export const PasswordInput = ({
86
94
onBlur,
87
95
onChange,
88
96
value,
97
+ customErrorMessage= "" ,
89
98
...rest
90
99
} : PasswordInputProps ) => {
100
+ useEffect ( ( ) => {
101
+ setBackendErrorMessage ( customErrorMessage ) ;
102
+ } , [ customErrorMessage ] ) ;
91
103
const [ isTouched , setIsTouched ] = useState ( false ) ;
92
104
const [ showPassword , setShowPassword ] = useState ( false ) ;
105
+ const [ backendErrorMessage , setBackendErrorMessage ] = useState ( customErrorMessage ) ;
93
106
94
107
const { errorMessage, score } = useMemo (
95
- ( ) => validatePassword ( value as string ) ,
96
- [ value ] ,
108
+ ( ) => validatePassword ( value as string , backendErrorMessage ) ,
109
+ [ value , backendErrorMessage ] ,
97
110
) ;
98
111
99
112
const handleChange = useCallback (
100
113
( e : ChangeEvent < HTMLInputElement > ) => {
101
114
onChange ?.( e ) ;
115
+ setBackendErrorMessage ( "" ) ;
102
116
if ( ! isTouched ) {
103
117
setIsTouched ( true ) ;
104
118
}
0 commit comments