@@ -36,9 +36,11 @@ const PhoneInput = forwardRef(({
36
36
onChange : handleChange = ( ) => null ,
37
37
onKeyDown : handleKeyDown = ( ) => null ,
38
38
...muiInputProps
39
- } : PhoneInputProps , ref : any ) => {
39
+ } : PhoneInputProps , forwardedRef : any ) => {
40
40
searchVariant = searchVariant || variant ;
41
+ const inputRef = useRef < any > ( null ) ;
41
42
const searchRef = useRef < boolean > ( false ) ;
43
+ const selectedRef = useRef < boolean > ( false ) ;
42
44
const initiatedRef = useRef < boolean > ( false ) ;
43
45
const [ query , setQuery ] = useState < string > ( "" ) ;
44
46
const [ open , setOpen ] = useState < boolean > ( false ) ;
@@ -78,7 +80,8 @@ const PhoneInput = forwardRef(({
78
80
} , [ handleKeyDown , onKeyDownMaskHandler ] )
79
81
80
82
const onChange = useCallback ( ( event : ChangeEvent < HTMLInputElement > ) => {
81
- const formattedNumber = getFormattedNumber ( event . target . value , pattern ) ;
83
+ const formattedNumber = selectedRef . current ? event . target . value : getFormattedNumber ( event . target . value , pattern ) ;
84
+ selectedRef . current = false ;
82
85
const phoneMetadata = parsePhoneNumber ( formattedNumber , countriesList ) ;
83
86
setCountryCode ( phoneMetadata . isoCode as any ) ;
84
87
setValue ( formattedNumber ) ;
@@ -94,6 +97,13 @@ const PhoneInput = forwardRef(({
94
97
handleMount ( value ) ;
95
98
} , [ handleMount ] )
96
99
100
+ const ref = useCallback ( ( node : any ) => {
101
+ [ forwardedRef , inputRef ] . forEach ( ( ref ) => {
102
+ if ( typeof ref === "function" ) ref ( node ) ;
103
+ else if ( ref != null ) ref . current = node ;
104
+ } )
105
+ } , [ forwardedRef ] )
106
+
97
107
useEffect ( ( ) => {
98
108
if ( initiatedRef . current ) return ;
99
109
initiatedRef . current = true ;
@@ -111,48 +121,51 @@ const PhoneInput = forwardRef(({
111
121
return (
112
122
< div className = "mui-phone-input-wrapper"
113
123
ref = { node => setMaxWidth ( node ?. offsetWidth || 0 ) } >
114
- < Select
115
- open = { open }
116
- variant = { variant }
117
- value = { selectValue }
118
- onClose = { ( ) => setOpen ( searchRef . current ) }
119
- style = { { position : "absolute" , top : 0 , left : 0 , visibility : "hidden" , width : "100%" , zIndex : - 1 } }
120
- >
121
- < div className = "mui-phone-input-search-wrapper" onKeyDown = { ( e : any ) => e . stopPropagation ( ) } >
122
- { enableSearch && (
123
- < TextField
124
- type = "search"
125
- value = { query }
126
- variant = { searchVariant }
127
- className = "mui-phone-input-search"
128
- onChange = { ( e : any ) => setQuery ( e . target . value ) }
129
- onBlur = { ( ) => searchRef . current = false }
130
- onFocus = { ( ) => searchRef . current = true }
131
- />
132
- ) }
133
- { countriesList . map ( ( [ iso , name , dial , mask ] ) => (
134
- < MenuItem
135
- disableRipple
136
- key = { iso + mask }
137
- value = { iso + dial }
138
- style = { { maxWidth} }
139
- selected = { selectValue === iso + dial }
140
- onClick = { ( ) => {
141
- const selectedOption = iso + dial ;
142
- if ( selectValue === selectedOption ) return ;
143
- setCountryCode ( selectedOption . slice ( 0 , 2 ) ) ;
144
- setValue ( getFormattedNumber ( mask , mask ) ) ;
145
- } }
146
- children = { < div className = "mui-phone-input-select-item" >
147
- < div className = { `flag ${ iso } ` } />
148
- < div className = "label" >
149
- { name } { displayFormat ( mask ) }
150
- </ div >
151
- </ div > }
152
- />
153
- ) ) }
154
- </ div >
155
- </ Select >
124
+ { ! disableDropdown && (
125
+ < Select
126
+ open = { open }
127
+ variant = { variant }
128
+ value = { selectValue }
129
+ onClose = { ( ) => setOpen ( searchRef . current ) }
130
+ style = { { position : "absolute" , top : 0 , left : 0 , visibility : "hidden" , width : "100%" , zIndex : - 1 } }
131
+ >
132
+ < div className = "mui-phone-input-search-wrapper" onKeyDown = { ( e : any ) => e . stopPropagation ( ) } >
133
+ { enableSearch && (
134
+ < TextField
135
+ type = "search"
136
+ value = { query }
137
+ variant = { searchVariant }
138
+ placeholder = { searchPlaceholder }
139
+ className = "mui-phone-input-search"
140
+ onChange = { ( e : any ) => setQuery ( e . target . value ) }
141
+ onBlur = { ( ) => searchRef . current = false }
142
+ onFocus = { ( ) => searchRef . current = true }
143
+ />
144
+ ) }
145
+ { countriesList . length ? countriesList . map ( ( [ iso , name , dial , mask ] ) => (
146
+ < MenuItem
147
+ disableRipple
148
+ key = { iso + mask }
149
+ value = { iso + dial }
150
+ style = { { maxWidth} }
151
+ selected = { selectValue === iso + dial }
152
+ onClick = { ( ) => {
153
+ const selectedOption = iso + dial ;
154
+ if ( selectValue === selectedOption ) return ;
155
+ setCountryCode ( selectedOption . slice ( 0 , 2 ) ) ;
156
+ setValue ( getFormattedNumber ( mask , mask ) ) ;
157
+ } }
158
+ children = { < div className = "mui-phone-input-select-item" >
159
+ < div className = { `flag ${ iso } ` } />
160
+ < div className = "label" >
161
+ { name } { displayFormat ( mask ) }
162
+ </ div >
163
+ </ div > }
164
+ />
165
+ ) ) : < MenuItem disabled > { searchNotFound } </ MenuItem > }
166
+ </ div >
167
+ </ Select >
168
+ ) }
156
169
< TextField
157
170
ref = { ref }
158
171
type = "tel"
0 commit comments