|
12 | 12 | import { Button } from "$lib/components/ui/button"; |
13 | 13 | import { onMount } from "svelte"; |
14 | 14 | import { cn } from "$lib/utils"; |
| 15 | + import { debounce } from "$lib/utils/debounce"; |
15 | 16 |
|
16 | 17 | let { |
17 | 18 | selectedMembers = $bindable([]), |
|
72 | 73 | }); |
73 | 74 |
|
74 | 75 | let input = $state(""); |
75 | | - let timeout: ReturnType<typeof setTimeout> | null = null; |
76 | 76 | let results: SearchDataWithType[] = $state([]); |
77 | 77 | let filteredResults: MemberSearchReturnAttributes[] = $derived< |
78 | 78 | MemberSearchReturnAttributes[] |
|
86 | 86 | }), |
87 | 87 | ); |
88 | 88 |
|
89 | | - async function handleSearch() { |
90 | | - if (timeout) clearTimeout(timeout); |
| 89 | + const debouncedSearch = debounce(async (searchQuery: string) => { |
| 90 | + const url = new URL("/api/search", window.location.origin); |
| 91 | + url.searchParams.set("query", searchQuery); |
| 92 | + url.searchParams.set("indexes", JSON.stringify(["members"])); |
| 93 | + url.searchParams.set("limit", "10"); |
| 94 | + url.searchParams.set("offset", "0"); |
| 95 | + const response = await fetch(url, { |
| 96 | + method: "GET", |
| 97 | + }); |
91 | 98 |
|
| 99 | + if (response.ok) { |
| 100 | + results = [...(await response.json())]; |
| 101 | + } else { |
| 102 | + results = []; |
| 103 | + } |
| 104 | + isSearching = false; |
| 105 | + }, 200); |
| 106 | +
|
| 107 | + function handleSearch() { |
92 | 108 | if (!input) { |
| 109 | + debouncedSearch.cancel(); |
93 | 110 | isSearching = false; |
94 | 111 | results = []; |
95 | 112 | return; |
96 | | - } else { |
97 | | - timeout = setTimeout(async () => { |
98 | | - if (!input) { |
99 | | - results = []; |
100 | | - return; |
101 | | - } |
102 | | - const url = new URL("/api/search", window.location.origin); |
103 | | - url.searchParams.set("query", input); |
104 | | - url.searchParams.set("indexes", JSON.stringify(["members"])); |
105 | | - url.searchParams.set("limit", "10"); |
106 | | - url.searchParams.set("offset", "0"); |
107 | | - const response = await fetch(url, { |
108 | | - method: "GET", |
109 | | - }); |
110 | | -
|
111 | | - if (response.ok) { |
112 | | - results = [...(await response.json())]; |
113 | | - } else { |
114 | | - results = []; |
115 | | - } |
116 | | - isSearching = false; |
117 | | - }, 200); |
118 | | - isSearching = true; |
119 | 113 | } |
| 114 | + isSearching = true; |
| 115 | + debouncedSearch(input); |
120 | 116 | } |
121 | 117 |
|
122 | 118 | function captureAddedItems() { |
|
0 commit comments