1- import React , { useCallback , useState } from "react" ;
1+ import React , { useCallback , useRef , useState } from "react" ;
22import PT from "prop-types" ;
33import cn from "classnames" ;
44import throttle from "lodash/throttle" ;
@@ -93,57 +93,46 @@ const SearchHandleField = ({
9393 const [ isMenuOpen , setIsMenuOpen ] = useState ( false ) ;
9494 const [ isMenuFocused , setIsMenuFocused ] = useState ( false ) ;
9595 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 ) ;
11297
11398 const onValueChange = ( option , { action } ) => {
11499 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 ) ;
120105 onChange ( option . value ) ;
121106 }
122107 } else if ( action === "clear" ) {
108+ isChangeAppliedRef . current = true ;
123109 setIsMenuFocused ( false ) ;
124110 setIsMenuOpen ( false ) ;
111+ setIsLoading ( false ) ;
125112 onChange ( "" ) ;
126113 }
127114 } ;
128115
129116 const onInputValueChange = useCallback (
130117 ( value , { action } ) => {
131118 if ( action === "input-change" ) {
119+ isChangeAppliedRef . current = false ;
132120 setIsMenuFocused ( false ) ;
133121 setInputValue ( value ) ;
134122 onInputChange && onInputChange ( value ) ;
135- loadOptions ( value ) ;
136123 }
137124 } ,
138- [ onInputChange , loadOptions ]
125+ [ onInputChange ]
139126 ) ;
140127
141128 const onKeyDown = ( event ) => {
142129 const key = event . key ;
143130 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 ) ;
147136 onChange ( inputValue ) ;
148137 }
149138 } else if ( key === "ArrowDown" ) {
@@ -160,16 +149,40 @@ const SearchHandleField = ({
160149 }
161150 } ;
162151
163- const onSelectBlur = useCallback ( ( ) => {
152+ const onSelectBlur = ( ) => {
164153 setIsMenuFocused ( false ) ;
165154 setIsMenuOpen ( false ) ;
155+ onChange ( inputValue ) ;
166156 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+ ) ;
168177
169178 useUpdateEffect ( ( ) => {
170179 setInputValue ( value ) ;
171180 } , [ value ] ) ;
172181
182+ useUpdateEffect ( ( ) => {
183+ loadOptions ( inputValue ) ;
184+ } , [ inputValue ] ) ;
185+
173186 return (
174187 < div
175188 className = { cn (
@@ -214,7 +227,7 @@ const loadSuggestions = async (inputValue) => {
214227 }
215228 try {
216229 const res = await getMemberSuggestions ( inputValue ) ;
217- const users = res . data . result . content ;
230+ const users = res . data . result . content . slice ( 0 , 100 ) ;
218231 let match = null ;
219232 for ( let i = 0 , len = users . length ; i < len ; i ++ ) {
220233 let value = users [ i ] . handle ;
0 commit comments