package com.example.onecamera.navigation import androidx.compose.animation.EnterTransition import androidx.compose.animation.ExitTransition import androidx.compose.animation.core.tween import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.ViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.lifecycle.viewModelScope import androidx.navigation.NavHostController import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.toRoute import com.example.onecamera.data.preferences.UserPreferences import com.example.onecamera.data.preferences.UserPreferencesRepository import com.example.onecamera.ui.camera.CameraScreen import com.example.onecamera.ui.folders.FoldersScreen import com.example.onecamera.ui.gallery.GalleryScreen import com.example.onecamera.ui.settings.SettingsScreen import dagger.hilt.android.lifecycle.HiltViewModel import javax.inject.Inject import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.stateIn import kotlinx.serialization.Serializable @Serializable object FoldersRoute @Serializable data class GalleryRoute(val folderUri: String) @Serializable data class CameraRoute( val targetFolderUri: String, val showTargetGalleryAfterSave: Boolean = false, ) @Serializable object SettingsRoute @HiltViewModel class NavGraphViewModel @Inject constructor( preferencesRepository: UserPreferencesRepository, ) : ViewModel() { val preferences: StateFlow = preferencesRepository.userPreferencesFlow .stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), UserPreferences()) } @Composable fun OneCameraNavGraph(navController: NavHostController) { val viewModel: NavGraphViewModel = hiltViewModel() val preferences by viewModel.preferences.collectAsStateWithLifecycle() val transitionsEnabled = preferences.screenTransitionsEnabled androidx.compose.runtime.CompositionLocalProvider( com.example.onecamera.ui.components.LocalOneCameraAnimationsEnabled provides transitionsEnabled, ) { NavHost( navController = navController, startDestination = FoldersRoute, enterTransition = { if (transitionsEnabled) fadeIn(tween(250)) else EnterTransition.None }, exitTransition = { if (transitionsEnabled) fadeOut(tween(250)) else ExitTransition.None }, popEnterTransition = { if (transitionsEnabled) fadeIn(tween(250)) else EnterTransition.None }, popExitTransition = { if (transitionsEnabled) fadeOut(tween(250)) else ExitTransition.None }, ) { composable { FoldersScreen( onNavigateToGallery = { folderUri -> navController.navigate(GalleryRoute(folderUri)) }, onNavigateToCamera = { folderUri -> navController.navigate( CameraRoute( targetFolderUri = folderUri, showTargetGalleryAfterSave = true, ), ) }, onNavigateToSettings = { navController.navigate(SettingsRoute) }, ) } composable { backStackEntry -> val route = backStackEntry.toRoute() GalleryScreen( folderUri = route.folderUri, onNavigateToCamera = { folderUri -> navController.navigate(CameraRoute(folderUri)) }, onNavigateToSubfolder = { folderUri -> navController.navigate(GalleryRoute(folderUri)) }, onNavigateBack = { navController.popBackStack() }, ) } composable { backStackEntry -> val route = backStackEntry.toRoute() CameraScreen( targetFolderUri = route.targetFolderUri, onNavigateBack = { navController.popBackStack() }, onPhotoSaved = { navController.popBackStack() if (route.showTargetGalleryAfterSave) { navController.navigate(GalleryRoute(route.targetFolderUri)) } }, ) } composable { SettingsScreen( onNavigateBack = { navController.popBackStack() }, ) } } } }