From 073516ae78c2bdaf8702e8f059885e268757ac6a Mon Sep 17 00:00:00 2001 From: ryanzhao Date: Fri, 5 Aug 2022 14:23:28 +1000 Subject: [PATCH] feat: add sortId for reaction sorting --- .../ConversationVC+Interaction.swift | 3 ++- .../Database/Models/Reaction.swift | 24 ++++++------------- SessionMessagingKit/Messages/Message.swift | 2 +- .../Open Groups/Models/SOGSMessage.swift | 5 +++- .../MessageReceiver+VisibleMessages.swift | 3 ++- .../Shared Models/MessageViewModel.swift | 2 +- 6 files changed, 17 insertions(+), 22 deletions(-) diff --git a/Session/Conversations/ConversationVC+Interaction.swift b/Session/Conversations/ConversationVC+Interaction.swift index 9dc0ba8ed..75a9b2f8c 100644 --- a/Session/Conversations/ConversationVC+Interaction.swift +++ b/Session/Conversations/ConversationVC+Interaction.swift @@ -1089,7 +1089,8 @@ extension ConversationVC: let sortId = Reaction.getSortId( db, interactionId: cellViewModel.id, - emoji: emoji + emoji: emoji, + timestamp: sentTimestamp ) try Reaction( interactionId: cellViewModel.id, diff --git a/SessionMessagingKit/Database/Models/Reaction.swift b/SessionMessagingKit/Database/Models/Reaction.swift index a5266e65e..b1e737e96 100644 --- a/SessionMessagingKit/Database/Models/Reaction.swift +++ b/SessionMessagingKit/Database/Models/Reaction.swift @@ -46,7 +46,7 @@ public struct Reaction: Codable, Equatable, Hashable, FetchableRecord, Persistab /// regardless of the type of conversation) public let count: Int64 - /// The id for sorting + /// The first timestamp that an emoji is added public let sortId: Int64 // MARK: - Relationships @@ -108,29 +108,19 @@ public extension Reaction { static func getSortId( _ db: Database, interactionId: Int64, - emoji: String + emoji: String, + timestamp: Int64 ) -> Int64 { - let existingSortId: Int64? = try? Reaction + if let existingSortId: Int64 = try? Reaction .select(Columns.sortId) .filter(Columns.interactionId == interactionId) .filter(Columns.emoji == emoji) .asRequest(of: Int64.self) .fetchOne(db) - - if let sortId = existingSortId { - return sortId + { + return existingSortId } - let existingLargestSortId: Int64? = try? Reaction - .select(max(Columns.sortId)) - .filter(Columns.interactionId == interactionId) - .asRequest(of: Int64.self) - .fetchOne(db) - - if let sortId = existingLargestSortId { - return sortId + 1 - } - - return 0 + return timestamp } } diff --git a/SessionMessagingKit/Messages/Message.swift b/SessionMessagingKit/Messages/Message.swift index f563fe932..6022a4299 100644 --- a/SessionMessagingKit/Messages/Message.swift +++ b/SessionMessagingKit/Messages/Message.swift @@ -369,7 +369,7 @@ public extension Message { let reactors = rawReaction.reactors { var count = rawReaction.count - let sortId: Int64 = 0 // TODO: Need to be modified to the server returned value + let sortId: Int64 = Int64(floor((rawReaction.first * 1000))) for reactor in reactors { if reactor == blindedUserPublicKey { continue } // Will add a reaction for this case outside of the loop let reaction = Reaction( diff --git a/SessionMessagingKit/Open Groups/Models/SOGSMessage.swift b/SessionMessagingKit/Open Groups/Models/SOGSMessage.swift index b9ff94939..2785c51e9 100644 --- a/SessionMessagingKit/Open Groups/Models/SOGSMessage.swift +++ b/SessionMessagingKit/Open Groups/Models/SOGSMessage.swift @@ -38,11 +38,13 @@ extension OpenGroupAPI { case count case reactors case you + case first } public let count: Int64 public let reactors: [String]? public let you: Bool + public let first: TimeInterval } public let reactions: [String:Reaction]? @@ -114,7 +116,8 @@ extension OpenGroupAPI.Message.Reaction { self = OpenGroupAPI.Message.Reaction( count: try container.decode(Int64.self, forKey: .count), reactors: try? container.decode([String].self, forKey: .reactors), - you: (try? container.decode(Bool.self, forKey: .you)) ?? false + you: (try? container.decode(Bool.self, forKey: .you)) ?? false, + first: ((try? container.decode(TimeInterval.self, forKey: .first)) ?? Date().timeIntervalSince1970) ) } } diff --git a/SessionMessagingKit/Sending & Receiving/Message Handling/MessageReceiver+VisibleMessages.swift b/SessionMessagingKit/Sending & Receiving/Message Handling/MessageReceiver+VisibleMessages.swift index b028be09d..d4ab1f9e5 100644 --- a/SessionMessagingKit/Sending & Receiving/Message Handling/MessageReceiver+VisibleMessages.swift +++ b/SessionMessagingKit/Sending & Receiving/Message Handling/MessageReceiver+VisibleMessages.swift @@ -327,7 +327,8 @@ extension MessageReceiver { let sortId = Reaction.getSortId( db, interactionId: interactionId, - emoji: reaction.emoji + emoji: reaction.emoji, + timestamp: Int64(messageSentTimestamp * 1000) ) switch reaction.kind { diff --git a/SessionMessagingKit/Shared Models/MessageViewModel.swift b/SessionMessagingKit/Shared Models/MessageViewModel.swift index 50e867485..37e4751ab 100644 --- a/SessionMessagingKit/Shared Models/MessageViewModel.swift +++ b/SessionMessagingKit/Shared Models/MessageViewModel.swift @@ -465,7 +465,7 @@ public extension MessageViewModel { // MARK: - Comparable public static func < (lhs: ReactionInfo, rhs: ReactionInfo) -> Bool { - return (lhs.reaction.timestampMs < rhs.reaction.timestampMs) + return (lhs.reaction.sortId < rhs.reaction.sortId) } } }