perf(web): свод 2 — begin(load) не очищает данные до первого ответа
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
parent
78e06583f4
commit
325c1c5f15
@ -125,6 +125,8 @@ export function createSheetPagingState() {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Инвариант для хука: settled надо слать для КАЖДОГО поколения; settled старого поколения игнорируется,
|
||||||
|
// поэтому loading, выставленный begin(load), снимает только settled текущего поколения.
|
||||||
export function svod2PagingReducer(state, action) {
|
export function svod2PagingReducer(state, action) {
|
||||||
if (action.generation !== state.generation && action.type !== 'begin') return state;
|
if (action.generation !== state.generation && action.type !== 'begin') return state;
|
||||||
switch (action.type) {
|
switch (action.type) {
|
||||||
@ -135,7 +137,6 @@ export function svod2PagingReducer(state, action) {
|
|||||||
pendingQueryKey: action.queryKey,
|
pendingQueryKey: action.queryKey,
|
||||||
error: '',
|
error: '',
|
||||||
loading: action.mode === 'load' ? true : state.loading,
|
loading: action.mode === 'load' ? true : state.loading,
|
||||||
...(action.mode === 'load' ? { pages: new Map(), total: 0, facets: null } : {}),
|
|
||||||
};
|
};
|
||||||
case 'page': {
|
case 'page': {
|
||||||
const first = state.dataGeneration !== action.generation;
|
const first = state.dataGeneration !== action.generation;
|
||||||
|
|||||||
@ -256,3 +256,26 @@ test('facets и settled текущего поколения', () => {
|
|||||||
s = svod2PagingReducer(s, { type: 'settled', generation: 1 });
|
s = svod2PagingReducer(s, { type: 'settled', generation: 1 });
|
||||||
assert.equal(s.loading, false);
|
assert.equal(s.loading, false);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test('begin(load) оставляет прежние pages/total/facets до первого ответа нового поколения', () => {
|
||||||
|
let s = begin(createSheetPagingState(), 1, 'load');
|
||||||
|
s = page(s, 1, 0, ['a'], 5);
|
||||||
|
s = svod2PagingReducer(s, { type: 'facets', generation: 1, facets: { total: 5 } });
|
||||||
|
s = begin(s, 2, 'load', 'k2');
|
||||||
|
assert.equal(s.loading, true);
|
||||||
|
assert.deepEqual(s.pages.get(0), ['a']);
|
||||||
|
assert.equal(s.total, 5);
|
||||||
|
assert.deepEqual(s.facets, { total: 5 });
|
||||||
|
s = page(s, 2, 0, ['z'], 1);
|
||||||
|
assert.deepEqual([...s.pages.keys()], [0]);
|
||||||
|
assert.deepEqual(s.pages.get(0), ['z']);
|
||||||
|
});
|
||||||
|
|
||||||
|
test('refine поверх load: loading снимает settled нового поколения, старого - игнорируется', () => {
|
||||||
|
let s = begin(createSheetPagingState(), 1, 'load');
|
||||||
|
s = begin(s, 2, 'refine');
|
||||||
|
assert.equal(s.loading, true);
|
||||||
|
assert.equal(svod2PagingReducer(s, { type: 'settled', generation: 1 }), s);
|
||||||
|
s = svod2PagingReducer(s, { type: 'settled', generation: 2 });
|
||||||
|
assert.equal(s.loading, false);
|
||||||
|
});
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user