1. Updated the space selection UI 2. Paginate spaces after room creation 3. Pre-selected space creation defaults to space members access.

This commit is contained in:
Mauro Romito
2026-02-09 15:53:55 +01:00
committed by Mauro
parent 14845d5620
commit c9cd4cb1dd
10 changed files with 80 additions and 50 deletions
@@ -39,6 +39,7 @@ class SpaceFlowCoordinator: FlowCoordinatorProtocol {
private let selectedSpaceRoomSubject: CurrentValueSubject<String?, Never> = .init(nil)
private var spaceScreenCoordinator: SpaceScreenCoordinator?
private var childSpaceFlowCoordinator: SpaceFlowCoordinator?
private var roomFlowCoordinator: RoomFlowCoordinator?
private var membersFlowCoordinator: RoomMembersFlowCoordinator?
@@ -361,6 +362,7 @@ class SpaceFlowCoordinator: FlowCoordinatorProtocol {
appSettings: flowParameters.appSettings,
userIndicatorController: flowParameters.userIndicatorController)
let coordinator = SpaceScreenCoordinator(parameters: parameters)
spaceScreenCoordinator = coordinator
coordinator.actionsPublisher
.sink { [weak self] action in
guard let self else { return }
@@ -645,8 +647,10 @@ class SpaceFlowCoordinator: FlowCoordinatorProtocol {
switch flowCoordinatorResult {
case .room(let id):
stateMachine.tryEvent(.startRoomFlow(roomID: id))
spaceScreenCoordinator?.reset()
case .space(let spaceRoomListProxy):
stateMachine.tryEvent(.startChildFlow, userInfo: spaceRoomListProxy)
spaceScreenCoordinator?.reset()
case .cancelled, .none:
break
}
+23 -12
View File
@@ -396,6 +396,10 @@ internal enum L10n {
internal static var commonAbout: String { return L10n.tr("Localizable", "common_about") }
/// Acceptable use policy
internal static var commonAcceptableUsePolicy: String { return L10n.tr("Localizable", "common_acceptable_use_policy") }
/// Add an account
internal static var commonAddAccount: String { return L10n.tr("Localizable", "common_add_account") }
/// Add another account
internal static var commonAddAnotherAccount: String { return L10n.tr("Localizable", "common_add_another_account") }
/// Adding caption
internal static var commonAddingCaption: String { return L10n.tr("Localizable", "common_adding_caption") }
/// Advanced settings
@@ -560,6 +564,8 @@ internal enum L10n {
internal static var commonNoResults: String { return L10n.tr("Localizable", "common_no_results") }
/// No room name
internal static var commonNoRoomName: String { return L10n.tr("Localizable", "common_no_room_name") }
/// No space name
internal static var commonNoSpaceName: String { return L10n.tr("Localizable", "common_no_space_name") }
/// Not encrypted
internal static var commonNotEncrypted: String { return L10n.tr("Localizable", "common_not_encrypted") }
/// Offline
@@ -604,10 +610,14 @@ internal enum L10n {
internal static var commonPreparing: String { return L10n.tr("Localizable", "common_preparing") }
/// Privacy policy
internal static var commonPrivacyPolicy: String { return L10n.tr("Localizable", "common_privacy_policy") }
/// Private
internal static var commonPrivate: String { return L10n.tr("Localizable", "common_private") }
/// Private room
internal static var commonPrivateRoom: String { return L10n.tr("Localizable", "common_private_room") }
/// Private space
internal static var commonPrivateSpace: String { return L10n.tr("Localizable", "common_private_space") }
/// Public
internal static var commonPublic: String { return L10n.tr("Localizable", "common_public") }
/// Public room
internal static var commonPublicRoom: String { return L10n.tr("Localizable", "common_public_room") }
/// Public space
@@ -666,6 +676,8 @@ internal enum L10n {
internal static var commonSecurity: String { return L10n.tr("Localizable", "common_security") }
/// Seen by
internal static var commonSeenBy: String { return L10n.tr("Localizable", "common_seen_by") }
/// Select an account
internal static var commonSelectAccount: String { return L10n.tr("Localizable", "common_select_account") }
/// Plural format key: "%#@COUNT@"
internal static func commonSelectedCount(_ p1: Int) -> String {
return L10n.tr("Localizable", "common_selected_count", p1)
@@ -704,6 +716,8 @@ internal enum L10n {
internal static var commonSomethingWentWrongMessage: String { return L10n.tr("Localizable", "common_something_went_wrong_message") }
/// Space
internal static var commonSpace: String { return L10n.tr("Localizable", "common_space") }
/// Space members
internal static var commonSpaceMembers: String { return L10n.tr("Localizable", "common_space_members") }
/// What is this space about?
internal static var commonSpaceTopicPlaceholder: String { return L10n.tr("Localizable", "common_space_topic_placeholder") }
/// Plural format key: "%#@COUNT@"
@@ -830,6 +844,12 @@ internal enum L10n {
internal static func cryptoEventKeyForwardedUnknownProfileDialogContent(_ p1: Any) -> String {
return L10n.tr("Localizable", "crypto_event_key_forwarded_unknown_profile_dialog_content", String(describing: p1))
}
/// New members don't see history
internal static var cryptoHistorySharingRoomInfoHiddenBadgeContent: String { return L10n.tr("Localizable", "crypto_history_sharing_room_info_hidden_badge_content") }
/// New members see history
internal static var cryptoHistorySharingRoomInfoSharedBadgeContent: String { return L10n.tr("Localizable", "crypto_history_sharing_room_info_shared_badge_content") }
/// Anyone can see history
internal static var cryptoHistorySharingRoomInfoWorldReadableBadgeContent: String { return L10n.tr("Localizable", "crypto_history_sharing_room_info_world_readable_badge_content") }
/// This room has been configured so that new members can read history. %1$@
internal static func cryptoHistoryVisible(_ p1: Any) -> String {
return L10n.tr("Localizable", "crypto_history_visible", String(describing: p1))
@@ -1646,7 +1666,9 @@ internal enum L10n {
internal static var screenCreateRoomRoomVisibilitySectionTitle: String { return L10n.tr("Localizable", "screen_create_room_room_visibility_section_title") }
/// (no space)
internal static var screenCreateRoomSpaceSelectionNoSpaceDescription: String { return L10n.tr("Localizable", "screen_create_room_space_selection_no_space_description") }
/// Home
/// Do not add to a space
internal static var screenCreateRoomSpaceSelectionNoSpaceOption: String { return L10n.tr("Localizable", "screen_create_room_space_selection_no_space_option") }
/// No space selected
internal static var screenCreateRoomSpaceSelectionNoSpaceTitle: String { return L10n.tr("Localizable", "screen_create_room_space_selection_no_space_title") }
/// Add to space
internal static var screenCreateRoomSpaceSelectionSheetTitle: String { return L10n.tr("Localizable", "screen_create_room_space_selection_sheet_title") }
@@ -3665,17 +3687,6 @@ internal enum L10n {
internal static var yourAvatar: String { return L10n.tr("Localizable", "a11y.your_avatar") }
}
internal enum Common {
/// Add an account
internal static var addAccount: String { return L10n.tr("Localizable", "common.add_account") }
/// Add another account
internal static var addAnotherAccount: String { return L10n.tr("Localizable", "common.add_another_account") }
/// No space name
internal static var noSpaceName: String { return L10n.tr("Localizable", "common.no_space_name") }
/// Select an account
internal static var selectAccount: String { return L10n.tr("Localizable", "common.select_account") }
}
internal enum Error {
/// You're already logged in on this device as %1$@.
internal static func accountAlreadyLoggedIn(_ p1: Any) -> String {
@@ -41,17 +41,21 @@ class CreateRoomScreenViewModel: CreateRoomScreenViewModelType, CreateRoomScreen
var selectedSpace: SpaceServiceRoom?
var canSelectSpace = false
var selectedAccessType = CreateRoomScreenAccessType.private
switch spaceSelectionMode {
case .editableSpacesList:
canSelectSpace = true
case .preSelected(let value):
selectedSpace = value
if value.joinRule != .public {
selectedAccessType = .spaceMembers
}
case .none:
break
}
let bindings = CreateRoomScreenViewStateBindings(roomTopic: "",
selectedAccessType: .private,
selectedAccessType: selectedAccessType,
selectedSpace: selectedSpace)
super.init(initialViewState: CreateRoomScreenViewState(isSpace: isSpace,
@@ -234,13 +234,7 @@ struct CreateRoomScreen: View {
context.showSpaceSelectionSheet = true
})
} else {
ListRow(label: .avatar(title: L10n.screenCreateRoomSpaceSelectionNoSpaceTitle,
description: L10n.screenCreateRoomSpaceSelectionNoSpaceDescription,
icon: CompoundIcon(\.homeSolid, size: .small, relativeTo: .body)
.foregroundColor(.compound.iconPrimary)
.scaledFrame(size: 32)
.background(.compound.bgSubtleSecondary)
.clipAvatar(isSpace: true, size: 32)),
ListRow(label: .plain(title: L10n.screenCreateRoomSpaceSelectionNoSpaceTitle),
kind: .navigationLink {
context.showSpaceSelectionSheet = true
})
@@ -24,14 +24,7 @@ struct CreateRoomSpaceSelectionSheet: View {
NavigationStack {
List {
Section {
ListRow(label: .avatar(title: L10n.screenCreateRoomSpaceSelectionNoSpaceTitle,
description: L10n.screenCreateRoomSpaceSelectionNoSpaceDescription,
icon: CompoundIcon(\.homeSolid, size: .small, relativeTo: .body)
.foregroundColor(.compound.iconPrimary)
.scaledFrame(size: 32)
.background(.compound.bgSubtleSecondary)
.scaledFrame(size: 32)
.clipAvatar(isSpace: true, size: 32)),
ListRow(label: .plain(title: L10n.screenCreateRoomSpaceSelectionNoSpaceOption),
kind: .selection(isSelected: context.selectedSpace == nil) {
context.selectedSpace = nil
dismiss()
@@ -93,4 +93,8 @@ final class SpaceScreenCoordinator: CoordinatorProtocol {
func toPresentable() -> AnyView {
AnyView(SpaceScreen(context: viewModel.context))
}
func reset() {
viewModel.reset()
}
}
@@ -170,6 +170,10 @@ class SpaceScreenViewModel: SpaceScreenViewModelType, SpaceScreenViewModelProtoc
state.joiningRoomIDs.removeAll()
}
func reset() {
Task { await spaceRoomListProxy.resetAndWaitForFullReload(timeout: .seconds(10)) }
}
// MARK: - Private
private func createChildRoom() async {
@@ -14,4 +14,6 @@ protocol SpaceScreenViewModelProtocol {
var context: SpaceScreenViewModelType.Context { get }
func stop()
func reset()
}