Implement the SpaceAddRoomsScreen. (#4951)

* Update proxies ready for adding rooms to a space.

- ClientProxy.recentlyVisitedRooms to take a filter and to return room proxies.
- Expose SpaceServiceProxy.addChildToSpace.

* Implement the SpaceAddRoomsScreen.

* Fix the designs of the selected carousels.

Add more snapshot tests for inviting users.

* Fix for screen using wrong avatar size.
This commit is contained in:
Doug
2026-01-14 12:07:57 +00:00
committed by GitHub
parent 530e249eee
commit cde9714a83
61 changed files with 1060 additions and 102 deletions
+9 -6
View File
@@ -66,6 +66,7 @@ enum UserAvatarSizeOnScreen {
case settings
case roomDetails
case roomMembersList
case roomChangeRoles
case dmDetails
case startChat
case memberDetails
@@ -110,12 +111,14 @@ enum UserAvatarSizeOnScreen {
return 44
case .roomMembersList:
return 32
case .roomChangeRoles:
return 56
case .startChat:
return 36
case .memberDetails:
return 96
case .inviteUsers:
return 56
return 52
case .editUserDetails:
return 96
case .dmDetails:
@@ -153,6 +156,8 @@ enum RoomAvatarSizeOnScreen {
case roomDirectorySearch
case joinRoom
case spaceHeader
case spaceAddRooms
case spaceAddRoomsSelected
case completionSuggestions
var value: CGFloat {
@@ -164,12 +169,10 @@ enum RoomAvatarSizeOnScreen {
return 32
case .notificationSettings:
return 30
case .messageForwarding:
return 36
case .globalSearch:
return 36
case .roomSelection:
case .messageForwarding, .globalSearch, .roomSelection, .spaceAddRooms:
return 36
case .spaceAddRoomsSelected:
return 52
case .details:
return 96
case .joinRoom:
@@ -0,0 +1,48 @@
//
// Copyright 2026 Element Creations Ltd.
//
// SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-Element-Commercial.
// Please see LICENSE files in the repository root for full details.
//
import Compound
import SwiftUI
extension View {
func overlayRemoveItemButton(action: @escaping () -> Void) -> some View {
modifier(RemoveItemButtonViewModifier(action: action))
}
}
private struct RemoveItemButtonViewModifier: ViewModifier {
let action: () -> Void
func body(content: Content) -> some View {
content
.mask {
Rectangle()
.fill(.white)
.overlay(alignment: .topTrailing) {
closeButtonLabel
.hidden()
.padding(2)
.overlay { Circle().fill(.black) }
.offset(x: 2, y: -2)
}
.compositingGroup()
.luminanceToAlpha()
}
.overlay(alignment: .topTrailing) {
Button(action: action) {
closeButtonLabel
}
}
}
var closeButtonLabel: some View {
CompoundIcon(\.close, size: .custom(12), relativeTo: .compound.bodySM)
.foregroundStyle(.compound.iconOnSolidPrimary)
.padding(2)
.background(.compound.iconPrimary, in: Circle())
}
}
@@ -163,6 +163,8 @@ enum TestablePreviewsDictionary {
"SettingsScreen_Previews" : SettingsScreen_Previews.self,
"ShimmerOverlay_Previews" : ShimmerOverlay_Previews.self,
"SoftLogoutScreen_Previews" : SoftLogoutScreen_Previews.self,
"SpaceAddRoomsScreenSelectedItem_Previews" : SpaceAddRoomsScreenSelectedItem_Previews.self,
"SpaceAddRoomsScreen_Previews" : SpaceAddRoomsScreen_Previews.self,
"SpaceHeaderTopicSheetView_Previews" : SpaceHeaderTopicSheetView_Previews.self,
"SpaceHeaderView_Previews" : SpaceHeaderView_Previews.self,
"SpaceListScreen_Previews" : SpaceListScreen_Previews.self,