|
1 |
| -import { useMemo, useState } from "react" |
| 1 | +import { useMemo, useRef, useState } from "react" |
2 | 2 | import {
|
3 | 3 | BaseOption,
|
4 | 4 | OwnerOption,
|
@@ -29,14 +29,26 @@ const useAutocomplete = <TOption extends BaseOption = BaseOption>({
|
29 | 29 | onChange,
|
30 | 30 | enabled,
|
31 | 31 | }: UseAutocompleteOptions<TOption>) => {
|
| 32 | + const selectedOptionsCacheRef = useRef<Record<string, TOption>>({}) |
32 | 33 | const [query, setQuery] = useState("")
|
33 |
| - const [selectedOption, setSelectedOption] = useState<TOption>() |
34 | 34 | const selectedOptionQuery = useQuery({
|
35 | 35 | queryKey: [id, "autocomplete", "selected", value],
|
36 |
| - queryFn: () => getSelectedOption(), |
37 |
| - onSuccess: (option) => setSelectedOption(option ?? undefined), |
| 36 | + queryFn: () => { |
| 37 | + if (!value) { |
| 38 | + return null |
| 39 | + } |
| 40 | + |
| 41 | + const cachedOption = selectedOptionsCacheRef.current[value] |
| 42 | + if (cachedOption) { |
| 43 | + return cachedOption |
| 44 | + } |
| 45 | + |
| 46 | + return getSelectedOption() |
| 47 | + }, |
38 | 48 | enabled,
|
| 49 | + keepPreviousData: true, |
39 | 50 | })
|
| 51 | + const selectedOption = selectedOptionQuery.data |
40 | 52 | const searchOptionsQuery = useQuery({
|
41 | 53 | queryKey: [id, "autocomplete", "search"],
|
42 | 54 | queryFn: () => getOptions(query),
|
@@ -75,26 +87,20 @@ const useAutocomplete = <TOption extends BaseOption = BaseOption>({
|
75 | 87 |
|
76 | 88 | const selectOption = (option: TOption) => {
|
77 | 89 | let newSelectedOptionValue: TOption | undefined = option
|
| 90 | + selectedOptionsCacheRef.current[option.value] = option |
78 | 91 |
|
79 | 92 | if (option.value === selectedOption?.value) {
|
80 | 93 | newSelectedOptionValue = undefined
|
81 | 94 | }
|
82 | 95 |
|
83 |
| - if (onChange) { |
84 |
| - onChange(newSelectedOptionValue) |
85 |
| - } |
86 |
| - setSelectedOption(newSelectedOptionValue) |
87 |
| - } |
88 |
| - const clearSelection = () => { |
89 |
| - setSelectedOption(undefined) |
| 96 | + onChange(newSelectedOptionValue) |
90 | 97 | }
|
91 | 98 |
|
92 | 99 | return {
|
93 | 100 | query,
|
94 | 101 | setQuery,
|
95 | 102 | selectedOption,
|
96 | 103 | selectOption,
|
97 |
| - clearSelection, |
98 | 104 | searchOptions,
|
99 | 105 | isInitializing: selectedOptionQuery.isInitialLoading,
|
100 | 106 | initialOption: selectedOptionQuery.data,
|
|
0 commit comments