Files
rider-pro-android-app/app/src/main/java/com/aiosman/riderpro/ui/Navi.kt

196 lines
7.2 KiB
Kotlin
Raw Normal View History

2024-07-23 15:25:00 +08:00
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
2024-07-31 14:50:55 +08:00
import com.aiosman.riderpro.ui.account.AccountEditScreen
2024-07-23 15:25:00 +08:00
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
2024-07-30 09:04:07 +08:00
import com.aiosman.riderpro.ui.login.EmailSignupScreen
2024-07-29 00:01:09 +08:00
import com.aiosman.riderpro.ui.login.LoginPage
2024-07-30 09:04:07 +08:00
import com.aiosman.riderpro.ui.login.SignupScreen
import com.aiosman.riderpro.ui.login.UserAuthScreen
2024-07-23 15:25:00 +08:00
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
2024-07-29 00:01:09 +08:00
import com.aiosman.riderpro.ui.profile.AccountProfile
2024-07-23 15:25:00 +08:00
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")
2024-07-29 00:01:09 +08:00
data object Login : NavigationRoute("Login")
data object AccountProfile : NavigationRoute("AccountProfile/{id}")
2024-07-30 09:04:07 +08:00
data object SignUp : NavigationRoute("SignUp")
data object UserAuth : NavigationRoute("UserAuth")
data object EmailSignUp : NavigationRoute("EmailSignUp")
2024-07-31 14:50:55 +08:00
data object AccountEdit : NavigationRoute("AccountEditScreen")
2024-07-23 15:25:00 +08:00
}
@Composable
2024-07-31 14:50:55 +08:00
fun NavigationController(
navController: NavHostController,
startDestination: String = NavigationRoute.Login.route
) {
2024-07-23 15:25:00 +08:00
val navigationBarHeight = with(LocalDensity.current) {
WindowInsets.navigationBars.getBottom(this).toDp()
}
NavHost(
navController = navController,
2024-07-30 16:57:25 +08:00
startDestination = startDestination,
2024-07-23 15:25:00 +08:00
) {
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()
}
}
2024-07-29 00:01:09 +08:00
composable(route = NavigationRoute.Login.route) {
LoginPage()
}
composable(
route = NavigationRoute.AccountProfile.route,
arguments = listOf(navArgument("id") { type = NavType.StringType })
) {
AccountProfile(it.arguments?.getString("id")!!)
}
2024-07-30 09:04:07 +08:00
composable(route = NavigationRoute.SignUp.route) {
SignupScreen()
}
composable(route = NavigationRoute.UserAuth.route) {
UserAuthScreen()
}
composable(route = NavigationRoute.EmailSignUp.route) {
EmailSignupScreen()
}
2024-07-31 14:50:55 +08:00
composable(route = NavigationRoute.AccountEdit.route) {
AccountEditScreen()
}
2024-07-23 15:25:00 +08:00
}
}
@OptIn(ExperimentalSharedTransitionApi::class)
@Composable
2024-07-30 16:57:25 +08:00
fun Navigation(startDestination: String = NavigationRoute.Login.route) {
2024-07-23 15:25:00 +08:00
val navController = rememberNavController()
SharedTransitionLayout {
CompositionLocalProvider(
LocalNavController provides navController,
LocalSharedTransitionScope provides this@SharedTransitionLayout,
) {
Box {
2024-07-31 14:50:55 +08:00
NavigationController(
navController = navController,
startDestination = startDestination
)
2024-07-23 15:25:00 +08:00
}
}
}
}