Add support for space rooms on the JoinRoomScreen. (#4582)

* Add support for space rooms to JoinRoomScreenModel.

* Make a single wrapper type for JoinRoomScreen previews to simplify instantiation.

* Add previews for JoinRoomScreen for spaces.
This commit is contained in:
Doug
2025-10-07 10:51:58 +01:00
committed by GitHub
parent 1a5ff8b012
commit 8cd5c9862e
102 changed files with 671 additions and 321 deletions
@@ -5,7 +5,8 @@
// Please see LICENSE files in the repository root for full details.
//
import Foundation
import Compound
import SwiftUI
enum JoinRoomScreenViewModelAction {
case joined(JoinRoomScreenJoinDetails)
@@ -41,9 +42,13 @@ struct JoinRoomScreenRoomDetails {
let canonicalAlias: String?
let avatar: RoomAvatar?
let memberCount: Int?
let heroes: [UserProfileProxy]
let inviter: RoomInviterDetails?
let isDirect: Bool?
let isSpace: Bool?
let childrenCount: Int?
let spaceVisibility: SpaceRoomProxyVisibility?
}
struct JoinRoomScreenViewState: BindableState {
@@ -70,16 +75,40 @@ struct JoinRoomScreenViewState: BindableState {
}
var subtitle: String? {
switch mode {
case .invited(isDM: true):
if let inviter = roomDetails?.inviter {
return inviter.displayName != nil ? inviter.id : nil
if roomDetails?.isSpace == true, let spaceVisibilityTitle, let childrenCount = roomDetails?.childrenCount {
return L10n.screenSpaceListDetails(spaceVisibilityTitle, L10n.commonRooms(childrenCount))
} else {
switch mode {
case .invited(isDM: true):
if let inviter = roomDetails?.inviter {
return inviter.displayName != nil ? inviter.id : nil
}
return nil
case .loading, .unknown, .knocked:
return nil
default:
return roomDetails?.canonicalAlias
}
return nil
case .loading, .unknown, .knocked:
return nil
default:
return roomDetails?.canonicalAlias
}
}
var subtitleIcon: KeyPath<CompoundIcons, Image>? {
guard roomDetails?.isSpace == true else { return nil }
return switch roomDetails?.spaceVisibility {
case .public: \.public
case .private: \.lock
case .restricted(let parentName): \.space
case .none: \.lock
}
}
var spaceVisibilityTitle: String? {
switch roomDetails?.spaceVisibility {
case .public: L10n.commonPublicSpace
case .private: L10n.commonPrivateSpace
case .restricted(let parentName): L10n.screenSpaceListParentSpace(parentName)
case .none: L10n.commonPrivateSpace
}
}
@@ -88,7 +117,7 @@ struct JoinRoomScreenViewState: BindableState {
// https://github.com/matrix-org/matrix-rust-sdk/issues/4825
if isDMInvite, let inviter = roomDetails?.inviter {
.heroes([.init(userID: inviter.id, displayName: inviter.displayName, avatarURL: hideInviteAvatars ? nil : inviter.avatarURL)])
} else if let roomDetails, let avatar = roomDetails.avatar {
} else if let avatar = roomDetails?.avatar {
shouldHideAvatars ? avatar.removingAvatar : avatar
} else if let name = roomDetails?.name {
.room(id: roomID, name: name, avatarURL: nil)