Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
12 changes: 8 additions & 4 deletions patches/react-native-onyx/details.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
# `react-native-onyx` patches

### [react-native-onyx+3.0.69.patch](react-native-onyx+3.0.69.patch)
### [react-native-onyx+3.0.71.patch](react-native-onyx+3.0.71.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
- Reason:

> Reverts [Onyx PR #770 (the subscription-side skip for skippable collection member ids in subscribeToKey)](https://github.com/Expensify/react-native-onyx/pull/770) and the line [PR #779](https://github.com/Expensify/react-native-onyx/pull/779) added to work around [PR #770](https://github.com/Expensify/react-native-onyx/pull/770)'s silent-no-callback contract.

- Upstream PR/issue: https://github.com/Expensify/react-native-onyx/pull/785
- E/App issue: https://github.com/Expensify/App/issues/86181
- PR Introducing Patch: https://github.com/Expensify/App/pull/90764
35 changes: 0 additions & 35 deletions patches/react-native-onyx/react-native-onyx+3.0.69.patch

This file was deleted.

67 changes: 67 additions & 0 deletions patches/react-native-onyx/react-native-onyx+3.0.71.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
diff --git a/node_modules/react-native-onyx/dist/OnyxUtils.js b/node_modules/react-native-onyx/dist/OnyxUtils.js
index de56f94..495d378 100644
--- a/node_modules/react-native-onyx/dist/OnyxUtils.js
+++ b/node_modules/react-native-onyx/dist/OnyxUtils.js
@@ -868,24 +868,6 @@ function subscribeToKey(connectOptions) {
const subscriptionID = lastSubscriptionID++;
callbackToStateMapping[subscriptionID] = mapping;
callbackToStateMapping[subscriptionID].subscriptionID = subscriptionID;
- // If the subscriber is attempting to connect to a collection member whose ID is skippable (e.g. "undefined", "null", etc.)
- // we suppress wiring the subscription fully to avoid unnecessary callback emissions such as for "report_undefined".
- // We still return a valid subscriptionID so callers can disconnect safely.
- try {
- const skippableIDs = getSkippableCollectionMemberIDs();
- if (skippableIDs.size) {
- const [, collectionMemberID] = OnyxKeys_1.default.splitCollectionMemberKey(mapping.key);
- if (skippableIDs.has(collectionMemberID)) {
- // Clean up the provisional mapping to avoid retaining unused subscribers.
- OnyxCache_1.default.addNullishStorageKey(mapping.key);
- delete callbackToStateMapping[subscriptionID];
- return subscriptionID;
- }
- }
- }
- catch (e) {
- // Not a collection member key, proceed as usual.
- }
// When keyChanged is called, a key is passed and the method looks through all the Subscribers in callbackToStateMapping for the matching key to get the subscriptionID
// to avoid having to loop through all the Subscribers all the time (even when just one connection belongs to one key),
// We create a mapping from key to lists of subscriptionIDs to access the specific list of subscriptionIDs.
@@ -1394,12 +1376,6 @@ function logKeyChanged(onyxMethod, key, value, hasChanged) {
function logKeyRemoved(onyxMethod, key) {
Logger.logInfo(`${onyxMethod} called for key: ${key} => null passed, so key was removed`);
}
-/**
- * Getter - returns the callback to state mapping, useful in test environments.
- */
-function getCallbackToStateMapping() {
- return callbackToStateMapping;
-}
/**
* Clear internal variables used in this file, useful in test environments.
*/
@@ -1458,6 +1434,5 @@ const OnyxUtils = {
setWithRetry,
multiSetWithRetry,
setCollectionWithRetry,
- getCallbackToStateMapping,
};
exports.default = OnyxUtils;
diff --git a/node_modules/react-native-onyx/dist/useOnyx.js b/node_modules/react-native-onyx/dist/useOnyx.js
index 9213cff..2e48c73 100644
--- a/node_modules/react-native-onyx/dist/useOnyx.js
+++ b/node_modules/react-native-onyx/dist/useOnyx.js
@@ -220,12 +220,8 @@ function useOnyx(key, options, dependencies = []) {
newValueRef.current = null;
sourceValueRef.current = undefined;
resultRef.current = [undefined, { status: (options === null || options === void 0 ? void 0 : options.initWithStoredValues) === false ? 'loaded' : 'loading' }];
+ shouldGetCachedValueRef.current = true;
}
- // Force a cache re-read on every (re)subscription so any side effects from
- // subscribeToKey (e.g. addNullishStorageKey for skippable collection member ids)
- // are reflected in the next getSnapshot. Resetting this flag does not change
- // resultRef by itself, so it doesn't cause an extra mount render.
- shouldGetCachedValueRef.current = true;
hasMountedRef.current = true;
isConnectingRef.current = true;
onStoreChangeFnRef.current = onStoreChange;
Loading