Membership aware room routes (#2709)

* Remove the invites button when room list invites are enabled

* element-hq/element-x-ios/issues/2632 - Handle room permalinks based on their membership state and show the according room joining screens:
- modify the room flow coordinator to only take a roomID and be able to decide its own room flows (especially for unjoined rooms)
- add support for the new room preview API
- have RoomDirectorySearch go through the same paths
This commit is contained in:
Stefan Ceriu
2024-04-19 17:04:18 +03:00
committed by GitHub
parent 9a172df7fd
commit effe3b6a9b
35 changed files with 698 additions and 247 deletions
@@ -21,34 +21,44 @@ enum JoinRoomScreenViewModelAction {
case cancelled
}
enum JoinRoomScreenInteractionMode {
case unknown
case invited
case join
case knock
}
struct JoinRoomScreenViewState: BindableState {
// Maybe use room summary details or similar here??
let roomID: String
let roomName: String
let avatarURL: URL?
let interaction: JoinRoomScreenInteraction
var roomDetails: RoomPreviewDetails?
var isJoining = false
var mode: JoinRoomScreenInteractionMode {
guard let roomDetails else {
return .unknown
}
if roomDetails.isInvited {
return .invited
}
if roomDetails.isPublic {
return .join
}
// Knocking is not supported yet, treat it as .unknown
// if roomDetails.canKnock {
// return .knock
// }
return .unknown
}
var bindings = JoinRoomScreenViewStateBindings()
var title: String {
switch interaction {
case .knock:
L10n.screenJoinRoomTitleKnock
case .join, .invited:
L10n.screenJoinRoomTitleNoPreview
}
}
var subtitle: String {
switch interaction {
case .knock:
L10n.screenJoinRoomSubtitleKnock
case .join, .invited:
L10n.screenJoinRoomSubtitleNoPreview
}
roomDetails?.name ?? L10n.screenJoinRoomTitleNoPreview
}
}
@@ -57,13 +67,7 @@ struct JoinRoomScreenViewStateBindings {
}
enum JoinRoomScreenAlertType {
case joinFailed
}
enum JoinRoomScreenInteraction {
case knock
case join
case invited
case declineInvite
}
enum JoinRoomScreenViewAction {