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.
This commit is contained in:
Stefan Ceriu
2026-09-29 14:56:45 +03:00
parent 50b38555b6
commit a78e4f0c2a
8 changed files with 34 additions and 10 deletions
@@ -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"
@@ -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)
@@ -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)
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:4bc96637d784a679d6be590589758889a367355ee32bfe970a82e2f6079c3bbe
size 107266
oid sha256:8c8463b5471ab15009f661652b237cc61f540eea5c4c7d51d26e462487b52892
size 109550
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:37dc8e32e88ead1940ae69f7b21426e0ec93136061fef5aa217962f8a2b3a9a8
size 109477
oid sha256:768478153a8dfe9d455fbb87269e79c3698c56cc3515ccb4b8c610ec91f204e6
size 112054
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:316e278e53ff463ac5a232b4767a420b31c09cc2da2d22e302dccee9d36f6520
size 61192
oid sha256:34c519522df41c5b63319d85a14bea386321922e5e208988d258f2df07ad7578
size 63101
@@ -1,3 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:437431e2bf9b05ebedb52638034bb367ab6990ec3ecdeb4d930b8a3d9078ed11
size 63703
oid sha256:cdc345436b48af82e9543daffc720db8d1c91bb10caf16e490eef4eecf2a4af5
size 67108
@@ -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")])