A cheap attempt at a native Bluesky client for Android
7
fork

Configure Feed

Select the types of activity you want to include in your feed.

SearchView: Replace tab row with People filter chip

Remove PrimaryTabRow and use a FilterChip pill for People alongside
the existing Latest/Top chips. Posts show by default, tapping People
toggles to the people results view.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

geesawra e928cb56 74eff5b5

+30 -38
+30 -38
app/src/main/java/industries/geesawra/monarch/SearchView.kt
··· 31 31 import androidx.compose.material3.MaterialTheme 32 32 import androidx.compose.material3.SearchBar 33 33 import androidx.compose.material3.SearchBarDefaults 34 - import androidx.compose.material3.Tab 35 - import androidx.compose.material3.PrimaryTabRow 36 34 import androidx.compose.material3.Text 37 35 import androidx.compose.runtime.Composable 38 36 import androidx.compose.runtime.LaunchedEffect 39 37 import androidx.compose.runtime.derivedStateOf 40 38 import androidx.compose.runtime.getValue 41 - import androidx.compose.runtime.mutableIntStateOf 42 39 import androidx.compose.runtime.mutableStateOf 43 40 import androidx.compose.runtime.remember 44 41 import androidx.compose.runtime.saveable.rememberSaveable ··· 63 60 import sh.christian.ozone.api.Did 64 61 65 62 66 - private enum class SearchTab(val label: String) { 67 - POSTS("Posts"), 68 - PEOPLE("People"), 69 - } 70 - 71 63 @OptIn(ExperimentalMaterial3Api::class) 72 64 @Composable 73 65 fun SearchView( ··· 81 73 onProfileTap: (Did) -> Unit, 82 74 ) { 83 75 var query by rememberSaveable { mutableStateOf("") } 84 - var expanded by rememberSaveable { mutableStateOf(false) } 85 - var selectedTab by rememberSaveable { mutableIntStateOf(0) } 76 + var showPeople by rememberSaveable { mutableStateOf(false) } 86 77 87 78 Column( 88 79 modifier = modifier ··· 96 87 query = query, 97 88 onQueryChange = { query = it }, 98 89 onSearch = { 99 - expanded = false 100 90 viewModel.search(query) 101 91 }, 102 92 expanded = false, ··· 123 113 ) {} 124 114 125 115 // Filter chips row 126 - SearchFilters(viewModel) 127 - 128 - // Tabs: Posts / People 129 - PrimaryTabRow( 130 - selectedTabIndex = selectedTab, 131 - ) { 132 - SearchTab.entries.forEachIndexed { index, tab -> 133 - Tab( 134 - selected = selectedTab == index, 135 - onClick = { selectedTab = index }, 136 - text = { Text(tab.label) }, 137 - ) 138 - } 139 - } 116 + SearchFilters(viewModel, showPeople, onShowPeopleChange = { showPeople = it }) 140 117 141 - // Tab content 142 - when (selectedTab) { 143 - 0 -> SearchPostsResults( 118 + // Content 119 + if (showPeople) { 120 + SearchPeopleResults( 144 121 viewModel = viewModel, 145 - listState = postsListState, 122 + listState = peopleListState, 146 123 isScrollEnabled = isScrollEnabled, 147 - onThreadTap = onThreadTap, 148 124 onProfileTap = onProfileTap, 149 125 ) 150 - 151 - 1 -> SearchPeopleResults( 126 + } else { 127 + SearchPostsResults( 152 128 viewModel = viewModel, 153 - listState = peopleListState, 129 + listState = postsListState, 154 130 isScrollEnabled = isScrollEnabled, 131 + onThreadTap = onThreadTap, 155 132 onProfileTap = onProfileTap, 156 133 ) 157 134 } ··· 159 136 } 160 137 161 138 @Composable 162 - private fun SearchFilters(viewModel: TimelineViewModel) { 139 + private fun SearchFilters( 140 + viewModel: TimelineViewModel, 141 + showPeople: Boolean, 142 + onShowPeopleChange: (Boolean) -> Unit, 143 + ) { 163 144 val sort = viewModel.uiState.searchPostsSort 164 145 val authorFilter = viewModel.uiState.searchAuthorFilter 165 146 ··· 170 151 horizontalArrangement = Arrangement.spacedBy(8.dp), 171 152 ) { 172 153 FilterChip( 173 - selected = sort == SearchPostsSort.Latest, 174 - onClick = { viewModel.setSearchSort(SearchPostsSort.Latest) }, 154 + selected = !showPeople && sort == SearchPostsSort.Latest, 155 + onClick = { 156 + onShowPeopleChange(false) 157 + viewModel.setSearchSort(SearchPostsSort.Latest) 158 + }, 175 159 label = { Text("Latest") }, 176 160 ) 177 161 FilterChip( 178 - selected = sort == SearchPostsSort.Top, 179 - onClick = { viewModel.setSearchSort(SearchPostsSort.Top) }, 162 + selected = !showPeople && sort == SearchPostsSort.Top, 163 + onClick = { 164 + onShowPeopleChange(false) 165 + viewModel.setSearchSort(SearchPostsSort.Top) 166 + }, 180 167 label = { Text("Top") }, 168 + ) 169 + FilterChip( 170 + selected = showPeople, 171 + onClick = { onShowPeopleChange(!showPeople) }, 172 + label = { Text("People") }, 181 173 ) 182 174 if (authorFilter != null) { 183 175 FilterChip(