|
1 | 1 | <script lang="ts" setup> |
2 | 2 | import type { RepoNode } from "../../server/utils/types"; |
| 3 | +
|
3 | 4 | const search = useSessionStorage("search", ""); |
4 | 5 | const searchResults = ref<RepoNode[]>([]); |
5 | 6 | const isLoading = ref(false); |
6 | 7 |
|
7 | | -let activeController: AbortController | null = null; |
| 8 | +let abortController: AbortController | null = null; |
8 | 9 | const throttledSearch = useThrottle(search, 500, true, false); |
9 | 10 |
|
10 | 11 | watch( |
11 | 12 | throttledSearch, |
12 | | - async (newValue) => { |
13 | | - activeController?.abort(); |
| 13 | + async (query) => { |
| 14 | + abortController?.abort(); |
14 | 15 | searchResults.value = []; |
15 | | - if (!newValue) { |
| 16 | +
|
| 17 | + if (!query) { |
16 | 18 | isLoading.value = false; |
17 | 19 | return; |
18 | 20 | } |
19 | 21 |
|
20 | 22 | const controller = new AbortController(); |
21 | | - activeController = controller; |
22 | | -
|
| 23 | + abortController = controller; |
23 | 24 | isLoading.value = true; |
| 25 | +
|
24 | 26 | try { |
25 | 27 | const response = await fetch( |
26 | | - `/api/repo/search?text=${encodeURIComponent(newValue)}`, |
27 | | - { signal: activeController.signal }, |
| 28 | + `/api/repo/search?text=${encodeURIComponent(query)}`, |
| 29 | + { signal: controller.signal }, |
28 | 30 | ); |
29 | | - const data = (await response.json()) as { nodes: RepoNode[] }; |
30 | | - if (activeController === controller) { |
31 | | - searchResults.value = data.nodes ?? []; |
| 31 | + const data = await response.json(); |
| 32 | +
|
| 33 | + if (abortController !== controller) { |
| 34 | + return; |
32 | 35 | } |
| 36 | +
|
| 37 | + searchResults.value = Array.isArray(data?.nodes) |
| 38 | + ? (data.nodes as RepoNode[]) |
| 39 | + : []; |
33 | 40 | } catch (err: any) { |
34 | 41 | if (err.name !== "AbortError") { |
35 | 42 | console.error(err); |
36 | 43 | } |
37 | 44 | } finally { |
38 | | - if (activeController === controller) { |
| 45 | + if (abortController === controller) { |
39 | 46 | isLoading.value = false; |
40 | 47 | } |
41 | 48 | } |
|
0 commit comments