diff --git a/ElementX/Sources/Screens/HomeScreen/HomeScreenModels.swift b/ElementX/Sources/Screens/HomeScreen/HomeScreenModels.swift index 021ae06e8..2cdbe62a5 100644 --- a/ElementX/Sources/Screens/HomeScreen/HomeScreenModels.swift +++ b/ElementX/Sources/Screens/HomeScreen/HomeScreenModels.swift @@ -35,23 +35,40 @@ struct HomeScreenViewState: BindableState { var userAvatar: UIImage? var rooms: [HomeScreenRoom] = [] + var isLoadingRooms: Bool = false var unencryptedDMs: [HomeScreenRoom] { - Array(rooms.filter { $0.isDirect && !$0.isEncrypted }) + searchFilteredRooms.filter { $0.isDirect && !$0.isEncrypted } } var encryptedDMs: [HomeScreenRoom] { - Array(rooms.filter { $0.isDirect && $0.isEncrypted}) + searchFilteredRooms.filter { $0.isDirect && $0.isEncrypted} } var unencryptedRooms: [HomeScreenRoom] { - Array(rooms.filter { !$0.isDirect && !$0.isEncrypted }) + searchFilteredRooms.filter { !$0.isDirect && !$0.isEncrypted } } var encryptedRooms: [HomeScreenRoom] { - Array(rooms.filter { !$0.isDirect && $0.isEncrypted }) + searchFilteredRooms.filter { !$0.isDirect && $0.isEncrypted } } + + private var searchFilteredRooms: LazyFilterSequence.Elements> { + guard !bindings.searchQuery.isEmpty else { + // This extra filter is fine for now as there are always downstream filters + // but if that changes, this approach should be reconsidered. + return rooms.lazy.filter { _ in true } + } + + return rooms.lazy.filter { $0.displayName?.localizedStandardContains(bindings.searchQuery) ?? false } + } + + var bindings = HomeScreenViewStateBindings() +} + +struct HomeScreenViewStateBindings { + var searchQuery: String = "" } struct HomeScreenRoom: Identifiable, Equatable { diff --git a/ElementX/Sources/Screens/HomeScreen/View/HomeScreen.swift b/ElementX/Sources/Screens/HomeScreen/View/HomeScreen.swift index 7b041f064..304bc529b 100644 --- a/ElementX/Sources/Screens/HomeScreen/View/HomeScreen.swift +++ b/ElementX/Sources/Screens/HomeScreen/View/HomeScreen.swift @@ -64,6 +64,7 @@ struct HomeScreen: View { } } .listStyle(.plain) + .searchable(text: $context.searchQuery) } Spacer() diff --git a/changelog.d/26.feature b/changelog.d/26.feature new file mode 100644 index 000000000..c1d962dee --- /dev/null +++ b/changelog.d/26.feature @@ -0,0 +1 @@ +Add filtering for rooms by name.