refactor navbar to not need viewmodel in constructor

This commit is contained in:
brreynie 2023-04-22 22:16:24 +02:00
parent 9da9873b58
commit 05c37b4168
6 changed files with 71 additions and 27 deletions

View file

@ -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(

View file

@ -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()) {

View file

@ -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()
)
} }
} }

View file

@ -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)))

View file

@ -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 {

View file

@ -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)) {