1
- import React , { useCallback , useState } from "react" ;
1
+ import React , { useCallback , useRef , useState } from "react" ;
2
2
import PT from "prop-types" ;
3
3
import cn from "classnames" ;
4
4
import throttle from "lodash/throttle" ;
@@ -93,57 +93,46 @@ const SearchHandleField = ({
93
93
const [ isMenuOpen , setIsMenuOpen ] = useState ( false ) ;
94
94
const [ isMenuFocused , setIsMenuFocused ] = useState ( false ) ;
95
95
const [ options , setOptions ] = useState ( [ ] ) ;
96
-
97
- const loadOptions = useCallback (
98
- throttle (
99
- async ( value ) => {
100
- setIsLoading ( true ) ;
101
- const options = await loadSuggestions ( value ) ;
102
- setOptions ( options ) ;
103
- setIsLoading ( false ) ;
104
- setIsMenuOpen ( true ) ;
105
- setIsMenuFocused ( options . length && options [ 0 ] . value === value ) ;
106
- } ,
107
- 300 ,
108
- { leading : false }
109
- ) ,
110
- [ ]
111
- ) ;
96
+ const isChangeAppliedRef = useRef ( false ) ;
112
97
113
98
const onValueChange = ( option , { action } ) => {
114
99
if ( action === "input-change" || action === "select-option" ) {
115
- setIsMenuFocused ( false ) ;
116
- setIsMenuOpen ( false ) ;
117
- if ( ! isMenuFocused ) {
118
- onChange ( inputValue ) ;
119
- } else if ( option ) {
100
+ if ( isMenuFocused && ! isLoading && option ) {
101
+ isChangeAppliedRef . current = true ;
102
+ setIsMenuFocused ( false ) ;
103
+ setIsMenuOpen ( false ) ;
104
+ setIsLoading ( false ) ;
120
105
onChange ( option . value ) ;
121
106
}
122
107
} else if ( action === "clear" ) {
108
+ isChangeAppliedRef . current = true ;
123
109
setIsMenuFocused ( false ) ;
124
110
setIsMenuOpen ( false ) ;
111
+ setIsLoading ( false ) ;
125
112
onChange ( "" ) ;
126
113
}
127
114
} ;
128
115
129
116
const onInputValueChange = useCallback (
130
117
( value , { action } ) => {
131
118
if ( action === "input-change" ) {
119
+ isChangeAppliedRef . current = false ;
132
120
setIsMenuFocused ( false ) ;
133
121
setInputValue ( value ) ;
134
122
onInputChange && onInputChange ( value ) ;
135
- loadOptions ( value ) ;
136
123
}
137
124
} ,
138
- [ onInputChange , loadOptions ]
125
+ [ onInputChange ]
139
126
) ;
140
127
141
128
const onKeyDown = ( event ) => {
142
129
const key = event . key ;
143
130
if ( key === "Enter" || key === "Escape" ) {
144
- setIsMenuFocused ( false ) ;
145
- setIsMenuOpen ( false ) ;
146
- if ( ! isMenuFocused ) {
131
+ if ( ! isMenuFocused || isLoading ) {
132
+ isChangeAppliedRef . current = true ;
133
+ setIsMenuFocused ( false ) ;
134
+ setIsMenuOpen ( false ) ;
135
+ setIsLoading ( false ) ;
147
136
onChange ( inputValue ) ;
148
137
}
149
138
} else if ( key === "ArrowDown" ) {
@@ -160,16 +149,40 @@ const SearchHandleField = ({
160
149
}
161
150
} ;
162
151
163
- const onSelectBlur = useCallback ( ( ) => {
152
+ const onSelectBlur = ( ) => {
164
153
setIsMenuFocused ( false ) ;
165
154
setIsMenuOpen ( false ) ;
155
+ onChange ( inputValue ) ;
166
156
onBlur && onBlur ( ) ;
167
- } , [ onBlur ] ) ;
157
+ } ;
158
+
159
+ const loadOptions = useCallback (
160
+ throttle (
161
+ async ( value ) => {
162
+ if ( ! isChangeAppliedRef . current ) {
163
+ setIsLoading ( true ) ;
164
+ const options = await loadSuggestions ( value ) ;
165
+ if ( ! isChangeAppliedRef . current ) {
166
+ setOptions ( options ) ;
167
+ setIsLoading ( false ) ;
168
+ setIsMenuOpen ( true ) ;
169
+ }
170
+ }
171
+ } ,
172
+ 300 ,
173
+ { leading : false }
174
+ ) ,
175
+ [ ]
176
+ ) ;
168
177
169
178
useUpdateEffect ( ( ) => {
170
179
setInputValue ( value ) ;
171
180
} , [ value ] ) ;
172
181
182
+ useUpdateEffect ( ( ) => {
183
+ loadOptions ( inputValue ) ;
184
+ } , [ inputValue ] ) ;
185
+
173
186
return (
174
187
< div
175
188
className = { cn (
@@ -214,7 +227,7 @@ const loadSuggestions = async (inputValue) => {
214
227
}
215
228
try {
216
229
const res = await getMemberSuggestions ( inputValue ) ;
217
- const users = res . data . result . content ;
230
+ const users = res . data . result . content . slice ( 0 , 100 ) ;
218
231
let match = null ;
219
232
for ( let i = 0 , len = users . length ; i < len ; i ++ ) {
220
233
let value = users [ i ] . handle ;
0 commit comments