Fixes #2808 - Switch the message sending failure options from a dialog to an alert

* Fixes #2808 - Switch the message sending failure options from a dialog to an alert
- this prevents it from showing up as a popup on the room list on an iPad
- it used to be set on the timeline and not on the timeline item because of our use of a UITableView
* Cleanup room screen action names
This commit is contained in:
Stefan Ceriu
2024-05-09 14:35:47 +03:00
committed by GitHub
parent d97f912df7
commit 905b21e0a8
16 changed files with 180 additions and 245 deletions
@@ -19,16 +19,19 @@ import UIKit
enum RoomScreenInteractionHandlerAction {
case composer(action: RoomScreenComposerAction)
case displayError(RoomScreenErrorType)
case displayEmojiPicker(itemID: TimelineItemIdentifier, selectedEmojis: Set<String>)
case displayReportContent(itemID: TimelineItemIdentifier, senderID: String)
case displayMessageForwarding(itemID: TimelineItemIdentifier)
case displayMediaUploadPreviewScreen(url: URL)
case displayPollForm(mode: PollFormMode)
case displayRoomMemberDetails(userID: String)
case showActionMenu(TimelineItemActionMenuInfo)
case showDebugInfo(TimelineItemDebugInfo)
case showConfirmationAlert(AlertInfo<UUID>)
case displayAudioRecorderPermissionError
case displayErrorToast(String)
}
@MainActor
@@ -85,7 +88,7 @@ class RoomScreenInteractionHandler {
// MARK: Timeline Item Action Menu
func showTimelineItemActionMenu(for itemID: TimelineItemIdentifier) {
func displayTimelineItemActionMenu(for itemID: TimelineItemIdentifier) {
Task {
if case let .success(value) = await roomProxy.canUserRedactOther(userID: roomProxy.ownUserID) {
canCurrentUserRedactOthers = value
@@ -186,7 +189,7 @@ class RoomScreenInteractionHandler {
return .init(actions: actions, debugActions: debugActions)
}
func processTimelineItemMenuAction(_ action: TimelineItemMenuAction, itemID: TimelineItemIdentifier) {
func handleTimelineItemMenuAction(_ action: TimelineItemMenuAction, itemID: TimelineItemIdentifier) {
guard let timelineItem = timelineController.timelineItems.firstUsingStableID(itemID),
let eventTimelineItem = timelineItem as? EventBasedTimelineItemProtocol else {
return
@@ -214,13 +217,13 @@ class RoomScreenInteractionHandler {
}
case .copyPermalink:
guard let eventID = eventTimelineItem.id.eventID else {
actionsSubject.send(.displayError(.alert(L10n.errorFailedCreatingThePermalink)))
actionsSubject.send(.displayErrorToast(L10n.errorFailedCreatingThePermalink))
return
}
Task {
guard case let .success(permalinkURL) = await roomProxy.matrixToEventPermalink(eventID) else {
actionsSubject.send(.displayError(.alert(L10n.errorFailedCreatingThePermalink)))
actionsSubject.send(.displayErrorToast(L10n.errorFailedCreatingThePermalink))
return
}
@@ -256,7 +259,7 @@ class RoomScreenInteractionHandler {
case .report:
actionsSubject.send(.displayReportContent(itemID: itemID, senderID: eventTimelineItem.sender.id))
case .react:
showEmojiPicker(for: itemID)
displayEmojiPicker(for: itemID)
case .toggleReaction(let key):
guard let eventID = itemID.eventID else { return }
Task { await roomProxy.timeline.toggleReaction(key, to: eventID) }
@@ -294,7 +297,7 @@ class RoomScreenInteractionHandler {
case .success:
break
case .failure:
actionsSubject.send(.displayError(.toast(L10n.errorUnknown)))
actionsSubject.send(.displayErrorToast(L10n.errorUnknown))
}
}
}
@@ -307,7 +310,7 @@ class RoomScreenInteractionHandler {
case .success:
break
case .failure:
actionsSubject.send(.displayError(.toast(L10n.errorUnknown)))
actionsSubject.send(.displayErrorToast(L10n.errorUnknown))
}
}
}
@@ -318,7 +321,7 @@ class RoomScreenInteractionHandler {
guard let contentType = provider.preferredContentType,
let preferredExtension = contentType.preferredFilenameExtension else {
MXLog.error("Invalid NSItemProvider: \(provider)")
actionsSubject.send(.displayError(.toast(L10n.screenRoomErrorFailedProcessingMedia)))
actionsSubject.send(.displayErrorToast(L10n.screenRoomErrorFailedProcessingMedia))
return
}
@@ -334,13 +337,13 @@ class RoomScreenInteractionHandler {
}
if let error {
self.actionsSubject.send(.displayError(.toast(L10n.screenRoomErrorFailedProcessingMedia)))
self.actionsSubject.send(.displayErrorToast(L10n.screenRoomErrorFailedProcessingMedia))
MXLog.error("Failed processing NSItemProvider: \(providerDescription) with error: \(error)")
return
}
guard let data else {
self.actionsSubject.send(.displayError(.toast(L10n.screenRoomErrorFailedProcessingMedia)))
self.actionsSubject.send(.displayErrorToast(L10n.screenRoomErrorFailedProcessingMedia))
MXLog.error("Invalid NSItemProvider data: \(providerDescription)")
return
}
@@ -359,7 +362,7 @@ class RoomScreenInteractionHandler {
self.actionsSubject.send(.displayMediaUploadPreviewScreen(url: url))
} catch {
self.actionsSubject.send(.displayError(.toast(L10n.screenRoomErrorFailedProcessingMedia)))
self.actionsSubject.send(.displayErrorToast(L10n.screenRoomErrorFailedProcessingMedia))
MXLog.error("Failed storing NSItemProvider data \(providerDescription) with error: \(error)")
}
}
@@ -381,11 +384,7 @@ class RoomScreenInteractionHandler {
switch error {
case .audioRecorderError(.recordPermissionNotGranted):
MXLog.info("permission to record audio has not been granted.")
actionsSubject.send(.showConfirmationAlert(.init(id: .init(),
title: L10n.dialogPermissionMicrophoneTitleIos(InfoPlistReader.main.bundleDisplayName),
message: L10n.dialogPermissionMicrophoneDescriptionIos,
primaryButton: .init(title: L10n.commonSettings, action: { [weak self] in self?.openSystemSettings() }),
secondaryButton: .init(title: L10n.actionNotNow, role: .cancel, action: nil))))
actionsSubject.send(.displayAudioRecorderPermissionError)
default:
MXLog.error("failed to start voice message recording. \(error)")
actionsSubject.send(.composer(action: .setMode(mode: .default)))
@@ -427,7 +426,7 @@ class RoomScreenInteractionHandler {
func sendCurrentVoiceMessage() async {
guard let audioPlayerState = voiceMessageRecorder.previewAudioPlayerState, let recordingURL = voiceMessageRecorder.recordingURL else {
actionsSubject.send(.displayError(.alert(L10n.errorFailedUploadingVoiceMessage)))
actionsSubject.send(.displayErrorToast(L10n.errorFailedUploadingVoiceMessage))
return
}
@@ -445,7 +444,7 @@ class RoomScreenInteractionHandler {
case .failure(let error):
MXLog.error("failed to send the voice message. \(error)")
actionsSubject.send(.composer(action: .setMode(mode: .previewVoiceMessage(state: audioPlayerState, waveform: .url(recordingURL), isUploading: false))))
actionsSubject.send(.displayError(.alert(L10n.errorFailedUploadingVoiceMessage)))
actionsSubject.send(.displayErrorToast(L10n.errorFailedUploadingVoiceMessage))
}
}
@@ -578,7 +577,7 @@ class RoomScreenInteractionHandler {
// MARK: Other
func showEmojiPicker(for itemID: TimelineItemIdentifier) {
func displayEmojiPicker(for itemID: TimelineItemIdentifier) {
guard let timelineItem = timelineController.timelineItems.firstUsingStableID(itemID),
timelineItem.isReactable,
let eventTimelineItem = timelineItem as? EventBasedTimelineItemProtocol else {
@@ -588,7 +587,7 @@ class RoomScreenInteractionHandler {
actionsSubject.send(.displayEmojiPicker(itemID: itemID, selectedEmojis: selectedEmojis))
}
func handleTappedUser(userID: String) async {
func displayRoomMemberDetails(userID: String) async {
actionsSubject.send(.displayRoomMemberDetails(userID: userID))
}
@@ -623,10 +622,6 @@ class RoomScreenInteractionHandler {
}
}
private func openSystemSettings() {
appMediator.openAppSettings()
}
private func displayMediaActionIfPossible(timelineItem: RoomTimelineItemProtocol) async -> RoomTimelineControllerAction {
var source: MediaSourceProxy?
var body: String