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

253 lines
9.4 KiB
Kotlin
Raw Normal View History

2024-07-23 15:25:00 +08:00
package com.aiosman.riderpro.ui
2024-08-13 22:32:27 +08:00
import ChangePasswordScreen
2024-08-03 15:58:19 +08:00
import ImageViewer
2024-07-23 15:25:00 +08:00
import ModificationListScreen
import androidx.compose.animation.ExperimentalSharedTransitionApi
import androidx.compose.animation.SharedTransitionLayout
2024-08-24 21:59:16 +08:00
import androidx.compose.animation.core.tween
import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut
import androidx.compose.animation.slideInHorizontally
import androidx.compose.animation.slideOutHorizontally
2024-07-23 15:25:00 +08:00
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
2024-08-20 19:48:12 +08:00
import com.aiosman.riderpro.ui.favourite.FavouriteScreen
2024-07-23 15:25:00 +08:00
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-08-22 20:57:32 +08:00
import com.aiosman.riderpro.ui.index.tabs.message.NotificationsScreen
import com.aiosman.riderpro.ui.index.tabs.search.SearchScreen
2024-07-23 15:25:00 +08:00
import com.aiosman.riderpro.ui.modification.EditModificationScreen
2024-08-24 17:57:04 +08:00
import com.aiosman.riderpro.ui.post.NewPostImageGridScreen
2024-07-23 15:25:00 +08:00
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-08-03 15:58:19 +08:00
data object ImageViewer : NavigationRoute("ImageViewer")
2024-08-13 22:32:27 +08:00
data object ChangePasswordScreen : NavigationRoute("ChangePasswordScreen")
2024-08-20 19:48:12 +08:00
data object FavouritesScreen : NavigationRoute("FavouritesScreen")
2024-08-24 17:57:04 +08:00
data object NewPostImageGrid : NavigationRoute("NewPostImageGrid")
data object Search : NavigationRoute("Search")
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,
2024-08-24 21:59:16 +08:00
arguments = listOf(navArgument("id") { type = NavType.StringType }),
enterTransition = {
fadeIn(animationSpec = tween(durationMillis = 100))
},
exitTransition = {
fadeOut(animationSpec = tween(durationMillis = 100))
}
2024-07-23 15:25:00 +08:00
) { 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()
}
2024-08-24 21:59:16 +08:00
composable(
route = NavigationRoute.NewPost.route,
enterTransition = {
fadeIn(animationSpec = tween(durationMillis = 100))
},
exitTransition = {
fadeOut(animationSpec = tween(durationMillis = 100))
}
) {
2024-07-23 15:25:00 +08:00
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 })
) {
2024-08-11 17:15:17 +08:00
CompositionLocalProvider(
LocalAnimatedContentScope provides this,
) {
AccountProfile(it.arguments?.getString("id")!!)
}
2024-07-29 00:01:09 +08:00
}
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-08-03 15:58:19 +08:00
composable(route = NavigationRoute.ImageViewer.route) {
CompositionLocalProvider(
LocalAnimatedContentScope provides this,
) {
ImageViewer()
}
}
2024-08-13 22:32:27 +08:00
composable(route = NavigationRoute.ChangePasswordScreen.route) {
ChangePasswordScreen()
}
2024-08-20 19:48:12 +08:00
composable(route = NavigationRoute.FavouritesScreen.route) {
FavouriteScreen()
}
2024-08-24 17:57:04 +08:00
composable(route = NavigationRoute.NewPostImageGrid.route) {
NewPostImageGridScreen()
}
composable(route = NavigationRoute.Search.route) {
CompositionLocalProvider(
LocalAnimatedContentScope provides this,
) {
SearchScreen()
}
}
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
}
}
}
}