session-ios/SessionMessagingKit/Messages/Visible Messages/VisibleMessage+Reaction.swift

107 lines
3.2 KiB
Swift

// 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)
)
"""
}
}
}