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 @@ -26,28 +26,7 @@ } function keyForUpdateInfo(updateInfo: ServerUpdateInfo): ?string { - if ( - updateInfo.type === updateTypes.UPDATE_THREAD || - updateInfo.type === updateTypes.JOIN_THREAD - ) { - return updateInfo.threadInfo.id; - } else if ( - updateInfo.type === updateTypes.UPDATE_THREAD_READ_STATUS || - updateInfo.type === updateTypes.DELETE_THREAD - ) { - return updateInfo.threadID; - } else if (updateInfo.type === updateTypes.UPDATE_ENTRY) { - const { id } = updateInfo.entryInfo; - invariant(id, 'should be set'); - return id; - } else if (updateInfo.type === updateTypes.UPDATE_CURRENT_USER) { - return updateInfo.currentUserInfo.id; - } else if (updateInfo.type === updateTypes.DELETE_ACCOUNT) { - return updateInfo.deletedUserID; - } else if (updateInfo.type === updateTypes.UPDATE_USER) { - return updateInfo.updatedUserID; - } - return null; + return updateSpecs[updateInfo.type].keyForUpdateInfo?.(updateInfo) ?? null; } // ESLint doesn't recognize that invariant always throws 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 @@ -79,6 +79,9 @@ keyForUpdateData(data: AccountDeletionUpdateData) { return data.deletedUserID; }, + keyForUpdateInfo(info: AccountDeletionUpdateInfo) { + return info.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 @@ -67,6 +67,9 @@ keyForUpdateData(data: ThreadDeletionUpdateData) { return data.threadID; }, + keyForUpdateInfo(info: ThreadDeletionUpdateInfo) { + return info.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 @@ -155,6 +155,9 @@ keyForUpdateData(data: ThreadJoinUpdateData) { return data.threadID; }, + keyForUpdateInfo(info: ThreadJoinUpdateInfo) { + return info.threadInfo.id; + }, 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 @@ -61,6 +61,9 @@ keyForUpdateData(data: CurrentUserUpdateData) { return data.userID; }, + keyForUpdateInfo(info: CurrentUserUpdateInfo) { + return info.currentUserInfo.id; + }, 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 @@ -77,6 +77,11 @@ keyForUpdateData(data: EntryUpdateData) { return data.entryID; }, + keyForUpdateInfo(info: EntryUpdateInfo) { + const { id } = info.entryInfo; + invariant(id, 'should be set'); + return id; + }, 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 @@ -92,6 +92,7 @@ ) => ?UpdateInfo, +deleteCondition: ?UpdateTypes, +keyForUpdateData?: (data: Data) => string, + +keyForUpdateInfo?: (info: UpdateInfo) => 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 @@ -75,6 +75,9 @@ keyForUpdateData(data: ThreadReadStatusUpdateData) { return data.threadID; }, + keyForUpdateInfo(info: ThreadReadStatusUpdateInfo) { + return info.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 @@ -96,6 +96,9 @@ keyForUpdateData(data: ThreadUpdateData) { return data.threadID; }, + keyForUpdateInfo(info: ThreadUpdateInfo) { + return info.threadInfo.id; + }, 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 @@ -46,6 +46,9 @@ keyForUpdateData(data: UserUpdateData) { return data.updatedUserID; }, + keyForUpdateInfo(info: UserUpdateInfo) { + return info.updatedUserID; + }, typesOfReplacedUpdatesForMatchingKey: null, infoValidator: tShape({ type: tNumber(updateTypes.UPDATE_USER),