|
4 | 4 | import { PUBLIC_APP_ASSETS, PUBLIC_ORIGIN } from "$env/static/public";
|
5 | 5 | import { isHuggingChat } from "$lib/utils/isHuggingChat";
|
6 | 6 |
|
7 |
| - import { tick } from "svelte"; |
8 | 7 | import { goto } from "$app/navigation";
|
9 | 8 | import { base } from "$app/paths";
|
10 | 9 | import { page } from "$app/stores";
|
|
29 | 28 |
|
30 | 29 | const SEARCH_DEBOUNCE_DELAY = 400;
|
31 | 30 | let filterInputEl: HTMLInputElement;
|
32 |
| - let searchDisabled = false; |
| 31 | + let filterValue = data.query; |
| 32 | + let isFilterInPorgress = false; |
33 | 33 |
|
34 | 34 | const onModelChange = (e: Event) => {
|
35 | 35 | const newUrl = getHref($page.url, {
|
|
39 | 39 | goto(newUrl);
|
40 | 40 | };
|
41 | 41 |
|
42 |
| - const filterOnName = debounce(async (e: Event) => { |
43 |
| - searchDisabled = true; |
44 |
| - const value = (e.target as HTMLInputElement).value; |
| 42 | + const filterOnName = debounce(async (value: string) => { |
| 43 | + filterValue = value; |
| 44 | +
|
| 45 | + if (isFilterInPorgress) { |
| 46 | + return; |
| 47 | + } |
| 48 | +
|
| 49 | + isFilterInPorgress = true; |
45 | 50 | const newUrl = getHref($page.url, {
|
46 | 51 | newKeys: { q: value },
|
47 | 52 | existingKeys: { behaviour: "delete", keys: ["p"] },
|
48 | 53 | });
|
49 | 54 | await goto(newUrl);
|
50 |
| - setTimeout(async () => { |
51 |
| - searchDisabled = false; |
52 |
| - await tick(); |
53 |
| - filterInputEl.focus(); |
54 |
| - }, 0); |
| 55 | + setTimeout(() => filterInputEl.focus(), 0); |
| 56 | + isFilterInPorgress = false; |
| 57 | +
|
| 58 | + // there was a new filter query before server returned response |
| 59 | + if (filterValue !== value) { |
| 60 | + filterOnName(filterValue); |
| 61 | + } |
55 | 62 | }, SEARCH_DEBOUNCE_DELAY);
|
56 | 63 |
|
57 | 64 | const settings = useSettingsStore();
|
|
171 | 178 | <input
|
172 | 179 | class="h-[30px] w-full bg-transparent pl-5 focus:outline-none"
|
173 | 180 | placeholder="Filter by name"
|
174 |
| - value={data.query} |
175 |
| - on:input={filterOnName} |
| 181 | + value={filterValue} |
| 182 | + on:input={(e) => filterOnName(e.currentTarget.value)} |
176 | 183 | bind:this={filterInputEl}
|
177 | 184 | maxlength="150"
|
178 | 185 | type="search"
|
179 |
| - disabled={searchDisabled} |
180 | 186 | />
|
181 | 187 | </div>
|
182 | 188 | </div>
|
|
0 commit comments