|
|
|
@ -45,47 +45,55 @@ const searchUsers = debounce(
|
|
|
|
export default function UserSelector(props: Props): JSX.Element {
|
|
|
|
export default function UserSelector(props: Props): JSX.Element {
|
|
|
|
const { value, className, onSelect } = props;
|
|
|
|
const { value, className, onSelect } = props;
|
|
|
|
const [searchPhrase, setSearchPhrase] = useState('');
|
|
|
|
const [searchPhrase, setSearchPhrase] = useState('');
|
|
|
|
|
|
|
|
const [initialUsers, setInitialUsers] = useState<User[]>([]);
|
|
|
|
const [users, setUsers] = useState<User[]>([]);
|
|
|
|
const [users, setUsers] = useState<User[]>([]);
|
|
|
|
const autocompleteRef = useRef<RefSelectProps | null>(null);
|
|
|
|
const autocompleteRef = useRef<RefSelectProps | null>(null);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
|
|
core.users.get({ limit: 10 }).then((result: User[]) => {
|
|
|
|
|
|
|
|
if (result) {
|
|
|
|
|
|
|
|
setInitialUsers(result);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
|
|
|
|
setUsers(initialUsers);
|
|
|
|
|
|
|
|
}, [initialUsers]);
|
|
|
|
|
|
|
|
|
|
|
|
const handleSearch = (searchValue: string): void => {
|
|
|
|
const handleSearch = (searchValue: string): void => {
|
|
|
|
if (searchValue) {
|
|
|
|
if (searchValue) {
|
|
|
|
searchUsers(searchValue, setUsers);
|
|
|
|
searchUsers(searchValue, setUsers);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
setUsers([]);
|
|
|
|
setUsers(initialUsers);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
setSearchPhrase(searchValue);
|
|
|
|
setSearchPhrase(searchValue);
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const handleFocus = (open: boolean): void => {
|
|
|
|
const onBlur = (): void => {
|
|
|
|
if (!users.length && open) {
|
|
|
|
if (!searchPhrase && value) {
|
|
|
|
core.users.get({ limit: 10 }).then((result: User[]) => {
|
|
|
|
onSelect(null);
|
|
|
|
if (result) {
|
|
|
|
|
|
|
|
setUsers(result);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!open && searchPhrase !== value?.username) {
|
|
|
|
|
|
|
|
setSearchPhrase('');
|
|
|
|
|
|
|
|
if (value) {
|
|
|
|
|
|
|
|
onSelect(null);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
const handleSelect = (_value: SelectValue): void => {
|
|
|
|
const handleSelect = (_value: SelectValue): void => {
|
|
|
|
setSearchPhrase(users.filter((user) => user.id === +_value)[0].username);
|
|
|
|
setSearchPhrase(users.filter((user) => user.id === +_value)[0].username);
|
|
|
|
onSelect(_value ? users.filter((user) => user.id === +_value)[0] : null);
|
|
|
|
const user = _value ? users.filter((_user) => _user.id === +_value)[0] : null;
|
|
|
|
|
|
|
|
if ((user?.id || null) !== (value?.id || null)) {
|
|
|
|
|
|
|
|
onSelect(user);
|
|
|
|
|
|
|
|
}
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
useEffect(() => {
|
|
|
|
useEffect(() => {
|
|
|
|
if (value && !users.filter((user) => user.id === value.id).length) {
|
|
|
|
if (value) {
|
|
|
|
core.users.get({ id: value.id }).then((result: User[]) => {
|
|
|
|
if (!users.filter((user) => user.id === value.id).length) {
|
|
|
|
const [user] = result;
|
|
|
|
core.users.get({ id: value.id }).then((result: User[]) => {
|
|
|
|
setUsers([...users, user]);
|
|
|
|
const [user] = result;
|
|
|
|
setSearchPhrase(user.username);
|
|
|
|
setUsers([...users, user]);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
setSearchPhrase(value.username);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}, [value]);
|
|
|
|
}, [value]);
|
|
|
|
|
|
|
|
|
|
|
|
@ -97,8 +105,8 @@ export default function UserSelector(props: Props): JSX.Element {
|
|
|
|
placeholder='Select a user'
|
|
|
|
placeholder='Select a user'
|
|
|
|
onSearch={handleSearch}
|
|
|
|
onSearch={handleSearch}
|
|
|
|
onSelect={handleSelect}
|
|
|
|
onSelect={handleSelect}
|
|
|
|
|
|
|
|
onBlur={onBlur}
|
|
|
|
className={combinedClassName}
|
|
|
|
className={combinedClassName}
|
|
|
|
onDropdownVisibleChange={handleFocus}
|
|
|
|
|
|
|
|
options={users.map((user) => ({
|
|
|
|
options={users.map((user) => ({
|
|
|
|
value: user.id.toString(),
|
|
|
|
value: user.id.toString(),
|
|
|
|
label: user.username,
|
|
|
|
label: user.username,
|
|
|
|
|