[Onyx bump] Bump react-native-onyx from 3.0.85 to 3.0.86#94449
Conversation
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
|
|
reviewing... |
Reviewer Checklist
Screenshots/VideosAndroid: HybridAppAndroid: mWeb Chromeandroid_mWeb.mp4iOS: HybridAppiOS: mWeb Safariios_mWeb.mp4MacOS: Chrome / Safariweb_chrome_1.mp4web_chrome_offline.mp4web_chrome_2.mp4web_chrome_3.mp4 |
@elirangoshen, I don't think this setup is required for QA, since this will be tested on staging once it's deployed. It can be removed to avoid confusion. |
|
✋ This PR was not deployed to staging yet because QA is ongoing. It will be automatically deployed to staging after the next production release. |
|
🚧 mountiny has triggered a test Expensify/App build. You can view the workflow run here. |
|
🧪🧪 Use the links below to test this adhoc build on Android, iOS, and Web. Happy testing! 🧪🧪
|
|
🚀 Deployed to staging by https://github.com/mountiny in version: 9.4.21-2 🚀
|
|
@elirangoshen @mountiny @mollfpr
Could this PR be verified internally? |
I verified and its all good |
|
🚀 Deployed to production by https://github.com/mountiny in version: 9.4.21-9 🚀
Bundle Size Analysis (Sentry): |
Explanation of Change
This PR bumps Onyx from 3.0.85 to 3.0.86 (diff), which includes the following changes:
retryOperation(mergeCollectionWithPatches,multiSetWithRetry,setCollectionWithRetry,partialSetCollection): (1) a brand-new key was silently downgraded fromStorage.multiSettoStorage.multiMergeon retry, and (2)keysChanged/keyChangedre-fired on every retry attempt, double-notifyingOnyx.connect({waitForCollectionCallback: true})subscribers (which re-fire on every call by contract). Each write now splits into an outer orchestrator (cache + subscriber notify + storage prep, called once) and a file-private write helper thatretryOperationre-enters — so the cache stays consistent and subscribers fire exactly once per logical write.setWithRetrywas already safe (broadcastUpdateshort-circuits onhasChanged === false).Fixed Issues
$ #94684
PROPOSAL: N/A — Onyx version bump. The underlying fix (react-native-onyx#792) was a #787 review follow-up with no separate App issue; companion testing PR is Expensify/App#91626.
Tests
The four refactored onyx write paths (
mergeCollectionWithPatches,multiSetWithRetry,setCollectionWithRetry,partialSetCollection) are reached from the App via Pusher events, theOpenAppresponse, everyOnyx.updatebatch that contains aMERGE_COLLECTION/MULTI_SET/SET_COLLECTIONop, LHN refresh, Search filters, chat sends, mark-all-as-read, hold/unhold, workspace switching, etc.Setup
bump-onyx-3.0.86).npm installunder Node 20.20.0, thennpm run web.Functional smoke — no regression in the refactored paths
The fix preserves the cache-first invariant from #787, so all of these should look indistinguishable from
mainto the user:main. (exercisesmergeCollectionWithPatchesvia Pusher /OpenApp)reportActions_), confirms via Pusher, persists after reload. (mergeCollectionWithPatches)mergeCollectionWithPatches)mergeCollectionWithPatches+setCollectionWithRetry)mergeCollectionWithPatches)mergeCollectionWithPatches)mergeCollectionWithPatches)Storage-failure simulation — the core regression guard
This is the test that exercises the retry path the fix targets. With the fix in place, retries on storage failure should produce one subscriber notification per logical operation (not one per retry attempt), and brand-new keys should stay routed through
multiSeteven when an earliermultiMergeretry kicks in.OnyxDB).mergeCollection-driven action — switch workspaces, send a chat message, or apply a search filter.retryOperationkicks in. Console shows storage error logs and retry attempts (look forFailed to save to storage. Error: ... retryAttempt: N/5), but no white screen, no stale UI, no data loss within the session, and no duplicatewaitForCollectionCallbacksubscriber invocations.multiSet-driven action and asetCollection-driven action (Search filter result population) to cover the other refactored paths.3.0.85locally and re-run step 4. Without the fix you'll seeOnyx.connect({waitForCollectionCallback: true})callbacks firing twice in DevTools traces.Cold-cache merge — preserves the pre-warm fast path from #787
mainsession — the cache pre-warm path (existing inmergeCollectionWithPatches) is untouched by Add hotkey navigation of the chat history in desktop #792.Offline tests
This PR is an Onyx version bump; there is no offline behavior to test that isn't already covered by the existing Onyx offline-first invariants. The fix specifically protects subscribers from going stale when a storage write fails — the user-visible behavior offline is better with this bump (UI reflects the merge even if IDB writes back-pressure), not worse. Spot-check the existing offline path:
QA Steps
Same as tests
PR Author Checklist
### Fixed Issuessection aboveTestssectionOffline stepssectionQA stepssectiontoggleReportand notonIconClick)Avatar, I verified the components usingAvatarare working as expected)StyleUtils.getBackgroundAndBorderStyle(theme.componentBG))npm run compress-svg)Avataris modified, I verified thatAvataris working as expected in all cases)Designlabel and/or tagged@Expensify/designso the design team can review the changes.mainbranch was merged into this PR after a review, I tested again and verified the outcome was still expected according to theTeststeps.Screenshots/Videos
Android: Native
N/A — Onyx storage retry path is exercised on web; no native-specific changes.
Android: mWeb Chrome
iOS: Native
N/A — Onyx storage retry path is exercised on web; no native-specific changes.
iOS: mWeb Safari
MacOS: Chrome / Safari
Screen.Recording.2026-05-26.at.14.41.29.mov
Screen.Recording.2026-05-26.at.14.42.06.mov
Screen.Recording.2026-05-26.at.14.42.27.mov
Screen.Recording.2026-05-26.at.14.43.07.mov
Screen.Recording.2026-05-26.at.14.44.17.mov
Screen.Recording.2026-05-26.at.14.44.48.mov