Add support for joining rooms from a space. (#4501)

* Add support for joining rooms from a space.

Doesn't yet handle the Join button 🤔

* Handle the join button for both rooms and spaces.

Also refactor more instances of spaceRoom to spaceRoomProxy.
This commit is contained in:
Doug
2025-09-11 16:41:19 +01:00
committed by GitHub
parent 880f2060f4
commit c2ac60f1e6
30 changed files with 304 additions and 34 deletions
@@ -6,6 +6,7 @@
//
import Combine
import MatrixRustSDK
import SwiftUI
typealias JoinRoomScreenViewModelType = StateStoreViewModel<JoinRoomScreenViewState, JoinRoomScreenViewAction>
@@ -211,8 +212,8 @@ class JoinRoomScreenViewModel: JoinRoomScreenViewModelType, JoinRoomScreenViewMo
state.mode = .inviteRequired
case .knock, .knockRestricted:
state.mode = appSettings.knockingEnabled ? .knockable : .joinable
case .restricted:
state.mode = .restricted
case .restricted(let rules):
state.mode = clientProxy.canJoinRoom(with: rules) ? .joinable : .restricted
default:
state.mode = .joinable
}
@@ -306,7 +306,8 @@ struct JoinRoomScreen: View {
struct JoinRoomScreen_Previews: PreviewProvider, TestablePreview {
static let unknownViewModel = makeViewModel(mode: .unknown)
static let joinableViewModel = makeViewModel(mode: .joinable)
static let restrictedViewModel = makeViewModel(mode: .restricted)
static let restrictedViewModel = makeViewModel(mode: .restricted, canJoinRoom: false)
static let restrictedJoinableViewModel = makeViewModel(mode: .restricted)
static let inviteRequiredViewModel = makeViewModel(mode: .inviteRequired)
static let invitedViewModel = makeViewModel(mode: .invited(isDM: false))
static let invitedDMViewModel = makeViewModel(mode: .invited(isDM: true))
@@ -321,6 +322,8 @@ struct JoinRoomScreen_Previews: PreviewProvider, TestablePreview {
makePreview(viewModel: unknownViewModel, mode: .unknown)
makePreview(viewModel: joinableViewModel, mode: .joinable)
makePreview(viewModel: restrictedViewModel, mode: .restricted)
makePreview(viewModel: restrictedJoinableViewModel, mode: .restricted,
customPreviewName: "RestrictedJoinable")
makePreview(viewModel: inviteRequiredViewModel, mode: .inviteRequired)
makePreview(viewModel: invitedViewModel, mode: .invited(isDM: false))
makePreview(viewModel: invitedDMViewModel, mode: .invited(isDM: true))
@@ -359,11 +362,14 @@ struct JoinRoomScreen_Previews: PreviewProvider, TestablePreview {
}
}
static func makeViewModel(mode: JoinRoomScreenMode, hideInviteAvatars: Bool = false) -> JoinRoomScreenViewModel {
static func makeViewModel(mode: JoinRoomScreenMode,
canJoinRoom: Bool = true,
hideInviteAvatars: Bool = false) -> JoinRoomScreenViewModel {
let appSettings = AppSettings()
appSettings.knockingEnabled = true
let clientProxy = ClientProxyMock(.init(hideInviteAvatars: hideInviteAvatars))
clientProxy.canJoinRoomWithReturnValue = canJoinRoom
switch mode {
case .unknown: