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