Several search/filter text inputs run their work on every keystroke, with no debouncing:
MarketTypeInput.vue — the watchEffect (src/market/type/MarketTypeInput.vue:76) calls searchMarketTypes() on every keystroke, firing a marketApi.searchTypes request per character (the only guard is the search.length < 3 minimum-length check). This spams the backend/ESI while typing.
ScanResultTable.vue — the filter ref (src/market/scan/ScanResultTable.vue:55) feeds a heavy useSort computed (:71) that re-filters/re-maps the full result list on every keystroke.
AcquisitionResultTable.vue — same pattern: the filter ref (src/market/acquisition/AcquisitionResultTable.vue:70) drives a computed (:72) recomputed on every keystroke.
Proposal
Add debouncing using VueUse (already a dependency — @vueuse/core):
MarketTypeInput.vue: debounce the value driving the search (e.g. refDebounced on the search term, or wrap searchMarketTypes in useDebounceFn) so the API is only hit after typing pauses. Suggested ~300ms.
ScanResultTable.vue / AcquisitionResultTable.vue: debounce the filter value feeding the computed so the (potentially large) list isn't re-filtered on every keystroke.
Notes
No debounce/throttle currently exists anywhere in the codebase.
Keep the existing length < 3 gate on the type search.
## Problem
Several search/filter text inputs run their work on every keystroke, with no debouncing:
- **`MarketTypeInput.vue`** — the `watchEffect` (`src/market/type/MarketTypeInput.vue:76`) calls `searchMarketTypes()` on every keystroke, firing a `marketApi.searchTypes` request per character (the only guard is the `search.length < 3` minimum-length check). This spams the backend/ESI while typing.
- **`ScanResultTable.vue`** — the `filter` ref (`src/market/scan/ScanResultTable.vue:55`) feeds a heavy `useSort` computed (`:71`) that re-filters/re-maps the full result list on every keystroke.
- **`AcquisitionResultTable.vue`** — same pattern: the `filter` ref (`src/market/acquisition/AcquisitionResultTable.vue:70`) drives a computed (`:72`) recomputed on every keystroke.
## Proposal
Add debouncing using VueUse (already a dependency — `@vueuse/core`):
- `MarketTypeInput.vue`: debounce the value driving the search (e.g. `refDebounced` on the search term, or wrap `searchMarketTypes` in `useDebounceFn`) so the API is only hit after typing pauses. Suggested ~300ms.
- `ScanResultTable.vue` / `AcquisitionResultTable.vue`: debounce the `filter` value feeding the computed so the (potentially large) list isn't re-filtered on every keystroke.
## Notes
- No `debounce`/`throttle` currently exists anywhere in the codebase.
- Keep the existing `length < 3` gate on the type search.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Problem
Several search/filter text inputs run their work on every keystroke, with no debouncing:
MarketTypeInput.vue— thewatchEffect(src/market/type/MarketTypeInput.vue:76) callssearchMarketTypes()on every keystroke, firing amarketApi.searchTypesrequest per character (the only guard is thesearch.length < 3minimum-length check). This spams the backend/ESI while typing.ScanResultTable.vue— thefilterref (src/market/scan/ScanResultTable.vue:55) feeds a heavyuseSortcomputed (:71) that re-filters/re-maps the full result list on every keystroke.AcquisitionResultTable.vue— same pattern: thefilterref (src/market/acquisition/AcquisitionResultTable.vue:70) drives a computed (:72) recomputed on every keystroke.Proposal
Add debouncing using VueUse (already a dependency —
@vueuse/core):MarketTypeInput.vue: debounce the value driving the search (e.g.refDebouncedon the search term, or wrapsearchMarketTypesinuseDebounceFn) so the API is only hit after typing pauses. Suggested ~300ms.ScanResultTable.vue/AcquisitionResultTable.vue: debounce thefiltervalue feeding the computed so the (potentially large) list isn't re-filtered on every keystroke.Notes
debounce/throttlecurrently exists anywhere in the codebase.length < 3gate on the type search.