diff --git a/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift b/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift index 72ff18d65..f7cb5372c 100644 --- a/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift +++ b/ElementX/Sources/Screens/RoomScreen/RoomScreenViewModel.swift @@ -353,11 +353,19 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol // Don't show a context menu for non-event based items. return nil } - + if timelineItem is StateRoomTimelineItem { // Don't show a context menu for state events. return nil } + + var debugActions: [TimelineItemMenuAction] = appSettings.canShowDeveloperOptions ? [.viewSource] : [] + + if let encryptedItem = timelineItem as? EncryptedRoomTimelineItem, + case let .megolmV1AesSha2(sessionID) = encryptedItem.encryptionType { + debugActions.append(.retryDecryption(sessionID: sessionID)) + return .init(actions: [], debugActions: debugActions) + } var actions: [TimelineItemMenuAction] = [ .reply @@ -382,13 +390,6 @@ class RoomScreenViewModel: RoomScreenViewModelType, RoomScreenViewModelProtocol } else { actions.append(.report) } - - var debugActions: [TimelineItemMenuAction] = appSettings.canShowDeveloperOptions ? [.viewSource] : [] - - if let item = timelineItem as? EncryptedRoomTimelineItem, - case let .megolmV1AesSha2(sessionID) = item.encryptionType { - debugActions.append(.retryDecryption(sessionID: sessionID)) - } if item.hasFailedToSend { actions = actions.filter(\.canAppearInFailedEcho) diff --git a/ElementX/Sources/Screens/RoomScreen/View/TimelineItemMenu.swift b/ElementX/Sources/Screens/RoomScreen/View/TimelineItemMenu.swift index e81f49ad3..102b6bb80 100644 --- a/ElementX/Sources/Screens/RoomScreen/View/TimelineItemMenu.swift +++ b/ElementX/Sources/Screens/RoomScreen/View/TimelineItemMenu.swift @@ -77,6 +77,12 @@ public struct TimelineItemMenu: View { let item: EventBasedTimelineItemProtocol let actions: TimelineItemMenuActions + + private var canShowReactions: Bool { + !item.isRedacted && + !item.hasFailedToSend && + !item.hasFailedDecryption + } public var body: some View { VStack { @@ -88,7 +94,7 @@ public struct TimelineItemMenu: View { ScrollView { VStack(alignment: .leading, spacing: 0.0) { - if !item.isRedacted, !item.hasFailedToSend { + if canShowReactions { reactionsSection .padding(.top, 4.0) .padding(.bottom, 8.0) diff --git a/ElementX/Sources/Services/Timeline/TimelineItems/EventBasedTimelineItemProtocol.swift b/ElementX/Sources/Services/Timeline/TimelineItems/EventBasedTimelineItemProtocol.swift index 8fa59a4ce..3b38ef624 100644 --- a/ElementX/Sources/Services/Timeline/TimelineItems/EventBasedTimelineItemProtocol.swift +++ b/ElementX/Sources/Services/Timeline/TimelineItems/EventBasedTimelineItemProtocol.swift @@ -45,4 +45,8 @@ extension EventBasedTimelineItemProtocol { var isRedacted: Bool { self is RedactedRoomTimelineItem } + + var hasFailedDecryption: Bool { + self is EncryptedRoomTimelineItem + } } diff --git a/changelog.d/1185.bugfix b/changelog.d/1185.bugfix new file mode 100644 index 000000000..c15cd2118 --- /dev/null +++ b/changelog.d/1185.bugfix @@ -0,0 +1 @@ +Messages that have failed to be decrypted are show only view source and retry decryptions as possible actions. \ No newline at end of file