From 032b5373fc343e25c68aef6a4dbebd6ef5133abb Mon Sep 17 00:00:00 2001 From: komallsingh Date: Fri, 26 Jun 2026 12:28:29 +0530 Subject: [PATCH] Add action filter chips to history screen --- .../app/ui/screens/history/HistoryScreen.kt | 36 +++++++++- .../ui/screens/history/HistoryViewModel.kt | 67 +++++++++---------- 2 files changed, 65 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/com/hush/app/ui/screens/history/HistoryScreen.kt b/app/src/main/java/com/hush/app/ui/screens/history/HistoryScreen.kt index 693ee93..14a7817 100644 --- a/app/src/main/java/com/hush/app/ui/screens/history/HistoryScreen.kt +++ b/app/src/main/java/com/hush/app/ui/screens/history/HistoryScreen.kt @@ -34,7 +34,7 @@ fun HistoryScreen( ) { val searchQuery by viewModel.searchQuery.collectAsState() val historyLogs by viewModel.historyLogs.collectAsState() - + val selectedFilter by viewModel.selectedFilter.collectAsState() var selectedLog by remember { mutableStateOf(null) } val timeFormatter = remember { DateTimeFormatter.ofPattern("hh:mm a").withZone(ZoneId.systemDefault()) @@ -75,7 +75,41 @@ fun HistoryScreen( ) Spacer(modifier = Modifier.height(12.dp)) + Row( + horizontalArrangement = Arrangement.spacedBy(8.dp) + ) { + FilterChip( + selected = selectedFilter == RuleAction.BLOCK, + onClick = { + viewModel.toggleFilter(RuleAction.BLOCK) + }, + label = { + Text("Blocked") + } + ) + + FilterChip( + selected = selectedFilter == RuleAction.MUTE, + onClick = { + viewModel.toggleFilter(RuleAction.MUTE) + }, + label = { + Text("Muted") + } + ) + + FilterChip( + selected = selectedFilter == RuleAction.ALLOW, + onClick = { + viewModel.toggleFilter(RuleAction.ALLOW) + }, + label = { + Text("Delivered") + } + ) + } + Spacer(modifier = Modifier.height(12.dp)) // ── Logs List ── LazyColumn( modifier = Modifier diff --git a/app/src/main/java/com/hush/app/ui/screens/history/HistoryViewModel.kt b/app/src/main/java/com/hush/app/ui/screens/history/HistoryViewModel.kt index 697fdf2..90f21d0 100644 --- a/app/src/main/java/com/hush/app/ui/screens/history/HistoryViewModel.kt +++ b/app/src/main/java/com/hush/app/ui/screens/history/HistoryViewModel.kt @@ -19,52 +19,45 @@ class HistoryViewModel @Inject constructor( private val _searchQuery = MutableStateFlow("") val searchQuery: StateFlow = _searchQuery.asStateFlow() - private val _selectedTab = MutableStateFlow("All") // "All", "BLOCK", "MUTE", "ALLOW" - val selectedTab: StateFlow = _selectedTab.asStateFlow() + private val _selectedFilter = MutableStateFlow(null) + val selectedFilter: StateFlow = _selectedFilter.asStateFlow() - val historyLogs: StateFlow> = combine( - _searchQuery, - _selectedTab - ) { query, tab -> - Pair(query, tab) - }.flatMapLatest { (query, tab) -> - val baseFlow = if (query.isBlank()) { - if (tab == "All") { - historyRepository.getAllLogs() - } else { - val action = runCatching { RuleAction.valueOf(tab) }.getOrNull() - if (action != null) { - historyRepository.getLogsByAction(action) - } else { + val historyLogs: StateFlow> = + combine( + _searchQuery, + _selectedFilter + ) { query, filter -> + query to filter + }.flatMapLatest { (query, filter) -> + + val flow = + if (query.isBlank()) { historyRepository.getAllLogs() - } - } - } else { - historyRepository.searchLogs(query).map { list -> - if (tab == "All") { - list } else { - val action = runCatching { RuleAction.valueOf(tab) }.getOrNull() - if (action != null) { - list.filter { it.actionTaken == action } - } else { - list - } + historyRepository.searchLogs(query) } + + flow.map { logs -> + filter?.let { action -> + logs.filter { it.actionTaken == action } + } ?: logs } - } - baseFlow - }.stateIn( - scope = viewModelScope, - started = SharingStarted.WhileSubscribed(5000), - initialValue = emptyList() - ) + }.stateIn( + scope = viewModelScope, + started = SharingStarted.WhileSubscribed(5000), + initialValue = emptyList() + ) fun setSearchQuery(query: String) { _searchQuery.value = query } - fun setSelectedTab(tab: String) { - _selectedTab.value = tab + fun toggleFilter(filter: RuleAction) { + _selectedFilter.value = + if (_selectedFilter.value == filter) { + null + } else { + filter + } } }