From c03ed528babbf30f3c42049d6bfa14404c9d3eb9 Mon Sep 17 00:00:00 2001 From: Doug <6060466+pixlwave@users.noreply.github.com> Date: Tue, 7 Oct 2025 10:57:53 +0100 Subject: [PATCH] More space tweaks (#4584) * Remove the room count everywhere. * Remove the parent name from restricted spaces. --- .../Mocks/Generated/GeneratedMocks.swift | 1 - ElementX/Sources/Mocks/SpaceRoomProxyMock.swift | 3 --- .../JoinRoomScreen/JoinRoomScreenModels.swift | 8 ++++---- .../Screens/Spaces/Common/SpaceHeaderView.swift | 5 ++--- .../Screens/Spaces/Common/SpaceRoomCell.swift | 5 ++--- .../SpaceListScreen/SpaceListScreenModels.swift | 8 -------- .../SpaceListScreen/View/SpaceListScreen.swift | 2 +- .../SpaceScreen/View/LeaveSpaceView.swift | 1 - .../Spaces/SpaceScreen/View/SpaceScreen.swift | 1 - .../Services/Spaces/LeaveSpaceHandleProxy.swift | 2 +- .../Services/Spaces/SpaceRoomListProxy.swift | 17 ++++++++--------- .../Services/Spaces/SpaceRoomProxy.swift | 8 +------- .../Spaces/SpaceRoomProxyProtocol.swift | 11 ++--------- .../Services/Spaces/SpaceServiceProxy.swift | 15 +++++++-------- ...nRoomScreenSpace.Banned-Space-iPad-en-GB.png | 4 ++-- ...RoomScreenSpace.Banned-Space-iPad-pseudo.png | 4 ++-- ...ScreenSpace.Banned-Space-iPhone-16-en-GB.png | 4 ++-- ...creenSpace.Banned-Space-iPhone-16-pseudo.png | 4 ++-- ...omScreenSpace.Forbidden-Space-iPad-en-GB.png | 4 ++-- ...mScreenSpace.Forbidden-Space-iPad-pseudo.png | 4 ++-- ...eenSpace.Forbidden-Space-iPhone-16-en-GB.png | 4 ++-- ...enSpace.Forbidden-Space-iPhone-16-pseudo.png | 4 ++-- ...eenSpace.InviteRequired-Space-iPad-en-GB.png | 4 ++-- ...enSpace.InviteRequired-Space-iPad-pseudo.png | 4 ++-- ...ace.InviteRequired-Space-iPhone-16-en-GB.png | 4 ++-- ...ce.InviteRequired-Space-iPhone-16-pseudo.png | 4 ++-- ...RoomScreenSpace.Invited-Space-iPad-en-GB.png | 4 ++-- ...oomScreenSpace.Invited-Space-iPad-pseudo.png | 4 ++-- ...creenSpace.Invited-Space-iPhone-16-en-GB.png | 4 ++-- ...reenSpace.Invited-Space-iPhone-16-pseudo.png | 4 ++-- ...nvitedWithHiddenAvatars-Space-iPad-en-GB.png | 4 ++-- ...vitedWithHiddenAvatars-Space-iPad-pseudo.png | 4 ++-- ...dWithHiddenAvatars-Space-iPhone-16-en-GB.png | 4 ++-- ...WithHiddenAvatars-Space-iPhone-16-pseudo.png | 4 ++-- ...oomScreenSpace.Joinable-Space-iPad-en-GB.png | 4 ++-- ...omScreenSpace.Joinable-Space-iPad-pseudo.png | 4 ++-- ...reenSpace.Joinable-Space-iPhone-16-en-GB.png | 4 ++-- ...eenSpace.Joinable-Space-iPhone-16-pseudo.png | 4 ++-- ...omScreenSpace.Knockable-Space-iPad-en-GB.png | 4 ++-- ...mScreenSpace.Knockable-Space-iPad-pseudo.png | 4 ++-- ...eenSpace.Knockable-Space-iPhone-16-en-GB.png | 4 ++-- ...enSpace.Knockable-Space-iPhone-16-pseudo.png | 4 ++-- ...mScreenSpace.Restricted-Space-iPad-en-GB.png | 4 ++-- ...ScreenSpace.Restricted-Space-iPad-pseudo.png | 4 ++-- ...enSpace.Restricted-Space-iPhone-16-en-GB.png | 4 ++-- ...nSpace.Restricted-Space-iPhone-16-pseudo.png | 4 ++-- ...pace.RestrictedJoinable-Space-iPad-en-GB.png | 4 ++-- ...ace.RestrictedJoinable-Space-iPad-pseudo.png | 4 ++-- ...RestrictedJoinable-Space-iPhone-16-en-GB.png | 4 ++-- ...estrictedJoinable-Space-iPhone-16-pseudo.png | 4 ++-- ...aveSpaceView.Only-Admin-Rooms-iPad-en-GB.png | 4 ++-- ...veSpaceView.Only-Admin-Rooms-iPad-pseudo.png | 4 ++-- ...aceView.Only-Admin-Rooms-iPhone-16-en-GB.png | 4 ++-- ...ceView.Only-Admin-Rooms-iPhone-16-pseudo.png | 4 ++-- .../spaceHeaderView.iPad-en-GB-0.png | 4 ++-- .../spaceHeaderView.iPad-pseudo-0.png | 4 ++-- .../spaceHeaderView.iPhone-16-en-GB-0.png | 4 ++-- .../spaceHeaderView.iPhone-16-pseudo-0.png | 4 ++-- .../spaceListScreen.iPad-en-GB-0.png | 4 ++-- .../spaceListScreen.iPad-pseudo-0.png | 4 ++-- .../spaceListScreen.iPhone-16-en-GB-0.png | 4 ++-- .../spaceListScreen.iPhone-16-pseudo-0.png | 4 ++-- .../PreviewTests/spaceRoomCell.iPad-en-GB-0.png | 4 ++-- .../spaceRoomCell.iPad-pseudo-0.png | 4 ++-- .../spaceRoomCell.iPhone-16-en-GB-0.png | 4 ++-- .../spaceRoomCell.iPhone-16-pseudo-0.png | 4 ++-- .../PreviewTests/spaceScreen.iPad-en-GB-0.png | 4 ++-- .../PreviewTests/spaceScreen.iPad-pseudo-0.png | 4 ++-- .../spaceScreen.iPhone-16-en-GB-0.png | 4 ++-- .../spaceScreen.iPhone-16-pseudo-0.png | 4 ++-- .../Sources/SpaceListScreenViewModelTests.swift | 1 - 71 files changed, 140 insertions(+), 172 deletions(-) diff --git a/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift b/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift index a7e79c320..aa9ae992c 100644 --- a/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift +++ b/ElementX/Sources/Mocks/Generated/GeneratedMocks.swift @@ -16009,7 +16009,6 @@ class SpaceRoomProxyMock: SpaceRoomProxyProtocol, @unchecked Sendable { } var underlyingIsSpace: Bool! var isDirect: Bool? - var parent: SpaceRoomProxyProtocol? var childrenCount: Int { get { return underlyingChildrenCount } set(value) { underlyingChildrenCount = value } diff --git a/ElementX/Sources/Mocks/SpaceRoomProxyMock.swift b/ElementX/Sources/Mocks/SpaceRoomProxyMock.swift index 88b32abdc..84d3df2fd 100644 --- a/ElementX/Sources/Mocks/SpaceRoomProxyMock.swift +++ b/ElementX/Sources/Mocks/SpaceRoomProxyMock.swift @@ -16,7 +16,6 @@ extension SpaceRoomProxyMock { var isSpace: Bool var isDirect: Bool? - var parent: SpaceRoomProxyProtocol? var childrenCount = 0 var joinedMembersCount = 0 @@ -38,7 +37,6 @@ extension SpaceRoomProxyMock { avatarURL = configuration.avatarURL isSpace = configuration.isSpace isDirect = configuration.isDirect - parent = configuration.parent childrenCount = configuration.childrenCount joinedMembersCount = configuration.joinedMembersCount heroes = configuration.heroes @@ -129,7 +127,6 @@ extension [SpaceRoomProxyProtocol] { SpaceRoomProxyMock(.init(id: "!\(typeName.lowercased())3:matrix.org", name: "Joined \(typeName)", isSpace: isSpace, - parent: SpaceRoomProxyMock(.init(name: "Company", isSpace: true)), joinedMembersCount: 123, topic: "Discussion on specific topic goes here.", joinRule: .restricted(rules: []), diff --git a/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenModels.swift b/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenModels.swift index e9ea7fa8a..e002a13f8 100644 --- a/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenModels.swift +++ b/ElementX/Sources/Screens/JoinRoomScreen/JoinRoomScreenModels.swift @@ -75,8 +75,8 @@ struct JoinRoomScreenViewState: BindableState { } var subtitle: String? { - if roomDetails?.isSpace == true, let spaceVisibilityTitle, let childrenCount = roomDetails?.childrenCount { - return L10n.screenSpaceListDetails(spaceVisibilityTitle, L10n.commonRooms(childrenCount)) + if roomDetails?.isSpace == true, let spaceVisibilityTitle { + return spaceVisibilityTitle } else { switch mode { case .invited(isDM: true): @@ -98,7 +98,7 @@ struct JoinRoomScreenViewState: BindableState { return switch roomDetails?.spaceVisibility { case .public: \.public case .private: \.lock - case .restricted(let parentName): \.space + case .restricted: \.space case .none: \.lock } } @@ -107,7 +107,7 @@ struct JoinRoomScreenViewState: BindableState { switch roomDetails?.spaceVisibility { case .public: L10n.commonPublicSpace case .private: L10n.commonPrivateSpace - case .restricted(let parentName): L10n.screenSpaceListParentSpace(parentName) + case .restricted: L10n.commonSharedSpace case .none: L10n.commonPrivateSpace } } diff --git a/ElementX/Sources/Screens/Spaces/Common/SpaceHeaderView.swift b/ElementX/Sources/Screens/Spaces/Common/SpaceHeaderView.swift index 73af0a9f4..10be90eb7 100644 --- a/ElementX/Sources/Screens/Spaces/Common/SpaceHeaderView.swift +++ b/ElementX/Sources/Screens/Spaces/Common/SpaceHeaderView.swift @@ -63,7 +63,7 @@ struct SpaceHeaderView: View { var spaceDetails: some View { Label { - Text(L10n.screenSpaceListDetails(spaceDetailsVisibilityTitle, L10n.commonRooms(spaceRoomProxy.childrenCount))) + Text(spaceDetailsVisibilityTitle) .font(.compound.bodyLG) .foregroundStyle(.compound.textSecondary) .multilineTextAlignment(.center) @@ -77,7 +77,7 @@ struct SpaceHeaderView: View { switch spaceRoomProxy.visibility { case .public: L10n.commonPublicSpace case .private: L10n.commonPrivateSpace - case .restricted(let parentName): L10n.screenSpaceListParentSpace(parentName) + case .restricted: L10n.commonSharedSpace case .none: L10n.commonPrivateSpace } } @@ -125,7 +125,6 @@ struct SpaceHeaderView_Previews: PreviewProvider, TestablePreview { SpaceRoomProxyMock(.init(id: "!space3:matrix.org", name: "Subspace", isSpace: true, - parent: SpaceRoomProxyMock(.init(name: "Foundation", isSpace: true)), childrenCount: 30, joinedMembersCount: 123, heroes: [.mockDan, .mockBob, .mockCharlie, .mockVerbose], diff --git a/ElementX/Sources/Screens/Spaces/Common/SpaceRoomCell.swift b/ElementX/Sources/Screens/Spaces/Common/SpaceRoomCell.swift index 24390fda1..2bef3057e 100644 --- a/ElementX/Sources/Screens/Spaces/Common/SpaceRoomCell.swift +++ b/ElementX/Sources/Screens/Spaces/Common/SpaceRoomCell.swift @@ -28,7 +28,7 @@ struct SpaceRoomCell: View { switch spaceRoomProxy.visibility { case .public: L10n.commonPublicSpace case .private: L10n.commonPrivateSpace - case .restricted(let parentName): L10n.screenSpaceListParentSpace(parentName) + case .restricted: L10n.commonSharedSpace case .none: L10n.commonPrivateSpace } } else { @@ -47,8 +47,7 @@ struct SpaceRoomCell: View { private var details: String { if spaceRoomProxy.isSpace { - L10n.screenSpaceListDetails(L10n.commonRooms(spaceRoomProxy.childrenCount), - L10n.commonMemberCount(spaceRoomProxy.joinedMembersCount)) + L10n.commonMemberCount(spaceRoomProxy.joinedMembersCount) } else { spaceRoomProxy.topic ?? " " // Use a single space to reserve a consistent amount of space. } diff --git a/ElementX/Sources/Screens/Spaces/SpaceListScreen/SpaceListScreenModels.swift b/ElementX/Sources/Screens/Spaces/SpaceListScreen/SpaceListScreenModels.swift index 4abc1d54a..8b6f96f11 100644 --- a/ElementX/Sources/Screens/Spaces/SpaceListScreen/SpaceListScreenModels.swift +++ b/ElementX/Sources/Screens/Spaces/SpaceListScreen/SpaceListScreenModels.swift @@ -21,14 +21,6 @@ struct SpaceListScreenViewState: BindableState { var selectedSpaceID: String? var bindings: SpaceListScreenViewStateBindings - - var subtitle: String { - L10n.screenSpaceListDetails(L10n.commonSpaces(joinedSpaces.count), L10n.commonRooms(joinedRoomsCount)) - } - - var joinedRoomsCount: Int { - joinedSpaces.map(\.childrenCount).reduce(0, +) - } } struct SpaceListScreenViewStateBindings { diff --git a/ElementX/Sources/Screens/Spaces/SpaceListScreen/View/SpaceListScreen.swift b/ElementX/Sources/Screens/Spaces/SpaceListScreen/View/SpaceListScreen.swift index 590828707..120c12082 100644 --- a/ElementX/Sources/Screens/Spaces/SpaceListScreen/View/SpaceListScreen.swift +++ b/ElementX/Sources/Screens/Spaces/SpaceListScreen/View/SpaceListScreen.swift @@ -39,7 +39,7 @@ struct SpaceListScreen: View { .foregroundStyle(.compound.textPrimary) .multilineTextAlignment(.center) - Text(context.viewState.subtitle) + Text(L10n.commonSpaces(context.viewState.joinedSpaces.count)) .font(.compound.bodyLG) .foregroundStyle(.compound.textSecondary) .multilineTextAlignment(.center) diff --git a/ElementX/Sources/Screens/Spaces/SpaceScreen/View/LeaveSpaceView.swift b/ElementX/Sources/Screens/Spaces/SpaceScreen/View/LeaveSpaceView.swift index da07f6163..e39dee311 100644 --- a/ElementX/Sources/Screens/Spaces/SpaceScreen/View/LeaveSpaceView.swift +++ b/ElementX/Sources/Screens/Spaces/SpaceScreen/View/LeaveSpaceView.swift @@ -153,7 +153,6 @@ struct LeaveSpaceView_Previews: PreviewProvider, TestablePreview { static let spaceRoomProxy = SpaceRoomProxyMock(.init(id: "!eng-space:matrix.org", name: "Engineering Team", isSpace: true, - parent: SpaceRoomProxyMock(.init(name: "MegaGroup", isSpace: true)), childrenCount: 30, joinedMembersCount: 76, heroes: [.mockDan, .mockBob, .mockCharlie, .mockVerbose], diff --git a/ElementX/Sources/Screens/Spaces/SpaceScreen/View/SpaceScreen.swift b/ElementX/Sources/Screens/Spaces/SpaceScreen/View/SpaceScreen.swift index 68e1b52dc..bd4006c48 100644 --- a/ElementX/Sources/Screens/Spaces/SpaceScreen/View/SpaceScreen.swift +++ b/ElementX/Sources/Screens/Spaces/SpaceScreen/View/SpaceScreen.swift @@ -89,7 +89,6 @@ struct SpaceScreen_Previews: PreviewProvider, TestablePreview { let spaceRoomProxy = SpaceRoomProxyMock(.init(id: "!eng-space:matrix.org", name: "Engineering Team", isSpace: true, - parent: SpaceRoomProxyMock(.init(name: "MegaGroup", isSpace: true)), childrenCount: 30, joinedMembersCount: 76, heroes: [.mockDan, .mockBob, .mockCharlie, .mockVerbose], diff --git a/ElementX/Sources/Services/Spaces/LeaveSpaceHandleProxy.swift b/ElementX/Sources/Services/Spaces/LeaveSpaceHandleProxy.swift index 4a4e1fa1f..641002cbb 100644 --- a/ElementX/Sources/Services/Spaces/LeaveSpaceHandleProxy.swift +++ b/ElementX/Sources/Services/Spaces/LeaveSpaceHandleProxy.swift @@ -34,7 +34,7 @@ class LeaveSpaceHandleProxy: Identifiable { room.spaceRoom.roomId != spaceID else { return nil } - return .init(spaceRoomProxy: SpaceRoomProxy(spaceRoom: room.spaceRoom, parent: nil), + return .init(spaceRoomProxy: SpaceRoomProxy(spaceRoom: room.spaceRoom), isLastAdmin: room.isLastAdmin, isSelected: !room.isLastAdmin) } diff --git a/ElementX/Sources/Services/Spaces/SpaceRoomListProxy.swift b/ElementX/Sources/Services/Spaces/SpaceRoomListProxy.swift index 2803633d4..f5e76d778 100644 --- a/ElementX/Sources/Services/Spaces/SpaceRoomListProxy.swift +++ b/ElementX/Sources/Services/Spaces/SpaceRoomListProxy.swift @@ -21,12 +21,11 @@ class SpaceRoomListProxy: SpaceRoomListProxyProtocol { private let paginationStateHandle: TaskHandle let paginationStatePublisher: CurrentValuePublisher - // Parent is temporary until we get the restricted AllowRules from the server. - init(_ spaceRoomList: SpaceRoomListProtocol, parent: SpaceRoomProxyProtocol?) throws { + init(_ spaceRoomList: SpaceRoomListProtocol) throws { guard let spaceRoom = spaceRoomList.space() else { throw SpaceRoomListProxyError.missingSpace } self.spaceRoomList = spaceRoomList - spaceRoomProxy = SpaceRoomProxy(spaceRoom: spaceRoom, parent: parent) + spaceRoomProxy = SpaceRoomProxy(spaceRoom: spaceRoom) let paginationStateSubject = CurrentValueSubject(spaceRoomList.paginationState()) paginationStatePublisher = paginationStateSubject.asCurrentValuePublisher() @@ -56,27 +55,27 @@ class SpaceRoomListProxy: SpaceRoomListProxyProtocol { for update in updates { switch update { case .append(let spaceRooms): - rooms.append(contentsOf: spaceRooms.map { SpaceRoomProxy(spaceRoom: $0, parent: spaceRoomProxy) }) + rooms.append(contentsOf: spaceRooms.map(SpaceRoomProxy.init)) case .clear: rooms.removeAll() case .pushFront(let spaceRoom): - rooms.insert(SpaceRoomProxy(spaceRoom: spaceRoom, parent: spaceRoomProxy), at: 0) + rooms.insert(SpaceRoomProxy(spaceRoom: spaceRoom), at: 0) case .pushBack(let spaceRoom): - rooms.append(SpaceRoomProxy(spaceRoom: spaceRoom, parent: spaceRoomProxy)) + rooms.append(SpaceRoomProxy(spaceRoom: spaceRoom)) case .popFront: rooms.removeFirst() case .popBack: rooms.removeLast() case .insert(let index, let spaceRoom): - rooms.insert(SpaceRoomProxy(spaceRoom: spaceRoom, parent: spaceRoomProxy), at: Int(index)) + rooms.insert(SpaceRoomProxy(spaceRoom: spaceRoom), at: Int(index)) case .set(let index, let spaceRoom): - rooms[Int(index)] = SpaceRoomProxy(spaceRoom: spaceRoom, parent: spaceRoomProxy) + rooms[Int(index)] = SpaceRoomProxy(spaceRoom: spaceRoom) case .remove(let index): rooms.remove(at: Int(index)) case .truncate(let length): rooms.removeSubrange(Int(length).. Result { do { - return try await .success(SpaceRoomListProxy(spaceService.spaceRoomList(spaceId: spaceID), parent: parent)) + return try await .success(SpaceRoomListProxy(spaceService.spaceRoomList(spaceId: spaceID))) } catch { MXLog.error("Failed creating space room list for \(spaceID): \(error)") return .failure(.sdkError(error)) @@ -57,27 +56,27 @@ class SpaceServiceProxy: SpaceServiceProxyProtocol { for update in updates { switch update { case .append(let spaceRooms): - spaces.append(contentsOf: spaceRooms.map { SpaceRoomProxy(spaceRoom: $0, parent: nil) }) + spaces.append(contentsOf: spaceRooms.map(SpaceRoomProxy.init)) case .clear: spaces.removeAll() case .pushFront(let spaceRoom): - spaces.insert(SpaceRoomProxy(spaceRoom: spaceRoom, parent: nil), at: 0) + spaces.insert(SpaceRoomProxy(spaceRoom: spaceRoom), at: 0) case .pushBack(let spaceRoom): - spaces.append(SpaceRoomProxy(spaceRoom: spaceRoom, parent: nil)) + spaces.append(SpaceRoomProxy(spaceRoom: spaceRoom)) case .popFront: spaces.removeFirst() case .popBack: spaces.removeLast() case .insert(let index, let spaceRoom): - spaces.insert(SpaceRoomProxy(spaceRoom: spaceRoom, parent: nil), at: Int(index)) + spaces.insert(SpaceRoomProxy(spaceRoom: spaceRoom), at: Int(index)) case .set(let index, let spaceRoom): - spaces[Int(index)] = SpaceRoomProxy(spaceRoom: spaceRoom, parent: nil) + spaces[Int(index)] = SpaceRoomProxy(spaceRoom: spaceRoom) case .remove(let index): spaces.remove(at: Int(index)) case .truncate(let length): spaces.removeSubrange(Int(length)..