refactor NavGraph so viewModel for drawer and navbar are shared across app
This commit is contained in:
		
							parent
							
								
									097d1ea134
								
							
						
					
					
						commit
						bbdcd0140c
					
				
					 4 changed files with 107 additions and 72 deletions
				
			
		|  | @ -18,11 +18,12 @@ import androidx.compose.ui.platform.LocalConfiguration | |||
| import androidx.compose.ui.platform.LocalContext | ||||
| import androidx.compose.ui.unit.dp | ||||
| import androidx.hilt.navigation.compose.hiltViewModel | ||||
| import androidx.navigation.NavGraphBuilder | ||||
| import androidx.navigation.NavHostController | ||||
| import androidx.navigation.compose.NavHost | ||||
| import androidx.navigation.compose.composable | ||||
| import androidx.navigation.compose.rememberNavController | ||||
| import be.ugent.sel.studeez.common.composable.drawer.DrawerViewModel | ||||
| import be.ugent.sel.studeez.common.composable.navbar.NavigationBarViewModel | ||||
| import be.ugent.sel.studeez.common.snackbar.SnackbarManager | ||||
| import be.ugent.sel.studeez.navigation.StudeezDestinations | ||||
| import be.ugent.sel.studeez.screens.home.HomeRoute | ||||
|  | @ -55,13 +56,7 @@ fun StudeezApp() { | |||
|                 }, | ||||
|                 scaffoldState = appState.scaffoldState | ||||
|             ) { innerPaddingModifier -> | ||||
|                 NavHost( | ||||
|                     navController = appState.navController, | ||||
|                     startDestination = StudeezDestinations.SPLASH_SCREEN, | ||||
|                     modifier = Modifier.padding(innerPaddingModifier) | ||||
|                 ) { | ||||
|                     studeezGraph(appState) | ||||
|                 } | ||||
|                 StudeezNavGraph(appState, Modifier.padding(innerPaddingModifier)) | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | @ -86,60 +81,91 @@ fun resources(): Resources { | |||
|     return LocalContext.current.resources | ||||
| } | ||||
| 
 | ||||
| fun NavGraphBuilder.studeezGraph(appState: StudeezAppstate) { | ||||
| @Composable | ||||
| fun StudeezNavGraph( | ||||
|     appState: StudeezAppstate, | ||||
|     modifier: Modifier, | ||||
| ) { | ||||
|     val drawerViewModel: DrawerViewModel = hiltViewModel() | ||||
|     val navBarViewModel: NavigationBarViewModel = hiltViewModel() | ||||
| 
 | ||||
|     val goBack: () -> Unit = { | ||||
|         appState.popUp() | ||||
|     NavHost( | ||||
|         navController = appState.navController, | ||||
|         startDestination = StudeezDestinations.SPLASH_SCREEN, | ||||
|         modifier = modifier, | ||||
|     ) { | ||||
|         val goBack: () -> Unit = { | ||||
|             appState.popUp() | ||||
|         } | ||||
| 
 | ||||
|         val open: (String) -> Unit = { route -> | ||||
|             appState.navigate(route) | ||||
|         } | ||||
| 
 | ||||
|         val openAndPopUp: (String, String) -> Unit = { route, popUp -> | ||||
|             appState.navigateAndPopUp(route, popUp) | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|         composable(StudeezDestinations.SPLASH_SCREEN) { | ||||
|             SplashRoute(openAndPopUp, viewModel = hiltViewModel()) | ||||
|         } | ||||
| 
 | ||||
|         composable(StudeezDestinations.LOGIN_SCREEN) { | ||||
|             LoginRoute(openAndPopUp, viewModel = hiltViewModel()) | ||||
|         } | ||||
| 
 | ||||
|         composable(StudeezDestinations.SIGN_UP_SCREEN) { | ||||
|             SignUpRoute(openAndPopUp, viewModel = hiltViewModel()) | ||||
|         } | ||||
| 
 | ||||
|         composable(StudeezDestinations.HOME_SCREEN) { | ||||
|             HomeRoute( | ||||
|                 open, | ||||
|                 openAndPopUp, | ||||
|                 viewModel = hiltViewModel(), | ||||
|                 drawerViewModel = drawerViewModel, | ||||
|                 navBarViewModel = navBarViewModel, | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
|         // TODO Tasks screen | ||||
|         // TODO Sessions screen | ||||
| 
 | ||||
|         composable(StudeezDestinations.PROFILE_SCREEN) { | ||||
|             ProfileRoute(open, openAndPopUp, viewModel = hiltViewModel()) | ||||
|         } | ||||
| 
 | ||||
|         composable(StudeezDestinations.TIMER_OVERVIEW_SCREEN) { | ||||
|             TimerOverviewRoute( | ||||
|                 open, | ||||
|                 openAndPopUp, | ||||
|                 viewModel = hiltViewModel(), | ||||
|                 drawerViewModel = drawerViewModel, | ||||
|                 navBarViewModel = navBarViewModel, | ||||
|             ) | ||||
|         } | ||||
| 
 | ||||
|         composable(StudeezDestinations.SESSION_SCREEN) { | ||||
|             SessionRoute(open, viewModel = hiltViewModel()) | ||||
|         } | ||||
| 
 | ||||
|         // TODO Timers screen | ||||
|         // TODO Settings screen | ||||
| 
 | ||||
|         // Edit screens | ||||
|         composable(StudeezDestinations.EDIT_PROFILE_SCREEN) { | ||||
|             EditProfileRoute(goBack, openAndPopUp, viewModel = hiltViewModel()) | ||||
|         } | ||||
| 
 | ||||
|         composable(StudeezDestinations.TIMER_SELECTION_SCREEN) { | ||||
|             TimerSelectionRoute( | ||||
|                 open, | ||||
|                 openAndPopUp, | ||||
|                 viewModel = hiltViewModel(), | ||||
|                 drawerViewModel = drawerViewModel, | ||||
|                 navBarViewModel = navBarViewModel, | ||||
|             ) | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     val open: (String) -> Unit = { route -> | ||||
|         appState.navigate(route) | ||||
|     } | ||||
| 
 | ||||
|     val openAndPopUp: (String, String) -> Unit = { route, popUp -> | ||||
|         appState.navigateAndPopUp(route, popUp) | ||||
|     } | ||||
| 
 | ||||
|     composable(StudeezDestinations.SPLASH_SCREEN) { | ||||
|         SplashRoute(openAndPopUp, viewModel = hiltViewModel()) | ||||
|     } | ||||
| 
 | ||||
|     composable(StudeezDestinations.LOGIN_SCREEN) { | ||||
|         LoginRoute(openAndPopUp, viewModel = hiltViewModel()) | ||||
|     } | ||||
| 
 | ||||
|     composable(StudeezDestinations.SIGN_UP_SCREEN) { | ||||
|         SignUpRoute(openAndPopUp, viewModel = hiltViewModel()) | ||||
|     } | ||||
| 
 | ||||
|     composable(StudeezDestinations.HOME_SCREEN) { | ||||
|         HomeRoute(open, openAndPopUp, viewModel = hiltViewModel()) | ||||
|     } | ||||
| 
 | ||||
|     // TODO Tasks screen | ||||
|     // TODO Sessions screen | ||||
| 
 | ||||
|     composable(StudeezDestinations.PROFILE_SCREEN) { | ||||
|         ProfileRoute(open, openAndPopUp, viewModel = hiltViewModel()) | ||||
|     } | ||||
| 
 | ||||
|     composable(StudeezDestinations.TIMER_OVERVIEW_SCREEN) { | ||||
|         TimerOverviewRoute(open, openAndPopUp, viewModel = hiltViewModel()) | ||||
|     } | ||||
| 
 | ||||
|     composable(StudeezDestinations.SESSION_SCREEN) { | ||||
|         SessionRoute(open, viewModel = hiltViewModel()) | ||||
|     } | ||||
| 
 | ||||
|     // TODO Timers screen | ||||
|     // TODO Settings screen | ||||
| 
 | ||||
|     // Edit screens | ||||
|     composable(StudeezDestinations.EDIT_PROFILE_SCREEN) { | ||||
|         EditProfileRoute(goBack, openAndPopUp, viewModel = hiltViewModel()) | ||||
|     } | ||||
| 
 | ||||
|     composable(StudeezDestinations.TIMER_SELECTION_SCREEN) { | ||||
|         TimerSelectionRoute(open, openAndPopUp, viewModel = hiltViewModel()) | ||||
|     } | ||||
| } | ||||
| } | ||||
|  |  | |||
|  | @ -7,13 +7,14 @@ import androidx.compose.material.icons.filled.Person | |||
| import androidx.compose.runtime.Composable | ||||
| import androidx.compose.ui.Modifier | ||||
| import androidx.compose.ui.tooling.preview.Preview | ||||
| import androidx.hilt.navigation.compose.hiltViewModel | ||||
| import be.ugent.sel.studeez.R | ||||
| import be.ugent.sel.studeez.common.composable.BasicButton | ||||
| import be.ugent.sel.studeez.common.composable.PrimaryScreenTemplate | ||||
| import be.ugent.sel.studeez.common.composable.drawer.DrawerActions | ||||
| import be.ugent.sel.studeez.common.composable.drawer.DrawerViewModel | ||||
| import be.ugent.sel.studeez.common.composable.drawer.getDrawerActions | ||||
| import be.ugent.sel.studeez.common.composable.navbar.NavigationBarActions | ||||
| import be.ugent.sel.studeez.common.composable.navbar.NavigationBarViewModel | ||||
| import be.ugent.sel.studeez.common.composable.navbar.getNavigationBarActions | ||||
| import be.ugent.sel.studeez.common.ext.basicButton | ||||
| import be.ugent.sel.studeez.resources | ||||
|  | @ -23,11 +24,13 @@ fun HomeRoute( | |||
|     open: (String) -> Unit, | ||||
|     openAndPopUp: (String, String) -> Unit, | ||||
|     viewModel: HomeViewModel, | ||||
|     drawerViewModel: DrawerViewModel, | ||||
|     navBarViewModel: NavigationBarViewModel, | ||||
| ) { | ||||
|     HomeScreen( | ||||
|         onStartSessionClick = { viewModel.onStartSessionClick(open) }, | ||||
|         drawerActions = getDrawerActions(hiltViewModel(), open, openAndPopUp), | ||||
|         navigationBarActions = getNavigationBarActions(hiltViewModel(), open), | ||||
|         drawerActions = getDrawerActions(drawerViewModel, open, openAndPopUp), | ||||
|         navigationBarActions = getNavigationBarActions(navBarViewModel, open), | ||||
|     ) | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -9,15 +9,16 @@ import androidx.compose.runtime.collectAsState | |||
| import androidx.compose.ui.Modifier | ||||
| import androidx.compose.ui.tooling.preview.Preview | ||||
| import androidx.compose.ui.unit.dp | ||||
| import androidx.hilt.navigation.compose.hiltViewModel | ||||
| import be.ugent.sel.studeez.R | ||||
| import be.ugent.sel.studeez.common.composable.BasicButton | ||||
| import be.ugent.sel.studeez.common.composable.PrimaryScreenTemplate | ||||
| import be.ugent.sel.studeez.common.composable.StealthButton | ||||
| import be.ugent.sel.studeez.common.composable.TimerEntry | ||||
| import be.ugent.sel.studeez.common.composable.drawer.DrawerActions | ||||
| import be.ugent.sel.studeez.common.composable.drawer.DrawerViewModel | ||||
| import be.ugent.sel.studeez.common.composable.drawer.getDrawerActions | ||||
| import be.ugent.sel.studeez.common.composable.navbar.NavigationBarActions | ||||
| import be.ugent.sel.studeez.common.composable.navbar.NavigationBarViewModel | ||||
| import be.ugent.sel.studeez.common.composable.navbar.getNavigationBarActions | ||||
| import be.ugent.sel.studeez.common.ext.basicButton | ||||
| import be.ugent.sel.studeez.data.local.models.timer_info.CustomTimerInfo | ||||
|  | @ -47,11 +48,13 @@ fun TimerOverviewRoute( | |||
|     open: (String) -> Unit, | ||||
|     openAndPopUp: (String, String) -> Unit, | ||||
|     viewModel: TimerOverviewViewModel, | ||||
|     drawerViewModel: DrawerViewModel, | ||||
|     navBarViewModel: NavigationBarViewModel, | ||||
| ) { | ||||
|     TimerOverviewScreen( | ||||
|         timerOverviewActions = getTimerOverviewActions(viewModel), | ||||
|         drawerActions = getDrawerActions(hiltViewModel(), open, openAndPopUp), | ||||
|         navigationBarActions = getNavigationBarActions(hiltViewModel(), open), | ||||
|         drawerActions = getDrawerActions(drawerViewModel, open, openAndPopUp), | ||||
|         navigationBarActions = getNavigationBarActions(navBarViewModel, open), | ||||
|     ) | ||||
| } | ||||
| 
 | ||||
|  |  | |||
|  | @ -7,14 +7,15 @@ import androidx.compose.runtime.Composable | |||
| import androidx.compose.runtime.collectAsState | ||||
| import androidx.compose.ui.tooling.preview.Preview | ||||
| import androidx.compose.ui.unit.dp | ||||
| import androidx.hilt.navigation.compose.hiltViewModel | ||||
| import be.ugent.sel.studeez.R | ||||
| import be.ugent.sel.studeez.common.composable.PrimaryScreenTemplate | ||||
| import be.ugent.sel.studeez.common.composable.StealthButton | ||||
| import be.ugent.sel.studeez.common.composable.TimerEntry | ||||
| import be.ugent.sel.studeez.common.composable.drawer.DrawerActions | ||||
| import be.ugent.sel.studeez.common.composable.drawer.DrawerViewModel | ||||
| import be.ugent.sel.studeez.common.composable.drawer.getDrawerActions | ||||
| import be.ugent.sel.studeez.common.composable.navbar.NavigationBarActions | ||||
| import be.ugent.sel.studeez.common.composable.navbar.NavigationBarViewModel | ||||
| import be.ugent.sel.studeez.common.composable.navbar.getNavigationBarActions | ||||
| import be.ugent.sel.studeez.data.local.models.timer_info.TimerInfo | ||||
| import be.ugent.sel.studeez.resources | ||||
|  | @ -41,11 +42,13 @@ fun TimerSelectionRoute( | |||
|     open: (String) -> Unit, | ||||
|     openAndPopUp: (String, String) -> Unit, | ||||
|     viewModel: TimerSelectionViewModel, | ||||
|     drawerViewModel: DrawerViewModel, | ||||
|     navBarViewModel: NavigationBarViewModel, | ||||
| ) { | ||||
|     TimerSelectionScreen( | ||||
|         timerSelectionActions = getTimerSelectionActions(viewModel, open), | ||||
|         drawerActions = getDrawerActions(hiltViewModel(), open, openAndPopUp), | ||||
|         navigationBarActions = getNavigationBarActions(hiltViewModel(), open), | ||||
|         drawerActions = getDrawerActions(drawerViewModel, open, openAndPopUp), | ||||
|         navigationBarActions = getNavigationBarActions(navBarViewModel, open), | ||||
|     ) | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Reference in a new issue
	
	 brreynie
						brreynie