package com.aiosman.riderpro.ui import ModificationListScreen import androidx.compose.animation.ExperimentalSharedTransitionApi import androidx.compose.animation.SharedTransitionLayout import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.navigationBars import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.unit.dp import androidx.navigation.NavHostController import androidx.navigation.NavType import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController import androidx.navigation.navArgument import com.aiosman.riderpro.LocalAnimatedContentScope import com.aiosman.riderpro.LocalNavController import com.aiosman.riderpro.LocalSharedTransitionScope import com.aiosman.riderpro.ui.comment.CommentsScreen import com.aiosman.riderpro.ui.follower.FollowerScreen import com.aiosman.riderpro.ui.gallery.OfficialGalleryScreen import com.aiosman.riderpro.ui.gallery.OfficialPhotographerScreen import com.aiosman.riderpro.ui.gallery.ProfileTimelineScreen import com.aiosman.riderpro.ui.index.IndexScreen import com.aiosman.riderpro.ui.like.LikeScreen import com.aiosman.riderpro.ui.location.LocationDetailScreen import com.aiosman.riderpro.ui.message.NotificationsScreen import com.aiosman.riderpro.ui.modification.EditModificationScreen import com.aiosman.riderpro.ui.post.NewPostScreen import com.aiosman.riderpro.ui.post.PostScreen sealed class NavigationRoute( val route: String, ) { data object Index : NavigationRoute("Index") data object ProfileTimeline : NavigationRoute("ProfileTimeline") data object LocationDetail : NavigationRoute("LocationDetail/{x}/{y}") data object OfficialPhoto : NavigationRoute("OfficialPhoto") data object OfficialPhotographer : NavigationRoute("OfficialPhotographer") data object Post : NavigationRoute("Post/{id}") data object ModificationList : NavigationRoute("ModificationList") data object MyMessage : NavigationRoute("MyMessage") data object Comments : NavigationRoute("Comments") data object Likes : NavigationRoute("Likes") data object Followers : NavigationRoute("Followers") data object NewPost : NavigationRoute("NewPost") data object EditModification : NavigationRoute("EditModification") } @Composable fun NavigationController(navController: NavHostController) { val navigationBarHeight = with(LocalDensity.current) { WindowInsets.navigationBars.getBottom(this).toDp() } NavHost( navController = navController, startDestination = NavigationRoute.Index.route, ) { composable(route = NavigationRoute.Index.route) { CompositionLocalProvider( LocalAnimatedContentScope provides this, ) { IndexScreen() } } composable(route = NavigationRoute.ProfileTimeline.route) { ProfileTimelineScreen() } composable( route = NavigationRoute.LocationDetail.route, arguments = listOf( navArgument("x") { type = NavType.FloatType }, navArgument("y") { type = NavType.FloatType } ) ) { Box( modifier = Modifier.padding(bottom = navigationBarHeight) ) { val x = it.arguments?.getFloat("x") ?: 0f val y = it.arguments?.getFloat("y") ?: 0f LocationDetailScreen( x, y ) } } composable(route = NavigationRoute.OfficialPhoto.route) { OfficialGalleryScreen() } composable(route = NavigationRoute.OfficialPhotographer.route) { OfficialPhotographerScreen() } composable( route = NavigationRoute.Post.route, arguments = listOf(navArgument("id") { type = NavType.StringType }) ) { backStackEntry -> CompositionLocalProvider( LocalAnimatedContentScope provides this, ) { val id = backStackEntry.arguments?.getString("id") PostScreen( id!! ) } } composable(route = NavigationRoute.ModificationList.route) { ModificationListScreen() } composable(route = NavigationRoute.MyMessage.route) { NotificationsScreen() } composable(route = NavigationRoute.Comments.route) { CommentsScreen() } composable(route = NavigationRoute.Likes.route) { LikeScreen() } composable(route = NavigationRoute.Followers.route) { FollowerScreen() } composable(route = NavigationRoute.NewPost.route) { NewPostScreen() } composable(route = NavigationRoute.EditModification.route) { Box( modifier = Modifier.padding(top = 64.dp) ) { EditModificationScreen() } } } } @OptIn(ExperimentalSharedTransitionApi::class) @Composable fun Navigation() { val navController = rememberNavController() SharedTransitionLayout { CompositionLocalProvider( LocalNavController provides navController, LocalSharedTransitionScope provides this@SharedTransitionLayout, ) { Box { NavigationController(navController = navController) } } } }