From 31dcb3c985d12b726036978914174b60c5d8ba53 Mon Sep 17 00:00:00 2001 From: Ryan Zhao Date: Mon, 29 Aug 2022 15:58:49 +1000 Subject: [PATCH] feat: cache remove all for open group emoji reacts --- .../ConversationVC+Interaction.swift | 19 +++++++++++++++++-- SessionMessagingKit/Messages/Message.swift | 18 ++++++++++++++---- .../Open Groups/Models/PendingChange.swift | 10 ++++++++-- .../Open Groups/OpenGroupManager.swift | 2 +- 4 files changed, 40 insertions(+), 9 deletions(-) diff --git a/Session/Conversations/ConversationVC+Interaction.swift b/Session/Conversations/ConversationVC+Interaction.swift index 4c743a856..231445b18 100644 --- a/Session/Conversations/ConversationVC+Interaction.swift +++ b/Session/Conversations/ConversationVC+Interaction.swift @@ -1040,6 +1040,15 @@ extension ConversationVC: return Promise(error: StorageError.objectNotFound) } + let pendingChange = OpenGroupManager + .addPendingReaction( + emoji: emoji, + id: openGroupServerMessageId, + in: openGroup.roomToken, + on: openGroup.server, + type: .removeAll + ) + return OpenGroupAPI .reactionDeleteAll( db, @@ -1048,7 +1057,13 @@ extension ConversationVC: in: openGroup.roomToken, on: openGroup.server ) - .map { _ in () } + .map { _, response in + OpenGroupManager + .updatePendingChange( + pendingChange, + seqNo: response.seqNo + ) + } } .done { _ in Storage.shared.writeAsync { db in @@ -1168,7 +1183,7 @@ extension ConversationVC: id: openGroupServerMessageId, in: openGroup.roomToken, on: openGroup.server, - type: .react + type: .add ) OpenGroupAPI .reactionAdd( diff --git a/SessionMessagingKit/Messages/Message.swift b/SessionMessagingKit/Messages/Message.swift index 28c2b3f28..dbd6acc86 100644 --- a/SessionMessagingKit/Messages/Message.swift +++ b/SessionMessagingKit/Messages/Message.swift @@ -369,12 +369,20 @@ public extension Message { rawReaction.count > 0, let reactors = rawReaction.reactors { + // Decide whether we need to ignore all reactions + let pendingChangeRemoveAllReaction: Bool = associatedPendingChanges.contains { pendingChange in + if case .reaction(_, let emoji, let action) = pendingChange.metadata { + return emoji == decodedEmoji && action == .removeAll + } + return false + } + // Decide whether we need to add an extra reaction from current user let pendingChangeSelfReaction: Bool? = { // Find the newest 'PendingChange' entry with a matching emoji, if one exists, and // set the "self reaction" value based on it's action let maybePendingChange: OpenGroupAPI.PendingChange? = associatedPendingChanges - .sorted(by: { lhs, rhs -> Bool in (lhs.seqNo ?? Int64.max) > (rhs.seqNo ?? Int64.max) }) + .sorted(by: { lhs, rhs -> Bool in (lhs.seqNo ?? Int64.max) >= (rhs.seqNo ?? Int64.max) }) .first { pendingChange in if case .reaction(_, let emoji, _) = pendingChange.metadata { return emoji == decodedEmoji @@ -390,11 +398,11 @@ public extension Message { else { return nil } // Otherwise add/remove accordingly - return (action == .react) + return action == .add }() let shouldAddSelfReaction: Bool = ( pendingChangeSelfReaction ?? - (rawReaction.you || reactors.contains(userPublicKey)) + ((rawReaction.you || reactors.contains(userPublicKey)) && !pendingChangeRemoveAllReaction) ) let count: Int64 = rawReaction.you ? rawReaction.count - 1 : rawReaction.count @@ -408,6 +416,8 @@ public extension Message { results = results .appending( // Add the first reaction (with the count) + pendingChangeRemoveAllReaction ? + nil : desiredReactorIds.first .map { reactor in Reaction( @@ -422,7 +432,7 @@ public extension Message { } ) .appending( // Add all other reactions - contentsOf: desiredReactorIds.count <= 1 ? + contentsOf: desiredReactorIds.count <= 1 || pendingChangeRemoveAllReaction ? [] : desiredReactorIds .suffix(from: 1) diff --git a/SessionMessagingKit/Open Groups/Models/PendingChange.swift b/SessionMessagingKit/Open Groups/Models/PendingChange.swift index 1c9c3e513..dd5af98b5 100644 --- a/SessionMessagingKit/Open Groups/Models/PendingChange.swift +++ b/SessionMessagingKit/Open Groups/Models/PendingChange.swift @@ -4,12 +4,18 @@ import Foundation extension OpenGroupAPI { public struct PendingChange: Equatable { - enum ChangeType { + public enum ChangeType { case reaction } + public enum ReactAction: Equatable { + case add + case remove + case removeAll + } + enum Metadata { - case reaction(messageId: Int64, emoji: String, action: VisibleMessage.VMReaction.Kind) + case reaction(messageId: Int64, emoji: String, action: ReactAction) } let server: String diff --git a/SessionMessagingKit/Open Groups/OpenGroupManager.swift b/SessionMessagingKit/Open Groups/OpenGroupManager.swift index 4364a4dff..611fd0a94 100644 --- a/SessionMessagingKit/Open Groups/OpenGroupManager.swift +++ b/SessionMessagingKit/Open Groups/OpenGroupManager.swift @@ -764,7 +764,7 @@ public final class OpenGroupManager: NSObject { id: Int64, in roomToken: String, on server: String, - type: VisibleMessage.VMReaction.Kind, + type: OpenGroupAPI.PendingChange.ReactAction, using dependencies: OGMDependencies = OGMDependencies() ) -> OpenGroupAPI.PendingChange { let pendingChange = OpenGroupAPI.PendingChange(