From 9c6fb7391a6e7a9a732fc444c94593c25a00d0db Mon Sep 17 00:00:00 2001 From: Huu Le <20178761+huult@users.noreply.github.com> Date: Tue, 20 May 2025 08:26:12 +0700 Subject: [PATCH 1/4] fix chat section not updating --- lib/OnyxUtils.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/OnyxUtils.ts b/lib/OnyxUtils.ts index f7ae2d83a..a555adba2 100644 --- a/lib/OnyxUtils.ts +++ b/lib/OnyxUtils.ts @@ -1417,7 +1417,10 @@ function updateSnapshots(data: OnyxUpdate[], mergeFn: typeof Onyx.merge): Array< } const oldValue = updatedData[key] || {}; - const newValue = lodashPick(value, Object.keys(snapshotData[key])); + const snapshotKeys = Object.keys(snapshotData[key] || {}); + const valueKeys = Object.keys(value ?? {}); + const hasNewKeys = valueKeys.some((k) => !snapshotKeys.includes(k)); + const newValue = hasNewKeys ? value : lodashPick(value, snapshotKeys); updatedData = {...updatedData, [key]: Object.assign(oldValue, newValue)}; }); From 6dd4083f7252768f94d32f9c8790f93f4473b463 Mon Sep 17 00:00:00 2001 From: Huu Le <20178761+huult@users.noreply.github.com> Date: Wed, 21 May 2025 15:58:32 +0700 Subject: [PATCH 2/4] Clear pending merge queue in multiSet to prevent applying outdated delta changes --- lib/Onyx.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lib/Onyx.ts b/lib/Onyx.ts index 4503744d2..46170cdbf 100644 --- a/lib/Onyx.ts +++ b/lib/Onyx.ts @@ -238,6 +238,11 @@ function multiSet(data: OnyxMultiSetInput): Promise { const updatePromises = keyValuePairsToSet.map(([key, value]) => { const prevValue = cache.get(key, false); + // When we use multiSet to set a key we want to clear the current delta changes from Onyx.merge that were queued + // before the value was set. If Onyx.merge is currently reading the old value from storage, it will then not apply the changes. + if (OnyxUtils.hasPendingMergeForKey(key)) { + delete OnyxUtils.getMergeQueue()[key]; + } // Update cache and optimistically inform subscribers on the next tick cache.set(key, value); From 83c071429fb43b5660cb34b91c7d91aeeecaeafe Mon Sep 17 00:00:00 2001 From: Huu Le <20178761+huult@users.noreply.github.com> Date: Wed, 21 May 2025 16:00:50 +0700 Subject: [PATCH 3/4] remove code unused --- lib/OnyxUtils.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lib/OnyxUtils.ts b/lib/OnyxUtils.ts index a555adba2..c954e0fc5 100644 --- a/lib/OnyxUtils.ts +++ b/lib/OnyxUtils.ts @@ -1417,11 +1417,7 @@ function updateSnapshots(data: OnyxUpdate[], mergeFn: typeof Onyx.merge): Array< } const oldValue = updatedData[key] || {}; - const snapshotKeys = Object.keys(snapshotData[key] || {}); - const valueKeys = Object.keys(value ?? {}); - const hasNewKeys = valueKeys.some((k) => !snapshotKeys.includes(k)); - const newValue = hasNewKeys ? value : lodashPick(value, snapshotKeys); - + const newValue = lodashPick(value, Object.keys(snapshotData[key])); updatedData = {...updatedData, [key]: Object.assign(oldValue, newValue)}; }); From bd3458ba3abe584fa505d02cc7f44a09627ce437 Mon Sep 17 00:00:00 2001 From: Huu Le <20178761+huult@users.noreply.github.com> Date: Wed, 21 May 2025 16:08:17 +0700 Subject: [PATCH 4/4] add code test --- lib/OnyxUtils.ts | 1 + tests/unit/onyxTest.ts | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/lib/OnyxUtils.ts b/lib/OnyxUtils.ts index c954e0fc5..f7ae2d83a 100644 --- a/lib/OnyxUtils.ts +++ b/lib/OnyxUtils.ts @@ -1418,6 +1418,7 @@ function updateSnapshots(data: OnyxUpdate[], mergeFn: typeof Onyx.merge): Array< const oldValue = updatedData[key] || {}; const newValue = lodashPick(value, Object.keys(snapshotData[key])); + updatedData = {...updatedData, [key]: Object.assign(oldValue, newValue)}; }); diff --git a/tests/unit/onyxTest.ts b/tests/unit/onyxTest.ts index 1bca6b377..dda151511 100644 --- a/tests/unit/onyxTest.ts +++ b/tests/unit/onyxTest.ts @@ -2029,5 +2029,25 @@ describe('Onyx', () => { [`${ONYX_KEYS.COLLECTION.TEST_KEY}entry2`]: {id: 'entry2_id', name: 'entry2_name'}, }); }); + it('should clear pending merge for a key during multiSet()', async () => { + const testKey = `${ONYX_KEYS.COLLECTION.TEST_KEY}entry1`; + + // Mock the merge queue with the correct type + const mockMergeQueue: Record = { + [testKey]: [{some: 'mergeData'}], + }; + + // Mock the utility functions + jest.spyOn(OnyxUtils, 'hasPendingMergeForKey').mockImplementation((key) => key === testKey); + jest.spyOn(OnyxUtils, 'getMergeQueue').mockImplementation(() => mockMergeQueue); + + await Onyx.multiSet({ + [testKey]: {id: 'entry1_id', name: 'entry1_name'}, + }); + + expect(mockMergeQueue[testKey]).toBeUndefined(); + + jest.restoreAllMocks(); + }); }); });