diff --git a/package-lock.json b/package-lock.json index 2c6a66b8e56f..6575e9d07fcc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -115,7 +115,7 @@ "react-native-localize": "^3.5.4", "react-native-nitro-modules": "0.35.0", "react-native-nitro-sqlite": "9.6.0", - "react-native-onyx": "3.0.69", + "react-native-onyx": "3.0.71", "react-native-pager-view": "8.0.0", "react-native-pdf": "7.0.2", "react-native-permissions": "^5.4.0", @@ -34997,9 +34997,9 @@ } }, "node_modules/react-native-onyx": { - "version": "3.0.69", - "resolved": "https://registry.npmjs.org/react-native-onyx/-/react-native-onyx-3.0.69.tgz", - "integrity": "sha512-J12iRFr4eXr1faolajLG47+P1JjToiju52+tcyyvFZB+9ik3FLiezbvz56udZd4TZi7M3mkRLuAMyzPv7BNE8w==", + "version": "3.0.71", + "resolved": "https://registry.npmjs.org/react-native-onyx/-/react-native-onyx-3.0.71.tgz", + "integrity": "sha512-q84y7aULjoRtQMjLP7fXYtI0nDROyfCgSKHEgZNHBwSvSogOEbGbsHw9qGm6jFIjIoOJf6Hzd3+FnIrFu+WVEQ==", "license": "MIT", "dependencies": { "ascii-table": "0.0.9", diff --git a/package.json b/package.json index bad6c849d38a..8b979c905e06 100644 --- a/package.json +++ b/package.json @@ -179,7 +179,7 @@ "react-native-localize": "^3.5.4", "react-native-nitro-modules": "0.35.0", "react-native-nitro-sqlite": "9.6.0", - "react-native-onyx": "3.0.69", + "react-native-onyx": "3.0.71", "react-native-pager-view": "8.0.0", "react-native-pdf": "7.0.2", "react-native-permissions": "^5.4.0", diff --git a/patches/react-native-onyx/details.md b/patches/react-native-onyx/details.md deleted file mode 100644 index b544adfc56b9..000000000000 --- a/patches/react-native-onyx/details.md +++ /dev/null @@ -1,7 +0,0 @@ -# `react-native-onyx` patches - -### [react-native-onyx+3.0.69.patch](react-native-onyx+3.0.69.patch) - -- Reason: Onyx v3.0.59 ([PR #756](https://github.com/Expensify/react-native-onyx/pull/756)) added a state reset inside the `subscribe` callback of `useOnyx` to fix stale data when keys change dynamically. However, this reset runs unconditionally — including on initial mount — which causes `useSyncExternalStore` to see a new snapshot reference after subscription, triggering one extra render per `useOnyx` hook. This patch guards the reset with a `hasMountedRef` flag so it only runs on key-change re-subscriptions, not on initial mount. -- E/App issue: https://github.com/Expensify/App/issues/85416 -- Upstream PR/issue: N/A diff --git a/patches/react-native-onyx/react-native-onyx+3.0.69.patch b/patches/react-native-onyx/react-native-onyx+3.0.69.patch deleted file mode 100644 index 7b321b0f51de..000000000000 --- a/patches/react-native-onyx/react-native-onyx+3.0.69.patch +++ /dev/null @@ -1,35 +0,0 @@ -diff --git a/node_modules/react-native-onyx/dist/useOnyx.js b/node_modules/react-native-onyx/dist/useOnyx.js -index b361d0d..4df16fa 100644 ---- a/node_modules/react-native-onyx/dist/useOnyx.js -+++ b/node_modules/react-native-onyx/dist/useOnyx.js -@@ -97,6 +97,9 @@ function useOnyx(key, options, dependencies = []) { - // after cleanup), so the hook automatically enters first-connection mode for the new key without any - // explicit reset logic — eliminating the race condition where cleanup could clobber a boolean flag. - const connectedKeyRef = (0, react_1.useRef)(null); -+ // Tracks whether the hook has completed its initial mount subscription. -+ // Unlike connectedKeyRef (which gets nulled by cleanup), this persists across re-subscriptions. -+ const hasMountedRef = (0, react_1.useRef)(false); - // Indicates if the hook is connecting to an Onyx key. - const isConnectingRef = (0, react_1.useRef)(false); - // Stores the `onStoreChange()` function, which can be used to trigger a `getSnapshot()` update when desired. -@@ -220,11 +223,15 @@ function useOnyx(key, options, dependencies = []) { - const subscribe = (0, react_1.useCallback)((onStoreChange) => { - // Reset internal state so the hook properly transitions through loading - // for the new key instead of preserving stale state from the previous one. -- previousValueRef.current = null; -- newValueRef.current = null; -- shouldGetCachedValueRef.current = true; -- sourceValueRef.current = undefined; -- resultRef.current = [undefined, { status: (options === null || options === void 0 ? void 0 : options.initWithStoredValues) === false ? 'loaded' : 'loading' }]; -+ // Only reset when the key has actually changed (not on initial mount). -+ if (hasMountedRef.current) { -+ previousValueRef.current = null; -+ newValueRef.current = null; -+ shouldGetCachedValueRef.current = true; -+ sourceValueRef.current = undefined; -+ resultRef.current = [undefined, { status: (options === null || options === void 0 ? void 0 : options.initWithStoredValues) === false ? 'loaded' : 'loading' }]; -+ } -+ hasMountedRef.current = true; - isConnectingRef.current = true; - onStoreChangeFnRef.current = onStoreChange; - connectionRef.current = OnyxConnectionManager_1.default.connect({