feat: add capability check for open group emoji reacts

This commit is contained in:
Ryan Zhao 2022-08-18 16:13:20 +10:00
parent f7a4c92d38
commit 651373234a
4 changed files with 39 additions and 6 deletions

View File

@ -105,6 +105,7 @@ extension ContextMenuVC {
for cellViewModel: MessageViewModel,
recentEmojis: [EmojiWithSkinTones],
currentUserIsOpenGroupModerator: Bool,
currentThreadIsMessageRequest: Bool,
delegate: ContextMenuActionDelegate?
) -> [Action]? {
// No context items for info messages
@ -156,6 +157,13 @@ extension ContextMenuVC {
currentUserIsOpenGroupModerator
)
let shouldShowEmojiActions: Bool = {
if cellViewModel.threadVariant == .openGroup {
return OpenGroupManager.isOpenGroupSupport(.reactions, on: cellViewModel.threadOpenGroupServer)
}
return currentThreadIsMessageRequest
}()
let generatedActions: [Action] = [
(canReply ? Action.reply(cellViewModel, delegate) : nil),
(canCopy ? Action.copy(cellViewModel, delegate) : nil),
@ -165,7 +173,7 @@ extension ContextMenuVC {
(canBan ? Action.ban(cellViewModel, delegate) : nil),
(canBan ? Action.banAndDeleteAllMessages(cellViewModel, delegate) : nil),
]
.appending(contentsOf: recentEmojis.map { Action.react(cellViewModel, $0, delegate) })
.appending(contentsOf: (shouldShowEmojiActions ? recentEmojis : []).map { Action.react(cellViewModel, $0, delegate) })
.appending(Action.emojiPlusButton(cellViewModel, delegate))
.compactMap { $0 }

View File

@ -671,14 +671,13 @@ extension ConversationVC:
contextMenuWindow == nil,
let actions: [ContextMenuVC.Action] = ContextMenuVC.actions(
for: cellViewModel,
recentEmojis: ((self.viewModel.threadData.threadIsMessageRequest == true) ? [] :
(self.viewModel.threadData.recentReactionEmoji ?? [])
).compactMap { EmojiWithSkinTones(rawValue: $0) },
recentEmojis: (self.viewModel.threadData.recentReactionEmoji ?? []).compactMap { EmojiWithSkinTones(rawValue: $0) },
currentUserIsOpenGroupModerator: OpenGroupManager.isUserModeratorOrAdmin(
self.viewModel.threadData.currentUserPublicKey,
for: self.viewModel.threadData.openGroupRoomToken,
on: self.viewModel.threadData.openGroupServer
),
currentThreadIsMessageRequest: (self.viewModel.threadData.threadIsMessageRequest == true),
delegate: self
)
else { return }
@ -1125,7 +1124,9 @@ extension ConversationVC:
Emoji.addRecent(db, emoji: emoji)
}
if let openGroup: OpenGroup = try? OpenGroup.fetchOne(db, id: cellViewModel.threadId) {
if let openGroup: OpenGroup = try? OpenGroup.fetchOne(db, id: cellViewModel.threadId),
OpenGroupManager.isOpenGroupSupport(.reactions, on: openGroup.server)
{
// Send reaction to open groups
guard
let openGroupServerMessageId: Int64 = try? Interaction

View File

@ -16,11 +16,12 @@ public struct Capability: Codable, FetchableRecord, PersistableRecord, TableReco
public enum Variant: Equatable, Hashable, CaseIterable, Codable, DatabaseValueConvertible {
public static var allCases: [Variant] {
[.sogs, .blind]
[.sogs, .blind, .reactions]
}
case sogs
case blind
case reactions
/// Fallback case if the capability isn't supported by this version of the app
case unsupported(String)

View File

@ -740,6 +740,29 @@ public final class OpenGroupManager: NSObject {
// MARK: - Convenience
/// This method specifies if the given capability is supported on a specified Open Group
public static func isOpenGroupSupport(
_ capability: Capability.Variant,
on server: String?,
using dependencies: OGMDependencies = OGMDependencies()
) -> Bool {
guard let server: String = server else { return false }
return dependencies.storage
.read { db in
let capabilities: [Capability.Variant] = (try? Capability
.select(.variant)
.filter(Capability.Columns.openGroupServer == server)
.filter(Capability.Columns.isMissing == false)
.asRequest(of: Capability.Variant.self)
.fetchAll(db))
.defaulting(to: [])
return capabilities.contains(capability)
}
.defaulting(to: false)
}
/// This method specifies if the given publicKey is a moderator or an admin within a specified Open Group
public static func isUserModeratorOrAdmin(
_ publicKey: String,