implemented the flow to create room in a selected space

This commit is contained in:
Mauro Romito
2026-01-21 18:59:29 +01:00
committed by Mauro
parent 8b38c2874a
commit d012380b01
10 changed files with 126 additions and 15 deletions
@@ -29,6 +29,7 @@ enum SpaceScreenCoordinatorAction {
case displaySpaceSettings(roomProxy: JoinedRoomProxyProtocol)
case displayRolesAndPermissions(roomProxy: JoinedRoomProxyProtocol)
case addExistingChildren
case displayCreateChildRoomFlow(space: SpaceServiceRoomProtocol)
}
final class SpaceScreenCoordinator: CoordinatorProtocol {
@@ -75,6 +76,8 @@ final class SpaceScreenCoordinator: CoordinatorProtocol {
actionsSubject.send(.displayRolesAndPermissions(roomProxy: roomProxy))
case .addExistingChildren:
actionsSubject.send(.addExistingChildren)
case .displayCreateChildRoomFlow(let space):
actionsSubject.send(.displayCreateChildRoomFlow(space: space))
}
}
.store(in: &cancellables)
@@ -17,6 +17,7 @@ enum SpaceScreenViewModelAction {
case displayMembers(roomProxy: JoinedRoomProxyProtocol)
case displaySpaceSettings(roomProxy: JoinedRoomProxyProtocol)
case addExistingChildren
case displayCreateChildRoomFlow(space: SpaceServiceRoomProtocol)
}
struct SpaceScreenViewState: BindableState {
@@ -34,6 +35,7 @@ struct SpaceScreenViewState: BindableState {
var canEditRolesAndPermissions = false
var canEditSecurityAndPrivacy = false
var canEditChildren = false
var canCreateRoom = false
var editMode: EditMode = .inactive
var editModeSelectedIDs: Set<String> = []
@@ -72,6 +74,7 @@ enum SpaceScreenViewAction {
case spaceSettings(roomProxy: JoinedRoomProxyProtocol)
case displayMembers(roomProxy: JoinedRoomProxyProtocol)
case addExistingRooms
case createChildRoom
case manageChildren
case removeSelectedChildren
case confirmRemoveSelectedChildren
@@ -75,6 +75,10 @@ class SpaceScreenViewModel: SpaceScreenViewModelType, SpaceScreenViewModelProtoc
.weakAssign(to: \.state.selectedSpaceRoomID, on: self)
.store(in: &cancellables)
appSettings.$createSpaceEnabled
.weakAssign(to: \.state.canCreateRoom, on: self)
.store(in: &cancellables)
Task {
if case let .joined(roomProxy) = await userSession.clientProxy.roomForIdentifier(spaceRoomListProxy.id) {
// Required to listen for membership updates in the members flow
@@ -155,6 +159,8 @@ class SpaceScreenViewModel: SpaceScreenViewModelType, SpaceScreenViewModelProtoc
} completion: {
self.state.editModeSelectedIDs.removeAll()
}
case .createChildRoom:
Task { await createChildRoom() }
}
}
@@ -165,6 +171,16 @@ class SpaceScreenViewModel: SpaceScreenViewModelType, SpaceScreenViewModelProtoc
// MARK: - Private
private func createChildRoom() async {
switch await spaceServiceProxy.spaceForIdentifier(spaceID: spaceRoomListProxy.id) {
case .success(.some(let space)):
actionsSubject.send(.displayCreateChildRoomFlow(space: space))
default:
MXLog.error("Unable to create child room: space not found")
userIndicatorController.submitIndicator(.init(title: L10n.errorUnknown))
}
}
private func join(_ spaceServiceRoom: SpaceServiceRoomProtocol) async {
state.joiningRoomIDs.insert(spaceServiceRoom.id)
defer { state.joiningRoomIDs.remove(spaceServiceRoom.id) }
@@ -121,6 +121,11 @@ struct SpaceScreen: View {
Menu {
if context.viewState.canEditChildren {
Section {
if context.viewState.canCreateRoom {
Button { context.send(viewAction: .createChildRoom) } label: {
Label(L10n.actionCreateARoom, icon: \.plus)
}
}
Button { context.send(viewAction: .addExistingRooms) } label: {
Label(L10n.actionAddExistingRooms, icon: \.room)
}