From e107fdc4c04380403af9403cfd5d9af1b0d7e1ec Mon Sep 17 00:00:00 2001 From: Doug <6060466+pixlwave@users.noreply.github.com> Date: Mon, 8 Sep 2025 12:04:17 +0100 Subject: [PATCH] Add the sheet for expanding the space description. (#4475) * Start working on space description * Hook up presentation of the SpaceScreenDescriptionView. * Make the SpaceScreenDescriptionView more accessible and apply a background colour. * Refactor and move sheet presentation to the header view. --------- Co-authored-by: amshak <85162587+amshakal@users.noreply.github.com> --- .../Sources/GeneratedAccessibilityTests.swift | 4 ++ ElementX.xcodeproj/project.pbxproj | 4 ++ .../TestablePreviewsDictionary.swift | 1 + .../Common/SpaceHeaderTopicSheetView.swift | 51 +++++++++++++++++++ .../Spaces/Common/SpaceHeaderView.swift | 19 +++++-- .../Sources/GeneratedPreviewTests.swift | 6 +++ ...spaceHeaderTopicSheetView.iPad-en-GB-0.png | 3 ++ ...paceHeaderTopicSheetView.iPad-pseudo-0.png | 3 ++ ...HeaderTopicSheetView.iPhone-16-en-GB-0.png | 3 ++ ...eaderTopicSheetView.iPhone-16-pseudo-0.png | 3 ++ 10 files changed, 92 insertions(+), 5 deletions(-) create mode 100644 ElementX/Sources/Screens/Spaces/Common/SpaceHeaderTopicSheetView.swift create mode 100644 PreviewTests/Sources/__Snapshots__/PreviewTests/spaceHeaderTopicSheetView.iPad-en-GB-0.png create mode 100644 PreviewTests/Sources/__Snapshots__/PreviewTests/spaceHeaderTopicSheetView.iPad-pseudo-0.png create mode 100644 PreviewTests/Sources/__Snapshots__/PreviewTests/spaceHeaderTopicSheetView.iPhone-16-en-GB-0.png create mode 100644 PreviewTests/Sources/__Snapshots__/PreviewTests/spaceHeaderTopicSheetView.iPhone-16-pseudo-0.png diff --git a/AccessibilityTests/Sources/GeneratedAccessibilityTests.swift b/AccessibilityTests/Sources/GeneratedAccessibilityTests.swift index ca1f3ab57..ba13bde28 100644 --- a/AccessibilityTests/Sources/GeneratedAccessibilityTests.swift +++ b/AccessibilityTests/Sources/GeneratedAccessibilityTests.swift @@ -583,6 +583,10 @@ extension AccessibilityTests { try await performAccessibilityAudit(named: "SoftLogoutScreen_Previews") } + func testSpaceHeaderTopicSheetView() async throws { + try await performAccessibilityAudit(named: "SpaceHeaderTopicSheetView_Previews") + } + func testSpaceHeaderView() async throws { try await performAccessibilityAudit(named: "SpaceHeaderView_Previews") } diff --git a/ElementX.xcodeproj/project.pbxproj b/ElementX.xcodeproj/project.pbxproj index 77cf5b4a0..6439fa104 100644 --- a/ElementX.xcodeproj/project.pbxproj +++ b/ElementX.xcodeproj/project.pbxproj @@ -1046,6 +1046,7 @@ BE8E5985771DF9137C6CE89A /* ProcessInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 077B01C13BBA2996272C5FB5 /* ProcessInfo.swift */; }; BEC6DFEA506085D3027E353C /* MediaEventsTimelineScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 002399C6CB875C4EBB01CBC0 /* MediaEventsTimelineScreen.swift */; }; BED59052E5C5163D2B065CA6 /* EventTimelineItem.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A81FD0C60175FA081EB19AD /* EventTimelineItem.swift */; }; + BF523D9E12E3C4AABBA2F6CB /* SpaceHeaderTopicSheetView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1D9F2E1FC5A0139571211CE8 /* SpaceHeaderTopicSheetView.swift */; }; BFEB24336DFD5F196E6F3456 /* IntentionalMentions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0DF5CBAF69BDF5DF31C661E1 /* IntentionalMentions.swift */; }; C0090506A52A1991BAF4BA68 /* NotificationSettingsChatType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 07579F9C29001E40715F3014 /* NotificationSettingsChatType.swift */; }; C022284E2774A5E1EF683B4D /* FileManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = 04DF593C3F7AF4B2FBAEB05D /* FileManager.swift */; }; @@ -1635,6 +1636,7 @@ 1D70253004A5AEC9C73D6A4F /* ComposerDraftService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposerDraftService.swift; sourceTree = ""; }; 1D8C38663020DF2EB2D13F5E /* AppLockSetupSettingsScreenViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppLockSetupSettingsScreenViewModel.swift; sourceTree = ""; }; 1D9F148717D74F73BE724434 /* LongPressWithFeedback.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LongPressWithFeedback.swift; sourceTree = ""; }; + 1D9F2E1FC5A0139571211CE8 /* SpaceHeaderTopicSheetView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpaceHeaderTopicSheetView.swift; sourceTree = ""; }; 1DA7E93C2E148B96EF6A8500 /* TimelineItemAccessibilityModifier.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TimelineItemAccessibilityModifier.swift; sourceTree = ""; }; 1DB2FC2AA9A07EE792DF65CF /* NotificationPermissionsScreenModels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationPermissionsScreenModels.swift; sourceTree = ""; }; 1DD2A058F3566FEEBA1D11B3 /* RoomSelectionScreenViewModelProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RoomSelectionScreenViewModelProtocol.swift; sourceTree = ""; }; @@ -5628,6 +5630,7 @@ BDDD421CD80AD0BCBA035076 /* Common */ = { isa = PBXGroup; children = ( + 1D9F2E1FC5A0139571211CE8 /* SpaceHeaderTopicSheetView.swift */, F3AAC314A877DBDB6EBE1170 /* SpaceHeaderView.swift */, A0E7B059E84E7E374D3322A2 /* SpaceRoomCell.swift */, ); @@ -8162,6 +8165,7 @@ CF4044A8EED5C41BC0ED6ABE /* SoftLogoutScreenViewModelProtocol.swift in Sources */, 8D9A97E32C6C03B884CBD85A /* SpaceExplorerFlowCoordinator.swift in Sources */, C8E11A335456FCF94A744E6E /* SpaceFlowCoordinator.swift in Sources */, + BF523D9E12E3C4AABBA2F6CB /* SpaceHeaderTopicSheetView.swift in Sources */, E9B4742B3D6E103327466513 /* SpaceHeaderView.swift in Sources */, 306ADA9D91EE5F0A30B5E500 /* SpaceListScreen.swift in Sources */, C586E1B286BCD8A774DA16B8 /* SpaceListScreenCoordinator.swift in Sources */, diff --git a/ElementX/Sources/Other/TestablePreview/TestablePreviewsDictionary.swift b/ElementX/Sources/Other/TestablePreview/TestablePreviewsDictionary.swift index db98f3438..6923c1d60 100644 --- a/ElementX/Sources/Other/TestablePreview/TestablePreviewsDictionary.swift +++ b/ElementX/Sources/Other/TestablePreview/TestablePreviewsDictionary.swift @@ -153,6 +153,7 @@ enum TestablePreviewsDictionary { "SettingsScreen_Previews" : SettingsScreen_Previews.self, "ShimmerOverlay_Previews" : ShimmerOverlay_Previews.self, "SoftLogoutScreen_Previews" : SoftLogoutScreen_Previews.self, + "SpaceHeaderTopicSheetView_Previews" : SpaceHeaderTopicSheetView_Previews.self, "SpaceHeaderView_Previews" : SpaceHeaderView_Previews.self, "SpaceListScreen_Previews" : SpaceListScreen_Previews.self, "SpaceRoomCell_Previews" : SpaceRoomCell_Previews.self, diff --git a/ElementX/Sources/Screens/Spaces/Common/SpaceHeaderTopicSheetView.swift b/ElementX/Sources/Screens/Spaces/Common/SpaceHeaderTopicSheetView.swift new file mode 100644 index 000000000..2e2299872 --- /dev/null +++ b/ElementX/Sources/Screens/Spaces/Common/SpaceHeaderTopicSheetView.swift @@ -0,0 +1,51 @@ +// +// Copyright 2025 New Vector 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 + +struct SpaceHeaderTopicSheetView: View { + let topic: String + + @State private var sheetHeight: CGFloat = .zero + private let topPadding: CGFloat = 19 + + var body: some View { + ScrollView { + VStack(alignment: .leading, spacing: 10) { + Text(L10n.commonDescription) + .font(.compound.bodySM) + .foregroundStyle(.compound.textSecondary) + .textCase(.uppercase) + Text(topic) + .font(.compound.bodyMD) + .foregroundStyle(.compound.textPrimary) + } + .frame(maxWidth: .infinity, alignment: .leading) + .padding(16) + .readHeight($sheetHeight) + } + .scrollBounceBehavior(.basedOnSize) + .padding(.top, topPadding) // For the drag indicator + .presentationDetents([.height(sheetHeight + topPadding)]) + .presentationDragIndicator(.visible) + .presentationBackground(.compound.bgCanvasDefault) + } +} + +// MARK: - Previews + +struct SpaceHeaderTopicSheetView_Previews: PreviewProvider, TestablePreview { + static var previews: some View { + SpaceHeaderTopicSheetView(topic: ["Description of the space goes right here.", + "Lorem ipsum dolor sit amet consectetur.", + "Leo viverra morbi habitant in.", + "Sem amet enim habitant nibh augue mauris.", + "Interdum mauris ultrices tincidunt proin morbi erat aenean risus nibh.", + "Diam amet sit fermentum vulputate faucibus."].joined(separator: " ")) + } +} diff --git a/ElementX/Sources/Screens/Spaces/Common/SpaceHeaderView.swift b/ElementX/Sources/Screens/Spaces/Common/SpaceHeaderView.swift index 3d2e94ed9..5f6d88be2 100644 --- a/ElementX/Sources/Screens/Spaces/Common/SpaceHeaderView.swift +++ b/ElementX/Sources/Screens/Spaces/Common/SpaceHeaderView.swift @@ -12,6 +12,8 @@ struct SpaceHeaderView: View { let spaceRoomProxy: SpaceRoomProxyProtocol let mediaProvider: MediaProviderProtocol? + @State private var isPresentingTopic = false + var title: String { spaceRoomProxy.name ?? "" } var body: some View { @@ -35,11 +37,13 @@ struct SpaceHeaderView: View { } if let topic = spaceRoomProxy.topic { - Text(topic) - .font(.compound.bodyMD) - .foregroundStyle(.compound.textPrimary) - .multilineTextAlignment(.center) - .lineLimit(2) + Button { isPresentingTopic = true } label: { + Text(topic) + .font(.compound.bodyMD) + .foregroundStyle(.compound.textPrimary) + .multilineTextAlignment(.center) + .lineLimit(2) + } } } .fixedSize(horizontal: false, vertical: true) @@ -52,6 +56,11 @@ struct SpaceHeaderView: View { .fill(Color.compound.borderDisabled) .frame(height: 1 / UIScreen.main.scale) } + .sheet(isPresented: $isPresentingTopic) { + if let topic = spaceRoomProxy.topic { + SpaceHeaderTopicSheetView(topic: topic) + } + } } var spaceDetails: some View { diff --git a/PreviewTests/Sources/GeneratedPreviewTests.swift b/PreviewTests/Sources/GeneratedPreviewTests.swift index 5bd341fef..a2b29989e 100644 --- a/PreviewTests/Sources/GeneratedPreviewTests.swift +++ b/PreviewTests/Sources/GeneratedPreviewTests.swift @@ -875,6 +875,12 @@ extension PreviewTests { } } + func testSpaceHeaderTopicSheetView() async throws { + for (index, preview) in SpaceHeaderTopicSheetView_Previews._allPreviews.enumerated() { + try await assertSnapshots(matching: preview, step: index) + } + } + func testSpaceHeaderView() async throws { for (index, preview) in SpaceHeaderView_Previews._allPreviews.enumerated() { try await assertSnapshots(matching: preview, step: index) diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/spaceHeaderTopicSheetView.iPad-en-GB-0.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/spaceHeaderTopicSheetView.iPad-en-GB-0.png new file mode 100644 index 000000000..cae22b54c --- /dev/null +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/spaceHeaderTopicSheetView.iPad-en-GB-0.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:3821a8be8b111ab8172cb60b5e5a2df6c6594b76b7bae881e72dc13c244f32d7 +size 101408 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/spaceHeaderTopicSheetView.iPad-pseudo-0.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/spaceHeaderTopicSheetView.iPad-pseudo-0.png new file mode 100644 index 000000000..79bdc37cc --- /dev/null +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/spaceHeaderTopicSheetView.iPad-pseudo-0.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:e0d3e84cfcee83e3f78b58d6c3454c68627ce4dda90957a1e6d1364c19b26450 +size 103142 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/spaceHeaderTopicSheetView.iPhone-16-en-GB-0.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/spaceHeaderTopicSheetView.iPhone-16-en-GB-0.png new file mode 100644 index 000000000..78e184629 --- /dev/null +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/spaceHeaderTopicSheetView.iPhone-16-en-GB-0.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:5515fa68a804f52727a9fc9566d9b72e3a4dd4f8f409498bfc4da691aa7a41b4 +size 65393 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/spaceHeaderTopicSheetView.iPhone-16-pseudo-0.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/spaceHeaderTopicSheetView.iPhone-16-pseudo-0.png new file mode 100644 index 000000000..5d316af08 --- /dev/null +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/spaceHeaderTopicSheetView.iPhone-16-pseudo-0.png @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:dc9beaa1a7b7817bf12c9a30208a79a8ec443ebc51a8e4eb4dcb10364a34fcdc +size 66488