Knocking feature polishing part 2 (#3738)

* improved implementation of the unknown state

* forget button in the banned state

* error handling for forbidden access

* added the forget function

fixed DMs, and updated preview tests

* removed banned room proxy

* code polishing and test improvement
This commit is contained in:
Mauro
2025-02-05 14:48:24 +01:00
committed by GitHub
parent cfaa1b455a
commit 3839025caa
28 changed files with 466 additions and 101 deletions
@@ -57,10 +57,14 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo
Task { await joinRoom() }
case .acceptInvite:
Task { await joinRoom() }
case .forget:
Task { await forgetRoom() }
case .declineInvite:
showDeclineInviteConfirmationAlert()
case .cancelKnock:
showCancelKnockConfirmationAlert()
case .dismiss:
actionsSubject.send(.dismiss)
}
}
@@ -132,12 +136,20 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo
}
let info = roomPreview?.info ?? roomInfo
let avatar: RoomAvatar? = if let avatar = info?.avatar {
avatar
} else if let displayName = info?.displayName {
.room(id: roomID, name: displayName, avatarURL: nil)
} else {
nil
}
state.roomDetails = JoinRoomScreenRoomDetails(name: info?.displayName,
topic: info?.topic,
canonicalAlias: info?.canonicalAlias,
avatar: info?.avatar ?? .room(id: roomID, name: info?.displayName ?? "", avatarURL: nil),
memberCount: info?.joinedMembersCount ?? 0,
inviter: inviter)
avatar: avatar,
memberCount: info?.joinedMembersCount,
inviter: inviter,
isDirect: info?.isDirect)
await updateMode()
}
@@ -153,7 +165,7 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo
switch roomPreview.info.membership {
case .invited:
state.mode = .invited
state.mode = .invited(isDM: state.roomDetails?.isDirect == true && state.roomDetails?.memberCount == 1)
case .knocked:
state.mode = .knocked
case .banned:
@@ -174,7 +186,7 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo
} else if let room {
switch room {
case .invited:
state.mode = .invited
state.mode = .invited(isDM: state.roomDetails?.isDirect == true && state.roomDetails?.memberCount == 1)
case .knocked:
state.mode = .knocked
case .banned:
@@ -198,16 +210,26 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo
case .success:
actionsSubject.send(.joined)
case .failure(let error):
MXLog.error("Failed joining room alias: \(alias) with error: \(error)")
userIndicatorController.submitIndicator(.init(title: L10n.errorUnknown))
if case .forbiddenAccess = error {
MXLog.error("Failed joining room alias: \(alias) forbidden access")
state.mode = .forbidden
} else {
MXLog.error("Failed joining room alias: \(alias) with error: \(error)")
userIndicatorController.submitIndicator(.init(title: L10n.errorUnknown))
}
}
} else {
switch await clientProxy.joinRoom(roomID, via: via) {
case .success:
actionsSubject.send(.joined)
case .failure(let error):
MXLog.error("Failed joining room id: \(roomID) with error: \(error)")
userIndicatorController.submitIndicator(.init(title: L10n.errorUnknown))
if case .forbiddenAccess = error {
MXLog.error("Failed joining room id: \(roomID) forbidden access")
state.mode = .forbidden
} else {
MXLog.error("Failed joining room id: \(roomID) with error: \(error)")
userIndicatorController.submitIndicator(.init(title: L10n.errorUnknown))
}
}
}
}
@@ -242,7 +264,7 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo
}
}
}
private func showDeclineInviteConfirmationAlert() {
guard let roomDetails = state.roomDetails else {
userIndicatorController.submitIndicator(.init(title: L10n.errorUnknown))
@@ -307,6 +329,27 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo
}
}
private func forgetRoom() async {
defer {
userIndicatorController.retractIndicatorWithId(roomID)
}
userIndicatorController.submitIndicator(UserIndicator(id: roomID, type: .modal, title: L10n.commonLoading, persistent: true))
guard case .banned = room, let roomPreview else {
userIndicatorController.submitIndicator(.init(title: L10n.errorUnknown))
return
}
let result = await roomPreview.forgetRoom()
if case .failure = result {
userIndicatorController.submitIndicator(.init(title: L10n.errorUnknown))
} else {
actionsSubject.send(.dismiss)
}
}
private static let loadingIndicatorIdentifier = "\(JoinRoomScreenViewModel.self)-Loading"
private func showLoadingIndicator() {