AllInBottomSheet and storing current user in app
continuous-integration/drone/push Build is passing Details

pull/3/head
Arthur VALIN 1 year ago
parent b835f1a4f4
commit 6f559862e4

@ -0,0 +1,23 @@
package fr.iut.alldev.allin.di
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import fr.iut.alldev.allin.data.repository.UserRepository
import javax.inject.Qualifier
@Qualifier
@Retention(AnnotationRetention.BINARY)
annotation class AllInCurrentUser
@Module
@InstallIn(SingletonComponent::class)
internal object CurrentUserModule {
@AllInCurrentUser
@Provides
fun provideUser(
userRepository: UserRepository
) = userRepository.currentUser
}

@ -0,0 +1,33 @@
package fr.iut.alldev.allin.ext
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color
import fr.iut.alldev.allin.R
import fr.iut.alldev.allin.data.model.BetStatus
import fr.iut.alldev.allin.ui.theme.AllInTheme
fun BetStatus.getTitle(): Int {
return when (this) {
BetStatus.FINISHED -> R.string.bet_status_finished
BetStatus.IN_PROGRESS -> R.string.bet_status_in_progress
BetStatus.WAITING -> R.string.bet_status_waiting
}
}
@Composable
fun BetStatus.getColor(): Color {
return when (this) {
BetStatus.FINISHED -> AllInTheme.colors.allIn_BetFinish
BetStatus.IN_PROGRESS -> AllInTheme.colors.allIn_BetInProgress
BetStatus.WAITING -> AllInTheme.colors.allIn_BetWaiting
}
}
@Composable
fun BetStatus.getTextColor(): Color {
return when (this) {
BetStatus.FINISHED -> AllInTheme.colors.allIn_BetFinishText
BetStatus.IN_PROGRESS -> AllInTheme.colors.allIn_BetInProgressText
BetStatus.WAITING -> AllInTheme.colors.allIn_BetWaitingText
}
}

@ -28,11 +28,11 @@ class MainActivity : ComponentActivity() {
with((view.context as Activity)) {
window.statusBarColor = Color.Transparent.toArgb()
window.navigationBarColor = Color.Transparent.toArgb()
WindowCompat.setDecorFitsSystemWindows(window, false)
if (Build.VERSION.SDK_INT > 30) {
window.insetsController?.hide(WindowInsetsCompat.Type.statusBars())
window.insetsController?.hide(WindowInsetsCompat.Type.navigationBars())
WindowCompat.setDecorFitsSystemWindows(window, false)
}
}
}

@ -26,10 +26,12 @@ import fr.iut.alldev.allin.ui.bet.components.BetScreenPopularCard
import fr.iut.alldev.allin.ui.core.AllInChip
import fr.iut.alldev.allin.ui.theme.AllInTheme
@OptIn(ExperimentalFoundationApi::class, ExperimentalMaterialApi::class)
@OptIn(ExperimentalFoundationApi::class, ExperimentalMaterialApi::class
)
@Composable
fun BetScreen(
viewModel: BetViewModel = hiltViewModel(),
showBetStatus: ()->Unit
){
val horizontalPadding = 23.dp
@ -89,7 +91,9 @@ fun BetScreen(
AllInChip(
text = stringResource(id = it),
isSelected = isSelected,
onClick = { isSelected = !isSelected })
onClick = {
isSelected = !isSelected
})
}
item {
Spacer(modifier = Modifier.width(horizontalPadding))
@ -104,7 +108,7 @@ fun BetScreen(
date = "11 Sept.",
time = "13:00",
players = List(3){ null },
onClickParticipate = { /* TODO */ },
onClickParticipate = showBetStatus,
modifier = Modifier.padding(horizontal = horizontalPadding)
)
Spacer(modifier = Modifier.height(24.dp))

@ -0,0 +1,51 @@
package fr.iut.alldev.allin.ui.betstatus
import androidx.compose.animation.*
import androidx.compose.foundation.layout.*
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import fr.iut.alldev.allin.data.model.BetStatus
import fr.iut.alldev.allin.ui.betstatus.components.BetStatusBottomSheetBack
import fr.iut.alldev.allin.ui.core.AllInBottomSheet
internal const val SHEET_HEIGHT = .85f
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun BetStatusBottomSheet(
state: SheetState,
sheetVisibility: Boolean,
sheetBackVisibility: Boolean,
betStatus: BetStatus,
onDismiss: ()->Unit
) {
AnimatedVisibility(
visible = sheetBackVisibility,
enter = slideInVertically(
initialOffsetY = { it }
),
exit = slideOutVertically(
targetOffsetY = { it }
)
) {
BetStatusBottomSheetBack(
status = betStatus
)
}
AllInBottomSheet(
sheetVisibility = sheetVisibility,
onDismiss = onDismiss,
state = state,
scrimColor = Color.Transparent
){
Column(
Modifier
.fillMaxHeight(SHEET_HEIGHT)
) {
}
}
}

@ -0,0 +1,72 @@
package fr.iut.alldev.allin.ui.betstatus.components
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.text.font.FontStyle
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import fr.iut.alldev.allin.R
import fr.iut.alldev.allin.data.model.BetStatus
import fr.iut.alldev.allin.ext.getColor
import fr.iut.alldev.allin.ext.getTextColor
import fr.iut.alldev.allin.ext.getTitle
import fr.iut.alldev.allin.ui.betstatus.SHEET_HEIGHT
import fr.iut.alldev.allin.ui.theme.AllInTheme
@Composable
fun BetStatusBottomSheetBack(
status: BetStatus,
modifier: Modifier = Modifier
) {
Box(
modifier
.fillMaxSize()
.background(status.getColor())
.padding(horizontal = 25.dp)
) {
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier.fillMaxHeight(1-SHEET_HEIGHT)
) {
Text(
text = stringResource(id = status.getTitle()),
color = status.getTextColor(),
style = AllInTheme.typography.h2.copy(
fontStyle = FontStyle.Italic
),
fontSize = 20.sp,
modifier = Modifier.weight(1f)
)
Icon(
painter = painterResource(id = R.drawable.allin_exit),
tint = AllInTheme.colors.white,
contentDescription = null
)
}
}
}
private class BetStatusPreviewProvider: PreviewParameterProvider<BetStatus> {
override val values = BetStatus.values().asSequence()
}
@Preview
@Composable
private fun BackStatusScreenBackPreview(
@PreviewParameter(BetStatusPreviewProvider::class) betStatus: BetStatus
) {
AllInTheme {
BetStatusBottomSheetBack(status = betStatus)
}
}

@ -0,0 +1,48 @@
package fr.iut.alldev.allin.ui.core
import androidx.compose.foundation.layout.*
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.unit.dp
import racra.compose.smooth_corner_rect_library.AbsoluteSmoothCornerShape
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun AllInBottomSheet(
sheetVisibility: Boolean,
onDismiss: ()->Unit,
state: SheetState,
scrimColor: Color = BottomSheetDefaults.ScrimColor,
content: @Composable ColumnScope.()->Unit
) {
val localDensity = LocalDensity.current
val localLayoutDirection = LocalLayoutDirection.current
if(sheetVisibility) {
ModalBottomSheet(
onDismissRequest = onDismiss,
sheetState = state,
scrimColor = scrimColor,
shape = sheetShape,
windowInsets = BottomSheetDefaults.windowInsets.let {
WindowInsets(
left = it.getLeft(localDensity, localLayoutDirection),
right = it.getRight(localDensity, localLayoutDirection),
top = it.getTop(localDensity),
bottom = 0,
)
},
content = content
)
}
}
private val sheetShape = AbsoluteSmoothCornerShape(
cornerRadiusTL = 15.dp,
cornerRadiusTR = 15.dp,
smoothnessAsPercentTL = 100,
smoothnessAsPercentTR = 100
)

@ -1,5 +1,6 @@
package fr.iut.alldev.allin.ui.core
import android.content.res.Configuration
import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.relocation.BringIntoViewRequester
import androidx.compose.foundation.text.KeyboardActions
@ -187,6 +188,7 @@ private fun AllInTextFieldPlaceholderPreview() {
@OptIn(ExperimentalFoundationApi::class)
@Preview
@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES)
@Composable
private fun AllInTextFieldValuePreview() {
AllInTheme {

@ -0,0 +1,137 @@
package fr.iut.alldev.allin.ui.main
import androidx.activity.compose.BackHandler
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavHostController
import androidx.navigation.compose.rememberNavController
import fr.iut.alldev.allin.data.model.BetStatus
import fr.iut.alldev.allin.ui.betstatus.BetStatusBottomSheet
import fr.iut.alldev.allin.ui.main.components.AllInScaffold
import fr.iut.alldev.allin.ui.navigation.AllInDrawerNavHost
import fr.iut.alldev.allin.ui.navigation.Routes
import fr.iut.alldev.allin.ui.navigation.TopLevelDestination
import fr.iut.alldev.allin.ui.navigation.drawer.AllInDrawer
import fr.iut.alldev.allin.ui.navigation.popUpTo
import fr.iut.alldev.allin.ui.theme.AllInTheme
import kotlinx.coroutines.launch
private val topLevelDestinations = listOf(
TopLevelDestination.PUBLIC_BETS,
TopLevelDestination.BET_CREATION,
TopLevelDestination.BET_HISTORY,
TopLevelDestination.FRIENDS,
TopLevelDestination.CURRENT_BETS
)
@Composable
private fun rememberBetStatusVisibilities(): Triple<MutableState<Boolean>, MutableState<Boolean>, (Boolean) -> Unit> {
val statusVisibility = remember {
mutableStateOf(false)
}
val sheetBackVisibility = remember {
mutableStateOf(false)
}
val setStatusVisibility = {
it: Boolean ->
statusVisibility.value = it
if(it) sheetBackVisibility.value = true
}
return Triple(statusVisibility, sheetBackVisibility, setStatusVisibility)
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun MainScreen(
navController: NavHostController = rememberNavController(),
drawerState: DrawerState = rememberDrawerState(initialValue = DrawerValue.Closed),
startDestination: String = Routes.PUBLIC_BETS,
mainViewModel: MainViewModel = hiltViewModel()
) {
val currentUser = remember{
mainViewModel.currentUser
}
val scope = rememberCoroutineScope()
val (statusVisibility, sheetBackVisibility, setStatusVisibility)
= rememberBetStatusVisibilities()
val bottomSheetState = rememberModalBottomSheetState(
skipPartiallyExpanded = true,
confirmValueChange = {
if(it == SheetValue.Hidden){
sheetBackVisibility.value = false
}
true
}
)
AllInDrawer(
drawerState = drawerState,
destinations = topLevelDestinations,
scope = scope,
username = currentUser.username,
nbFriends = 5,
nbBets = 35,
bestWin = 362,
navigateTo = {route ->
navController.popUpTo(route, startDestination)
}
){
AllInScaffold(
onMenuClicked = { scope.launch { drawerState.open() } },
coinAmount = currentUser.coins,
drawerState = drawerState
) {
Column(
modifier = Modifier
.padding(top = it.calculateTopPadding())
.fillMaxSize()
.background(AllInTheme.themeColors.main_surface),
horizontalAlignment = Alignment.CenterHorizontally
) {
AllInDrawerNavHost(
navController = navController,
setStatusVisibility = setStatusVisibility
)
}
}
}
BetStatusBottomSheet(
state = bottomSheetState,
sheetVisibility = statusVisibility.value,
sheetBackVisibility = sheetBackVisibility.value,
onDismiss = {
setStatusVisibility(false)
},
betStatus = BetStatus.IN_PROGRESS
)
BackHandler(
enabled = drawerState.isOpen
) {
scope.launch {
drawerState.close()
}
}
BackHandler(
enabled = statusVisibility.value
) {
scope.launch {
setStatusVisibility(false)
}
}
}

@ -0,0 +1,17 @@
package fr.iut.alldev.allin.ui.main
import androidx.compose.runtime.mutableStateOf
import androidx.lifecycle.ViewModel
import dagger.hilt.android.lifecycle.HiltViewModel
import fr.iut.alldev.allin.di.AllInCurrentUser
import fr.iut.alldev.allin.data.model.BetStatus
import fr.iut.alldev.allin.data.model.User
import javax.inject.Inject
@HiltViewModel
class MainViewModel @Inject constructor(
@AllInCurrentUser val currentUser: User
) : ViewModel() {
val selectedBet = mutableStateOf<BetStatus?>(null)
}

@ -0,0 +1,48 @@
package fr.iut.alldev.allin.ui.main.components
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.offset
import androidx.compose.material3.DrawerState
import androidx.compose.material3.Scaffold
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.unit.dp
import fr.iut.alldev.allin.ui.core.topbar.AllInTopBar
import kotlin.math.abs
@Composable
fun AllInScaffold(
onMenuClicked: ()->Unit,
coinAmount: Int,
drawerState: DrawerState,
content: @Composable (PaddingValues)->Unit
) {
val drawerOffset = derivedStateOf { drawerState.offset.value }
var drawerWidth by remember {
mutableStateOf(drawerState.offset.value)
}
LaunchedEffect(drawerWidth == 0f) {
drawerWidth = drawerState.offset.value
}
val localDensity = LocalDensity.current
val contentOffset by derivedStateOf {
if (drawerWidth == 0f) 0.dp
else with(localDensity) {
(abs(drawerWidth) + drawerOffset.value).toDp()
}
}
Scaffold(
modifier = Modifier.offset(x = contentOffset),
topBar = {
AllInTopBar(
onMenuClicked = onMenuClicked,
coinAmount = coinAmount
)
},
content = content
)
}

@ -14,7 +14,7 @@ import androidx.navigation.compose.rememberNavController
import fr.iut.alldev.allin.ui.bet.BetScreen
import fr.iut.alldev.allin.ui.betcreation.BetCreationScreen
import fr.iut.alldev.allin.ui.login.LoginScreen
import fr.iut.alldev.allin.ui.navigation.drawer.AllInDrawer
import fr.iut.alldev.allin.ui.main.MainScreen
import fr.iut.alldev.allin.ui.register.RegisterScreen
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.ui.welcome.WelcomeScreen
@ -80,6 +80,7 @@ fun AllInNavHost(modifier: Modifier = Modifier,
internal fun AllInDrawerNavHost(
modifier: Modifier = Modifier,
navController: NavHostController,
setStatusVisibility: (Boolean) -> Unit,
startDestination: String = Routes.PUBLIC_BETS
) {
NavHost(
@ -89,8 +90,14 @@ internal fun AllInDrawerNavHost(
enterTransition = { EnterTransition.None },
exitTransition = { ExitTransition.None }
) {
composable(route = Routes.PUBLIC_BETS) { BetScreen() }
composable(route = Routes.BET_CREATION) { BetCreationScreen() }
composable(route = Routes.PUBLIC_BETS) {
BetScreen(
showBetStatus = { setStatusVisibility(true) }
)
}
composable(route = Routes.BET_CREATION) {
BetCreationScreen()
}
}
}
private fun NavGraphBuilder.allInWelcomeScreen(
@ -142,6 +149,6 @@ private fun NavGraphBuilder.allInDashboard() {
composable(
route = Routes.DASHBOARD,
){
AllInDrawer()
MainScreen()
}
}

@ -0,0 +1,41 @@
package fr.iut.alldev.allin.ui.navigation
import fr.iut.alldev.allin.R
sealed class TopLevelDestination(
val route: String,
val title: Int,
val subtitle: Int,
val emoji: Int
) {
object PUBLIC_BETS : TopLevelDestination(
route = Routes.PUBLIC_BETS,
title = R.string.public_bets,
subtitle = R.string.public_bets_subtitle,
emoji = R.drawable.globe
)
object BET_CREATION : TopLevelDestination(
route = Routes.BET_CREATION,
title = R.string.create_a_bet,
subtitle = R.string.create_a_bet_subtitle,
emoji = R.drawable.video_game
)
object BET_HISTORY : TopLevelDestination(
route = Routes.BET_HISTORY,
title = R.string.bet_history,
subtitle = R.string.bet_history_subtitle,
emoji = R.drawable.eyes
)
object FRIENDS : TopLevelDestination(
route = Routes.FRIENDS,
title = R.string.friends,
subtitle = R.string.friends_subtitle,
emoji = R.drawable.holding_hands
)
object CURRENT_BETS : TopLevelDestination(
route = Routes.CURRENT_BETS,
title = R.string.current_bets,
subtitle = R.string.current_bets_subtitle,
emoji = R.drawable.money_with_wings
)
}

@ -0,0 +1,83 @@
package fr.iut.alldev.allin.ui.navigation.drawer
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Settings
import androidx.compose.material3.*
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import fr.iut.alldev.allin.ui.navigation.TopLevelDestination
import fr.iut.alldev.allin.ui.navigation.drawer.components.DrawerCell
import fr.iut.alldev.allin.ui.navigation.drawer.components.DrawerHeader
import fr.iut.alldev.allin.ui.theme.AllInTheme
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch
@Composable
fun AllInDrawer(
drawerState: DrawerState,
destinations: List<TopLevelDestination>,
scope: CoroutineScope,
username: String,
nbBets: Int,
bestWin: Int,
nbFriends: Int,
navigateTo: (String)->Unit,
content: @Composable ()->Unit
) {
ModalNavigationDrawer(
drawerState = drawerState,
drawerContent = {
ModalDrawerSheet(
drawerShape = RectangleShape,
drawerContainerColor = AllInTheme.colors.allIn_Dark
) {
DrawerHeader(
nbBets = nbBets,
bestWin = bestWin,
nbFriends = nbFriends,
username = username,
modifier = Modifier.padding(top = 39.dp, bottom = 26.dp)
)
destinations.forEach { item ->
DrawerCell(
title = stringResource(item.title).uppercase(),
subtitle = stringResource(item.subtitle),
emoji = painterResource(id = item.emoji),
onClick = {
scope.launch { drawerState.close() }
navigateTo(item.route)
},
modifier = Modifier.padding(vertical = 5.dp, horizontal = 13.dp)
)
}
Box(
Modifier
.fillMaxSize()
.padding(start = 19.dp, bottom = 10.dp)
) {
IconButton(
onClick = { /*TODO : Settings*/ },
modifier = Modifier.align(Alignment.BottomStart)
) {
Icon(
imageVector = Icons.Filled.Settings,
modifier = Modifier.size(40.dp),
tint = AllInTheme.colors.allIn_DarkGrey50,
contentDescription = null
)
}
}
}
},
content = content
)
}

@ -1,168 +0,0 @@
package fr.iut.alldev.allin.ui.navigation.drawer
import androidx.activity.compose.BackHandler
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.*
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Settings
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.RectangleShape
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.navigation.NavHostController
import androidx.navigation.compose.rememberNavController
import fr.iut.alldev.allin.R
import fr.iut.alldev.allin.ui.core.topbar.AllInTopBar
import fr.iut.alldev.allin.ui.navigation.AllInDrawerNavHost
import fr.iut.alldev.allin.ui.navigation.Routes
import fr.iut.alldev.allin.ui.navigation.popUpTo
import fr.iut.alldev.allin.ui.theme.AllInTheme
import kotlinx.coroutines.launch
import kotlin.math.abs
sealed class TopLevelDestination(
val route: String,
val title: Int,
val subtitle: Int,
val emoji: Int
) {
object PUBLIC_BETS : TopLevelDestination(
route = Routes.PUBLIC_BETS,
title = R.string.public_bets,
subtitle = R.string.public_bets_subtitle,
emoji = R.drawable.globe
)
object BET_CREATION : TopLevelDestination(
route = Routes.BET_CREATION,
title = R.string.create_a_bet,
subtitle = R.string.create_a_bet_subtitle,
emoji = R.drawable.video_game
)
object BET_HISTORY : TopLevelDestination(
route = Routes.BET_HISTORY,
title = R.string.bet_history,
subtitle = R.string.bet_history_subtitle,
emoji = R.drawable.eyes
)
object FRIENDS : TopLevelDestination(
route = Routes.FRIENDS,
title = R.string.friends,
subtitle = R.string.friends_subtitle,
emoji = R.drawable.holding_hands
)
object CURRENT_BETS : TopLevelDestination(
route = Routes.CURRENT_BETS,
title = R.string.current_bets,
subtitle = R.string.current_bets_subtitle,
emoji = R.drawable.money_with_wings
)
}
val topLevelDestinations = listOf(
TopLevelDestination.PUBLIC_BETS,
TopLevelDestination.BET_CREATION,
TopLevelDestination.BET_HISTORY,
TopLevelDestination.FRIENDS,
TopLevelDestination.CURRENT_BETS
)
@Composable
fun AllInDrawer(
navController: NavHostController = rememberNavController(),
drawerState: DrawerState = rememberDrawerState(initialValue = DrawerValue.Closed),
startDestination: String = Routes.PUBLIC_BETS
) {
val scope = rememberCoroutineScope()
val drawerOffset = derivedStateOf { drawerState.offset.value }
var drawerWidth by remember {
mutableStateOf(drawerState.offset.value)
}
LaunchedEffect(drawerWidth == 0f) {
drawerWidth = drawerState.offset.value
}
val localDensity = LocalDensity.current
val contentOffset by derivedStateOf {
if (drawerWidth == 0f) 0.dp
else with(localDensity) {
(abs(drawerWidth) + drawerOffset.value).toDp()
}
}
ModalNavigationDrawer(
drawerState = drawerState,
drawerContent = {
ModalDrawerSheet(
drawerShape = RectangleShape,
drawerContainerColor = AllInTheme.colors.allIn_Dark
) {
DrawerHeader(
nbBets = 135,
bestWin = 365,
nbFriends = 5,
username = "Pseudo",
modifier = Modifier.padding(top = 39.dp, bottom = 26.dp)
)
topLevelDestinations.forEach { item ->
DrawerCell(
title = stringResource(item.title).uppercase(),
subtitle = stringResource(item.subtitle),
emoji = painterResource(id = item.emoji),
onClick = {
scope.launch { drawerState.close() }
navController.popUpTo(item.route, startDestination)
},
modifier = Modifier.padding(vertical = 5.dp, horizontal = 13.dp)
)
}
Box(
Modifier
.fillMaxSize()
.padding(start = 19.dp, bottom = 10.dp)) {
IconButton(onClick = { /*TODO*/ },
modifier = Modifier.align(Alignment.BottomStart)){
Icon(imageVector = Icons.Filled.Settings,
modifier = Modifier.size(40.dp),
tint = AllInTheme.colors.allIn_DarkGrey50,
contentDescription = null)
}
}
}
}
) {
Scaffold(
modifier = Modifier.offset( x = contentOffset ),
topBar = { AllInTopBar(onMenuClicked = { scope.launch { drawerState.open() } }, coinAmount = 541) }// TODO: CoinAmount
) {
Column(
modifier = Modifier
.padding(top = it.calculateTopPadding())
.fillMaxSize()
.background(AllInTheme.themeColors.main_surface),
horizontalAlignment = Alignment.CenterHorizontally
) {
AllInDrawerNavHost(
navController = navController
)
}
}
}
BackHandler(
enabled = drawerState.isOpen
) {
scope.launch {
drawerState.close()
}
}
}

@ -1,4 +1,4 @@
package fr.iut.alldev.allin.ui.navigation.drawer
package fr.iut.alldev.allin.ui.navigation.drawer.components
import androidx.compose.foundation.BorderStroke
import androidx.compose.foundation.Image

@ -1,4 +1,4 @@
package fr.iut.alldev.allin.ui.navigation.drawer
package fr.iut.alldev.allin.ui.navigation.drawer.components
import androidx.compose.foundation.layout.*
import androidx.compose.material3.Text

@ -1,4 +1,4 @@
package fr.iut.alldev.allin.ui.navigation.drawer
package fr.iut.alldev.allin.ui.navigation.drawer.components
import androidx.compose.foundation.layout.Column
import androidx.compose.material3.Text

@ -29,6 +29,12 @@ data class AllInColors(
val allIn_DarkBlue: Color,
val allIn_BarPurple: Color,
val allIn_BarPink: Color,
val allIn_BetFinish: Color,
val allIn_BetInProgress: Color,
val allIn_BetWaiting: Color,
val allIn_BetFinishText: Color,
val allIn_BetInProgressText: Color,
val allIn_BetWaitingText: Color,
val allIn_MainGradient: Brush,
val allIn_Bar1stGradient: Brush,
val allIn_Bar2ndGradient: Brush,
@ -59,7 +65,12 @@ internal val LocalColors = staticCompositionLocalOf {
allIn_Blue = Color.Unspecified,
allIn_Mint = Color.Unspecified,
allIn_DarkBlue = Color.Unspecified,
allIn_BetFinish = Color.Unspecified,
allIn_BetInProgress = Color.Unspecified,
allIn_BetWaiting = Color.Unspecified,
allIn_BetFinishText = Color.Unspecified,
allIn_BetInProgressText = Color.Unspecified,
allIn_BetWaitingText = Color.Unspecified,
allIn_MainGradient = Brush.linearGradient(
0.0f to Color(0xFFf951a8),
0.5f to Color(0xFFaa7ef3),

@ -39,6 +39,12 @@ fun AllInTheme(
allIn_Blue = Color(0xFF6a89fa),
allIn_Mint = Color(0xFFC4DEE9),
allIn_DarkBlue = Color(0xFF323078),
allIn_BetFinish = Color(0xFF353535),
allIn_BetInProgress = Color(0xFF604BDB),
allIn_BetWaiting = Color(0xFFDF3B9A),
allIn_BetFinishText = Color(0xFFA7A7A7),
allIn_BetInProgressText = Color(0xFF4636A3),
allIn_BetWaitingText = Color(0xFF852E6C),
allIn_MainGradient = Brush.linearGradient(
0.0f to Color(0xFFf951a8),

@ -0,0 +1,10 @@
<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="30dp"
android:height="30dp"
android:viewportWidth="30"
android:viewportHeight="30">
<path
android:pathData="M15,0C6.716,0 0,6.716 0,15C0,23.284 6.716,30 15,30C23.284,30 30,23.284 30,15C30,6.716 23.284,0 15,0ZM19.789,10.596C20.374,11.182 20.374,12.132 19.789,12.717L17.314,15.192L19.789,17.667C20.374,18.253 20.374,19.203 19.789,19.789C19.203,20.374 18.253,20.374 17.667,19.789L15.192,17.314L12.717,19.789C12.132,20.374 11.182,20.374 10.596,19.789C10.01,19.203 10.01,18.253 10.596,17.667L13.071,15.192L10.596,12.717C10.01,12.132 10.01,11.182 10.596,10.596C11.182,10.01 12.132,10.01 12.717,10.596L15.192,13.071L17.667,10.596C18.253,10.01 19.203,10.01 19.789,10.596Z"
android:fillColor="#ffffff"
android:fillType="evenOdd"/>
</vector>

@ -96,4 +96,10 @@
<item quantity="other">%s points en jeu</item>
<item quantity="many">%s points en jeu</item>
</plurals>
<!--Bet status-->
<string name="bet_status_finished">Terminé !</string>
<string name="bet_status_in_progress">En cours…</string>
<string name="bet_status_waiting">En attente…</string>
</resources>

@ -96,4 +96,8 @@
<item quantity="one">%s point at stake</item>
<item quantity="other">%s points at stake</item>
</plurals>
<!--Bet status-->
<string name="bet_status_finished">Finished !</string>
<string name="bet_status_in_progress">In progress…</string>
<string name="bet_status_waiting">Waiting…</string>
</resources>

@ -1,6 +1,7 @@
package fr.iut.alldev.allin.data.api.model
import androidx.annotation.Keep
import fr.iut.alldev.allin.data.model.User
import kotlinx.serialization.Serializable
@Keep
@ -10,7 +11,14 @@ data class ResponseUser(
val email: String,
val password: String,
var nbCoins: Int,
)
){
fun toUser() = User(
username = username,
email = email,
id = "",
coins = nbCoins
)
}
@Keep
@Serializable

@ -0,0 +1,7 @@
package fr.iut.alldev.allin.data.model
enum class BetStatus {
FINISHED,
IN_PROGRESS,
WAITING
}

@ -1,6 +1,9 @@
package fr.iut.alldev.allin.data.repository
import fr.iut.alldev.allin.data.model.User
abstract class UserRepository {
lateinit var currentUser: User
abstract suspend fun login(
username: String,
password: String

@ -9,24 +9,24 @@ import javax.inject.Inject
class UserRepositoryImpl @Inject constructor(
private val api: AllInApi,
) : UserRepository() {
override suspend fun login(username: String, password: String) {
api.login(
currentUser = api.login(
CheckUser(
username = username,
password = password
)
)
).toUser()
}
override suspend fun register(username: String, email: String, password: String) {
api.register(
currentUser = api.register(
ResponseUser(
username = username,
email = email,
password = password,
nbCoins = 0
)
)
).toUser()
}
}
Loading…
Cancel
Save