mirror of
https://github.com/Novaloop-AG/element-x-ios.git
synced 2026-11-02 12:07:55 +00:00
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:
@@ -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() {
|
||||
|
||||
Reference in New Issue
Block a user