diff --git a/web/src/pages/Svod2Page/svod2Paging.js b/web/src/pages/Svod2Page/svod2Paging.js index da917f3..0ca4367 100644 --- a/web/src/pages/Svod2Page/svod2Paging.js +++ b/web/src/pages/Svod2Page/svod2Paging.js @@ -125,6 +125,8 @@ export function createSheetPagingState() { }; } +// Инвариант для хука: settled надо слать для КАЖДОГО поколения; settled старого поколения игнорируется, +// поэтому loading, выставленный begin(load), снимает только settled текущего поколения. export function svod2PagingReducer(state, action) { if (action.generation !== state.generation && action.type !== 'begin') return state; switch (action.type) { @@ -135,7 +137,6 @@ export function svod2PagingReducer(state, action) { pendingQueryKey: action.queryKey, error: '', loading: action.mode === 'load' ? true : state.loading, - ...(action.mode === 'load' ? { pages: new Map(), total: 0, facets: null } : {}), }; case 'page': { const first = state.dataGeneration !== action.generation; diff --git a/web/src/pages/Svod2Page/svod2Paging.test.js b/web/src/pages/Svod2Page/svod2Paging.test.js index 02b585e..07e9c16 100644 --- a/web/src/pages/Svod2Page/svod2Paging.test.js +++ b/web/src/pages/Svod2Page/svod2Paging.test.js @@ -256,3 +256,26 @@ test('facets и settled текущего поколения', () => { s = svod2PagingReducer(s, { type: 'settled', generation: 1 }); 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); +});