feat: show bottom nav on Favorite Algo Feeds screen

Switch FavoriteAlgoFeedsListScreen from a plain Material Scaffold to
DisappearingScaffold and host an AppBottomBar bound to
Route.EditFavoriteAlgoFeeds, matching the pattern used by every other
tab-root feed (Badges, Articles, Bookmark Groups, ...). Hoist the
LazyColumn state so re-tapping the bar item scrolls to top.

When the user pins this screen as a bottom-bar entry, navigation lands
here via nav.navBottomBar() which marks the entry as a tab root, so
AppBottomBar renders and TopBarWithBackButton hides its back arrow.
When reached as a pushed screen from elsewhere, AppBottomBar's existing
canPop() guard hides the bar and the back arrow stays — preserving the
old behaviour for non-bottom-bar entry points.
This commit is contained in:
Claude
2026-05-14 02:53:02 +00:00
parent f3574081b5
commit 12650bd7fd
@@ -34,15 +34,16 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.layout.widthIn
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyListState
import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.items
import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material3.Button import androidx.compose.material3.Button
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.IconButton import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Alignment.Companion.BottomStart import androidx.compose.ui.Alignment.Companion.BottomStart
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@@ -57,6 +58,8 @@ import com.vitorpamplona.amethyst.commons.icons.symbols.Icon
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
import com.vitorpamplona.amethyst.model.AddressableNote import com.vitorpamplona.amethyst.model.AddressableNote
import com.vitorpamplona.amethyst.ui.components.MyAsyncImage import com.vitorpamplona.amethyst.ui.components.MyAsyncImage
import com.vitorpamplona.amethyst.ui.layouts.DisappearingScaffold
import com.vitorpamplona.amethyst.ui.navigation.bottombars.AppBottomBar
import com.vitorpamplona.amethyst.ui.navigation.navs.INav import com.vitorpamplona.amethyst.ui.navigation.navs.INav
import com.vitorpamplona.amethyst.ui.navigation.routes.DiscoverTab import com.vitorpamplona.amethyst.ui.navigation.routes.DiscoverTab
import com.vitorpamplona.amethyst.ui.navigation.routes.Route import com.vitorpamplona.amethyst.ui.navigation.routes.Route
@@ -70,20 +73,34 @@ import com.vitorpamplona.amethyst.ui.theme.FeedPadding
import com.vitorpamplona.amethyst.ui.theme.SimpleImage35Modifier import com.vitorpamplona.amethyst.ui.theme.SimpleImage35Modifier
import com.vitorpamplona.amethyst.ui.theme.StdVertSpacer import com.vitorpamplona.amethyst.ui.theme.StdVertSpacer
import com.vitorpamplona.amethyst.ui.theme.grayText import com.vitorpamplona.amethyst.ui.theme.grayText
import kotlinx.coroutines.launch
@OptIn(ExperimentalMaterial3Api::class)
@Composable @Composable
fun FavoriteAlgoFeedsListScreen( fun FavoriteAlgoFeedsListScreen(
accountViewModel: AccountViewModel, accountViewModel: AccountViewModel,
nav: INav, nav: INav,
) { ) {
Scaffold( val listState = rememberLazyListState()
val coroutineScope = rememberCoroutineScope()
DisappearingScaffold(
isInvertedLayout = false,
topBar = { topBar = {
TopBarWithBackButton( TopBarWithBackButton(
caption = stringRes(R.string.favorite_dvms_title), caption = stringRes(R.string.favorite_dvms_title),
nav = nav, nav = nav,
) )
}, },
bottomBar = {
AppBottomBar(Route.EditFavoriteAlgoFeeds, nav, accountViewModel) { route ->
if (route == Route.EditFavoriteAlgoFeeds) {
coroutineScope.launch { listState.animateScrollToItem(0) }
} else {
nav.navBottomBar(route)
}
}
},
accountViewModel = accountViewModel,
) { padding -> ) { padding ->
Column( Column(
modifier = modifier =
@@ -104,13 +121,14 @@ fun FavoriteAlgoFeedsListScreen(
color = MaterialTheme.colorScheme.grayText, color = MaterialTheme.colorScheme.grayText,
) )
FavoriteAlgoFeedList(accountViewModel, nav) FavoriteAlgoFeedList(listState, accountViewModel, nav)
} }
} }
} }
@Composable @Composable
private fun FavoriteAlgoFeedList( private fun FavoriteAlgoFeedList(
listState: LazyListState,
accountViewModel: AccountViewModel, accountViewModel: AccountViewModel,
nav: INav, nav: INav,
) { ) {
@@ -154,6 +172,7 @@ private fun FavoriteAlgoFeedList(
} }
LazyColumn( LazyColumn(
state = listState,
verticalArrangement = Arrangement.spacedBy(4.dp), verticalArrangement = Arrangement.spacedBy(4.dp),
contentPadding = FeedPadding, contentPadding = FeedPadding,
) { ) {