From 4d4427dc5cc204d8ed2882239c83dc2c649718f5 Mon Sep 17 00:00:00 2001 From: kata Date: Thu, 12 Sep 2019 12:03:53 +0800 Subject: [PATCH] Improve selector caching for receipt data --- src/containers/NahmiiHoc/selectors.js | 14 +++++--------- .../NahmiiHoc/tests/selectors.test.js | 18 +++++++++--------- 2 files changed, 14 insertions(+), 18 deletions(-) diff --git a/src/containers/NahmiiHoc/selectors.js b/src/containers/NahmiiHoc/selectors.js index 64951a0f..a66a62c1 100644 --- a/src/containers/NahmiiHoc/selectors.js +++ b/src/containers/NahmiiHoc/selectors.js @@ -23,17 +23,13 @@ export const createReceiptsSelector = createSelectorCreator( (previousArray, currentArray) => { let changed = false; currentArray.keySeq().forEach((address) => { - const previousReceipts = previousArray.getIn([address, 'receipts']); - const currentReceipts = currentArray.getIn([address, 'receipts']); + const previousReceipts = previousArray.getIn([address, 'receipts']) || fromJS([]); + const currentReceipts = currentArray.getIn([address, 'receipts']) || fromJS([]); - if (!currentReceipts && !previousReceipts) { - return; - } + const previousLastCreated = previousReceipts.getIn([previousReceipts.size - 1, 'created']); + const currentLastCreated = currentReceipts.getIn([currentReceipts.size - 1, 'created']); - if ( - (!previousReceipts && currentReceipts) || - (previousReceipts.size !== currentReceipts.size) - ) { + if (previousLastCreated !== currentLastCreated) { changed = true; } }); diff --git a/src/containers/NahmiiHoc/tests/selectors.test.js b/src/containers/NahmiiHoc/tests/selectors.test.js index c3b70002..985dea6b 100644 --- a/src/containers/NahmiiHoc/tests/selectors.test.js +++ b/src/containers/NahmiiHoc/tests/selectors.test.js @@ -80,16 +80,11 @@ describe('makeSelectReceipts', () => { receiptsSelector(storeMock.setIn(['nahmiiHoc', 'receipts', address, 'receipts'], null)) ).toEqual(receiptsLoaded.setIn([address, 'receipts'], null)); }); - it('should update the cache when the current receipts state has initialised array value', () => { - expect( - receiptsSelector(storeMock.setIn(['nahmiiHoc', 'receipts', address, 'receipts'], [])) - ).toEqual(receiptsLoaded.setIn([address, 'receipts'], [])); - }); }); describe('when previous receipts state has initialised', () => { - const store = storeMock.setIn(['nahmiiHoc', 'receipts', address, 'receipts'], fromJS([{}])); - const txs = receiptsLoaded.setIn([address, 'receipts'], fromJS([{}])); + const store = storeMock.setIn(['nahmiiHoc', 'receipts', address, 'receipts'], fromJS([{ created: '2018' }])); + const txs = receiptsLoaded.setIn([address, 'receipts'], fromJS([{ created: '2018' }])); beforeEach(() => { expect( receiptsSelector(store) @@ -98,11 +93,16 @@ describe('makeSelectReceipts', () => { describe('should update the cache', () => { it('when the size of receipts array is different from previous state', () => { expect(receiptsSelector( - store.updateIn(['nahmiiHoc', 'receipts', address, 'receipts'], (arr) => arr.push({})) - )).toEqual(txs.updateIn([address, 'receipts'], (arr) => arr.push({}))); + store.updateIn(['nahmiiHoc', 'receipts', address, 'receipts'], (arr) => arr.push(fromJS({ created: '2019' }))) + )).toEqual(txs.updateIn([address, 'receipts'], (arr) => arr.push(fromJS({ created: '2019' })))); }); }); describe('should not update the cache', () => { + it('when the last created property is the same', () => { + expect(receiptsSelector( + store.updateIn(['nahmiiHoc', 'receipts', address, 'receipts'], (arr) => arr.push(fromJS({ created: '2018' }))) + )).toEqual(txs); + }); it('even when the loading state is changed', () => { expect(txs.getIn([address, 'loading'])).toEqual(false); expect(receiptsSelector(