From ec944a99bf39ecf5de0edd6253fbe1c861bf67da Mon Sep 17 00:00:00 2001 From: Mauro Romito Date: Thu, 19 Jun 2025 17:23:42 +0200 Subject: [PATCH] show alert when trying to accept invalid invites --- .../Localizations/en.lproj/Localizable.strings | 3 ++- ElementX/Sources/Generated/Strings.swift | 4 +++- .../Screens/HomeScreen/HomeScreenViewModel.swift | 15 ++++++++++----- .../JoinRoomScreen/JoinRoomScreenModels.swift | 1 + .../JoinRoomScreen/JoinRoomScreenViewModel.swift | 16 ++++++++++++---- .../Sources/Services/Client/ClientProxy.swift | 8 +++++++- .../Services/Client/ClientProxyProtocol.swift | 1 + 7 files changed, 36 insertions(+), 12 deletions(-) diff --git a/ElementX/Resources/Localizations/en.lproj/Localizable.strings b/ElementX/Resources/Localizations/en.lproj/Localizable.strings index 32d9c15ab..3d2601a87 100644 --- a/ElementX/Resources/Localizations/en.lproj/Localizable.strings +++ b/ElementX/Resources/Localizations/en.lproj/Localizable.strings @@ -325,6 +325,7 @@ "emoji_picker_category_people" = "Smileys & People"; "emoji_picker_category_places" = "Travel & Places"; "emoji_picker_category_symbols" = "Symbols"; +"error_invalid_invite" = "The room no longer exists or the invite is no longer valid."; "error_network_or_server_issue" = "This may be due to network or server issues."; "error_room_address_already_exists" = "This room address already exists. Please try editing the room address field or change the room name"; "error_room_address_invalid_symbols" = "Some characters are not allowed. Only letters, digits and the following symbols are supported ! $ & ‘ ( ) * + / ; = ? @ [ ] - . _"; @@ -359,7 +360,7 @@ "notification_channel_noisy" = "Noisy notifications"; "notification_channel_ringing_calls" = "Ringing calls"; "notification_channel_silent" = "Silent notifications"; -"notification_fallback_content" = "You have new message(s)."; +"notification_fallback_content" = "You have new messages."; "notification_incoming_call" = "📹 Incoming call"; "notification_inline_reply_failed" = "** Failed to send - please open room"; "notification_invite_body" = "Invited you to chat"; diff --git a/ElementX/Sources/Generated/Strings.swift b/ElementX/Sources/Generated/Strings.swift index 368dd6017..c255ac60a 100644 --- a/ElementX/Sources/Generated/Strings.swift +++ b/ElementX/Sources/Generated/Strings.swift @@ -774,6 +774,8 @@ internal enum L10n { } /// Failed to upload your voice message. internal static var errorFailedUploadingVoiceMessage: String { return L10n.tr("Localizable", "error_failed_uploading_voice_message") } + /// The room no longer exists or the invite is no longer valid. + internal static var errorInvalidInvite: String { return L10n.tr("Localizable", "error_invalid_invite") } /// Message not found internal static var errorMessageNotFound: String { return L10n.tr("Localizable", "error_message_not_found") } /// This may be due to network or server issues. @@ -846,7 +848,7 @@ internal enum L10n { internal static func notificationCompatSummaryTitle(_ p1: Int) -> String { return L10n.tr("Localizable", "notification_compat_summary_title", p1) } - /// You have new message(s). + /// You have new messages. internal static var notificationFallbackContent: String { return L10n.tr("Localizable", "notification_fallback_content") } /// 📹 Incoming call internal static var notificationIncomingCall: String { return L10n.tr("Localizable", "notification_incoming_call") } diff --git a/ElementX/Sources/Screens/HomeScreen/HomeScreenViewModel.swift b/ElementX/Sources/Screens/HomeScreen/HomeScreenViewModel.swift index a072aef08..655a196e4 100644 --- a/ElementX/Sources/Screens/HomeScreen/HomeScreenViewModel.swift +++ b/ElementX/Sources/Screens/HomeScreen/HomeScreenViewModel.swift @@ -416,8 +416,13 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol isSpace: roomProxy.info.isSpace, activeMemberCount: UInt(roomProxy.info.activeMembersCount)) appSettings.seenInvites.remove(roomID) - case .failure: - displayError() + case .failure(let error): + switch error { + case .invalidInvite: + displayError(title: L10n.dialogTitleError, message: L10n.errorInvalidInvite) + default: + displayError() + } } } @@ -474,9 +479,9 @@ class HomeScreenViewModel: HomeScreenViewModelType, HomeScreenViewModelProtocol } } - private func displayError() { + private func displayError(title: String? = nil, message: String? = nil) { state.bindings.alertInfo = .init(id: UUID(), - title: L10n.commonError, - message: L10n.errorUnknown) + title: title ?? L10n.commonError, + message: message ?? L10n.errorUnknown) } } diff --git a/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenModels.swift b/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenModels.swift index 4d1a587ce..283d9ee9e 100644 --- a/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenModels.swift +++ b/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenModels.swift @@ -111,6 +111,7 @@ enum JoinRoomScreenAlertType { case declineInviteAndBlock case cancelKnock case loadingError + case invalidInvite } enum JoinRoomScreenViewAction { diff --git a/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenViewModel.swift b/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenViewModel.swift index 8fec297ca..e94fcc5dd 100644 --- a/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenViewModel.swift +++ b/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenViewModel.swift @@ -246,10 +246,14 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo appSettings.seenInvites.remove(roomID) actionsSubject.send(.joined) case .failure(let error): - if case .forbiddenAccess = error { + switch error { + case .forbiddenAccess: MXLog.error("Failed joining room alias: \(alias) forbidden access") state.mode = .forbidden - } else { + case .invalidInvite: + MXLog.error("Failed joining room alias: \(alias) invalid invite") + state.bindings.alertInfo = .init(id: .invalidInvite, title: L10n.dialogTitleError, message: L10n.errorInvalidInvite) + default: MXLog.error("Failed joining room alias: \(alias) with error: \(error)") userIndicatorController.submitIndicator(.init(title: L10n.errorUnknown)) } @@ -260,10 +264,14 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo appSettings.seenInvites.remove(roomID) actionsSubject.send(.joined) case .failure(let error): - if case .forbiddenAccess = error { + switch error { + case .forbiddenAccess: MXLog.error("Failed joining room id: \(roomID) forbidden access") state.mode = .forbidden - } else { + case .invalidInvite: + MXLog.error("Failed joining room id: \(roomID) invalid invite") + state.bindings.alertInfo = .init(id: .invalidInvite, title: L10n.dialogTitleError, message: L10n.errorInvalidInvite) + default: MXLog.error("Failed joining room id: \(roomID) with error: \(error)") userIndicatorController.submitIndicator(.init(title: L10n.errorUnknown)) } diff --git a/ElementX/Sources/Services/Client/ClientProxy.swift b/ElementX/Sources/Services/Client/ClientProxy.swift index 555cb2510..351b53bc0 100644 --- a/ElementX/Sources/Services/Client/ClientProxy.swift +++ b/ElementX/Sources/Services/Client/ClientProxy.swift @@ -467,8 +467,11 @@ class ClientProxy: ClientProxyProtocol { await waitForRoomToSync(roomID: roomID, timeout: .seconds(30)) return .success(()) + } catch ClientError.MatrixApi(kind: .unknown, _, _, _) { + MXLog.error("Failed joining roomID: \(roomID) invalid invite") + return .failure(.invalidInvite) } catch ClientError.MatrixApi(.forbidden, _, _, _) { - MXLog.error("Failed joining roomAlias: \(roomID) forbidden") + MXLog.error("Failed joining roomID: \(roomID) forbidden") return .failure(.forbiddenAccess) } catch { MXLog.error("Failed joining roomID: \(roomID) with error: \(error)") @@ -483,6 +486,9 @@ class ClientProxy: ClientProxyProtocol { await waitForRoomToSync(roomID: room.id(), timeout: .seconds(30)) return .success(()) + } catch ClientError.MatrixApi(kind: .unknown, _, _, _) { + MXLog.error("Failed joining roomAlias: \(roomAlias) invalid invite") + return .failure(.invalidInvite) } catch ClientError.MatrixApi(.forbidden, _, _, _) { MXLog.error("Failed joining roomAlias: \(roomAlias) forbidden") return .failure(.forbiddenAccess) diff --git a/ElementX/Sources/Services/Client/ClientProxyProtocol.swift b/ElementX/Sources/Services/Client/ClientProxyProtocol.swift index a11d0a7c4..60987f112 100644 --- a/ElementX/Sources/Services/Client/ClientProxyProtocol.swift +++ b/ElementX/Sources/Services/Client/ClientProxyProtocol.swift @@ -39,6 +39,7 @@ enum ClientProxyError: Error { case failedRetrievingUserIdentity case failedResolvingRoomAlias case roomNotInLocalStore + case invalidInvite } enum SlidingSyncConstants {