Skip to content
This repository was archived by the owner on Mar 13, 2025. It is now read-only.

Commit eb8661d

Browse files
committed
Fixes for search handle field behavior.
1 parent 04d21ec commit eb8661d

File tree

1 file changed

+43
-30
lines changed

1 file changed

+43
-30
lines changed

src/components/SearchHandleField/index.jsx

+43-30
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React, { useCallback, useState } from "react";
1+
import React, { useCallback, useRef, useState } from "react";
22
import PT from "prop-types";
33
import cn from "classnames";
44
import 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

Comments
 (0)