Created
April 17, 2026 17:28
-
-
Save AndroidPoet/d40a89b1c634f3a3d610e268f3812f3e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| sealed class TabRoute { | |
| data object Home : TabRoute() | |
| data object Explore : TabRoute() | |
| data object Messages : TabRoute() | |
| data object Profile : TabRoute() | |
| } | |
| sealed class HomeStackRoute { | |
| data object Feed : HomeStackRoute() | |
| data class PostDetail(val postId: String) : HomeStackRoute() | |
| data class UserProfile(val userId: String) : HomeStackRoute() | |
| } | |
| sealed class ExploreStackRoute { | |
| data object Trending : ExploreStackRoute() | |
| data class SearchResults(val query: String) : ExploreStackRoute() | |
| } | |
| @Composable | |
| fun MainTabNavigation() { | |
| var selectedTab by remember { mutableStateOf<TabRoute>(TabRoute.Home) } | |
| val tabNavControllers = remember { | |
| mapOf( | |
| TabRoute.Home to NavController(HomeStackRoute.Feed), | |
| TabRoute.Explore to NavController(ExploreStackRoute.Trending), | |
| TabRoute.Messages to NavController(Route.Messages), | |
| TabRoute.Profile to NavController(Route.Profile) | |
| ) | |
| } | |
| Scaffold( | |
| bottomBar = { | |
| NavigationBar { | |
| listOf( | |
| TabRoute.Home, | |
| TabRoute.Explore, | |
| TabRoute.Messages, | |
| TabRoute.Profile | |
| ).forEach { tab -> | |
| NavigationBarItem( | |
| icon = { Icon(tab.getIcon(), contentDescription = null) }, | |
| label = { Text(tab.getTitle()) }, | |
| selected = selectedTab == tab, | |
| onClick = { | |
| if (selectedTab != tab) { | |
| selectedTab = tab | |
| } | |
| } | |
| ) | |
| } | |
| } | |
| } | |
| ) { innerPadding -> | |
| Box(modifier = Modifier.padding(innerPadding)) { | |
| when (selectedTab) { | |
| TabRoute.Home -> HomeTabNavHost(tabNavControllers[TabRoute.Home]!!) | |
| TabRoute.Explore -> ExploreTabNavHost(tabNavControllers[TabRoute.Explore]!!) | |
| TabRoute.Messages -> MessagesScreen() | |
| TabRoute.Profile -> ProfileScreen() | |
| } | |
| } | |
| } | |
| } | |
| @Composable | |
| private fun HomeTabNavHost(navController: NavController) { | |
| NavHost(navController, HomeStackRoute.Feed) { | |
| composable<HomeStackRoute.Feed> { | |
| FeedScreen(navController) | |
| } | |
| composable<HomeStackRoute.PostDetail> { entry -> | |
| val postId = (entry.toRoute() as HomeStackRoute.PostDetail).postId | |
| PostDetailScreen(postId, navController) | |
| } | |
| composable<HomeStackRoute.UserProfile> { entry -> | |
| val userId = (entry.toRoute() as HomeStackRoute.UserProfile).userId | |
| UserProfileScreen(userId, navController) | |
| } | |
| } | |
| } | |
| @Composable | |
| private fun ExploreTabNavHost(navController: NavController) { | |
| NavHost(navController, ExploreStackRoute.Trending) { | |
| composable<ExploreStackRoute.Trending> { | |
| TrendingScreen(navController) | |
| } | |
| composable<ExploreStackRoute.SearchResults> { entry -> | |
| val query = (entry.toRoute() as ExploreStackRoute.SearchResults).query | |
| SearchResultsScreen(query, navController) | |
| } | |
| } | |
| } | |
| @Composable | |
| fun FeedScreen(navController: NavController) { | |
| var posts by remember { mutableStateOf<List<Post>>(emptyList()) } | |
| LaunchedEffect(Unit) { | |
| // Load posts from API | |
| } | |
| LazyColumn { | |
| items(posts) { post -> | |
| PostCard( | |
| post = post, | |
| onPostClick = { | |
| navController.navigate(HomeStackRoute.PostDetail(post.id)) | |
| }, | |
| onUserClick = { | |
| navController.navigate(HomeStackRoute.UserProfile(post.userId)) | |
| } | |
| ) | |
| } | |
| } | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment