refactor primaryScreenTemplate to not create drawerViewModel

This commit is contained in:
brreynie 2023-04-22 22:04:48 +02:00
parent 2b2cc879b3
commit 9da9873b58
6 changed files with 122 additions and 43 deletions

View file

@ -2,16 +2,24 @@ package be.ugent.sel.studeez.common.composable
import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.RowScope import androidx.compose.foundation.layout.RowScope
import androidx.compose.material.* import androidx.compose.material.FabPosition
import androidx.compose.material.Icon
import androidx.compose.material.IconButton
import androidx.compose.material.Scaffold
import androidx.compose.material.ScaffoldState
import androidx.compose.material.Text
import androidx.compose.material.TopAppBar
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Edit import androidx.compose.material.icons.filled.Edit
import androidx.compose.material.icons.filled.Menu import androidx.compose.material.icons.filled.Menu
import androidx.compose.material.rememberScaffoldState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import be.ugent.sel.studeez.R import be.ugent.sel.studeez.R
import be.ugent.sel.studeez.resources 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.navbar.NavigationBar import be.ugent.sel.studeez.screens.navbar.NavigationBar
import be.ugent.sel.studeez.ui.theme.StudeezTheme import be.ugent.sel.studeez.ui.theme.StudeezTheme
import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.CoroutineScope
@ -22,6 +30,7 @@ fun PrimaryScreenTemplate(
title: String, title: String,
open: (String) -> Unit, open: (String) -> Unit,
openAndPopUp: (String, String) -> Unit, openAndPopUp: (String, String) -> Unit,
drawerActions: DrawerActions,
action: @Composable RowScope.() -> Unit = {}, action: @Composable RowScope.() -> Unit = {},
content: @Composable (PaddingValues) -> Unit content: @Composable (PaddingValues) -> Unit
) { ) {
@ -31,7 +40,8 @@ fun PrimaryScreenTemplate(
Scaffold( Scaffold(
scaffoldState = scaffoldState, scaffoldState = scaffoldState,
topBar = { TopAppBar( topBar = {
TopAppBar(
title = { Text(text = title) }, title = { Text(text = title) },
navigationIcon = { navigationIcon = {
IconButton(onClick = { IconButton(onClick = {
@ -44,10 +54,11 @@ fun PrimaryScreenTemplate(
} }
}, },
actions = action actions = action
) }, )
},
drawerContent = { drawerContent = {
Drawer(open, openAndPopUp) Drawer(drawerActions)
}, },
bottomBar = { NavigationBar(open) }, bottomBar = { NavigationBar(open) },
@ -65,14 +76,17 @@ fun PrimaryScreenPreview() {
StudeezTheme { StudeezTheme {
PrimaryScreenTemplate( PrimaryScreenTemplate(
"Preview screen", "Preview screen",
{ _ -> {}}, {},
{ _, _ -> {}}, { _, _ -> run {} },
{ IconButton(onClick = { /*TODO*/ }) { DrawerActions({}, {}, {}, {}, {}),
{
IconButton(onClick = { /*TODO*/ }) {
Icon( Icon(
imageVector = Icons.Default.Edit, imageVector = Icons.Default.Edit,
contentDescription = "Edit" contentDescription = "Edit"
) )
}} }
},
) {} ) {}
} }
} }

View file

@ -23,14 +23,17 @@ import be.ugent.sel.studeez.R
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
data class DrawerActions(
val onHomeButtonClick: () -> Unit,
val onTimersClick: () -> Unit,
val onSettingsClick: () -> Unit,
val onLogoutClick: () -> Unit,
val onAboutClick: () -> Unit,
)
@Composable @Composable
fun Drawer( fun Drawer(
onHomeButtonClick: () -> Unit, drawerActions: DrawerActions,
onTimersClick: () -> Unit,
onSettingsClick: () -> Unit,
onLogoutClick: () -> Unit,
onAboutClick: () -> Unit,
) { ) {
Column( Column(
modifier = Modifier.fillMaxWidth() modifier = Modifier.fillMaxWidth()
@ -43,29 +46,29 @@ fun Drawer(
DrawerEntry( DrawerEntry(
icon = Icons.Default.Home, icon = Icons.Default.Home,
text = resources().getString(R.string.home), text = resources().getString(R.string.home),
onClick = onHomeButtonClick, onClick = drawerActions.onHomeButtonClick,
) )
DrawerEntry( DrawerEntry(
icon = ImageVector.vectorResource(id = R.drawable.ic_timer), icon = ImageVector.vectorResource(id = R.drawable.ic_timer),
text = resources().getString(R.string.timers), text = resources().getString(R.string.timers),
onClick = onTimersClick, onClick = drawerActions.onTimersClick,
) )
DrawerEntry( DrawerEntry(
icon = Icons.Default.Settings, icon = Icons.Default.Settings,
text = resources().getString(R.string.settings), text = resources().getString(R.string.settings),
onClick = onSettingsClick, onClick = drawerActions.onSettingsClick,
) )
DrawerEntry( DrawerEntry(
icon = ImageVector.vectorResource(id = R.drawable.ic_logout), icon = ImageVector.vectorResource(id = R.drawable.ic_logout),
text = resources().getString(R.string.log_out), text = resources().getString(R.string.log_out),
onClick = onLogoutClick, onClick = drawerActions.onLogoutClick,
) )
} }
DrawerEntry( DrawerEntry(
icon = Icons.Outlined.Info, icon = Icons.Outlined.Info,
text = resources().getString(R.string.about), text = resources().getString(R.string.about),
onClick = onAboutClick, onClick = drawerActions.onAboutClick,
) )
} }
} }
@ -100,7 +103,8 @@ fun DrawerEntry(
@Preview @Preview
@Composable @Composable
fun DrawerPreview() { fun DrawerPreview() {
val drawerActions = DrawerActions({}, {}, {}, {}, {})
StudeezTheme { StudeezTheme {
Drawer({}, {}, {}, {}, {}) Drawer(drawerActions)
} }
} }

View file

@ -6,27 +6,52 @@ import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Person import androidx.compose.material.icons.filled.Person
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
import be.ugent.sel.studeez.R import be.ugent.sel.studeez.R
import be.ugent.sel.studeez.common.composable.BasicButton import be.ugent.sel.studeez.common.composable.BasicButton
import be.ugent.sel.studeez.common.composable.PrimaryScreenTemplate import be.ugent.sel.studeez.common.composable.PrimaryScreenTemplate
import be.ugent.sel.studeez.common.ext.basicButton 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.DrawerViewModel
@Composable
fun HomeRoute(
open: (String) -> Unit,
openAndPopUp: (String, String) -> Unit,
viewModel: HomeViewModel,
) {
HomeScreen(
open = open,
openAndPopUp = openAndPopUp,
onStartSessionClick = { viewModel.onStartSessionClick(open) }
)
}
@Composable @Composable
fun HomeScreen( fun HomeScreen(
open: (String) -> Unit, open: (String) -> Unit,
openAndPopUp: (String, String) -> Unit, openAndPopUp: (String, String) -> Unit,
viewModel: HomeViewModel = hiltViewModel() onStartSessionClick: () -> Unit,
) { ) {
val drawerViewModel: DrawerViewModel = hiltViewModel()
val drawerActions = DrawerActions(
onHomeButtonClick = { drawerViewModel.onHomeButtonClick(open) },
onTimersClick = { drawerViewModel.onTimersClick(open) },
onSettingsClick = { drawerViewModel.onSettingsClick(open) },
onLogoutClick = { drawerViewModel.onLogoutClick(openAndPopUp) },
onAboutClick = { drawerViewModel.onAboutClick(open) },
)
PrimaryScreenTemplate( PrimaryScreenTemplate(
title = resources().getString(R.string.home), title = resources().getString(R.string.home),
open = open, open = open,
openAndPopUp = openAndPopUp, openAndPopUp = openAndPopUp,
drawerActions = drawerActions,
action = { FriendsAction() } action = { FriendsAction() }
) { ) {
BasicButton(R.string.start_session, Modifier.basicButton()) { BasicButton(R.string.start_session, Modifier.basicButton()) {
viewModel.onStartSessionClick(open) onStartSessionClick()
} }
} }
} }
@ -40,3 +65,9 @@ fun FriendsAction () {
) )
} }
} }
@Preview
@Composable
fun HomeScreenPreview() {
HomeScreen(open = {}, openAndPopUp = { _, _ -> run {} }, onStartSessionClick = {})
}

View file

@ -10,6 +10,8 @@ import be.ugent.sel.studeez.R
import be.ugent.sel.studeez.common.composable.Headline import be.ugent.sel.studeez.common.composable.Headline
import be.ugent.sel.studeez.common.composable.PrimaryScreenTemplate 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.DrawerViewModel
import be.ugent.sel.studeez.R.string as AppText import be.ugent.sel.studeez.R.string as AppText
@Composable @Composable
@ -22,11 +24,19 @@ fun ProfileScreen(
LaunchedEffect(key1 = Unit) { LaunchedEffect(key1 = Unit) {
username = viewModel.getUsername() username = viewModel.getUsername()
} }
val drawerViewModel: DrawerViewModel = hiltViewModel()
val drawerActions = DrawerActions(
onHomeButtonClick = { drawerViewModel.onHomeButtonClick(open) },
onTimersClick = { drawerViewModel.onTimersClick(open) },
onSettingsClick = { drawerViewModel.onSettingsClick(open) },
onLogoutClick = { drawerViewModel.onLogoutClick(openAndPopUp) },
onAboutClick = { drawerViewModel.onAboutClick(open) },
)
PrimaryScreenTemplate( PrimaryScreenTemplate(
title = resources().getString(AppText.profile), title = resources().getString(AppText.profile),
open = open, open = open,
openAndPopUp = openAndPopUp, openAndPopUp = openAndPopUp,
drawerActions = drawerActions,
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

@ -28,6 +28,8 @@ import be.ugent.sel.studeez.common.ext.basicButton
import be.ugent.sel.studeez.data.local.models.timer_info.CustomTimerInfo import be.ugent.sel.studeez.data.local.models.timer_info.CustomTimerInfo
import be.ugent.sel.studeez.data.local.models.timer_info.TimerInfo 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.DrawerViewModel
@Composable @Composable
fun TimerOverviewScreen( fun TimerOverviewScreen(
@ -37,11 +39,19 @@ fun TimerOverviewScreen(
) { ) {
val timers = viewModel.getUserTimers().collectAsState(initial = emptyList()) val timers = viewModel.getUserTimers().collectAsState(initial = emptyList())
val drawerViewModel: DrawerViewModel = hiltViewModel()
val drawerActions = DrawerActions(
onHomeButtonClick = { drawerViewModel.onHomeButtonClick(open) },
onTimersClick = { drawerViewModel.onTimersClick(open) },
onSettingsClick = { drawerViewModel.onSettingsClick(open) },
onLogoutClick = { drawerViewModel.onLogoutClick(openAndPopUp) },
onAboutClick = { drawerViewModel.onAboutClick(open) },
)
PrimaryScreenTemplate( PrimaryScreenTemplate(
title = resources().getString(R.string.timers), title = resources().getString(R.string.timers),
open = open, open = open,
openAndPopUp = openAndPopUp openAndPopUp = openAndPopUp,
drawerActions = drawerActions,
) { ) {
Column { Column {

View file

@ -9,6 +9,8 @@ import androidx.hilt.navigation.compose.hiltViewModel
import be.ugent.sel.studeez.R import be.ugent.sel.studeez.R
import be.ugent.sel.studeez.common.composable.PrimaryScreenTemplate 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.DrawerViewModel
import be.ugent.sel.studeez.screens.timer_overview.TimerEntry import be.ugent.sel.studeez.screens.timer_overview.TimerEntry
@Composable @Composable
@ -19,11 +21,19 @@ fun TimerSelectionScreen(
) { ) {
val timers = viewModel.getAllTimers().collectAsState(initial = emptyList()) val timers = viewModel.getAllTimers().collectAsState(initial = emptyList())
val drawerViewModel: DrawerViewModel = hiltViewModel()
val drawerActions = DrawerActions(
onHomeButtonClick = { drawerViewModel.onHomeButtonClick(open) },
onTimersClick = { drawerViewModel.onTimersClick(open) },
onSettingsClick = { drawerViewModel.onSettingsClick(open) },
onLogoutClick = { drawerViewModel.onLogoutClick(openAndPopUp) },
onAboutClick = { drawerViewModel.onAboutClick(open) },
)
PrimaryScreenTemplate( PrimaryScreenTemplate(
title = resources().getString(R.string.timers), title = resources().getString(R.string.timers),
open = open, open = open,
openAndPopUp = openAndPopUp, openAndPopUp = openAndPopUp,
drawerActions = drawerActions,
) { ) {
LazyColumn(verticalArrangement = Arrangement.spacedBy(7.dp)) { LazyColumn(verticalArrangement = Arrangement.spacedBy(7.dp)) {