From 759fd67ef585365e9c4a0efc5c59dc6437e1c251 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 27 Apr 2026 20:00:28 +0000 Subject: [PATCH] fix(nav): hide bottom bar on screens reached via non-tab-root entries MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bottom-nav screens (Notifications, Discover, etc.) used to render the bottom bar unconditionally. When reached as a non-tab-root entry — drawer, deep link, in-app navigation that pushed a fresh copy with different args — the bar should disappear, matching the back-arrow and slide-animation rules. AppBottomBar now takes an INav and returns early when nav.canPop() is true. The check covers two valid cases for showing the bar: - Tab-root entry (carries BOTTOM_NAV_ROOT_KEY, canPop is false). - Graph start destination Home (no previous entry, canPop is false). All 19 callers updated to pass nav; the existing click callback param is renamed onClick to free up the nav name. https://claude.ai/code/session_01PrirRcL7g8iX7vTqqLTkBS --- .../amethyst/ui/navigation/bottombars/AppBottomBar.kt | 10 ++++++++-- .../ui/screen/loggedIn/articles/ArticlesScreen.kt | 2 +- .../ui/screen/loggedIn/audiorooms/AudioRoomsScreen.kt | 2 +- .../amethyst/ui/screen/loggedIn/badges/BadgesScreen.kt | 2 +- .../chats/rooms/singlepane/MessagesSinglePane.kt | 2 +- .../loggedIn/chats/rooms/twopane/MessagesTwoPane.kt | 2 +- .../loggedIn/communities/list/CommunitiesScreen.kt | 2 +- .../ui/screen/loggedIn/discover/DiscoverScreen.kt | 2 +- .../loggedIn/followPacks/list/FollowPacksScreen.kt | 2 +- .../amethyst/ui/screen/loggedIn/home/HomeScreen.kt | 2 +- .../screen/loggedIn/livestreams/LiveStreamsScreen.kt | 2 +- .../amethyst/ui/screen/loggedIn/longs/LongsScreen.kt | 2 +- .../loggedIn/notifications/NotificationScreen.kt | 2 +- .../ui/screen/loggedIn/pictures/PicturesScreen.kt | 2 +- .../amethyst/ui/screen/loggedIn/polls/PollsScreen.kt | 2 +- .../ui/screen/loggedIn/products/ProductsScreen.kt | 2 +- .../screen/loggedIn/publicChats/PublicChatsScreen.kt | 2 +- .../amethyst/ui/screen/loggedIn/search/SearchScreen.kt | 2 +- .../amethyst/ui/screen/loggedIn/shorts/ShortsScreen.kt | 2 +- .../amethyst/ui/screen/loggedIn/video/VideoScreen.kt | 2 +- 20 files changed, 27 insertions(+), 21 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/bottombars/AppBottomBar.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/bottombars/AppBottomBar.kt index 553cea282..d136372dc 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/bottombars/AppBottomBar.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/bottombars/AppBottomBar.kt @@ -44,6 +44,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.vitorpamplona.amethyst.commons.icons.symbols.Icon +import com.vitorpamplona.amethyst.ui.navigation.navs.INav import com.vitorpamplona.amethyst.ui.navigation.routes.Route import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import com.vitorpamplona.amethyst.ui.stringRes @@ -56,9 +57,14 @@ import com.vitorpamplona.amethyst.ui.theme.Size27dp @Composable fun AppBottomBar( selectedRoute: Route?, + nav: INav, accountViewModel: AccountViewModel, - nav: (Route) -> Unit, + onClick: (Route) -> Unit, ) { + // Hide the bar on entries that aren't a tab root (drawer or in-app + // pushes). Mirrors the back-arrow rule in canPop(). + if (nav.canPop()) return + val items by accountViewModel.settings.uiSettingsFlow.bottomBarItems .collectAsStateWithLifecycle() if (items.isEmpty()) { @@ -73,7 +79,7 @@ fun AppBottomBar( } val isKeyboardState by keyboardAsState() if (isKeyboardState == KeyboardState.Closed) { - RenderBottomMenu(items, selectedRoute, accountViewModel, nav) + RenderBottomMenu(items, selectedRoute, accountViewModel, onClick) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/articles/ArticlesScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/articles/ArticlesScreen.kt index e4d06e578..9e96fe05f 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/articles/ArticlesScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/articles/ArticlesScreen.kt @@ -65,7 +65,7 @@ fun ArticlesScreen( ArticlesTopBar(accountViewModel, nav) }, bottomBar = { - AppBottomBar(Route.Articles, accountViewModel) { route -> + AppBottomBar(Route.Articles, nav, accountViewModel) { route -> if (route == Route.Articles) { articlesFeedContentState.sendToTop() } else { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/audiorooms/AudioRoomsScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/audiorooms/AudioRoomsScreen.kt index c08199cff..e155f50a8 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/audiorooms/AudioRoomsScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/audiorooms/AudioRoomsScreen.kt @@ -65,7 +65,7 @@ fun AudioRoomsScreen( AudioRoomsTopBar(accountViewModel, nav) }, bottomBar = { - AppBottomBar(Route.AudioRooms, accountViewModel) { route -> + AppBottomBar(Route.AudioRooms, nav, accountViewModel) { route -> if (route == Route.AudioRooms) { audioRoomsFeedContentState.sendToTop() } else { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/badges/BadgesScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/badges/BadgesScreen.kt index ca46f5b7a..6bea3ecbc 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/badges/BadgesScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/badges/BadgesScreen.kt @@ -65,7 +65,7 @@ fun BadgesScreen( BadgesTopBar(accountViewModel, nav) }, bottomBar = { - AppBottomBar(Route.Badges, accountViewModel) { route -> + AppBottomBar(Route.Badges, nav, accountViewModel) { route -> if (route == Route.Badges) { feedContentState.sendToTop() } else { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/rooms/singlepane/MessagesSinglePane.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/rooms/singlepane/MessagesSinglePane.kt index b957e33a1..1691f0d39 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/rooms/singlepane/MessagesSinglePane.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/rooms/singlepane/MessagesSinglePane.kt @@ -82,7 +82,7 @@ fun MessagesSinglePane( } }, bottomBar = { - AppBottomBar(Route.Message, accountViewModel) { route -> + AppBottomBar(Route.Message, nav, accountViewModel) { route -> if (route == Route.Message) { tabs[pagerState.currentPage].feedContentState.sendToTop() } else { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/rooms/twopane/MessagesTwoPane.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/rooms/twopane/MessagesTwoPane.kt index b716fcdbe..8ab3ff379 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/rooms/twopane/MessagesTwoPane.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/rooms/twopane/MessagesTwoPane.kt @@ -79,7 +79,7 @@ fun MessagesTwoPane( UserDrawerSearchTopBar(accountViewModel, nav) { AmethystClickableIcon() } }, bottomBar = { - AppBottomBar(Route.Message, accountViewModel) { route -> + AppBottomBar(Route.Message, nav, accountViewModel) { route -> if (route == Route.Message) { knownFeedContentState.sendToTop() newFeedContentState.sendToTop() diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/communities/list/CommunitiesScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/communities/list/CommunitiesScreen.kt index 5c3f9f2c2..168615743 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/communities/list/CommunitiesScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/communities/list/CommunitiesScreen.kt @@ -82,7 +82,7 @@ fun CommunitiesScreen( CommunitiesTopBar(accountViewModel, nav) }, bottomBar = { - AppBottomBar(Route.Communities, accountViewModel) { route -> + AppBottomBar(Route.Communities, nav, accountViewModel) { route -> if (route == Route.Communities) { feedContentState.sendToTop() } else { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/discover/DiscoverScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/discover/DiscoverScreen.kt index 92855e339..8b1b91499 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/discover/DiscoverScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/discover/DiscoverScreen.kt @@ -239,7 +239,7 @@ private fun DiscoverPages( } }, bottomBar = { - AppBottomBar(Route.Discover, accountViewModel) { route -> + AppBottomBar(Route.Discover, nav, accountViewModel) { route -> if (route == Route.Discover) { val currentPage = pagerState.currentPage if (currentPage >= 0 && currentPage < feedTabs.size) { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/followPacks/list/FollowPacksScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/followPacks/list/FollowPacksScreen.kt index e15bcb520..201b1a289 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/followPacks/list/FollowPacksScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/followPacks/list/FollowPacksScreen.kt @@ -65,7 +65,7 @@ fun FollowPacksScreen( FollowPacksTopBar(accountViewModel, nav) }, bottomBar = { - AppBottomBar(Route.FollowPacks, accountViewModel) { route -> + AppBottomBar(Route.FollowPacks, nav, accountViewModel) { route -> if (route == Route.FollowPacks) { followPacksFeedContentState.sendToTop() } else { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/HomeScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/HomeScreen.kt index 900684f95..a440722f3 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/HomeScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/HomeScreen.kt @@ -199,7 +199,7 @@ private fun HomePages( } }, bottomBar = { - AppBottomBar(Route.Home, accountViewModel) { route -> + AppBottomBar(Route.Home, nav, accountViewModel) { route -> if (route == Route.Home) { tabs[pagerState.currentPage].feedState.sendToTop() } else { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/livestreams/LiveStreamsScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/livestreams/LiveStreamsScreen.kt index 833b160ca..8b0d16726 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/livestreams/LiveStreamsScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/livestreams/LiveStreamsScreen.kt @@ -65,7 +65,7 @@ fun LiveStreamsScreen( LiveStreamsTopBar(accountViewModel, nav) }, bottomBar = { - AppBottomBar(Route.LiveStreams, accountViewModel) { route -> + AppBottomBar(Route.LiveStreams, nav, accountViewModel) { route -> if (route == Route.LiveStreams) { liveStreamsFeedContentState.sendToTop() } else { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/longs/LongsScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/longs/LongsScreen.kt index 2e7c50803..ecb8d5fe8 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/longs/LongsScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/longs/LongsScreen.kt @@ -65,7 +65,7 @@ fun LongsScreen( LongsTopBar(accountViewModel, nav) }, bottomBar = { - AppBottomBar(Route.Longs, accountViewModel) { route -> + AppBottomBar(Route.Longs, nav, accountViewModel) { route -> if (route == Route.Longs) { longsFeedContentState.sendToTop() } else { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/notifications/NotificationScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/notifications/NotificationScreen.kt index 0fbc27bc8..f8b6a7046 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/notifications/NotificationScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/notifications/NotificationScreen.kt @@ -79,7 +79,7 @@ fun NotificationScreen( } }, bottomBar = { - AppBottomBar(Route.Notification(), accountViewModel) { route -> + AppBottomBar(Route.Notification(), nav, accountViewModel) { route -> if (route is Route.Notification) { notifFeedContentState.invalidateDataAndSendToTop(true) } else { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/pictures/PicturesScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/pictures/PicturesScreen.kt index 9402bc17d..e2d9fd2a9 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/pictures/PicturesScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/pictures/PicturesScreen.kt @@ -65,7 +65,7 @@ fun PicturesScreen( PicturesTopBar(accountViewModel, nav) }, bottomBar = { - AppBottomBar(Route.Pictures, accountViewModel) { route -> + AppBottomBar(Route.Pictures, nav, accountViewModel) { route -> if (route == Route.Pictures) { picturesFeedContentState.sendToTop() } else { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/polls/PollsScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/polls/PollsScreen.kt index 6509470b7..97b736999 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/polls/PollsScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/polls/PollsScreen.kt @@ -147,7 +147,7 @@ private fun PollsPages( } }, bottomBar = { - AppBottomBar(Route.Polls, accountViewModel) { route -> + AppBottomBar(Route.Polls, nav, accountViewModel) { route -> if (route == Route.Polls) { tabs[pagerState.currentPage].feedState.sendToTop() } else { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/products/ProductsScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/products/ProductsScreen.kt index 632a576b6..a2ce49702 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/products/ProductsScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/products/ProductsScreen.kt @@ -64,7 +64,7 @@ fun ProductsScreen( ProductsTopBar(accountViewModel, nav) }, bottomBar = { - AppBottomBar(Route.Products, accountViewModel) { route -> + AppBottomBar(Route.Products, nav, accountViewModel) { route -> if (route == Route.Products) { productsFeedContentState.sendToTop() } else { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/publicChats/PublicChatsScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/publicChats/PublicChatsScreen.kt index 4cc99f432..ae177d56d 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/publicChats/PublicChatsScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/publicChats/PublicChatsScreen.kt @@ -65,7 +65,7 @@ fun PublicChatsScreen( PublicChatsTopBar(accountViewModel, nav) }, bottomBar = { - AppBottomBar(Route.PublicChats, accountViewModel) { route -> + AppBottomBar(Route.PublicChats, nav, accountViewModel) { route -> if (route == Route.PublicChats) { publicChatsFeedContentState.sendToTop() } else { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/search/SearchScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/search/SearchScreen.kt index 9ad00be70..0ffcd4428 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/search/SearchScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/search/SearchScreen.kt @@ -142,7 +142,7 @@ fun SearchScreen( SearchBar(searchBarViewModel, accountViewModel, nav) }, bottomBar = { - AppBottomBar(Route.Search, accountViewModel) { route -> + AppBottomBar(Route.Search, nav, accountViewModel) { route -> nav.navBottomBar(route) } }, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/shorts/ShortsScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/shorts/ShortsScreen.kt index 9266c2d3a..f36d80ad8 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/shorts/ShortsScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/shorts/ShortsScreen.kt @@ -65,7 +65,7 @@ fun ShortsScreen( ShortsTopBar(accountViewModel, nav) }, bottomBar = { - AppBottomBar(Route.Shorts, accountViewModel) { route -> + AppBottomBar(Route.Shorts, nav, accountViewModel) { route -> if (route == Route.Shorts) { shortsFeedContentState.sendToTop() } else { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/video/VideoScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/video/VideoScreen.kt index 83402464c..63c38dc02 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/video/VideoScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/video/VideoScreen.kt @@ -82,7 +82,7 @@ fun VideoScreen( StoriesTopBar(accountViewModel, nav) }, bottomBar = { - AppBottomBar(Route.Video, accountViewModel) { route -> + AppBottomBar(Route.Video, nav, accountViewModel) { route -> if (route == Route.Video) { videoFeedContentState.sendToTop() } else {