From a78e4f0c2a39ca1520c26f61e0a25a1a6f4356a7 Mon Sep 17 00:00:00 2001 From: Stefan Ceriu Date: Tue, 29 Sep 2026 14:56:45 +0300 Subject: [PATCH] Add a clear all button to recent searches Lets users wipe their whole search history at once from the recent searches section header, as per the designs. --- .../Screens/SearchScreen/SearchScreenModels.swift | 2 ++ .../SearchScreen/SearchScreenViewModel.swift | 2 ++ .../Screens/SearchScreen/View/SearchScreen.swift | 15 +++++++++++++-- .../searchScreen.Recent-searches-iPad-en-GB.png | 4 ++-- .../searchScreen.Recent-searches-iPad-pseudo.png | 4 ++-- .../searchScreen.Recent-searches-iPhone-en-GB.png | 4 ++-- ...searchScreen.Recent-searches-iPhone-pseudo.png | 4 ++-- .../Sources/SearchScreenViewModelTests.swift | 9 +++++++++ 8 files changed, 34 insertions(+), 10 deletions(-) diff --git a/ElementX/Sources/Screens/SearchScreen/SearchScreenModels.swift b/ElementX/Sources/Screens/SearchScreen/SearchScreenModels.swift index 949cb29fe..dea25277b 100644 --- a/ElementX/Sources/Screens/SearchScreen/SearchScreenModels.swift +++ b/ElementX/Sources/Screens/SearchScreen/SearchScreenModels.swift @@ -52,6 +52,7 @@ enum SearchScreenViewAction: CustomStringConvertible { case selectRoom(roomID: String) case selectMessage(roomID: String, eventID: String) case removeBreadcrumb(SearchScreenBreadcrumb) + case clearBreadcrumbs case reachedTop case reachedBottom case cancel @@ -63,6 +64,7 @@ enum SearchScreenViewAction: CustomStringConvertible { case .selectRoom(let roomID): "selectRoom(\(roomID))" case .selectMessage(let roomID, let eventID): "selectMessage(\(roomID), \(eventID))" case .removeBreadcrumb: "removeBreadcrumb" + case .clearBreadcrumbs: "clearBreadcrumbs" case .reachedTop: "reachedTop" case .reachedBottom: "reachedBottom" case .cancel: "cancel" diff --git a/ElementX/Sources/Screens/SearchScreen/SearchScreenViewModel.swift b/ElementX/Sources/Screens/SearchScreen/SearchScreenViewModel.swift index fc42b4415..a09102e4c 100644 --- a/ElementX/Sources/Screens/SearchScreen/SearchScreenViewModel.swift +++ b/ElementX/Sources/Screens/SearchScreen/SearchScreenViewModel.swift @@ -149,6 +149,8 @@ class SearchScreenViewModel: SearchScreenViewModelType, SearchScreenViewModelPro actionsSubject.send(.presentRoom(roomID: roomID, eventID: eventID)) case .removeBreadcrumb(let breadcrumb): removeBreadcrumb(breadcrumb) + case .clearBreadcrumbs: + userSettings.searchBreadcrumbs = [] case .reachedTop: if state.bindings.searchMode == .rooms { updateVisibleRange(edge: .top) diff --git a/ElementX/Sources/Screens/SearchScreen/View/SearchScreen.swift b/ElementX/Sources/Screens/SearchScreen/View/SearchScreen.swift index 06ee73082..6c4a45a20 100644 --- a/ElementX/Sources/Screens/SearchScreen/View/SearchScreen.swift +++ b/ElementX/Sources/Screens/SearchScreen/View/SearchScreen.swift @@ -209,8 +209,19 @@ struct SearchScreen: View { } } } header: { - Text(UntranslatedL10n.screenSearchRecentSearches) - .compoundListSectionHeader() + HStack(spacing: 8) { + Text(UntranslatedL10n.screenSearchRecentSearches) + .compoundListSectionHeader() + + Spacer() + + // The compound text link style has no accent colour variant. + Button { context.send(viewAction: .clearBreadcrumbs) } label: { + Text(L10n.actionClearAll) + .font(.compound.bodyMDSemibold) + .foregroundStyle(.compound.textActionAccent) + } + } } } .compoundList(.plain) diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/searchScreen.Recent-searches-iPad-en-GB.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/searchScreen.Recent-searches-iPad-en-GB.png index 34911adfd..b8ff4b901 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/searchScreen.Recent-searches-iPad-en-GB.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/searchScreen.Recent-searches-iPad-en-GB.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:4bc96637d784a679d6be590589758889a367355ee32bfe970a82e2f6079c3bbe -size 107266 +oid sha256:8c8463b5471ab15009f661652b237cc61f540eea5c4c7d51d26e462487b52892 +size 109550 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/searchScreen.Recent-searches-iPad-pseudo.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/searchScreen.Recent-searches-iPad-pseudo.png index fd4255f67..b9addd173 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/searchScreen.Recent-searches-iPad-pseudo.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/searchScreen.Recent-searches-iPad-pseudo.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:37dc8e32e88ead1940ae69f7b21426e0ec93136061fef5aa217962f8a2b3a9a8 -size 109477 +oid sha256:768478153a8dfe9d455fbb87269e79c3698c56cc3515ccb4b8c610ec91f204e6 +size 112054 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/searchScreen.Recent-searches-iPhone-en-GB.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/searchScreen.Recent-searches-iPhone-en-GB.png index 7b918cd20..634d14df7 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/searchScreen.Recent-searches-iPhone-en-GB.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/searchScreen.Recent-searches-iPhone-en-GB.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:316e278e53ff463ac5a232b4767a420b31c09cc2da2d22e302dccee9d36f6520 -size 61192 +oid sha256:34c519522df41c5b63319d85a14bea386321922e5e208988d258f2df07ad7578 +size 63101 diff --git a/PreviewTests/Sources/__Snapshots__/PreviewTests/searchScreen.Recent-searches-iPhone-pseudo.png b/PreviewTests/Sources/__Snapshots__/PreviewTests/searchScreen.Recent-searches-iPhone-pseudo.png index 08a441271..ae5b0c549 100644 --- a/PreviewTests/Sources/__Snapshots__/PreviewTests/searchScreen.Recent-searches-iPhone-pseudo.png +++ b/PreviewTests/Sources/__Snapshots__/PreviewTests/searchScreen.Recent-searches-iPhone-pseudo.png @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:437431e2bf9b05ebedb52638034bb367ab6990ec3ecdeb4d930b8a3d9078ed11 -size 63703 +oid sha256:cdc345436b48af82e9543daffc720db8d1c91bb10caf16e490eef4eecf2a4af5 +size 67108 diff --git a/UnitTests/Sources/SearchScreenViewModelTests.swift b/UnitTests/Sources/SearchScreenViewModelTests.swift index b26b2f202..0113e0320 100644 --- a/UnitTests/Sources/SearchScreenViewModelTests.swift +++ b/UnitTests/Sources/SearchScreenViewModelTests.swift @@ -162,6 +162,15 @@ struct SearchScreenViewModelTests { #expect(userSettings.searchBreadcrumbs.isEmpty) } + @Test + func clearingBreadcrumbs() { + userSettings.searchBreadcrumbs = [.query("Second"), .room(roomID: "2")] + + context.send(viewAction: .clearBreadcrumbs) + + #expect(userSettings.searchBreadcrumbs.isEmpty) + } + @Test func breadcrumbsAreDisplayed() async throws { staticRoomListSubject.send([.mock(id: "2", name: "Second")])