diff --git a/lib/Onyx.ts b/lib/Onyx.ts index 98b9413c2..c41db3b0c 100644 --- a/lib/Onyx.ts +++ b/lib/Onyx.ts @@ -303,48 +303,43 @@ function merge(key: TKey, changes: OnyxEntry { - OnyxUtils.sendActionToDevTools(OnyxUtils.METHOD.MERGE, key, changes, modifiedData); + return Storage.mergeItem(key, batchedDeltaChanges, preMergedValue, shouldSetValue).then(() => { + OnyxUtils.sendActionToDevTools(OnyxUtils.METHOD.MERGE, key, changes, preMergedValue); return updatePromise; }); } catch (error) { diff --git a/lib/storage/index.ts b/lib/storage/index.ts index cf8c575bc..c9b797b10 100644 --- a/lib/storage/index.ts +++ b/lib/storage/index.ts @@ -114,9 +114,9 @@ const Storage: Storage = { /** * Merging an existing value with a new one */ - mergeItem: (key, changes, modifiedData) => + mergeItem: (key, deltaChanges, preMergedValue, shouldSetValue = false) => tryOrDegradePerformance(() => { - const promise = provider.mergeItem(key, changes, modifiedData); + const promise = provider.mergeItem(key, deltaChanges, preMergedValue, shouldSetValue); if (shouldKeepInstancesSync) { return promise.then(() => InstanceSync.mergeItem(key)); diff --git a/lib/storage/providers/IDBKeyValProvider.ts b/lib/storage/providers/IDBKeyValProvider.ts index 3a385d228..f3539b500 100644 --- a/lib/storage/providers/IDBKeyValProvider.ts +++ b/lib/storage/providers/IDBKeyValProvider.ts @@ -40,9 +40,9 @@ const provider: StorageProvider = { return Promise.all(upsertMany); }); }), - mergeItem(key, _changes, modifiedData) { + mergeItem(key, _deltaChanges, preMergedValue) { // Since Onyx also merged the existing value with the changes, we can just set the value directly - return provider.setItem(key, modifiedData); + return provider.setItem(key, preMergedValue); }, multiSet: (pairs) => setMany(pairs, idbKeyValStore), clear: () => clear(idbKeyValStore), diff --git a/lib/storage/providers/MemoryOnlyProvider.ts b/lib/storage/providers/MemoryOnlyProvider.ts index 74d9e3a84..00583a55a 100644 --- a/lib/storage/providers/MemoryOnlyProvider.ts +++ b/lib/storage/providers/MemoryOnlyProvider.ts @@ -78,9 +78,9 @@ const provider: StorageProvider = { /** * Merging an existing value with a new one */ - mergeItem(key, _changes, modifiedData) { + mergeItem(key, _deltaChanges, preMergedValue) { // Since Onyx already merged the existing value with the changes, we can just set the value directly - return this.setItem(key, modifiedData); + return this.setItem(key, preMergedValue); }, /** diff --git a/lib/storage/providers/SQLiteProvider.ts b/lib/storage/providers/SQLiteProvider.ts index ad5324ea9..461c4b8ca 100644 --- a/lib/storage/providers/SQLiteProvider.ts +++ b/lib/storage/providers/SQLiteProvider.ts @@ -76,8 +76,12 @@ const provider: StorageProvider = { return db.executeBatchAsync([[query, queryArguments]]); }, - mergeItem(key, changes) { - return this.multiMerge([[key, changes]]) as Promise; + mergeItem(key, deltaChanges, preMergedValue, shouldSetValue) { + if (shouldSetValue) { + return this.setItem(key, preMergedValue) as Promise; + } + + return this.multiMerge([[key, deltaChanges]]) as Promise; }, getAllKeys: () => db.executeAsync('SELECT record_key FROM keyvaluepairs;').then(({rows}) => { diff --git a/lib/storage/providers/types.ts b/lib/storage/providers/types.ts index 80cf88ba7..0161ecdae 100644 --- a/lib/storage/providers/types.ts +++ b/lib/storage/providers/types.ts @@ -43,10 +43,11 @@ type StorageProvider = { /** * Merges an existing value with a new one by leveraging JSON_PATCH - * @param changes - the delta for a specific key - * @param modifiedData - the pre-merged data from `Onyx.applyMerge` + * @param deltaChanges - the delta for a specific key + * @param preMergedValue - the pre-merged data from `Onyx.applyMerge` + * @param shouldSetValue - whether the data should be set instead of merged */ - mergeItem: (key: TKey, changes: OnyxValue, modifiedData: OnyxValue) => Promise; + mergeItem: (key: TKey, deltaChanges: OnyxValue, preMergedValue: OnyxValue, shouldSetValue?: boolean) => Promise; /** * Returns all keys available in storage