11'use client' ; 
22
33import  clsx  from  'clsx' ; 
4- import  React ,  {  useState ,  useEffect ,  useRef ,  FocusEvent ,  ChangeEvent ,  useCallback ,  useImperativeHandle  }  from  'react' ; 
4+ import  React ,  { 
5+   useState , 
6+   useEffect , 
7+   useRef , 
8+   FocusEvent , 
9+   ChangeEvent , 
10+   useCallback , 
11+   useImperativeHandle , 
12+   useMemo , 
13+ }  from  'react' ; 
514import  type  {  InputProps  }  from  './types' ; 
615import  {  useOnScreen  }  from  '../../../utils/hooks' ; 
716
@@ -11,7 +20,7 @@ const MDBInput: React.FC<InputProps> = React.forwardRef<HTMLInputElement, InputP
1120      className, 
1221      size, 
1322      contrast, 
14-       value, 
23+       value :  valueProp , 
1524      defaultValue, 
1625      id, 
1726      labelClass, 
@@ -31,20 +40,24 @@ const MDBInput: React.FC<InputProps> = React.forwardRef<HTMLInputElement, InputP
3140    } , 
3241    ref 
3342  )  =>  { 
34-     const  [ newValue ,  setNewValue ]  =  useState ( value  ||  defaultValue ) ; 
43+     const  [ valueState ,  setValueState ]  =  useState ( defaultValue ) ; 
44+     const  value  =  useMemo ( ( )  =>  { 
45+       if  ( valueProp  !==  undefined )  { 
46+         return  valueProp ; 
47+       } 
48+       return  valueState ; 
49+     } ,  [ valueProp ,  valueState ] ) ; 
50+ 
3551    const  [ labelWidth ,  setLabelWidth ]  =  useState ( 0 ) ; 
3652    const  [ active ,  setActive ]  =  useState ( false ) ; 
3753    const  [ counter ,  setCounter ]  =  useState ( 0 ) ; 
38- 
3954    const  innerRef  =  useRef < HTMLInputElement > ( null ) ; 
4055    const  isVisible  =  useOnScreen ( innerRef ) ; 
41- 
42-     useImperativeHandle ( ref ,  ( )  =>  innerRef . current  as  HTMLInputElement ) ; 
43- 
4456    const  labelEl  =  useRef < HTMLLabelElement > ( null ) ; 
45- 
4657    const  labelReference  =  labelRef  ? labelRef  : labelEl ; 
4758
59+     useImperativeHandle ( ref ,  ( )  =>  innerRef . current  as  HTMLInputElement ) ; 
60+ 
4861    const  wrapperClasses  =  clsx ( 'form-outline' ,  contrast  &&  'form-white' ,  wrapperClass ) ; 
4962    const  inputClasses  =  clsx ( 
5063      'form-control' , 
@@ -55,58 +68,42 @@ const MDBInput: React.FC<InputProps> = React.forwardRef<HTMLInputElement, InputP
5568    ) ; 
5669    const  labelClasses  =  clsx ( 'form-label' ,  labelClass ) ; 
5770
58-     useEffect ( ( )  =>  { 
59-       if  ( ! innerRef . current )  return ; 
60- 
61-       const  {  value }  =  innerRef . current ; 
62- 
63-       value  !=  ''  ? setActive ( true )  : setActive ( false ) ; 
64-     } ,  [ innerRef . current ?. value ] ) ; 
65- 
66-     useEffect ( ( )  =>  { 
67-       if  ( value  ===  undefined )  return ; 
68-       value  !=  ''  ? setActive ( true )  : setActive ( false ) ; 
69-     } ,  [ value ] ) ; 
70- 
71-     useEffect ( ( )  =>  { 
72-       if  ( defaultValue  ===  undefined )  return ; 
73-       defaultValue  !=  ''  ? setActive ( true )  : setActive ( false ) ; 
74-     } ,  [ defaultValue ] ) ; 
75- 
7671    const  setWidth  =  useCallback ( ( )  =>  { 
7772      if  ( labelReference . current ?. clientWidth )  { 
7873        setLabelWidth ( labelReference . current . clientWidth  *  0.8  +  8 ) ; 
7974      } 
8075    } ,  [ labelReference ] ) ; 
8176
82-     useEffect ( ( )  =>  { 
83-       setWidth ( ) ; 
84-     } ,  [ labelReference . current ?. clientWidth ,  setWidth ,  isVisible ] ) ; 
85- 
8677    const  handleChange  =  ( e : ChangeEvent < HTMLInputElement > )  =>  { 
87-       setNewValue ( e . target . value ) ; 
78+       setValueState ( e . target . value ) ; 
8879      showCounter  &&  setCounter ( e . target . value . length ) ; 
8980      onChange ?.( e ) ; 
9081    } ; 
9182
9283    const  handleBlur  =  useCallback ( 
9384      ( e : FocusEvent < HTMLInputElement ,  Element > )  =>  { 
9485        if  ( ! innerRef . current )  return ; 
95- 
96-         if  ( 
97-           ( newValue  !==  undefined  &&  newValue  !=  '' )  || 
98-           ( value  !==  undefined  &&  value  !=  '' )  || 
99-           innerRef . current . value  !=  '' 
100-         )  { 
86+         if  ( value )  { 
10187          setActive ( true ) ; 
10288        }  else  { 
10389          setActive ( false ) ; 
10490        } 
10591        onBlur  &&  onBlur ( e ) ; 
10692      } , 
107-       [ newValue ,   value ,  onBlur ] 
93+       [ value ,  onBlur ] 
10894    ) ; 
10995
96+     useEffect ( ( )  =>  { 
97+       setWidth ( ) ; 
98+     } ,  [ labelReference . current ?. clientWidth ,  setWidth ,  isVisible ] ) ; 
99+ 
100+     useEffect ( ( )  =>  { 
101+       if  ( value )  { 
102+         return  setActive ( true ) ; 
103+       } 
104+       setActive ( false ) ; 
105+     } ,  [ value ] ) ; 
106+ 
110107    return  ( 
111108      < WrapperTag  className = { wrapperClasses }  style = { wrapperStyle } > 
112109        < input 
@@ -116,7 +113,7 @@ const MDBInput: React.FC<InputProps> = React.forwardRef<HTMLInputElement, InputP
116113          onBlur = { handleBlur } 
117114          onChange = { handleChange } 
118115          onFocus = { setWidth } 
119-           value = { value } 
116+           value = { valueProp } 
120117          defaultValue = { defaultValue } 
121118          id = { id } 
122119          ref = { innerRef } 
0 commit comments