@@ -6,6 +6,7 @@ import androidx.compose.foundation.layout.Arrangement
66import androidx.compose.foundation.layout.Box
77import androidx.compose.foundation.layout.ExperimentalLayoutApi
88import androidx.compose.foundation.layout.FlowRow
9+ import androidx.compose.foundation.layout.Row
910import androidx.compose.foundation.layout.fillMaxSize
1011import androidx.compose.foundation.layout.fillMaxWidth
1112import androidx.compose.foundation.layout.padding
@@ -14,15 +15,19 @@ import androidx.compose.foundation.lazy.LazyRow
1415import androidx.compose.foundation.lazy.items
1516import androidx.compose.foundation.lazy.staggeredgrid.StaggeredGridItemSpan
1617import androidx.compose.foundation.lazy.staggeredgrid.rememberLazyStaggeredGridState
18+ import androidx.compose.material3.DropdownMenuItem
1719import androidx.compose.material3.FilterChip
20+ import androidx.compose.material3.IconButton
1821import androidx.compose.material3.ListItem
1922import androidx.compose.material3.ListItemDefaults
2023import androidx.compose.material3.Text
2124import androidx.compose.runtime.Composable
2225import androidx.compose.runtime.LaunchedEffect
2326import androidx.compose.runtime.getValue
27+ import androidx.compose.runtime.mutableStateOf
2428import androidx.compose.runtime.remember
2529import androidx.compose.runtime.rememberCoroutineScope
30+ import androidx.compose.runtime.setValue
2631import androidx.compose.ui.Alignment
2732import androidx.compose.ui.Modifier
2833import androidx.compose.ui.graphics.Color
@@ -39,11 +44,13 @@ import dev.dimension.flare.model.AccountType
3944import dev.dimension.flare.model.MicroBlogKey
4045import dev.dimension.flare.ui.common.items
4146import dev.dimension.flare.ui.component.AvatarComponent
47+ import dev.dimension.flare.ui.component.FlareDropdownMenu
4248import dev.dimension.flare.ui.component.FlareScaffold
4349import dev.dimension.flare.ui.component.RefreshContainer
4450import dev.dimension.flare.ui.component.SearchBar
4551import dev.dimension.flare.ui.component.SearchBarState
4652import dev.dimension.flare.ui.component.placeholder
53+ import dev.dimension.flare.ui.component.platform.isBigScreen
4754import dev.dimension.flare.ui.component.searchBarPresenter
4855import dev.dimension.flare.ui.component.searchContent
4956import dev.dimension.flare.ui.component.status.AdaptiveCard
@@ -56,6 +63,7 @@ import dev.dimension.flare.ui.presenter.home.DiscoverPresenter
5663import dev.dimension.flare.ui.presenter.home.DiscoverState
5764import dev.dimension.flare.ui.presenter.home.SearchPresenter
5865import dev.dimension.flare.ui.presenter.invoke
66+ import dev.dimension.flare.ui.theme.screenHorizontalPadding
5967import kotlinx.coroutines.launch
6068import moe.tlaster.precompose.molecule.producePresenter
6169
@@ -64,6 +72,7 @@ import moe.tlaster.precompose.molecule.producePresenter
6472internal fun DiscoverScreen (onUserClick : (AccountType , MicroBlogKey ) -> Unit ) {
6573 val state by producePresenter(" discover" ) { discoverPresenter() }
6674 val lazyListState = rememberLazyStaggeredGridState()
75+ val isBigScreen = isBigScreen()
6776 RegisterTabCallback (
6877 lazyListState = lazyListState,
6978 onRefresh = {
@@ -75,17 +84,64 @@ internal fun DiscoverScreen(onUserClick: (AccountType, MicroBlogKey) -> Unit) {
7584 }
7685 FlareScaffold (
7786 topBar = {
78- Box (
87+ Row (
7988 modifier =
8089 Modifier
81- .fillMaxWidth(),
82- contentAlignment = Alignment .Center ,
90+ .fillMaxWidth()
91+ .padding(horizontal = screenHorizontalPadding),
92+ horizontalArrangement = Arrangement .spacedBy(8 .dp, Alignment .CenterHorizontally ),
93+ verticalAlignment = Alignment .CenterVertically ,
8394 ) {
8495 SearchBar (
8596 state = state,
8697 onSearch = {
8798 state.commitSearch(it)
8899 },
100+ trailingIcon =
101+ state.selectedAccount?.let { account ->
102+ if (! isBigScreen) {
103+ {
104+ state.accounts.onSuccess { accounts ->
105+ var showMenu by remember { mutableStateOf(false ) }
106+ IconButton (
107+ onClick = {
108+ if (accounts.size > 1 ) {
109+ showMenu = true
110+ }
111+ },
112+ ) {
113+ AvatarComponent (
114+ data = account.avatar,
115+ )
116+ }
117+ FlareDropdownMenu (
118+ expanded = showMenu,
119+ onDismissRequest = { showMenu = false },
120+ ) {
121+ accounts.forEach { profile ->
122+ DropdownMenuItem (
123+ text = {
124+ Text (profile.handle.canonical)
125+ },
126+ leadingIcon = {
127+ AvatarComponent (
128+ data = profile.avatar,
129+ size = 18 .dp,
130+ )
131+ },
132+ onClick = {
133+ state.setAccount(profile)
134+ showMenu = false
135+ },
136+ )
137+ }
138+ }
139+ }
140+ }
141+ } else {
142+ null
143+ }
144+ },
89145 )
90146 }
91147 },
@@ -103,31 +159,33 @@ internal fun DiscoverScreen(onUserClick: (AccountType, MicroBlogKey) -> Unit) {
103159 contentPadding = contentPadding,
104160 forceCardMode = true ,
105161 ) {
106- state.accounts.onSuccess { accounts ->
107- if (accounts.size > 1 ) {
108- item(
109- span = StaggeredGridItemSpan .FullLine ,
110- ) {
111- LazyRow (
112- horizontalArrangement = Arrangement .spacedBy(8 .dp),
113- modifier = Modifier .padding(bottom = 8 .dp),
162+ if (isBigScreen) {
163+ state.accounts.onSuccess { accounts ->
164+ if (accounts.size > 1 ) {
165+ item(
166+ span = StaggeredGridItemSpan .FullLine ,
114167 ) {
115- items(accounts) { profile ->
116- FilterChip (
117- selected = state.selectedAccount?.key == profile.key,
118- onClick = {
119- state.setAccount(profile)
120- },
121- label = {
122- Text (profile.handle.canonical)
123- },
124- leadingIcon = {
125- AvatarComponent (
126- data = profile.avatar,
127- size = 18 .dp,
128- )
129- },
130- )
168+ LazyRow (
169+ horizontalArrangement = Arrangement .spacedBy(8 .dp),
170+ modifier = Modifier .padding(bottom = 8 .dp),
171+ ) {
172+ items(accounts) { profile ->
173+ FilterChip (
174+ selected = state.selectedAccount?.key == profile.key,
175+ onClick = {
176+ state.setAccount(profile)
177+ },
178+ label = {
179+ Text (profile.handle.canonical)
180+ },
181+ leadingIcon = {
182+ AvatarComponent (
183+ data = profile.avatar,
184+ size = 18 .dp,
185+ )
186+ },
187+ )
188+ }
131189 }
132190 }
133191 }
0 commit comments