Skip to content

Commit e73f75b

Browse files
committed
fix: Search properly handles id increments to avoid race conditions. May be snappier too.
1 parent 9ec6cb2 commit e73f75b

File tree

2 files changed

+58
-40
lines changed

2 files changed

+58
-40
lines changed

src/renderer/store/search/middleware.ts

Lines changed: 36 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import {
2222
setFilter,
2323
setOrderBy,
2424
setOrderReverse,
25+
setSearchId,
2526
setSearchText
2627
} from './slice';
2728

@@ -34,8 +35,22 @@ export function addSearchMiddleware() {
3435
const view = state.search.views[action.payload.view];
3536

3637
if (view) {
37-
// Debounce building search text
38-
debounceBuildQuery(view);
38+
// Immediately update search id
39+
const newSearchId = view.data.searchId + 1;
40+
store.dispatch(setSearchId({ view: view.id, searchId: newSearchId }));
41+
42+
// Get processed query
43+
const filter = await window.Shared.back.request(BackIn.PARSE_QUERY_DATA, {
44+
viewId: view.id,
45+
searchId: newSearchId,
46+
text: view.text,
47+
advancedFilter: view.advancedFilter,
48+
orderBy: view.orderBy,
49+
orderDirection: view.orderReverse,
50+
playlist: view.selectedPlaylist
51+
});
52+
53+
store.dispatch(setFilter({ filter }));
3954
}
4055
}
4156
});
@@ -162,45 +177,26 @@ export function addSearchMiddleware() {
162177
const view = state.search.views[action.payload.filter.viewId];
163178

164179
if (view) {
165-
// Debounce building search text
166-
debounceSearch(view.id, view.searchFilter);
180+
log.info('Launcher', 'Performing search...');
181+
// Request first page
182+
window.Shared.back.request(BackIn.BROWSE_VIEW_FIRST_PAGE, view.searchFilter)
183+
.then((data) => {
184+
store.dispatch(addData({
185+
view: view.id,
186+
data: {
187+
searchId: view.searchFilter.searchId,
188+
page: 0,
189+
games: data.games,
190+
}
191+
}));
192+
193+
// Request keyset
194+
store.dispatch(requestKeyset({
195+
view: view.id,
196+
searchId: view.searchFilter.searchId,
197+
}));
198+
});
167199
}
168200
}
169201
});
170202
}
171-
172-
const debounceBuildQuery = debounce(async (view: ResultsView) => {
173-
const filter = await window.Shared.back.request(BackIn.PARSE_QUERY_DATA, {
174-
viewId: view.id,
175-
searchId: view.data.searchId + 1,
176-
text: view.text,
177-
advancedFilter: view.advancedFilter,
178-
orderBy: view.orderBy,
179-
orderDirection: view.orderReverse,
180-
playlist: view.selectedPlaylist
181-
});
182-
183-
store.dispatch(setFilter({ filter }));
184-
}, 125);
185-
186-
const debounceSearch = debounce((viewName: string, searchFilter: SearchQuery) => {
187-
log.info('Launcher', 'Performing search...');
188-
// Request first page
189-
window.Shared.back.request(BackIn.BROWSE_VIEW_FIRST_PAGE, searchFilter)
190-
.then((data) => {
191-
store.dispatch(addData({
192-
view: viewName,
193-
data: {
194-
searchId: searchFilter.searchId,
195-
page: 0,
196-
games: data.games,
197-
}
198-
}));
199-
200-
// Request keyset
201-
store.dispatch(requestKeyset({
202-
view: viewName,
203-
searchId: searchFilter.searchId,
204-
}));
205-
});
206-
}, 50);

src/renderer/store/search/slice.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import { BackIn, PageKeyset, SearchQuery } from '@shared/back/types';
88
import { VIEW_PAGE_SIZE } from '@shared/constants';
99
import { getDefaultAdvancedFilter, getDefaultGameSearch } from '@shared/search/util';
1010
import { updatePreferencesData } from '@shared/preferences/util';
11+
import { number } from 'zod';
1112

1213
export const GENERAL_VIEW_ID = '!general!';
1314

@@ -138,6 +139,11 @@ export type SearchDeleteViewAction = {
138139
view: string;
139140
}
140141

142+
export type SearchSetIdAction = {
143+
view: string;
144+
searchId: number;
145+
}
146+
141147
export type SearchRenameViewAction = {
142148
old: string;
143149
new: string;
@@ -403,6 +409,21 @@ const searchSlice = createSlice({
403409
}
404410
}
405411
},
412+
setSearchId(state: SearchState, { payload }: PayloadAction<SearchSetIdAction>) {
413+
const view = state.views[payload.view];
414+
if (view) {
415+
if (view.data.searchId < payload.searchId) {
416+
view.data = {
417+
searchId: payload.searchId,
418+
pages: {},
419+
keyset: [],
420+
games: {},
421+
total: undefined,
422+
metaState: RequestState.REQUESTED,
423+
};
424+
}
425+
}
426+
},
406427
setOrderBy(state: SearchState, { payload }: PayloadAction<SearchOrderByAction>) {
407428
const view = state.views[payload.view];
408429
if (view) {
@@ -608,6 +629,7 @@ export const {
608629
selectPlaylist,
609630
selectGame,
610631
setFilter,
632+
setSearchId,
611633
setOrderBy,
612634
setOrderReverse,
613635
setAdvancedFilter,

0 commit comments

Comments
 (0)