// Copyright © 2022 Rangeproof Pty Ltd. All rights reserved. import Foundation import GRDB import SessionUtilitiesKit public extension VisibleMessage { struct VMReaction: Codable { /// This is the timestamp (in milliseconds since epoch) when the interaction this reaction belongs to was sent public var timestamp: UInt64 /// This is the public key of the sender of the interaction this reaction belongs to public var publicKey: String /// This is the emoji for the reaction public var emoji: String /// This is the behaviour for the reaction public var kind: Kind public var isValid: Bool { true } // MARK: - Kind public enum Kind: Int, Codable { case react case remove var description: String { switch self { case .react: return "react" case .remove: return "remove" } } // MARK: - Initialization init(protoAction: SNProtoDataMessageReaction.SNProtoDataMessageReactionAction) { switch protoAction { case .react: self = .react case .remove: self = .remove } } // MARK: - Proto Conversion func toProto() -> SNProtoDataMessageReaction.SNProtoDataMessageReactionAction { switch self { case .react: return .react case .remove: return .remove } } } // MARK: - Initialization public init(timestamp: UInt64, publicKey: String, emoji: String, kind: Kind) { self.timestamp = timestamp self.publicKey = publicKey self.emoji = emoji self.kind = kind } // MARK: - Proto Conversion public static func fromProto(_ proto: SNProtoDataMessageReaction) -> VMReaction? { guard let emoji: String = proto.emoji else { return nil } return VMReaction( timestamp: proto.id, publicKey: proto.author, emoji: emoji, kind: Kind(protoAction: proto.action) ) } public func toProto() -> SNProtoDataMessageReaction? { let reactionProto = SNProtoDataMessageReaction.builder( id: self.timestamp, author: self.publicKey, action: self.kind.toProto() ) reactionProto.setEmoji(self.emoji) do { return try reactionProto.build() } catch { SNLog("Couldn't construct quote proto from: \(self).") return nil } } // MARK: - Description public var description: String { """ Reaction( timestamp: \(timestamp), publicKey: \(publicKey), emoji: \(emoji), kind: \(kind.description) ) """ } } }