react-native-onyx 2.0.57 → 2.0.58

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/Onyx.d.ts CHANGED
@@ -19,7 +19,7 @@ declare function init({ keys, initialKeyStates, safeEvictionKeys, maxCachedKeysC
19
19
  * @param [mapping.callback] a method that will be called with changed data
20
20
  * This is used by any non-React code to connect to Onyx
21
21
  * @param [mapping.initWithStoredValues] If set to false, then no data will be prefilled into the
22
- * component
22
+ * component. Default is true.
23
23
  * @param [mapping.waitForCollectionCallback] If set to true, it will return the entire collection to the callback as a single object
24
24
  * @param [mapping.selector] THIS PARAM IS ONLY USED WITH withOnyx(). If included, this will be used to subscribe to a subset of an Onyx key's data.
25
25
  * The sourceData and withOnyx state are passed to the selector and should return the simplified data. Using this setting on `withOnyx` can have very positive
package/dist/Onyx.js CHANGED
@@ -80,7 +80,7 @@ function init({ keys = {}, initialKeyStates = {}, safeEvictionKeys = [], maxCach
80
80
  * @param [mapping.callback] a method that will be called with changed data
81
81
  * This is used by any non-React code to connect to Onyx
82
82
  * @param [mapping.initWithStoredValues] If set to false, then no data will be prefilled into the
83
- * component
83
+ * component. Default is true.
84
84
  * @param [mapping.waitForCollectionCallback] If set to true, it will return the entire collection to the callback as a single object
85
85
  * @param [mapping.selector] THIS PARAM IS ONLY USED WITH withOnyx(). If included, this will be used to subscribe to a subset of an Onyx key's data.
86
86
  * The sourceData and withOnyx state are passed to the selector and should return the simplified data. Using this setting on `withOnyx` can have very positive
@@ -145,7 +145,7 @@ declare function keysChanged<TKey extends CollectionKeyBase>(collectionKey: TKey
145
145
  * @example
146
146
  * keyChanged(key, value, subscriber => subscriber.initWithStoredValues === false)
147
147
  */
148
- declare function keyChanged<TKey extends OnyxKey>(key: TKey, value: OnyxValue<TKey>, previousValue: OnyxValue<TKey>, canUpdateSubscriber?: (subscriber?: Mapping<OnyxKey>) => boolean, notifyRegularSubscibers?: boolean, notifyWithOnyxSubscibers?: boolean): void;
148
+ declare function keyChanged<TKey extends OnyxKey>(key: TKey, value: OnyxValue<TKey>, previousValue: OnyxValue<TKey>, canUpdateSubscriber?: (subscriber?: Mapping<OnyxKey>) => boolean, notifyConnectSubscribers?: boolean, notifyWithOnyxSubscribers?: boolean): void;
149
149
  /**
150
150
  * Sends the data obtained from the keys to the connection. It either:
151
151
  * - sets state on the withOnyxInstances
package/dist/OnyxUtils.js CHANGED
@@ -67,6 +67,8 @@ const evictionBlocklist = {};
67
67
  let defaultKeyStates = {};
68
68
  let batchUpdatesPromise = null;
69
69
  let batchUpdatesQueue = [];
70
+ // Used for comparison with a new update to avoid invoking the Onyx.connect callback with the same data.
71
+ const lastConnectionCallbackData = new Map();
70
72
  let snapshotKey = null;
71
73
  function getSnapshotKey() {
72
74
  return snapshotKey;
@@ -625,7 +627,7 @@ function keysChanged(collectionKey, partialCollection, partialPreviousCollection
625
627
  * @example
626
628
  * keyChanged(key, value, subscriber => subscriber.initWithStoredValues === false)
627
629
  */
628
- function keyChanged(key, value, previousValue, canUpdateSubscriber = () => true, notifyRegularSubscibers = true, notifyWithOnyxSubscibers = true) {
630
+ function keyChanged(key, value, previousValue, canUpdateSubscriber = () => true, notifyConnectSubscribers = true, notifyWithOnyxSubscribers = true) {
629
631
  var _a, _b;
630
632
  // Add or remove this key from the recentlyAccessedKeys lists
631
633
  if (value !== null) {
@@ -657,7 +659,10 @@ function keyChanged(key, value, previousValue, canUpdateSubscriber = () => true,
657
659
  }
658
660
  // Subscriber is a regular call to connect() and provided a callback
659
661
  if (typeof subscriber.callback === 'function') {
660
- if (!notifyRegularSubscibers) {
662
+ if (!notifyConnectSubscribers) {
663
+ continue;
664
+ }
665
+ if (lastConnectionCallbackData.has(subscriber.connectionID) && lastConnectionCallbackData.get(subscriber.connectionID) === value) {
661
666
  continue;
662
667
  }
663
668
  if (isCollectionKey(subscriber.key) && subscriber.waitForCollectionCallback) {
@@ -668,11 +673,12 @@ function keyChanged(key, value, previousValue, canUpdateSubscriber = () => true,
668
673
  }
669
674
  const subscriberCallback = subscriber.callback;
670
675
  subscriberCallback(value, key);
676
+ lastConnectionCallbackData.set(subscriber.connectionID, value);
671
677
  continue;
672
678
  }
673
679
  // Subscriber connected via withOnyx() HOC
674
680
  if ('withOnyxInstance' in subscriber && subscriber.withOnyxInstance) {
675
- if (!notifyWithOnyxSubscibers) {
681
+ if (!notifyWithOnyxSubscribers) {
676
682
  continue;
677
683
  }
678
684
  const selector = subscriber.selector;
@@ -784,7 +790,14 @@ function sendDataToConnection(mapping, value, matchedKey, isBatched) {
784
790
  // If we would pass undefined to setWithOnyxInstance instead, withOnyx would not set the value in the state.
785
791
  // withOnyx will internally replace null values with undefined and never pass null values to wrapped components.
786
792
  // For regular callbacks, we never want to pass null values, but always just undefined if a value is not set in cache or storage.
787
- (_b = (_a = mapping).callback) === null || _b === void 0 ? void 0 : _b.call(_a, value === null ? undefined : value, matchedKey);
793
+ const valueToPass = value === null ? undefined : value;
794
+ const lastValue = lastConnectionCallbackData.get(mapping.connectionID);
795
+ lastConnectionCallbackData.get(mapping.connectionID);
796
+ // If the value has not changed we do not need to trigger the callback
797
+ if (lastConnectionCallbackData.has(mapping.connectionID) && valueToPass === lastValue) {
798
+ return;
799
+ }
800
+ (_b = (_a = mapping).callback) === null || _b === void 0 ? void 0 : _b.call(_a, valueToPass, matchedKey);
788
801
  }
789
802
  /**
790
803
  * We check to see if this key is flagged as safe for eviction and add it to the recentlyAccessedKeys list so that when we
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-onyx",
3
- "version": "2.0.57",
3
+ "version": "2.0.58",
4
4
  "author": "Expensify, Inc.",
5
5
  "homepage": "https://expensify.com",
6
6
  "description": "State management for React Native",