Merge branch 'development' into timers

This commit is contained in:
lbarraga 2023-04-17 10:48:48 +02:00 committed by GitHub Enterprise
commit bf93428fdc
20 changed files with 226 additions and 71 deletions

View file

@ -23,6 +23,7 @@ import be.ugent.sel.studeez.ui.theme.StudeezTheme
@Composable
fun Drawer(
open: (String) -> Unit,
openAndPopUp: (String, String) -> Unit,
viewModel: DrawerViewModel = hiltViewModel()
) {
@ -36,19 +37,19 @@ fun Drawer(
icon = Icons.Default.Home,
text = resources().getString(R.string.home)
) {
// TODO Go to home
viewModel.onHomeButtonClick(open)
}
DrawerEntry(
icon = ImageVector.vectorResource(id = R.drawable.ic_timer),
text = resources().getString(R.string.timers)
) {
viewModel.onTimersClick(openAndPopUp)
viewModel.onTimersClick(open)
}
DrawerEntry(
icon = Icons.Default.Settings,
text = resources().getString(R.string.settings)
) {
viewModel.onSettingsClick(openAndPopUp)
viewModel.onSettingsClick(open)
}
DrawerEntry(
icon = ImageVector.vectorResource(id = R.drawable.ic_logout),
@ -62,7 +63,7 @@ fun Drawer(
icon = Icons.Outlined.Info,
text = resources().getString(R.string.about)
) {
viewModel.onAboutClick(openAndPopUp)
viewModel.onAboutClick(open)
}
}
}
@ -101,7 +102,9 @@ fun DrawerEntry(
fun DrawerPreview() {
StudeezTheme {
Drawer(
{a, b -> {}}, hiltViewModel()
{ _, -> {} },
{ _, _ -> {} },
hiltViewModel()
)
}
}

View file

@ -2,7 +2,8 @@ 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
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
@ -13,27 +14,30 @@ class DrawerViewModel @Inject constructor(
logService: LogService
) : StudeezViewModel(logService) {
fun onLogoutClick(openAndPopup: (String, String) -> Unit) {
launchCatching {
accountDAO.signOut()
openAndPopup(StudeezDestinations.LOGIN_SCREEN, StudeezDestinations.HOME_SCREEN)
}
fun onHomeButtonClick(open: (String) -> Unit) {
open(HOME_SCREEN)
}
fun onHomeButtonClick(openAndPopup: (String, String) -> Unit) {
fun onTimersClick(open: (String) -> Unit) {
// TODO
}
fun onTimersClick(openAndPopup: (String, String) -> Unit) {
// TODO is niet altijd het homescreen
openAndPopup(StudeezDestinations.TIMER_OVERVIEW_SCREEN, StudeezDestinations.HOME_SCREEN)
}
fun onSettingsClick(openAndPopup: (String, String) -> Unit) {
fun onSettingsClick(open: (String) -> Unit) {
// TODO
}
fun onAboutClick(openAndPopup: (String, String) -> Unit) {
fun onLogoutClick(openAndPopUp: (String, String) -> Unit) {
launchCatching {
accountDAO.signOut()
openAndPopUp(LOGIN_SCREEN, HOME_SCREEN)
}
}
fun onAboutClick(open: (String) -> Unit) {
// TODO
}
}

View file

@ -11,15 +11,17 @@ import be.ugent.sel.studeez.resources
@Composable
fun HomeScreen(
open: (String) -> Unit,
openAndPopUp: (String, String) -> Unit,
viewModel: HomeViewModel = hiltViewModel()
) {
PrimaryScreenTemplate(
title = resources().getString(R.string.home),
open = open,
openAndPopUp = openAndPopUp
) {
BasicButton(R.string.start_session, Modifier.basicButton()) {
viewModel.onStartSessionClick(openAndPopUp)
viewModel.onStartSessionClick(open)
}
}
}

View file

@ -1,8 +1,5 @@
package be.ugent.sel.studeez.screens.home
import androidx.compose.material.ScaffoldState
import androidx.compose.material.rememberScaffoldState
import be.ugent.sel.studeez.data.local.models.User
import be.ugent.sel.studeez.domain.AccountDAO
import be.ugent.sel.studeez.domain.LogService
import be.ugent.sel.studeez.navigation.StudeezDestinations
@ -10,7 +7,6 @@ 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 kotlinx.coroutines.flow.Flow
import javax.inject.Inject
@HiltViewModel

View file

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

View file

@ -13,11 +13,14 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import be.ugent.sel.studeez.resources
import be.ugent.sel.studeez.ui.theme.StudeezTheme
import be.ugent.sel.studeez.R.string as AppText
@Composable
fun NavigationBar(
popUpAndOpen: (String, String) -> Unit,
open: (String) -> Unit,
viewModel: NavigationBarViewModel = hiltViewModel()
) {
// TODO Pass functions and new screens.
@ -27,41 +30,46 @@ fun NavigationBar(
elevation = 10.dp
) {
BottomNavigationItem(
icon = { Icon(imageVector = Icons.Default.List, "Home") },
label = { Text(text = "Home") },
icon = { Icon(imageVector = Icons.Default.List, resources().getString(AppText.home)) },
label = { Text(text = resources().getString(AppText.home)) },
selected = false, // TODO
onClick = { viewModel.onHomeClick(popUpAndOpen) }
onClick = { viewModel.onHomeClick(open) }
)
BottomNavigationItem(
icon = { Icon(imageVector = Icons.Default.Check, "Tasks") },
label = { Text(text = "Tasks") },
icon = { Icon(imageVector = Icons.Default.Check, resources().getString(AppText.tasks)) },
label = { Text(text = resources().getString(AppText.tasks)) },
selected = false, // TODO
onClick = { viewModel.onTasksClick(popUpAndOpen) }
onClick = { viewModel.onTasksClick(open) }
)
// Hack to space the entries in the navigation bar, make space for fab
BottomNavigationItem(icon = {}, onClick = {}, selected = false)
BottomNavigationItem(
icon = { Icon(imageVector = Icons.Outlined.DateRange, "Sessions") },
label = { Text(text = "Sessions") },
icon = { Icon(imageVector = Icons.Outlined.DateRange, resources().getString(AppText.sessions)) },
label = { Text(text = resources().getString(AppText.sessions)) },
selected = false, // TODO
onClick = { viewModel.onSessionsClick(popUpAndOpen) }
onClick = { viewModel.onSessionsClick(open) }
)
BottomNavigationItem(
icon = { Icon(imageVector = Icons.Default.Person, "Profile") },
label = { Text(text = "Profile") },
icon = { Icon(imageVector = Icons.Default.Person, resources().getString(AppText.profile)) },
label = { Text(text = resources().getString(AppText.profile)) },
selected = false, // TODO
onClick = { viewModel.onProfileClick(popUpAndOpen) }
onClick = { viewModel.onProfileClick(open) }
)
}
}
//@Preview(showBackground = true)
//@Composable
//fun NavigationBarPreview() {
// StudeezTheme { NavigationBar() }
//}
@Preview(showBackground = true)
@Composable
fun NavigationBarPreview() {
StudeezTheme {
NavigationBar(
{ _ -> {} },
hiltViewModel()
)
}
}

View file

@ -3,6 +3,8 @@ package be.ugent.sel.studeez.screens.navbar
import be.ugent.sel.studeez.domain.AccountDAO
import be.ugent.sel.studeez.domain.LogService
import be.ugent.sel.studeez.navigation.StudeezDestinations
import be.ugent.sel.studeez.navigation.StudeezDestinations.HOME_SCREEN
import be.ugent.sel.studeez.navigation.StudeezDestinations.PROFILE_SCREEN
import be.ugent.sel.studeez.screens.StudeezViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import javax.inject.Inject
@ -13,19 +15,19 @@ class NavigationBarViewModel @Inject constructor(
logService: LogService
) : StudeezViewModel(logService) {
fun onHomeClick(openAndPopup: (String, String) -> Unit) {
fun onHomeClick(open: (String) -> Unit) {
open(HOME_SCREEN)
}
fun onTasksClick(open: (String) -> Unit) {
// TODO
}
fun onTasksClick(openAndPopup: (String, String) -> Unit) {
fun onSessionsClick(open: (String) -> Unit) {
// TODO
}
fun onSessionsClick(openAndPopup: (String, String) -> Unit) {
// TODO
}
fun onProfileClick(openAndPopup: (String, String) -> Unit) {
// TODO
fun onProfileClick(open: (String) -> Unit) {
open(PROFILE_SCREEN)
}
}

View file

@ -0,0 +1,29 @@
package be.ugent.sel.studeez.screens.profile
import androidx.compose.runtime.*
import androidx.hilt.navigation.compose.hiltViewModel
import be.ugent.sel.studeez.R
import be.ugent.sel.studeez.common.composable.Headline
import be.ugent.sel.studeez.common.composable.PrimaryScreenTemplate
import be.ugent.sel.studeez.resources
import be.ugent.sel.studeez.R.string as AppText
@Composable
fun ProfileScreen(
open: (String) -> Unit,
openAndPopUp: (String, String) -> Unit,
viewModel: ProfileViewModel = hiltViewModel()
) {
var username: String? by remember { mutableStateOf("") }
LaunchedEffect(key1 = Unit) {
username = viewModel.getUsername()
}
PrimaryScreenTemplate(
title = resources().getString(AppText.profile),
open = open,
openAndPopUp = openAndPopUp
) {
Headline(text = (username ?: resources().getString(R.string.no_username)))
}
}

View file

@ -0,0 +1,30 @@
package be.ugent.sel.studeez.screens.profile
import androidx.compose.runtime.rememberCoroutineScope
import androidx.lifecycle.viewModelScope
import be.ugent.sel.studeez.R
import be.ugent.sel.studeez.domain.LogService
import be.ugent.sel.studeez.domain.UserDAO
import be.ugent.sel.studeez.resources
import be.ugent.sel.studeez.screens.StudeezViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn
import javax.inject.Inject
@HiltViewModel
class ProfileViewModel @Inject constructor(
private val userDAO: UserDAO,
logService: LogService
) : StudeezViewModel(logService) {
suspend fun getUsername(): String? {
return userDAO.getUsername()
}
}

View file

@ -6,8 +6,6 @@ import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Person
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
@ -29,7 +27,7 @@ fun SignUpScreen(
val uiState by viewModel.uiState
val fieldModifier = Modifier.fieldModifier()
SecondaryScreenTemplate(title = resources().getString(AppText.create_account), {}) {
SimpleScreenTemplate(title = resources().getString(AppText.create_account)) {
Column(
modifier = modifier
.fillMaxWidth()

View file

@ -21,7 +21,7 @@ import be.ugent.sel.studeez.common.ext.basicButton
import kotlinx.coroutines.delay
import be.ugent.sel.studeez.R.string as AppText
private const val SPLASH_TIMEOUT = 1000L
private const val SPLASH_TIMEOUT = 500L
@Composable
fun SplashScreen(

View file

@ -0,0 +1,4 @@
package be.ugent.sel.studeez.screens.timers
class TimerScreen {
}