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