pull/5/head
avalin 1 year ago
parent b6c6f2c005
commit c362543581

@ -1,29 +1,29 @@
package fr.iut.alldev.allin.ui package fr.iut.alldev.allin.ui
import android.app.Activity
import android.os.Build
import android.os.Bundle import android.os.Bundle
import androidx.activity.ComponentActivity import androidx.activity.ComponentActivity
import androidx.activity.SystemBarStyle
import androidx.activity.compose.setContent import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.compose.runtime.SideEffect
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.graphics.toArgb
import androidx.compose.ui.platform.LocalView
import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import fr.iut.alldev.allin.ui.navigation.AllInNavHost
import fr.iut.alldev.allin.theme.AllInTheme import fr.iut.alldev.allin.theme.AllInTheme
import fr.iut.alldev.allin.ui.navigation.AllInNavHost
@AndroidEntryPoint @AndroidEntryPoint
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
enableEdgeToEdge() enableEdgeToEdge(
navigationBarStyle = SystemBarStyle.light(
scrim = Color.Transparent.toArgb(),
darkScrim = Color.Transparent.toArgb()
)
)
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContent { setContent {
AllInTheme{ AllInTheme {
AllInNavHost() AllInNavHost()
} }
} }

@ -5,13 +5,12 @@ import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.safeContentPadding
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.items
@ -31,7 +30,6 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalHapticFeedback
import androidx.compose.ui.res.stringResource import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
@ -50,8 +48,6 @@ fun BetScreen(
viewModel: BetViewModel = hiltViewModel(), viewModel: BetViewModel = hiltViewModel(),
selectBet: (Bet, Boolean) -> Unit, selectBet: (Bet, Boolean) -> Unit,
) { ) {
val haptic = LocalHapticFeedback.current
val bets by viewModel.bets.collectAsState() val bets by viewModel.bets.collectAsState()
val refreshing by viewModel.isRefreshing.collectAsState() val refreshing by viewModel.isRefreshing.collectAsState()
@ -96,11 +92,9 @@ fun BetScreen(
) )
) )
.padding(top = 5.dp, bottom = 19.dp), .padding(top = 5.dp, bottom = 19.dp),
horizontalArrangement = Arrangement.spacedBy(9.dp) horizontalArrangement = Arrangement.spacedBy(9.dp),
contentPadding = PaddingValues(horizontal = 23.dp)
) { ) {
item {
Spacer(modifier = Modifier.width(23.dp))
}
items(items) { items(items) {
var isSelected by remember { mutableStateOf(false) } var isSelected by remember { mutableStateOf(false) }
AllInChip( AllInChip(
@ -110,9 +104,6 @@ fun BetScreen(
isSelected = !isSelected isSelected = !isSelected
}) })
} }
item {
Spacer(modifier = Modifier.width(23.dp))
}
} }
} }
itemsIndexed(bets) { idx, it -> itemsIndexed(bets) { idx, it ->

@ -1,6 +1,5 @@
package fr.iut.alldev.allin.ui.betCreation package fr.iut.alldev.allin.ui.betCreation
import androidx.compose.foundation.interaction.MutableInteractionSource
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
@ -26,6 +25,7 @@ import java.time.ZonedDateTime
fun BetCreationScreen( fun BetCreationScreen(
viewModel: BetCreationViewModel = hiltViewModel(), viewModel: BetCreationViewModel = hiltViewModel(),
setLoading: (Boolean) -> Unit, setLoading: (Boolean) -> Unit,
openDrawer: () -> Unit,
onCreation: () -> Unit onCreation: () -> Unit
) { ) {
val betTypes = remember { BetType.entries } val betTypes = remember { BetType.entries }
@ -93,6 +93,7 @@ fun BetCreationScreen(
selectedBetType = selectedBetType, selectedBetType = selectedBetType,
setSelectedBetTypeElement = { selectedBetTypeElement = it }, setSelectedBetTypeElement = { selectedBetTypeElement = it },
selectionBetType = selectionElements, selectionBetType = selectionElements,
openDrawer = openDrawer,
onCreateBet = { onCreateBet = {
viewModel.createBet( viewModel.createBet(
themeFieldName = themeFieldName, themeFieldName = themeFieldName,

@ -51,6 +51,7 @@ fun BetCreationScreenContent(
selectedBetType: BetType, selectedBetType: BetType,
setSelectedBetTypeElement: (SelectionElement) -> Unit, setSelectedBetTypeElement: (SelectionElement) -> Unit,
selectionBetType: List<SelectionElement>, selectionBetType: List<SelectionElement>,
openDrawer: () -> Unit,
onCreateBet: () -> Unit onCreateBet: () -> Unit
) { ) {
val interactionSource = remember { MutableInteractionSource() } val interactionSource = remember { MutableInteractionSource() }
@ -58,6 +59,7 @@ fun BetCreationScreenContent(
Box(Modifier.fillMaxSize()) { Box(Modifier.fillMaxSize()) {
AllInSections( AllInSections(
openDrawer = openDrawer,
onLoadSection = { focus.clearFocus() }, onLoadSection = { focus.clearFocus() },
modifier = Modifier.align(Alignment.TopCenter), modifier = Modifier.align(Alignment.TopCenter),
sections = listOf( sections = listOf(
@ -144,7 +146,8 @@ private fun BetCreationScreenContentPreview() {
selectedBetType = BetType.BINARY, selectedBetType = BetType.BINARY,
setSelectedBetTypeElement = { }, setSelectedBetTypeElement = { },
selectionBetType = listOf(), selectionBetType = listOf(),
onCreateBet = { } onCreateBet = { },
openDrawer = { }
) )
} }
} }

@ -5,6 +5,7 @@ import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.safeContentPadding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Close import androidx.compose.material.icons.filled.Close
@ -75,6 +76,7 @@ fun BetResultBottomSheetContent(
Box( Box(
modifier = Modifier modifier = Modifier
.fillMaxSize() .fillMaxSize()
.safeContentPadding()
.padding(16.dp) .padding(16.dp)
) { ) {
IconButton( IconButton(

@ -14,7 +14,6 @@ import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.navigationBarsPadding import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.safeContentPadding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.width
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
@ -83,7 +82,7 @@ class BetStatusBottomSheetBetDisplayer(
val response1Answer = remember { betDetail.getAnswerOfResponse(response1) } val response1Answer = remember { betDetail.getAnswerOfResponse(response1) }
val response2Answer = remember { betDetail.getAnswerOfResponse(response2) } val response2Answer = remember { betDetail.getAnswerOfResponse(response2) }
Box(Modifier.navigationBarsPadding()) { Box(Modifier) {
Column { Column {
Column(Modifier.padding(horizontal = 20.dp)) { Column(Modifier.padding(horizontal = 20.dp)) {
BetTitleHeader( BetTitleHeader(
@ -196,7 +195,7 @@ class BetStatusBottomSheetBetDisplayer(
item { item {
if (betDetail.bet.betStatus != BetStatus.FINISHED && betDetail.userParticipation == null) { if (betDetail.bet.betStatus != BetStatus.FINISHED && betDetail.userParticipation == null) {
Spacer(modifier = Modifier.height(48.dp)) Spacer(modifier = Modifier.height(75.dp))
} }
Spacer(modifier = Modifier.navigationBarsPadding()) Spacer(modifier = Modifier.navigationBarsPadding())
} }

@ -5,20 +5,11 @@ import androidx.compose.foundation.ExperimentalFoundationApi
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.fillMaxHeight
import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.navigationBarsPadding
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.safeContentPadding
import androidx.compose.foundation.layout.wrapContentHeight
import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.LazyItemScope
import androidx.compose.foundation.lazy.LazyListScope
import androidx.compose.foundation.lazy.LazyRow import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.foundation.lazy.itemsIndexed import androidx.compose.foundation.lazy.itemsIndexed
import androidx.compose.foundation.pager.HorizontalPager import androidx.compose.foundation.pager.HorizontalPager
@ -48,54 +39,61 @@ fun AllInSections(
sections: List<SectionElement>, sections: List<SectionElement>,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
interSectionsPadding: Dp = 56.dp, interSectionsPadding: Dp = 56.dp,
onLoadSection: ()->Unit = { } openDrawer: () -> Unit,
onLoadSection: () -> Unit = { }
) { ) {
val pagerState = rememberPagerState(pageCount = { sections.size }) val pagerState = rememberPagerState(pageCount = { sections.size })
val scope = rememberCoroutineScope() val scope = rememberCoroutineScope()
LazyColumn(
modifier = modifier, LaunchedEffect(key1 = pagerState.isScrollInProgress) {
horizontalAlignment = Alignment.CenterHorizontally if (
){ pagerState.isScrollInProgress &&
stickyHeader { !pagerState.canScrollBackward &&
Box( pagerState.currentPage == pagerState.targetPage
modifier = Modifier ) {
.fillMaxWidth() openDrawer()
.background( }
Brush.verticalGradient( }
0.75f to AllInTheme.themeColors.mainSurface,
1f to Color.Transparent Box(modifier = modifier) {
) HorizontalPager(state = pagerState) { page ->
), LaunchedEffect(key1 = page) { onLoadSection() }
contentAlignment = Alignment.Center LazyColumn(
modifier = Modifier.fillMaxSize(),
contentPadding = PaddingValues(top = 40.dp, start = 20.dp, end = 20.dp)
) { ) {
LazyRow( item {
horizontalArrangement = Arrangement.spacedBy(interSectionsPadding), sections[page].content()
modifier = Modifier.padding(vertical = 12.dp)
) {
itemsIndexed(sections) { index, section ->
AllInSectionButton(
text = section.text,
isSelected = index == pagerState.currentPage,
onClick = {
scope.launch {
pagerState.animateScrollToPage(index)
}
}
)
}
} }
} }
} }
item { Box(
HorizontalPager( modifier = Modifier
state = pagerState .align(Alignment.TopCenter)
) { page -> .fillMaxWidth()
LaunchedEffect(key1 = page) { onLoadSection() } .background(
Column( Brush.verticalGradient(
modifier = Modifier.padding(horizontal = 20.dp) 0.75f to AllInTheme.themeColors.mainSurface,
) { 1f to Color.Transparent
sections[page].content() )
),
contentAlignment = Alignment.Center
) {
LazyRow(
horizontalArrangement = Arrangement.spacedBy(interSectionsPadding),
modifier = Modifier.padding(vertical = 12.dp)
) {
itemsIndexed(sections) { index, section ->
AllInSectionButton(
text = section.text,
isSelected = index == pagerState.currentPage,
onClick = {
scope.launch {
pagerState.animateScrollToPage(index)
}
}
)
} }
} }
} }
@ -108,6 +106,7 @@ fun AllInSections(
private fun AllInSectionsPreview() { private fun AllInSectionsPreview() {
AllInTheme { AllInTheme {
AllInSections( AllInSections(
openDrawer = { },
sections = listOf( sections = listOf(
SectionElement("Page 1") { SectionElement("Page 1") {
Text("This is page 1") Text("This is page 1")

@ -108,6 +108,7 @@ fun MainScreen(
} }
) )
AllInDrawer( AllInDrawer(
drawerState = drawerState, drawerState = drawerState,
destinations = topLevelDestinations, destinations = topLevelDestinations,
@ -153,6 +154,11 @@ fun MainScreen(
drawerState.close() drawerState.close()
} }
} }
},
openDrawer = {
scope.launch {
drawerState.open()
}
} }
) )
} }
@ -160,6 +166,7 @@ fun MainScreen(
} }
events.firstOrNull()?.let { events.firstOrNull()?.let {
it.Display(sheetState = eventBottomSheetState) { it.Display(sheetState = eventBottomSheetState) {
mainViewModel.dismissedEvents += it mainViewModel.dismissedEvents += it

@ -43,14 +43,14 @@ class MainViewModel @Inject constructor(
val snackbarContent: MutableState<SnackbarContent?> by lazy { mutableStateOf(null) } val snackbarContent: MutableState<SnackbarContent?> by lazy { mutableStateOf(null) }
fun putSnackbarContent(content: SnackbarContent) {
snackbarContent.value = content
}
init { init {
fetchEvents() fetchEvents()
} }
fun putSnackbarContent(content: SnackbarContent) {
snackbarContent.value = content
}
fun fetchEvents() { fun fetchEvents() {
viewModelScope.launch { viewModelScope.launch {
val token = keystoreManager.getTokenOrEmpty() val token = keystoreManager.getTokenOrEmpty()

@ -90,6 +90,7 @@ fun AllInNavHost(
@Composable @Composable
internal fun AllInDrawerNavHost( internal fun AllInDrawerNavHost(
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
openDrawer: () -> Unit,
navController: NavHostController, navController: NavHostController,
selectBet: (Bet, Boolean) -> Unit, selectBet: (Bet, Boolean) -> Unit,
startDestination: String = Routes.PUBLIC_BETS, startDestination: String = Routes.PUBLIC_BETS,
@ -116,6 +117,7 @@ internal fun AllInDrawerNavHost(
val creationSuccessMessage = stringResource(id = R.string.bet_creation_success_message) val creationSuccessMessage = stringResource(id = R.string.bet_creation_success_message)
BetCreationScreen( BetCreationScreen(
setLoading = setLoading, setLoading = setLoading,
openDrawer = openDrawer,
onCreation = { onCreation = {
putSnackbarContent( putSnackbarContent(
MainViewModel.SnackbarContent( MainViewModel.SnackbarContent(

Loading…
Cancel
Save