refactor navbar to not need viewmodel in constructor
This commit is contained in:
		
							parent
							
								
									9da9873b58
								
							
						
					
					
						commit
						05c37b4168
					
				
					 6 changed files with 71 additions and 27 deletions
				
			
		|  | @ -21,6 +21,7 @@ import be.ugent.sel.studeez.resources | ||||||
| import be.ugent.sel.studeez.screens.drawer.Drawer | import be.ugent.sel.studeez.screens.drawer.Drawer | ||||||
| import be.ugent.sel.studeez.screens.drawer.DrawerActions | import be.ugent.sel.studeez.screens.drawer.DrawerActions | ||||||
| import be.ugent.sel.studeez.screens.navbar.NavigationBar | import be.ugent.sel.studeez.screens.navbar.NavigationBar | ||||||
|  | import be.ugent.sel.studeez.screens.navbar.NavigationBarActions | ||||||
| import be.ugent.sel.studeez.ui.theme.StudeezTheme | import be.ugent.sel.studeez.ui.theme.StudeezTheme | ||||||
| import kotlinx.coroutines.CoroutineScope | import kotlinx.coroutines.CoroutineScope | ||||||
| import kotlinx.coroutines.launch | import kotlinx.coroutines.launch | ||||||
|  | @ -28,9 +29,8 @@ import kotlinx.coroutines.launch | ||||||
| @Composable | @Composable | ||||||
| fun PrimaryScreenTemplate( | fun PrimaryScreenTemplate( | ||||||
|     title: String, |     title: String, | ||||||
|     open: (String) -> Unit, |  | ||||||
|     openAndPopUp: (String, String) -> Unit, |  | ||||||
|     drawerActions: DrawerActions, |     drawerActions: DrawerActions, | ||||||
|  |     navigationBarActions: NavigationBarActions, | ||||||
|     action: @Composable RowScope.() -> Unit = {}, |     action: @Composable RowScope.() -> Unit = {}, | ||||||
|     content: @Composable (PaddingValues) -> Unit |     content: @Composable (PaddingValues) -> Unit | ||||||
| ) { | ) { | ||||||
|  | @ -61,7 +61,7 @@ fun PrimaryScreenTemplate( | ||||||
|             Drawer(drawerActions) |             Drawer(drawerActions) | ||||||
|         }, |         }, | ||||||
| 
 | 
 | ||||||
|         bottomBar = { NavigationBar(open) }, |         bottomBar = { NavigationBar(navigationBarActions) }, | ||||||
|         floatingActionButtonPosition = FabPosition.Center, |         floatingActionButtonPosition = FabPosition.Center, | ||||||
|         isFloatingActionButtonDocked = true, |         isFloatingActionButtonDocked = true, | ||||||
|         floatingActionButton = { CollapsedAddButton() } |         floatingActionButton = { CollapsedAddButton() } | ||||||
|  | @ -76,9 +76,8 @@ fun PrimaryScreenPreview() { | ||||||
|     StudeezTheme { |     StudeezTheme { | ||||||
|         PrimaryScreenTemplate( |         PrimaryScreenTemplate( | ||||||
|             "Preview screen", |             "Preview screen", | ||||||
|             {}, |  | ||||||
|             { _, _ -> run {} }, |  | ||||||
|             DrawerActions({}, {}, {}, {}, {}), |             DrawerActions({}, {}, {}, {}, {}), | ||||||
|  |             NavigationBarActions({}, {}, {}, {}), | ||||||
|             { |             { | ||||||
|                 IconButton(onClick = { /*TODO*/ }) { |                 IconButton(onClick = { /*TODO*/ }) { | ||||||
|                     Icon( |                     Icon( | ||||||
|  |  | ||||||
|  | @ -15,6 +15,8 @@ import be.ugent.sel.studeez.common.ext.basicButton | ||||||
| import be.ugent.sel.studeez.resources | import be.ugent.sel.studeez.resources | ||||||
| import be.ugent.sel.studeez.screens.drawer.DrawerActions | import be.ugent.sel.studeez.screens.drawer.DrawerActions | ||||||
| import be.ugent.sel.studeez.screens.drawer.DrawerViewModel | import be.ugent.sel.studeez.screens.drawer.DrawerViewModel | ||||||
|  | import be.ugent.sel.studeez.screens.navbar.NavigationBarActions | ||||||
|  | import be.ugent.sel.studeez.screens.navbar.NavigationBarViewModel | ||||||
| 
 | 
 | ||||||
| @Composable | @Composable | ||||||
| fun HomeRoute( | fun HomeRoute( | ||||||
|  | @ -43,11 +45,17 @@ fun HomeScreen( | ||||||
|         onLogoutClick = { drawerViewModel.onLogoutClick(openAndPopUp) }, |         onLogoutClick = { drawerViewModel.onLogoutClick(openAndPopUp) }, | ||||||
|         onAboutClick = { drawerViewModel.onAboutClick(open) }, |         onAboutClick = { drawerViewModel.onAboutClick(open) }, | ||||||
|     ) |     ) | ||||||
|  |     val navigationBarViewModel: NavigationBarViewModel = hiltViewModel() | ||||||
|  |     val navigationBarActions = NavigationBarActions( | ||||||
|  |         onHomeClick = { navigationBarViewModel.onHomeClick(open) }, | ||||||
|  |         onTasksClick = { navigationBarViewModel.onTasksClick(open) }, | ||||||
|  |         onSessionsClick = { navigationBarViewModel.onSessionsClick(open) }, | ||||||
|  |         onProfileClick = { navigationBarViewModel.onProfileClick(open) }, | ||||||
|  |     ) | ||||||
|     PrimaryScreenTemplate( |     PrimaryScreenTemplate( | ||||||
|         title = resources().getString(R.string.home), |         title = resources().getString(R.string.home), | ||||||
|         open = open, |  | ||||||
|         openAndPopUp = openAndPopUp, |  | ||||||
|         drawerActions = drawerActions, |         drawerActions = drawerActions, | ||||||
|  |         navigationBarActions = navigationBarActions, | ||||||
|         action = { FriendsAction() } |         action = { FriendsAction() } | ||||||
|     ) { |     ) { | ||||||
|         BasicButton(R.string.start_session, Modifier.basicButton()) { |         BasicButton(R.string.start_session, Modifier.basicButton()) { | ||||||
|  |  | ||||||
|  | @ -12,16 +12,20 @@ import androidx.compose.material.icons.outlined.DateRange | ||||||
| import androidx.compose.runtime.Composable | import androidx.compose.runtime.Composable | ||||||
| import androidx.compose.ui.tooling.preview.Preview | import androidx.compose.ui.tooling.preview.Preview | ||||||
| import androidx.compose.ui.unit.dp | import androidx.compose.ui.unit.dp | ||||||
| import androidx.hilt.navigation.compose.hiltViewModel |  | ||||||
| import be.ugent.sel.studeez.resources | import be.ugent.sel.studeez.resources | ||||||
| import be.ugent.sel.studeez.ui.theme.StudeezTheme | import be.ugent.sel.studeez.ui.theme.StudeezTheme | ||||||
| import be.ugent.sel.studeez.R.string as AppText | import be.ugent.sel.studeez.R.string as AppText | ||||||
| 
 | 
 | ||||||
|  | data class NavigationBarActions( | ||||||
|  |     val onHomeClick: () -> Unit, | ||||||
|  |     val onTasksClick: () -> Unit, | ||||||
|  |     val onSessionsClick: () -> Unit, | ||||||
|  |     val onProfileClick: () -> Unit, | ||||||
|  | ) | ||||||
| 
 | 
 | ||||||
| @Composable | @Composable | ||||||
| fun NavigationBar( | fun NavigationBar( | ||||||
|     open: (String) -> Unit, |     navigationBarActions: NavigationBarActions, | ||||||
|     viewModel: NavigationBarViewModel = hiltViewModel() |  | ||||||
| ) { | ) { | ||||||
|     // TODO Pass functions and new screens. |     // TODO Pass functions and new screens. | ||||||
|     // TODO Pass which screen is selected. |     // TODO Pass which screen is selected. | ||||||
|  | @ -33,31 +37,43 @@ fun NavigationBar( | ||||||
|             icon = { Icon(imageVector = Icons.Default.List, resources().getString(AppText.home)) }, |             icon = { Icon(imageVector = Icons.Default.List, resources().getString(AppText.home)) }, | ||||||
|             label = { Text(text = resources().getString(AppText.home)) }, |             label = { Text(text = resources().getString(AppText.home)) }, | ||||||
|             selected = false, // TODO |             selected = false, // TODO | ||||||
|             onClick = { viewModel.onHomeClick(open) } |             onClick = navigationBarActions.onHomeClick | ||||||
|         ) |         ) | ||||||
| 
 | 
 | ||||||
|         BottomNavigationItem( |         BottomNavigationItem( | ||||||
|             icon = { Icon(imageVector = Icons.Default.Check, resources().getString(AppText.tasks)) }, |             icon = { | ||||||
|  |                 Icon( | ||||||
|  |                     imageVector = Icons.Default.Check, resources().getString(AppText.tasks) | ||||||
|  |                 ) | ||||||
|  |             }, | ||||||
|             label = { Text(text = resources().getString(AppText.tasks)) }, |             label = { Text(text = resources().getString(AppText.tasks)) }, | ||||||
|             selected = false, // TODO |             selected = false, // TODO | ||||||
|             onClick = { viewModel.onTasksClick(open) } |             onClick = navigationBarActions.onTasksClick | ||||||
|         ) |         ) | ||||||
| 
 | 
 | ||||||
|         // Hack to space the entries in the navigation bar, make space for fab |         // Hack to space the entries in the navigation bar, make space for fab | ||||||
|         BottomNavigationItem(icon = {}, onClick = {}, selected = false) |         BottomNavigationItem(icon = {}, onClick = {}, selected = false) | ||||||
| 
 | 
 | ||||||
|         BottomNavigationItem( |         BottomNavigationItem( | ||||||
|             icon = { Icon(imageVector = Icons.Outlined.DateRange, resources().getString(AppText.sessions)) }, |             icon = { | ||||||
|  |                 Icon( | ||||||
|  |                     imageVector = Icons.Outlined.DateRange, resources().getString(AppText.sessions) | ||||||
|  |                 ) | ||||||
|  |             }, | ||||||
|             label = { Text(text = resources().getString(AppText.sessions)) }, |             label = { Text(text = resources().getString(AppText.sessions)) }, | ||||||
|             selected = false, // TODO |             selected = false, // TODO | ||||||
|             onClick = { viewModel.onSessionsClick(open) } |             onClick = navigationBarActions.onSessionsClick | ||||||
|         ) |         ) | ||||||
| 
 | 
 | ||||||
|         BottomNavigationItem( |         BottomNavigationItem( | ||||||
|             icon = { Icon(imageVector = Icons.Default.Person, resources().getString(AppText.profile)) }, |             icon = { | ||||||
|  |                 Icon( | ||||||
|  |                     imageVector = Icons.Default.Person, resources().getString(AppText.profile) | ||||||
|  |                 ) | ||||||
|  |             }, | ||||||
|             label = { Text(text = resources().getString(AppText.profile)) }, |             label = { Text(text = resources().getString(AppText.profile)) }, | ||||||
|             selected = false, // TODO |             selected = false, // TODO | ||||||
|             onClick = { viewModel.onProfileClick(open) } |             onClick = navigationBarActions.onProfileClick | ||||||
|         ) |         ) | ||||||
| 
 | 
 | ||||||
|     } |     } | ||||||
|  | @ -67,9 +83,6 @@ fun NavigationBar( | ||||||
| @Composable | @Composable | ||||||
| fun NavigationBarPreview() { | fun NavigationBarPreview() { | ||||||
|     StudeezTheme { |     StudeezTheme { | ||||||
|         NavigationBar( |         NavigationBar(NavigationBarActions({}, {}, {}, {})) | ||||||
|             { _ -> {} }, |  | ||||||
|             hiltViewModel() |  | ||||||
|         ) |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | @ -12,6 +12,8 @@ import be.ugent.sel.studeez.common.composable.PrimaryScreenTemplate | ||||||
| import be.ugent.sel.studeez.resources | import be.ugent.sel.studeez.resources | ||||||
| import be.ugent.sel.studeez.screens.drawer.DrawerActions | import be.ugent.sel.studeez.screens.drawer.DrawerActions | ||||||
| import be.ugent.sel.studeez.screens.drawer.DrawerViewModel | import be.ugent.sel.studeez.screens.drawer.DrawerViewModel | ||||||
|  | import be.ugent.sel.studeez.screens.navbar.NavigationBarActions | ||||||
|  | import be.ugent.sel.studeez.screens.navbar.NavigationBarViewModel | ||||||
| import be.ugent.sel.studeez.R.string as AppText | import be.ugent.sel.studeez.R.string as AppText | ||||||
| 
 | 
 | ||||||
| @Composable | @Composable | ||||||
|  | @ -32,11 +34,17 @@ fun ProfileScreen( | ||||||
|         onLogoutClick = { drawerViewModel.onLogoutClick(openAndPopUp) }, |         onLogoutClick = { drawerViewModel.onLogoutClick(openAndPopUp) }, | ||||||
|         onAboutClick = { drawerViewModel.onAboutClick(open) }, |         onAboutClick = { drawerViewModel.onAboutClick(open) }, | ||||||
|     ) |     ) | ||||||
|  |     val navigationBarViewModel: NavigationBarViewModel = hiltViewModel() | ||||||
|  |     val navigationBarActions = NavigationBarActions( | ||||||
|  |         onHomeClick = { navigationBarViewModel.onHomeClick(open) }, | ||||||
|  |         onTasksClick = { navigationBarViewModel.onTasksClick(open) }, | ||||||
|  |         onSessionsClick = { navigationBarViewModel.onSessionsClick(open) }, | ||||||
|  |         onProfileClick = { navigationBarViewModel.onProfileClick(open) }, | ||||||
|  |     ) | ||||||
|     PrimaryScreenTemplate( |     PrimaryScreenTemplate( | ||||||
|         title = resources().getString(AppText.profile), |         title = resources().getString(AppText.profile), | ||||||
|         open = open, |  | ||||||
|         openAndPopUp = openAndPopUp, |  | ||||||
|         drawerActions = drawerActions, |         drawerActions = drawerActions, | ||||||
|  |         navigationBarActions = navigationBarActions, | ||||||
|         action = { EditAction { viewModel.onEditProfileClick(open) } } |         action = { EditAction { viewModel.onEditProfileClick(open) } } | ||||||
|     ) { |     ) { | ||||||
|         Headline(text = (username ?: resources().getString(R.string.no_username))) |         Headline(text = (username ?: resources().getString(R.string.no_username))) | ||||||
|  |  | ||||||
|  | @ -30,6 +30,8 @@ import be.ugent.sel.studeez.data.local.models.timer_info.TimerInfo | ||||||
| import be.ugent.sel.studeez.resources | import be.ugent.sel.studeez.resources | ||||||
| import be.ugent.sel.studeez.screens.drawer.DrawerActions | import be.ugent.sel.studeez.screens.drawer.DrawerActions | ||||||
| import be.ugent.sel.studeez.screens.drawer.DrawerViewModel | import be.ugent.sel.studeez.screens.drawer.DrawerViewModel | ||||||
|  | import be.ugent.sel.studeez.screens.navbar.NavigationBarActions | ||||||
|  | import be.ugent.sel.studeez.screens.navbar.NavigationBarViewModel | ||||||
| 
 | 
 | ||||||
| @Composable | @Composable | ||||||
| fun TimerOverviewScreen( | fun TimerOverviewScreen( | ||||||
|  | @ -47,11 +49,17 @@ fun TimerOverviewScreen( | ||||||
|         onLogoutClick = { drawerViewModel.onLogoutClick(openAndPopUp) }, |         onLogoutClick = { drawerViewModel.onLogoutClick(openAndPopUp) }, | ||||||
|         onAboutClick = { drawerViewModel.onAboutClick(open) }, |         onAboutClick = { drawerViewModel.onAboutClick(open) }, | ||||||
|     ) |     ) | ||||||
|  |     val navigationBarViewModel: NavigationBarViewModel = hiltViewModel() | ||||||
|  |     val navigationBarActions = NavigationBarActions( | ||||||
|  |         onHomeClick = { navigationBarViewModel.onHomeClick(open) }, | ||||||
|  |         onTasksClick = { navigationBarViewModel.onTasksClick(open) }, | ||||||
|  |         onSessionsClick = { navigationBarViewModel.onSessionsClick(open) }, | ||||||
|  |         onProfileClick = { navigationBarViewModel.onProfileClick(open) }, | ||||||
|  |     ) | ||||||
|     PrimaryScreenTemplate( |     PrimaryScreenTemplate( | ||||||
|         title = resources().getString(R.string.timers), |         title = resources().getString(R.string.timers), | ||||||
|         open = open, |  | ||||||
|         openAndPopUp = openAndPopUp, |  | ||||||
|         drawerActions = drawerActions, |         drawerActions = drawerActions, | ||||||
|  |         navigationBarActions = navigationBarActions, | ||||||
|     ) { |     ) { | ||||||
| 
 | 
 | ||||||
|         Column { |         Column { | ||||||
|  |  | ||||||
|  | @ -11,6 +11,8 @@ import be.ugent.sel.studeez.common.composable.PrimaryScreenTemplate | ||||||
| import be.ugent.sel.studeez.resources | import be.ugent.sel.studeez.resources | ||||||
| import be.ugent.sel.studeez.screens.drawer.DrawerActions | import be.ugent.sel.studeez.screens.drawer.DrawerActions | ||||||
| import be.ugent.sel.studeez.screens.drawer.DrawerViewModel | import be.ugent.sel.studeez.screens.drawer.DrawerViewModel | ||||||
|  | import be.ugent.sel.studeez.screens.navbar.NavigationBarActions | ||||||
|  | import be.ugent.sel.studeez.screens.navbar.NavigationBarViewModel | ||||||
| import be.ugent.sel.studeez.screens.timer_overview.TimerEntry | import be.ugent.sel.studeez.screens.timer_overview.TimerEntry | ||||||
| 
 | 
 | ||||||
| @Composable | @Composable | ||||||
|  | @ -29,11 +31,17 @@ fun TimerSelectionScreen( | ||||||
|         onLogoutClick = { drawerViewModel.onLogoutClick(openAndPopUp) }, |         onLogoutClick = { drawerViewModel.onLogoutClick(openAndPopUp) }, | ||||||
|         onAboutClick = { drawerViewModel.onAboutClick(open) }, |         onAboutClick = { drawerViewModel.onAboutClick(open) }, | ||||||
|     ) |     ) | ||||||
|  |     val navigationBarViewModel: NavigationBarViewModel = hiltViewModel() | ||||||
|  |     val navigationBarActions = NavigationBarActions( | ||||||
|  |         onHomeClick = { navigationBarViewModel.onHomeClick(open) }, | ||||||
|  |         onTasksClick = { navigationBarViewModel.onTasksClick(open) }, | ||||||
|  |         onSessionsClick = { navigationBarViewModel.onSessionsClick(open) }, | ||||||
|  |         onProfileClick = { navigationBarViewModel.onProfileClick(open) }, | ||||||
|  |     ) | ||||||
|     PrimaryScreenTemplate( |     PrimaryScreenTemplate( | ||||||
|         title = resources().getString(R.string.timers), |         title = resources().getString(R.string.timers), | ||||||
|         open = open, |  | ||||||
|         openAndPopUp = openAndPopUp, |  | ||||||
|         drawerActions = drawerActions, |         drawerActions = drawerActions, | ||||||
|  |         navigationBarActions = navigationBarActions, | ||||||
|     ) { |     ) { | ||||||
| 
 | 
 | ||||||
|         LazyColumn(verticalArrangement = Arrangement.spacedBy(7.dp)) { |         LazyColumn(verticalArrangement = Arrangement.spacedBy(7.dp)) { | ||||||
|  |  | ||||||
		Reference in a new issue
	
	 brreynie
						brreynie