diff --git a/lib/shared/update-utils.js b/lib/shared/update-utils.js --- a/lib/shared/update-utils.js +++ b/lib/shared/update-utils.js @@ -3,6 +3,7 @@ import invariant from 'invariant'; import _maxBy from 'lodash/fp/maxBy.js'; +import { updateSpecs } from './updates/update-specs.js'; import { updateTypes } from '../types/update-types-enum.js'; import { type ServerUpdateInfo, @@ -21,23 +22,7 @@ } function keyForUpdateData(updateData: UpdateData): ?string { - if ( - updateData.type === updateTypes.UPDATE_THREAD || - updateData.type === updateTypes.UPDATE_THREAD_READ_STATUS || - updateData.type === updateTypes.DELETE_THREAD || - updateData.type === updateTypes.JOIN_THREAD - ) { - return updateData.threadID; - } else if (updateData.type === updateTypes.UPDATE_ENTRY) { - return updateData.entryID; - } else if (updateData.type === updateTypes.UPDATE_CURRENT_USER) { - return updateData.userID; - } else if (updateData.type === updateTypes.DELETE_ACCOUNT) { - return updateData.deletedUserID; - } else if (updateData.type === updateTypes.UPDATE_USER) { - return updateData.updatedUserID; - } - return null; + return updateSpecs[updateData.type].keyForUpdateData?.(updateData) ?? null; } function keyForUpdateInfo(updateInfo: ServerUpdateInfo): ?string { diff --git a/lib/shared/updates/delete-account-spec.js b/lib/shared/updates/delete-account-spec.js --- a/lib/shared/updates/delete-account-spec.js +++ b/lib/shared/updates/delete-account-spec.js @@ -76,6 +76,9 @@ updateTypes.DELETE_ACCOUNT, updateTypes.UPDATE_USER, ]), + keyForUpdateData(data: AccountDeletionUpdateData) { + return data.deletedUserID; + }, typesOfReplacedUpdatesForMatchingKey: 'all_types', infoValidator: tShape({ type: tNumber(updateTypes.DELETE_ACCOUNT), diff --git a/lib/shared/updates/delete-thread-spec.js b/lib/shared/updates/delete-thread-spec.js --- a/lib/shared/updates/delete-thread-spec.js +++ b/lib/shared/updates/delete-thread-spec.js @@ -64,6 +64,9 @@ }; }, deleteCondition: 'all_types', + keyForUpdateData(data: ThreadDeletionUpdateData) { + return data.threadID; + }, typesOfReplacedUpdatesForMatchingKey: 'all_types', infoValidator: tShape({ type: tNumber(updateTypes.DELETE_THREAD), diff --git a/lib/shared/updates/join-thread-spec.js b/lib/shared/updates/join-thread-spec.js --- a/lib/shared/updates/join-thread-spec.js +++ b/lib/shared/updates/join-thread-spec.js @@ -152,6 +152,9 @@ }; }, deleteCondition: 'all_types', + keyForUpdateData(data: ThreadJoinUpdateData) { + return data.threadID; + }, typesOfReplacedUpdatesForMatchingKey: 'all_types', infoValidator: tShape({ type: tNumber(updateTypes.JOIN_THREAD), diff --git a/lib/shared/updates/update-current-user-spec.js b/lib/shared/updates/update-current-user-spec.js --- a/lib/shared/updates/update-current-user-spec.js +++ b/lib/shared/updates/update-current-user-spec.js @@ -58,6 +58,9 @@ }; }, deleteCondition: new Set([updateTypes.UPDATE_CURRENT_USER]), + keyForUpdateData(data: CurrentUserUpdateData) { + return data.userID; + }, typesOfReplacedUpdatesForMatchingKey: 'all_types', infoValidator: tShape({ type: tNumber(updateTypes.UPDATE_CURRENT_USER), diff --git a/lib/shared/updates/update-entry-spec.js b/lib/shared/updates/update-entry-spec.js --- a/lib/shared/updates/update-entry-spec.js +++ b/lib/shared/updates/update-entry-spec.js @@ -74,6 +74,9 @@ }; }, deleteCondition: 'all_types', + keyForUpdateData(data: EntryUpdateData) { + return data.entryID; + }, typesOfReplacedUpdatesForMatchingKey: 'all_types', infoValidator: tShape({ type: tNumber(updateTypes.UPDATE_ENTRY), diff --git a/lib/shared/updates/update-spec.js b/lib/shared/updates/update-spec.js --- a/lib/shared/updates/update-spec.js +++ b/lib/shared/updates/update-spec.js @@ -91,6 +91,7 @@ params: UpdateInfoFromRawInfoParams, ) => ?UpdateInfo, +deleteCondition: ?UpdateTypes, + +keyForUpdateData?: (data: Data) => string, +typesOfReplacedUpdatesForMatchingKey: ?UpdateTypes, +infoValidator: TType, }; diff --git a/lib/shared/updates/update-thread-read-status-spec.js b/lib/shared/updates/update-thread-read-status-spec.js --- a/lib/shared/updates/update-thread-read-status-spec.js +++ b/lib/shared/updates/update-thread-read-status-spec.js @@ -72,6 +72,9 @@ }; }, deleteCondition: new Set([updateTypes.UPDATE_THREAD_READ_STATUS]), + keyForUpdateData(data: ThreadReadStatusUpdateData) { + return data.threadID; + }, typesOfReplacedUpdatesForMatchingKey: new Set([ updateTypes.UPDATE_THREAD_READ_STATUS, ]), diff --git a/lib/shared/updates/update-thread-spec.js b/lib/shared/updates/update-thread-spec.js --- a/lib/shared/updates/update-thread-spec.js +++ b/lib/shared/updates/update-thread-spec.js @@ -93,6 +93,9 @@ updateTypes.UPDATE_THREAD, updateTypes.UPDATE_THREAD_READ_STATUS, ]), + keyForUpdateData(data: ThreadUpdateData) { + return data.threadID; + }, typesOfReplacedUpdatesForMatchingKey: new Set([ updateTypes.UPDATE_THREAD_READ_STATUS, ]), diff --git a/lib/shared/updates/update-user-spec.js b/lib/shared/updates/update-user-spec.js --- a/lib/shared/updates/update-user-spec.js +++ b/lib/shared/updates/update-user-spec.js @@ -43,6 +43,9 @@ }; }, deleteCondition: new Set([updateTypes.UPDATE_USER]), + keyForUpdateData(data: UserUpdateData) { + return data.updatedUserID; + }, typesOfReplacedUpdatesForMatchingKey: null, infoValidator: tShape({ type: tNumber(updateTypes.UPDATE_USER),