#52 poging tot herstructureren -- WERK NIET

This commit is contained in:
Tibo De Peuter 2023-04-12 16:34:13 +02:00
parent 724087362a
commit 12fe0c852e
12 changed files with 133 additions and 128 deletions

View file

@ -1,123 +0,0 @@
package be.ugent.sel.studeez.screens.drawer
import androidx.compose.foundation.Image
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.*
import androidx.compose.material.Divider
import androidx.compose.material.Icon
import androidx.compose.material.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Home
import androidx.compose.material.icons.filled.Settings
import androidx.compose.material.icons.outlined.Info
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.hilt.navigation.compose.hiltViewModel
import be.ugent.sel.studeez.R
import be.ugent.sel.studeez.resources
import be.ugent.sel.studeez.ui.theme.StudeezTheme
@Composable
fun Drawer(
openAndPopup: (String, String) -> Unit,
viewModel: DrawerViewModel = hiltViewModel()
) {
Column(modifier = Modifier.fillMaxSize()) {
LoggedInUserCard(viewModel.currentUser)
Divider()
DrawerEntry(
icon = Icons.Default.Home,
text = resources().getString(R.string.home)
) {
// TODO Go to home
}
DrawerEntry(
icon = ImageVector.vectorResource(id = R.drawable.ic_timer),
text = resources().getString(R.string.timers)
) {
// TODO Go to timers
}
DrawerEntry(
icon = Icons.Default.Settings,
text = resources().getString(R.string.settings)
) {
// TODO Go to settings
}
DrawerEntry(
icon = ImageVector.vectorResource(id = R.drawable.ic_logout),
text = resources().getString(R.string.log_out)
) {
viewModel.onLogoutClick(openAndPopup)
}
DrawerEntry(
icon = Icons.Outlined.Info,
text = resources().getString(R.string.about)
) {
// TODO Go to about
}
}
}
@Composable
fun DrawerEntry(
icon: ImageVector,
text: String,
onClick: () -> Unit
) {
Row(
horizontalArrangement = Arrangement.Center,
modifier = Modifier
.clickable(onClick = { onClick() })
.fillMaxWidth()
) {
Box(modifier = Modifier.fillMaxWidth(0.25f)) {
Icon(imageVector = icon, contentDescription = text)
}
Box(modifier = Modifier.fillMaxWidth(0.75f)) {
Text(text = text)
}
}
}
@Composable
fun LoggedInUserCard(
username: String
) {
Column() {
// TODO Profile picture of current user
Image(
painter = painterResource(id = R.drawable.ic_launcher_background),
contentDescription = stringResource(R.string.profile_picture_description)
)
Text(text = username)
// TODO Description of user (normal user or something else?)
Text(text = stringResource(id = R.string.user_description))
}
}
@Preview
@Composable
fun DrawerPreview() {
StudeezTheme {
Drawer({ a, b -> {}})
}
}
@Preview
@Composable
fun LoggedInUserCardPreview() {
StudeezTheme {
LoggedInUserCard("John Doe")
}
}

View file

@ -1,24 +0,0 @@
package be.ugent.sel.studeez.screens.drawer
import be.ugent.sel.studeez.domain.AccountDAO
import be.ugent.sel.studeez.domain.LogService
import be.ugent.sel.studeez.navigation.StudeezDestinations.HOME_SCREEN
import be.ugent.sel.studeez.navigation.StudeezDestinations.LOGIN_SCREEN
import be.ugent.sel.studeez.screens.StudeezViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
@HiltViewModel
class DrawerViewModel @Inject constructor(
private val accountDAO: AccountDAO,
logService: LogService
): StudeezViewModel(logService) {
val currentUser: String = accountDAO.currentUserId
fun onLogoutClick(openAndPopup: (String, String) -> Unit) {
launchCatching {
accountDAO.signOut()
openAndPopup(LOGIN_SCREEN, HOME_SCREEN)
}
}
}

View file

@ -1,16 +0,0 @@
package be.ugent.sel.studeez.screens.drawer
import androidx.compose.material.ScaffoldState
import androidx.compose.runtime.Stable
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
@Stable
class StudeezDrawerState(
val scaffoldState: ScaffoldState,
private val coroutineScope: CoroutineScope
) {
fun openDrawer() {
coroutineScope.launch { scaffoldState.drawerState.open() }
}
}

View file

@ -1,13 +1,15 @@
package be.ugent.sel.studeez.screens.home
import androidx.compose.material.rememberScaffoldState
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.viewModelScope
import be.ugent.sel.studeez.R
import be.ugent.sel.studeez.common.composable.BasicButton
import be.ugent.sel.studeez.common.composable.PrimaryScreenToolbar
import be.ugent.sel.studeez.common.ext.basicButton
import be.ugent.sel.studeez.resources
import be.ugent.sel.studeez.screens.templates.primary_screen.PrimaryScreen
@Composable
fun HomeScreen(
@ -15,9 +17,11 @@ fun HomeScreen(
viewModel: HomeViewModel = hiltViewModel()
) {
PrimaryScreenToolbar(
PrimaryScreen(
title = resources().getString(R.string.home),
openAndPopUp = openAndPopUp
openDrawer = { viewModel.openDrawer() },
onLogoutClick = { viewModel.onLogoutClick(openAndPopUp) },
viewModel.scaffoldState
) {
BasicButton(R.string.start_session, Modifier.basicButton()) {
viewModel.onStartSessionClick(openAndPopUp)

View file

@ -1,14 +1,36 @@
package be.ugent.sel.studeez.screens.home
import androidx.compose.material.ScaffoldState
import androidx.compose.material.rememberScaffoldState
import be.ugent.sel.studeez.domain.AccountDAO
import be.ugent.sel.studeez.domain.LogService
import be.ugent.sel.studeez.navigation.StudeezDestinations.HOME_SCREEN
import be.ugent.sel.studeez.navigation.StudeezDestinations.LOGIN_SCREEN
import be.ugent.sel.studeez.screens.StudeezViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
@HiltViewModel
class HomeViewModel @Inject constructor(logService: LogService) : StudeezViewModel(logService) {
class HomeViewModel @Inject constructor(
private val accountDAO: AccountDAO,
logService: LogService
) : StudeezViewModel(logService) {
val scaffoldState: ScaffoldState = rememberScaffoldState()
fun onStartSessionClick(openAndPopUp: (String, String) -> Unit) {
// openAndPopUp(StudeezDestinations.xxx, StudeezDestinations.HOME_SCREEN)
// TODO openAndPopUp(StudeezDestinations.xxx, StudeezDestinations.HOME_SCREEN)
}
fun onLogoutClick(openAndPopup: (String, String) -> Unit) {
launchCatching {
accountDAO.signOut()
openAndPopup(LOGIN_SCREEN, HOME_SCREEN)
}
}
fun openDrawer() {
launchCatching {
scaffoldState.drawerState.open()
}
}
}

View file

@ -27,7 +27,7 @@ fun LoginScreen(
val uiState by viewModel.uiState
// TODO Make this a separate kind of screen?
SecondaryScreenToolbar(title = resources().getString(AppText.sign_in)) {
SecondaryScreenToolbar(title = resources().getString(AppText.sign_in), {}) {
Column(
modifier = modifier
.fillMaxWidth()

View file

@ -27,7 +27,7 @@ fun SignUpScreen(
val uiState by viewModel.uiState
val fieldModifier = Modifier.fieldModifier()
SecondaryScreenToolbar(title = resources().getString(AppText.create_account)) {
SecondaryScreenToolbar(title = resources().getString(AppText.create_account), {}) {
Column(
modifier = modifier
.fillMaxWidth()

View file

@ -0,0 +1,65 @@
package be.ugent.sel.studeez.screens.templates.primary_screen
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.material.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Menu
import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import be.ugent.sel.studeez.R
import be.ugent.sel.studeez.common.composable.CollapsedAddButton
import be.ugent.sel.studeez.common.composable.Drawer
import be.ugent.sel.studeez.common.composable.NavigationBar
import be.ugent.sel.studeez.resources
import be.ugent.sel.studeez.ui.theme.StudeezTheme
@Composable
fun PrimaryScreen(
title: String,
openDrawer: () -> Unit,
onLogoutClick: () -> Unit,
scaffoldState: ScaffoldState,
content: @Composable (PaddingValues) -> Unit
) {
Scaffold(
scaffoldState = scaffoldState,
topBar = { TopAppBar(
title = { Text(text = title) },
navigationIcon = {
IconButton(onClick = { openDrawer() }) {
Icon(
imageVector = Icons.Default.Menu,
contentDescription = resources().getString(R.string.menu)
)
}
}
) },
drawerContent = {
Drawer(
currentUser = "TODO John Doe",
onLogoutClick = { onLogoutClick() }
)
},
bottomBar = { NavigationBar() }, // TODO Pass arguments so that the current tab etc can be shown
floatingActionButtonPosition = FabPosition.Center,
isFloatingActionButtonDocked = true,
floatingActionButton = { CollapsedAddButton() }
) {
content(it)
}
}
@Preview
@Composable
fun PrimaryScreenPreview() {
StudeezTheme {
PrimaryScreen(
"Preview screen",
{}, {}, rememberScaffoldState()
) {}
}
}

View file

@ -0,0 +1,14 @@
package be.ugent.sel.studeez.screens.templates.primary_screen
import androidx.compose.material.ScaffoldState
import androidx.compose.material.rememberScaffoldState
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import be.ugent.sel.studeez.StudeezAppstate
@Composable
fun rememberPrimaryScreenState(
scaffoldState: ScaffoldState = rememberScaffoldState()
) = remember(scaffoldState) {
StudeezAppstate(scaffoldState)
}