diff --git a/Session.xcodeproj/project.pbxproj b/Session.xcodeproj/project.pbxproj index 038509eaa..2cc66b98a 100644 --- a/Session.xcodeproj/project.pbxproj +++ b/Session.xcodeproj/project.pbxproj @@ -7915,7 +7915,7 @@ CLANG_WARN__ARC_BRIDGE_CAST_NONARC = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Developer"; - CURRENT_PROJECT_VERSION = 549; + CURRENT_PROJECT_VERSION = 550; ENABLE_BITCODE = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; @@ -7991,7 +7991,7 @@ CLANG_WARN__ARC_BRIDGE_CAST_NONARC = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = "iPhone Distribution"; - CURRENT_PROJECT_VERSION = 549; + CURRENT_PROJECT_VERSION = 550; ENABLE_BITCODE = NO; ENABLE_MODULE_VERIFIER = YES; ENABLE_STRICT_OBJC_MSGSEND = YES; diff --git a/Session/Conversations/ConversationViewModel.swift b/Session/Conversations/ConversationViewModel.swift index dbcd41154..097eb588a 100644 --- a/Session/Conversations/ConversationViewModel.swift +++ b/Session/Conversations/ConversationViewModel.swift @@ -754,11 +754,21 @@ public class ConversationViewModel: OWSAudioPlayerDelegate, NavigatableStateHold body: interaction.body, expiresStartedAtMs: interaction.expiresStartedAtMs, expiresInSeconds: interaction.expiresInSeconds, - isSenderOpenGroupModerator: dependencies[singleton: .openGroupManager].isUserModeratorOrAdmin( - publicKey: threadData.currentUserSessionId, - for: threadData.openGroupRoomToken, - on: threadData.openGroupServer - ), + isSenderModeratorOrAdmin: { + switch threadData.threadVariant { + case .group, .legacyGroup: + return (threadData.currentUserIsClosedGroupAdmin == true) + + case .community: + return dependencies[singleton: .openGroupManager].isUserModeratorOrAdmin( + publicKey: threadData.currentUserSessionId, + for: threadData.openGroupRoomToken, + on: threadData.openGroupServer + ) + + default: return false + } + }(), currentUserProfile: currentUserProfile, quote: quoteModel.map { model in // Don't care about this optimistic quote (the proper one will be generated in the database) diff --git a/Session/Conversations/Message Cells/VisibleMessageCell.swift b/Session/Conversations/Message Cells/VisibleMessageCell.swift index 5afaf7f33..dc553e9e3 100644 --- a/Session/Conversations/Message Cells/VisibleMessageCell.swift +++ b/Session/Conversations/Message Cells/VisibleMessageCell.swift @@ -310,7 +310,7 @@ final class VisibleMessageCell: MessageCell, TappableLabelDelegate { threadVariant: .contact, // Always show the display picture in 'contact' mode displayPictureFilename: nil, profile: cellViewModel.profile, - profileIcon: (cellViewModel.isSenderOpenGroupModerator ? .crown : .none), + profileIcon: (cellViewModel.isSenderModeratorOrAdmin ? .crown : .none), using: dependencies ) diff --git a/Session/Conversations/Settings/ThreadSettingsViewModel.swift b/Session/Conversations/Settings/ThreadSettingsViewModel.swift index b1b2c987d..7d611f2ac 100644 --- a/Session/Conversations/Settings/ThreadSettingsViewModel.swift +++ b/Session/Conversations/Settings/ThreadSettingsViewModel.swift @@ -540,7 +540,7 @@ class ThreadSettingsViewModel: SessionTableViewModel, NavigatableStateHolder, Ob confirmStyle: .danger, cancelStyle: .alert_text ), - onTap: { [dependencies] in + onTap: { [weak self, dependencies] in dependencies[singleton: .storage].write { db in try SessionThread.deleteOrLeave( db, @@ -550,6 +550,8 @@ class ThreadSettingsViewModel: SessionTableViewModel, NavigatableStateHolder, Ob using: dependencies ) } + + self?.dismissScreen(type: .popToRoot) } ) ), diff --git a/Session/Media Viewing & Editing/MessageInfoScreen.swift b/Session/Media Viewing & Editing/MessageInfoScreen.swift index b69a0af80..ef2b6bd58 100644 --- a/Session/Media Viewing & Editing/MessageInfoScreen.swift +++ b/Session/Media Viewing & Editing/MessageInfoScreen.swift @@ -245,7 +245,7 @@ struct MessageInfoScreen: View { threadVariant: .contact, // Always show the display picture in 'contact' mode displayPictureFilename: nil, profile: messageViewModel.profile, - profileIcon: (messageViewModel.isSenderOpenGroupModerator ? .crown : .none), + profileIcon: (messageViewModel.isSenderModeratorOrAdmin ? .crown : .none), using: dependencies ) @@ -591,7 +591,7 @@ struct MessageInfoView_Previews: PreviewProvider { expiresStartedAtMs: nil, expiresInSeconds: nil, state: .failed, - isSenderOpenGroupModerator: false, + isSenderModeratorOrAdmin: false, currentUserProfile: Profile.fetchOrCreateCurrentUser(using: dependencies), quote: nil, quoteAttachment: nil, diff --git a/SessionMessagingKit/Shared Models/MessageViewModel.swift b/SessionMessagingKit/Shared Models/MessageViewModel.swift index b118474b0..202c00a31 100644 --- a/SessionMessagingKit/Shared Models/MessageViewModel.swift +++ b/SessionMessagingKit/Shared Models/MessageViewModel.swift @@ -45,7 +45,7 @@ public struct MessageViewModel: FetchableRecordWithRowId, Decodable, Equatable, case state case hasBeenReadByRecipient case mostRecentFailureText - case isSenderOpenGroupModerator + case isSenderModeratorOrAdmin case isTypingIndicator case profile case quote @@ -129,7 +129,7 @@ public struct MessageViewModel: FetchableRecordWithRowId, Decodable, Equatable, public let state: Interaction.State public let hasBeenReadByRecipient: Bool public let mostRecentFailureText: String? - public let isSenderOpenGroupModerator: Bool + public let isSenderModeratorOrAdmin: Bool public let isTypingIndicator: Bool? public let profile: Profile? public let quote: Quote? @@ -240,7 +240,7 @@ public struct MessageViewModel: FetchableRecordWithRowId, Decodable, Equatable, state: (state ?? self.state), hasBeenReadByRecipient: self.hasBeenReadByRecipient, mostRecentFailureText: (mostRecentFailureText ?? self.mostRecentFailureText), - isSenderOpenGroupModerator: self.isSenderOpenGroupModerator, + isSenderModeratorOrAdmin: self.isSenderModeratorOrAdmin, isTypingIndicator: self.isTypingIndicator, profile: self.profile, quote: (quote ?? self.quote), @@ -302,7 +302,7 @@ public struct MessageViewModel: FetchableRecordWithRowId, Decodable, Equatable, state: self.state, hasBeenReadByRecipient: self.hasBeenReadByRecipient, mostRecentFailureText: self.mostRecentFailureText, - isSenderOpenGroupModerator: self.isSenderOpenGroupModerator, + isSenderModeratorOrAdmin: self.isSenderModeratorOrAdmin, isTypingIndicator: self.isTypingIndicator, profile: self.profile, quote: self.quote, @@ -492,7 +492,7 @@ public struct MessageViewModel: FetchableRecordWithRowId, Decodable, Equatable, state: self.state, hasBeenReadByRecipient: self.hasBeenReadByRecipient, mostRecentFailureText: self.mostRecentFailureText, - isSenderOpenGroupModerator: self.isSenderOpenGroupModerator, + isSenderModeratorOrAdmin: self.isSenderModeratorOrAdmin, isTypingIndicator: self.isTypingIndicator, profile: self.profile, quote: self.quote, @@ -745,7 +745,7 @@ public extension MessageViewModel { self.state = .sent self.hasBeenReadByRecipient = false self.mostRecentFailureText = nil - self.isSenderOpenGroupModerator = false + self.isSenderModeratorOrAdmin = false self.isTypingIndicator = isTypingIndicator self.profile = nil self.quote = quote @@ -794,7 +794,7 @@ public extension MessageViewModel { expiresStartedAtMs: Double?, expiresInSeconds: TimeInterval?, state: Interaction.State = .sending, - isSenderOpenGroupModerator: Bool, + isSenderModeratorOrAdmin: Bool, currentUserProfile: Profile, quote: Quote?, quoteAttachment: Attachment?, @@ -830,7 +830,7 @@ public extension MessageViewModel { self.state = state self.hasBeenReadByRecipient = false self.mostRecentFailureText = nil - self.isSenderOpenGroupModerator = isSenderOpenGroupModerator + self.isSenderModeratorOrAdmin = isSenderModeratorOrAdmin self.isTypingIndicator = false self.profile = currentUserProfile self.quote = quote @@ -985,10 +985,9 @@ public extension MessageViewModel { WHERE ( \(groupMember[.groupId]) = \(interaction[.threadId]) AND \(groupMember[.profileId]) = \(interaction[.authorId]) AND - \(SQL("\(thread[.variant]) = \(SessionThread.Variant.community)")) AND \(SQL("\(groupMember[.role]) IN \([GroupMember.Role.moderator, GroupMember.Role.admin])")) ) - ) AS \(ViewModel.Columns.isSenderOpenGroupModerator), + ) AS \(ViewModel.Columns.isSenderModeratorOrAdmin), \(profile.allColumns), \(quote[.interactionId]),