Continue displaying of bets
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
parent
038781de5a
commit
716a389be0
@ -0,0 +1,126 @@
|
|||||||
|
package fr.iut.alldev.allin.ui.betstatus.components
|
||||||
|
|
||||||
|
import android.content.res.Configuration
|
||||||
|
import androidx.compose.foundation.background
|
||||||
|
import androidx.compose.foundation.layout.*
|
||||||
|
import androidx.compose.material3.*
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.rememberCoroutineScope
|
||||||
|
import androidx.compose.ui.Alignment
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.res.stringResource
|
||||||
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
|
import androidx.compose.ui.unit.Dp
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import androidx.compose.ui.unit.sp
|
||||||
|
import fr.iut.alldev.allin.R
|
||||||
|
import fr.iut.alldev.allin.ui.core.AllInBottomSheet
|
||||||
|
import fr.iut.alldev.allin.ui.core.AllInButton
|
||||||
|
import fr.iut.alldev.allin.ui.core.AllInCoinCount
|
||||||
|
import fr.iut.alldev.allin.ui.core.topbar.AllInTopBarCoinCounter
|
||||||
|
import fr.iut.alldev.allin.ui.theme.AllInTheme
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
|
|
||||||
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
|
@Composable
|
||||||
|
fun BetStatusParticipationBottomSheet(
|
||||||
|
sheetVisibility: Boolean,
|
||||||
|
safeBottomPadding: Dp,
|
||||||
|
betPhrase: String,
|
||||||
|
coinAmount: Int,
|
||||||
|
onDismiss: ()->Unit,
|
||||||
|
state: SheetState,
|
||||||
|
onParticipate: ()->Unit
|
||||||
|
) {
|
||||||
|
val scope = rememberCoroutineScope()
|
||||||
|
AllInBottomSheet(
|
||||||
|
sheetVisibility = sheetVisibility,
|
||||||
|
onDismiss = onDismiss,
|
||||||
|
state = state,
|
||||||
|
containerColor = AllInTheme.themeColors.background_2
|
||||||
|
) {
|
||||||
|
Row(
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
horizontalArrangement = Arrangement.SpaceBetween,
|
||||||
|
verticalAlignment = Alignment.CenterVertically
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
text = stringResource(id = R.string.place_your_bets),
|
||||||
|
style = AllInTheme.typography.h2,
|
||||||
|
color = AllInTheme.themeColors.on_main_surface,
|
||||||
|
fontSize = 20.sp,
|
||||||
|
modifier = Modifier.padding(start = 18.dp)
|
||||||
|
)
|
||||||
|
AllInTopBarCoinCounter(
|
||||||
|
amount = coinAmount,
|
||||||
|
backgroundColor = AllInTheme.colors.allIn_Blue,
|
||||||
|
textColor = AllInTheme.colors.white,
|
||||||
|
iconColor = AllInTheme.colors.white,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
Spacer(modifier = Modifier.height(30.dp))
|
||||||
|
Text(
|
||||||
|
text = betPhrase,
|
||||||
|
style = AllInTheme.typography.s,
|
||||||
|
color = AllInTheme.themeColors.on_main_surface,
|
||||||
|
modifier = Modifier.padding(horizontal = 18.dp)
|
||||||
|
)
|
||||||
|
Spacer(modifier = Modifier.height(100.dp))
|
||||||
|
HorizontalDivider(color = AllInTheme.themeColors.border)
|
||||||
|
Column(
|
||||||
|
modifier = Modifier
|
||||||
|
.background(AllInTheme.themeColors.background)
|
||||||
|
.padding(horizontal = 7.dp)
|
||||||
|
.padding(bottom = safeBottomPadding, top = 7.dp),
|
||||||
|
verticalArrangement = Arrangement.spacedBy(7.dp)
|
||||||
|
) {
|
||||||
|
Row(
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
horizontalArrangement = Arrangement.SpaceBetween,
|
||||||
|
verticalAlignment = Alignment.CenterVertically
|
||||||
|
){
|
||||||
|
Text(
|
||||||
|
text = stringResource(id = R.string.Possible_winnings),
|
||||||
|
style = AllInTheme.typography.r,
|
||||||
|
color = AllInTheme.themeColors.on_background
|
||||||
|
)
|
||||||
|
AllInCoinCount(
|
||||||
|
amount = 121,
|
||||||
|
color = AllInTheme.themeColors.on_background
|
||||||
|
)
|
||||||
|
}
|
||||||
|
AllInButton(
|
||||||
|
color = AllInTheme.colors.allIn_Purple,
|
||||||
|
text = stringResource(id = R.string.Participate),
|
||||||
|
textColor = AllInTheme.colors.white,
|
||||||
|
radius = 5.dp
|
||||||
|
){
|
||||||
|
scope.launch{
|
||||||
|
onParticipate()
|
||||||
|
state.hide()
|
||||||
|
onDismiss()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
|
@Preview
|
||||||
|
@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES)
|
||||||
|
@Composable
|
||||||
|
private fun BetStatusParticipationBottomSheetPreview() {
|
||||||
|
AllInTheme {
|
||||||
|
BetStatusParticipationBottomSheet(
|
||||||
|
sheetVisibility = true,
|
||||||
|
safeBottomPadding = 5.dp,
|
||||||
|
betPhrase = "Lorem Ipsum",
|
||||||
|
coinAmount = 125,
|
||||||
|
onDismiss = {},
|
||||||
|
state = rememberModalBottomSheetState(),
|
||||||
|
onParticipate = {}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,84 @@
|
|||||||
|
package fr.iut.alldev.allin.ui.betstatus.components
|
||||||
|
|
||||||
|
import android.content.res.Configuration
|
||||||
|
import androidx.compose.foundation.background
|
||||||
|
import androidx.compose.foundation.layout.*
|
||||||
|
import androidx.compose.material.icons.Icons
|
||||||
|
import androidx.compose.material.icons.filled.EmojiEvents
|
||||||
|
import androidx.compose.material.icons.filled.People
|
||||||
|
import androidx.compose.material3.HorizontalDivider
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.Alignment
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.graphics.Color
|
||||||
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import fr.iut.alldev.allin.ui.core.AllInCoinCount
|
||||||
|
import fr.iut.alldev.allin.ui.core.AllInTextIcon
|
||||||
|
import fr.iut.alldev.allin.ui.core.IconPosition
|
||||||
|
import fr.iut.alldev.allin.ui.theme.AllInTheme
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun BetStatusWinner(
|
||||||
|
answer: String,
|
||||||
|
coinAmount: Int,
|
||||||
|
username: String,
|
||||||
|
multiplier: Float,
|
||||||
|
color: Color = AllInTheme.themeColors.on_main_surface
|
||||||
|
) {
|
||||||
|
Column {
|
||||||
|
HorizontalDivider(color = color.copy(alpha = .4f))
|
||||||
|
Column(
|
||||||
|
horizontalAlignment = Alignment.CenterHorizontally,
|
||||||
|
modifier = Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.background(color.copy(alpha = .2f))
|
||||||
|
.padding(vertical = 20.dp)
|
||||||
|
) {
|
||||||
|
AllInTextIcon(
|
||||||
|
text = answer,
|
||||||
|
icon = Icons.Filled.EmojiEvents,
|
||||||
|
color = color,
|
||||||
|
size = 50,
|
||||||
|
iconSize = 60,
|
||||||
|
position = IconPosition.LEADING
|
||||||
|
)
|
||||||
|
Row(
|
||||||
|
horizontalArrangement = Arrangement.spacedBy(17.dp)
|
||||||
|
) {
|
||||||
|
AllInCoinCount(
|
||||||
|
amount = coinAmount,
|
||||||
|
color = color,
|
||||||
|
position = IconPosition.LEADING
|
||||||
|
)
|
||||||
|
AllInTextIcon(
|
||||||
|
text = username,
|
||||||
|
icon = Icons.Filled.People,
|
||||||
|
color = color,
|
||||||
|
position = IconPosition.LEADING
|
||||||
|
)
|
||||||
|
AllInTextIcon(
|
||||||
|
text = "x" + String.format("%.1f", multiplier),
|
||||||
|
icon = Icons.Filled.EmojiEvents,
|
||||||
|
color = color,
|
||||||
|
position = IconPosition.LEADING
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
HorizontalDivider(color = color.copy(alpha = .4f))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Preview
|
||||||
|
@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES)
|
||||||
|
@Composable
|
||||||
|
private fun BetStatusWinnerPreview() {
|
||||||
|
AllInTheme {
|
||||||
|
BetStatusWinner(
|
||||||
|
answer = "Answer",
|
||||||
|
coinAmount = 435,
|
||||||
|
username = "Imri",
|
||||||
|
multiplier = 1.2f,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,85 @@
|
|||||||
|
package fr.iut.alldev.allin.ui.betstatus.components
|
||||||
|
|
||||||
|
import android.content.res.Configuration
|
||||||
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
|
import androidx.compose.foundation.layout.Row
|
||||||
|
import androidx.compose.foundation.layout.fillMaxWidth
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.graphics.painter.Painter
|
||||||
|
import androidx.compose.ui.graphics.vector.ImageVector
|
||||||
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
|
import fr.iut.alldev.allin.ui.core.AllInTextIcon
|
||||||
|
import fr.iut.alldev.allin.ui.core.IconPosition
|
||||||
|
import fr.iut.alldev.allin.ui.theme.AllInTheme
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun YesNoDetailsLine(
|
||||||
|
icon: ImageVector,
|
||||||
|
yesText: String,
|
||||||
|
noText: String
|
||||||
|
) {
|
||||||
|
Row(
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
horizontalArrangement = Arrangement.SpaceBetween
|
||||||
|
) {
|
||||||
|
AllInTextIcon(
|
||||||
|
text = yesText,
|
||||||
|
color = AllInTheme.colors.allIn_Blue,
|
||||||
|
icon = icon,
|
||||||
|
position = IconPosition.LEADING,
|
||||||
|
size = 10,
|
||||||
|
iconSize = 15
|
||||||
|
)
|
||||||
|
AllInTextIcon(
|
||||||
|
text = noText,
|
||||||
|
color = AllInTheme.colors.allIn_BarPink,
|
||||||
|
icon = icon,
|
||||||
|
position = IconPosition.TRAILING,
|
||||||
|
size = 10,
|
||||||
|
iconSize = 15
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun YesNoDetailsLine(
|
||||||
|
icon: Painter,
|
||||||
|
yesText: String,
|
||||||
|
noText: String
|
||||||
|
) {
|
||||||
|
Row(
|
||||||
|
modifier = Modifier.fillMaxWidth(),
|
||||||
|
horizontalArrangement = Arrangement.SpaceBetween
|
||||||
|
) {
|
||||||
|
AllInTextIcon(
|
||||||
|
text = yesText,
|
||||||
|
color = AllInTheme.colors.allIn_Blue,
|
||||||
|
icon = icon,
|
||||||
|
position = IconPosition.LEADING,
|
||||||
|
size = 10,
|
||||||
|
iconSize = 15
|
||||||
|
)
|
||||||
|
AllInTextIcon(
|
||||||
|
text = noText,
|
||||||
|
color = AllInTheme.colors.allIn_BarPink,
|
||||||
|
icon = icon,
|
||||||
|
position = IconPosition.TRAILING,
|
||||||
|
size = 10,
|
||||||
|
iconSize = 15
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Preview
|
||||||
|
@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES)
|
||||||
|
@Composable
|
||||||
|
private fun YesNoDetailsLinePreview() {
|
||||||
|
AllInTheme {
|
||||||
|
YesNoDetailsLine(
|
||||||
|
icon = AllInTheme.icons.allCoins(),
|
||||||
|
yesText = "550",
|
||||||
|
noText = "330"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
@ -1,33 +1,233 @@
|
|||||||
package fr.iut.alldev.allin.ui.betstatus.visitor
|
package fr.iut.alldev.allin.ui.betstatus.visitor
|
||||||
|
|
||||||
import androidx.compose.foundation.layout.Column
|
import android.content.res.Configuration
|
||||||
import androidx.compose.foundation.layout.padding
|
import androidx.compose.foundation.background
|
||||||
|
import androidx.compose.foundation.layout.*
|
||||||
|
import androidx.compose.material.icons.Icons
|
||||||
|
import androidx.compose.material.icons.filled.EmojiEvents
|
||||||
|
import androidx.compose.material.icons.filled.People
|
||||||
|
import androidx.compose.material.icons.filled.WorkspacePremium
|
||||||
|
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||||
|
import androidx.compose.material3.HorizontalDivider
|
||||||
import androidx.compose.material3.Text
|
import androidx.compose.material3.Text
|
||||||
|
import androidx.compose.material3.rememberModalBottomSheetState
|
||||||
import androidx.compose.runtime.Composable
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.MutableState
|
||||||
|
import androidx.compose.runtime.mutableStateOf
|
||||||
|
import androidx.compose.runtime.remember
|
||||||
|
import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.res.stringResource
|
||||||
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
|
import fr.iut.alldev.allin.R
|
||||||
|
import fr.iut.alldev.allin.data.ext.formatToMediumDateNoYear
|
||||||
|
import fr.iut.alldev.allin.data.ext.formatToTime
|
||||||
|
import fr.iut.alldev.allin.data.model.bet.BetStatus
|
||||||
import fr.iut.alldev.allin.data.model.bet.MatchBet
|
import fr.iut.alldev.allin.data.model.bet.MatchBet
|
||||||
import fr.iut.alldev.allin.data.model.bet.YesNoBet
|
import fr.iut.alldev.allin.data.model.bet.YesNoBet
|
||||||
import fr.iut.alldev.allin.ui.core.StatBar
|
import fr.iut.alldev.allin.ext.getDateEndLabel
|
||||||
|
import fr.iut.alldev.allin.ext.getDateStartLabel
|
||||||
|
import fr.iut.alldev.allin.ui.betstatus.components.BetStatusParticipationBottomSheet
|
||||||
|
import fr.iut.alldev.allin.ui.betstatus.components.BetStatusWinner
|
||||||
|
import fr.iut.alldev.allin.ui.betstatus.components.YesNoDetailsLine
|
||||||
|
import fr.iut.alldev.allin.ui.betstatus.components.YesNoStatBar
|
||||||
|
import fr.iut.alldev.allin.ui.core.AllInDetailsDrawer
|
||||||
|
import fr.iut.alldev.allin.ui.core.RainbowButton
|
||||||
|
import fr.iut.alldev.allin.ui.core.bet.BetDateTimeRow
|
||||||
import fr.iut.alldev.allin.ui.core.bet.BetTitleHeader
|
import fr.iut.alldev.allin.ui.core.bet.BetTitleHeader
|
||||||
|
import fr.iut.alldev.allin.ui.theme.AllInTheme
|
||||||
|
import fr.iut.alldev.allin.vo.bet.factory.toBetVO
|
||||||
import fr.iut.alldev.allin.vo.bet.visitor.DisplayBetVisitor
|
import fr.iut.alldev.allin.vo.bet.visitor.DisplayBetVisitor
|
||||||
|
import java.time.ZonedDateTime
|
||||||
|
|
||||||
class BetStatusBottomSheetDisplayBetVisitor : DisplayBetVisitor {
|
class BetStatusBottomSheetDisplayBetVisitor(
|
||||||
|
val userCoinAmount: MutableState<Int>,
|
||||||
|
val onParticipate: (Int)->Unit
|
||||||
|
) : DisplayBetVisitor {
|
||||||
|
|
||||||
|
val participateBottomSheetVisibility = mutableStateOf(false)
|
||||||
|
val paddingValues = mutableStateOf(PaddingValues())
|
||||||
|
|
||||||
|
@OptIn(ExperimentalMaterial3Api::class)
|
||||||
@Composable
|
@Composable
|
||||||
override fun visitYesNoBet(b: YesNoBet) {
|
override fun visitYesNoBet(b: YesNoBet) {
|
||||||
Column {
|
|
||||||
BetTitleHeader(
|
val (participateSheetVisibility, setParticipateSheetVisibility) = remember{
|
||||||
title = b.phrase,
|
this.participateBottomSheetVisibility
|
||||||
category = b.theme,
|
|
||||||
creator = "Lucas" /*TODO : Creator*/,
|
|
||||||
modifier = Modifier.padding(horizontal = 20.dp)
|
|
||||||
)
|
|
||||||
StatBar(percentage = .86f)
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
val safeBottomPadding = paddingValues.value.calculateBottomPadding()
|
||||||
|
|
||||||
|
Box(
|
||||||
|
Modifier
|
||||||
|
.padding(bottom = safeBottomPadding)
|
||||||
|
) {
|
||||||
|
Column{
|
||||||
|
Column(
|
||||||
|
Modifier.padding(horizontal = 20.dp)
|
||||||
|
) {
|
||||||
|
BetTitleHeader(
|
||||||
|
title = b.phrase,
|
||||||
|
category = b.theme,
|
||||||
|
creator = "Lucas" /*TODO : Creator*/,
|
||||||
|
modifier = Modifier.fillMaxWidth()
|
||||||
|
)
|
||||||
|
Spacer(modifier = Modifier.height(20.dp))
|
||||||
|
Column(
|
||||||
|
horizontalAlignment = Alignment.End
|
||||||
|
) {
|
||||||
|
BetDateTimeRow(
|
||||||
|
label = stringResource(id = b.betStatus.getDateStartLabel()),
|
||||||
|
date = b.endRegisterDate.formatToMediumDateNoYear(),
|
||||||
|
time = b.endRegisterDate.formatToTime(),
|
||||||
|
modifier = Modifier.width(IntrinsicSize.Max)
|
||||||
|
)
|
||||||
|
Spacer(modifier = Modifier.height(15.dp))
|
||||||
|
BetDateTimeRow(
|
||||||
|
label = stringResource(id = b.betStatus.getDateEndLabel()),
|
||||||
|
date = b.endBetDate.formatToMediumDateNoYear(),
|
||||||
|
time = b.endBetDate.formatToTime(),
|
||||||
|
modifier = Modifier.width(IntrinsicSize.Max)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
Spacer(modifier = Modifier.height(20.dp))
|
||||||
|
}
|
||||||
|
if (b.betStatus == BetStatus.FINISHED) {
|
||||||
|
BetStatusWinner(
|
||||||
|
answer = stringResource(id = R.string.Yes),
|
||||||
|
color = AllInTheme.colors.allIn_Blue,
|
||||||
|
coinAmount = 442,
|
||||||
|
username = "Imri",
|
||||||
|
multiplier = 1.2f
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
HorizontalDivider(color = AllInTheme.themeColors.border)
|
||||||
|
}
|
||||||
|
Column(
|
||||||
|
Modifier
|
||||||
|
.fillMaxHeight()
|
||||||
|
.background(AllInTheme.themeColors.background_2)
|
||||||
|
.padding(horizontal = 20.dp)
|
||||||
|
) {
|
||||||
|
Spacer(modifier = Modifier.height(20.dp))
|
||||||
|
YesNoStatBar(yesPercentage = .86f)
|
||||||
|
AllInDetailsDrawer {
|
||||||
|
YesNoDetailsLine(
|
||||||
|
icon = AllInTheme.icons.allCoins(),
|
||||||
|
yesText = "550",
|
||||||
|
noText = "330",
|
||||||
|
)
|
||||||
|
YesNoDetailsLine(
|
||||||
|
icon = Icons.Filled.People,
|
||||||
|
yesText = "12",
|
||||||
|
noText = "5"
|
||||||
|
)
|
||||||
|
YesNoDetailsLine(
|
||||||
|
icon = Icons.Filled.WorkspacePremium,
|
||||||
|
yesText = "45",
|
||||||
|
noText = "45"
|
||||||
|
)
|
||||||
|
YesNoDetailsLine(
|
||||||
|
icon = Icons.Filled.EmojiEvents,
|
||||||
|
yesText = "x1.2",
|
||||||
|
noText = "x1.45"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(b.betStatus != BetStatus.FINISHED) {
|
||||||
|
RainbowButton(
|
||||||
|
modifier = Modifier
|
||||||
|
.align(Alignment.BottomCenter)
|
||||||
|
.padding(horizontal = 7.dp),
|
||||||
|
text = stringResource(id = R.string.Participate),
|
||||||
|
enabled = b.betStatus == BetStatus.WAITING,
|
||||||
|
onClick = {
|
||||||
|
setParticipateSheetVisibility(true)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
BetStatusParticipationBottomSheet(
|
||||||
|
sheetVisibility = participateSheetVisibility && b.betStatus == BetStatus.WAITING,
|
||||||
|
safeBottomPadding = safeBottomPadding,
|
||||||
|
betPhrase = b.phrase,
|
||||||
|
coinAmount = userCoinAmount.value,
|
||||||
|
onDismiss = { setParticipateSheetVisibility(false) },
|
||||||
|
state = rememberModalBottomSheetState()
|
||||||
|
){
|
||||||
|
onParticipate(100)
|
||||||
|
}
|
||||||
|
}
|
||||||
@Composable
|
@Composable
|
||||||
override fun visitMatchBet(b: MatchBet) {
|
override fun visitMatchBet(b: MatchBet) {
|
||||||
Text("This is a MATCH BET")
|
Text("This is a MATCH BET")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Preview
|
||||||
|
@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES)
|
||||||
|
@Composable
|
||||||
|
private fun YesNoBetPreview() {
|
||||||
|
AllInTheme {
|
||||||
|
YesNoBet(
|
||||||
|
theme = "Theme",
|
||||||
|
phrase = "Phrase",
|
||||||
|
endRegisterDate = ZonedDateTime.now(),
|
||||||
|
endBetDate = ZonedDateTime.now(),
|
||||||
|
isPublic = true,
|
||||||
|
betStatus = BetStatus.IN_PROGRESS
|
||||||
|
).toBetVO()?.accept(
|
||||||
|
BetStatusBottomSheetDisplayBetVisitor(
|
||||||
|
userCoinAmount = mutableStateOf(100),
|
||||||
|
onParticipate = {}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Preview
|
||||||
|
@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES)
|
||||||
|
@Composable
|
||||||
|
private fun YesNoBetFinishedPreview() {
|
||||||
|
AllInTheme {
|
||||||
|
YesNoBet(
|
||||||
|
theme = "Theme",
|
||||||
|
phrase = "Phrase",
|
||||||
|
endRegisterDate = ZonedDateTime.now(),
|
||||||
|
endBetDate = ZonedDateTime.now(),
|
||||||
|
isPublic = true,
|
||||||
|
betStatus = BetStatus.FINISHED
|
||||||
|
).toBetVO()?.accept(
|
||||||
|
BetStatusBottomSheetDisplayBetVisitor(
|
||||||
|
userCoinAmount = mutableStateOf(100),
|
||||||
|
onParticipate = {}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Preview
|
||||||
|
@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES)
|
||||||
|
@Composable
|
||||||
|
private fun MatchBetPreview() {
|
||||||
|
AllInTheme {
|
||||||
|
MatchBet(
|
||||||
|
theme = "Theme",
|
||||||
|
phrase = "Phrase",
|
||||||
|
endRegisterDate = ZonedDateTime.now(),
|
||||||
|
endBetDate = ZonedDateTime.now(),
|
||||||
|
isPublic = true,
|
||||||
|
betStatus = BetStatus.IN_PROGRESS,
|
||||||
|
nameTeam1 = "Team 1",
|
||||||
|
nameTeam2 = "Team 2"
|
||||||
|
).toBetVO()?.accept(
|
||||||
|
BetStatusBottomSheetDisplayBetVisitor(
|
||||||
|
userCoinAmount = mutableStateOf(100),
|
||||||
|
onParticipate = {}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,81 @@
|
|||||||
|
package fr.iut.alldev.allin.ui.core
|
||||||
|
|
||||||
|
import android.content.res.Configuration
|
||||||
|
import androidx.compose.animation.AnimatedVisibility
|
||||||
|
import androidx.compose.animation.animateContentSize
|
||||||
|
import androidx.compose.foundation.clickable
|
||||||
|
import androidx.compose.foundation.interaction.MutableInteractionSource
|
||||||
|
import androidx.compose.foundation.layout.*
|
||||||
|
import androidx.compose.material.icons.Icons
|
||||||
|
import androidx.compose.material.icons.filled.ExpandLess
|
||||||
|
import androidx.compose.material.icons.filled.ExpandMore
|
||||||
|
import androidx.compose.material3.Icon
|
||||||
|
import androidx.compose.material3.Text
|
||||||
|
import androidx.compose.runtime.*
|
||||||
|
import androidx.compose.ui.Alignment
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.graphics.Color
|
||||||
|
import androidx.compose.ui.res.stringResource
|
||||||
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import androidx.compose.ui.unit.sp
|
||||||
|
import fr.iut.alldev.allin.R
|
||||||
|
import fr.iut.alldev.allin.ui.theme.AllInTheme
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun AllInDetailsDrawer(
|
||||||
|
text: String = stringResource(id = R.string.Details),
|
||||||
|
textColor: Color = AllInTheme.themeColors.on_background_2,
|
||||||
|
content: @Composable ColumnScope.()->Unit
|
||||||
|
){
|
||||||
|
val interactionSource = remember { MutableInteractionSource() }
|
||||||
|
var isOpen by remember { mutableStateOf(false) }
|
||||||
|
|
||||||
|
Column(
|
||||||
|
Modifier
|
||||||
|
.fillMaxWidth()
|
||||||
|
.animateContentSize()
|
||||||
|
) {
|
||||||
|
Row(
|
||||||
|
verticalAlignment = Alignment.CenterVertically,
|
||||||
|
modifier = Modifier
|
||||||
|
.align(Alignment.End)
|
||||||
|
.clickable(
|
||||||
|
interactionSource = interactionSource,
|
||||||
|
indication = null,
|
||||||
|
onClick = {
|
||||||
|
isOpen = !isOpen
|
||||||
|
}
|
||||||
|
)
|
||||||
|
){
|
||||||
|
Text(
|
||||||
|
text = text,
|
||||||
|
style = AllInTheme.typography.s,
|
||||||
|
color = textColor,
|
||||||
|
fontSize = 15.sp
|
||||||
|
)
|
||||||
|
Icon(
|
||||||
|
imageVector = with(Icons.Default){
|
||||||
|
if(isOpen) ExpandLess else ExpandMore
|
||||||
|
},
|
||||||
|
contentDescription = null,
|
||||||
|
tint = textColor,
|
||||||
|
modifier = Modifier.size(15.dp)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
AnimatedVisibility(visible = isOpen){
|
||||||
|
Column {
|
||||||
|
content()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Preview
|
||||||
|
@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES)
|
||||||
|
@Composable
|
||||||
|
private fun AllInDetailsDrawerPreview() {
|
||||||
|
AllInTheme {
|
||||||
|
AllInDetailsDrawer{}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,132 @@
|
|||||||
|
package fr.iut.alldev.allin.ui.core
|
||||||
|
|
||||||
|
import androidx.compose.foundation.layout.Arrangement
|
||||||
|
import androidx.compose.foundation.layout.Box
|
||||||
|
import androidx.compose.foundation.layout.Row
|
||||||
|
import androidx.compose.foundation.layout.size
|
||||||
|
import androidx.compose.material.icons.Icons
|
||||||
|
import androidx.compose.material.icons.filled.Fireplace
|
||||||
|
import androidx.compose.material3.Icon
|
||||||
|
import androidx.compose.material3.Text
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.CompositionLocalProvider
|
||||||
|
import androidx.compose.ui.Alignment
|
||||||
|
import androidx.compose.ui.Modifier
|
||||||
|
import androidx.compose.ui.graphics.Color
|
||||||
|
import androidx.compose.ui.graphics.painter.Painter
|
||||||
|
import androidx.compose.ui.graphics.vector.ImageVector
|
||||||
|
import androidx.compose.ui.platform.LocalLayoutDirection
|
||||||
|
import androidx.compose.ui.tooling.preview.Preview
|
||||||
|
import androidx.compose.ui.unit.LayoutDirection
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import androidx.compose.ui.unit.sp
|
||||||
|
import fr.iut.alldev.allin.ui.theme.AllInTheme
|
||||||
|
|
||||||
|
|
||||||
|
enum class IconPosition{
|
||||||
|
LEADING,
|
||||||
|
TRAILING
|
||||||
|
}
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun AllInTextIcon(
|
||||||
|
modifier: Modifier = Modifier,
|
||||||
|
text: String,
|
||||||
|
icon: Painter,
|
||||||
|
color: Color,
|
||||||
|
position: IconPosition = IconPosition.TRAILING,
|
||||||
|
size: Int = 15,
|
||||||
|
iconSize: Int = size
|
||||||
|
) {
|
||||||
|
val direction =
|
||||||
|
if(position==IconPosition.LEADING) LayoutDirection.Rtl
|
||||||
|
else LayoutDirection.Ltr
|
||||||
|
Box(modifier) {
|
||||||
|
CompositionLocalProvider(
|
||||||
|
LocalLayoutDirection provides direction
|
||||||
|
) {
|
||||||
|
Row(
|
||||||
|
verticalAlignment = Alignment.CenterVertically,
|
||||||
|
horizontalArrangement = Arrangement.spacedBy(7.dp)
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
text = text,
|
||||||
|
color = color,
|
||||||
|
style = AllInTheme.typography.h1,
|
||||||
|
fontSize = size.sp
|
||||||
|
)
|
||||||
|
Icon(
|
||||||
|
painter = icon,
|
||||||
|
contentDescription = null,
|
||||||
|
modifier = Modifier.size(iconSize.dp),
|
||||||
|
tint = color
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Composable
|
||||||
|
fun AllInTextIcon(
|
||||||
|
modifier: Modifier = Modifier,
|
||||||
|
text: String,
|
||||||
|
icon: ImageVector,
|
||||||
|
color: Color,
|
||||||
|
position: IconPosition = IconPosition.TRAILING,
|
||||||
|
size: Int = 15,
|
||||||
|
iconSize: Int = size
|
||||||
|
) {
|
||||||
|
val direction =
|
||||||
|
if(position==IconPosition.LEADING) LayoutDirection.Rtl
|
||||||
|
else LayoutDirection.Ltr
|
||||||
|
Box(modifier) {
|
||||||
|
CompositionLocalProvider(
|
||||||
|
LocalLayoutDirection provides direction
|
||||||
|
) {
|
||||||
|
Row(
|
||||||
|
modifier = modifier,
|
||||||
|
verticalAlignment = Alignment.CenterVertically,
|
||||||
|
horizontalArrangement = Arrangement.spacedBy(7.dp)
|
||||||
|
) {
|
||||||
|
Text(
|
||||||
|
text = text,
|
||||||
|
color = color,
|
||||||
|
style = AllInTheme.typography.h1,
|
||||||
|
fontSize = size.sp
|
||||||
|
)
|
||||||
|
Icon(
|
||||||
|
imageVector = icon,
|
||||||
|
contentDescription = null,
|
||||||
|
modifier = Modifier.size(iconSize.dp),
|
||||||
|
tint = color
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Preview
|
||||||
|
@Composable
|
||||||
|
private fun AllInTextIconPreview() {
|
||||||
|
AllInTheme {
|
||||||
|
AllInTextIcon(
|
||||||
|
text = "value",
|
||||||
|
icon = Icons.Default.Fireplace,
|
||||||
|
color = AllInTheme.colors.allIn_Blue
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Preview
|
||||||
|
@Composable
|
||||||
|
private fun AllInTextIconReversePreview() {
|
||||||
|
AllInTheme {
|
||||||
|
AllInTextIcon(
|
||||||
|
text = "value",
|
||||||
|
icon = AllInTheme.icons.allCoins(),
|
||||||
|
color = AllInTheme.colors.allIn_Blue,
|
||||||
|
position = IconPosition.LEADING
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,19 @@
|
|||||||
|
package fr.iut.alldev.allin.ui.theme
|
||||||
|
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.runtime.Immutable
|
||||||
|
import androidx.compose.runtime.staticCompositionLocalOf
|
||||||
|
import androidx.compose.ui.graphics.Color
|
||||||
|
import androidx.compose.ui.graphics.painter.ColorPainter
|
||||||
|
import androidx.compose.ui.graphics.painter.Painter
|
||||||
|
|
||||||
|
@Immutable
|
||||||
|
data class AllInIcons(
|
||||||
|
val allCoins: @Composable ()->Painter,
|
||||||
|
)
|
||||||
|
|
||||||
|
internal val LocalIcons = staticCompositionLocalOf {
|
||||||
|
AllInIcons(
|
||||||
|
allCoins = { ColorPainter(Color.Unspecified) }
|
||||||
|
)
|
||||||
|
}
|
@ -0,0 +1,12 @@
|
|||||||
|
package fr.iut.alldev.allin.utils
|
||||||
|
|
||||||
|
import java.io.Serializable
|
||||||
|
|
||||||
|
data class Quadruple<out A, out B, out C, out D>(
|
||||||
|
val first: A,
|
||||||
|
val second: B,
|
||||||
|
val third: C,
|
||||||
|
val fourth: D
|
||||||
|
) : Serializable {
|
||||||
|
override fun toString(): String = "($first, $second, $third, $fourth)"
|
||||||
|
}
|
@ -0,0 +1,3 @@
|
|||||||
|
package fr.iut.alldev.allin.vo
|
||||||
|
|
||||||
|
interface Visitor
|
Loading…
Reference in new issue