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
|
||||
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.padding
|
||||
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.material.icons.filled.WorkspacePremium
|
||||
import androidx.compose.material3.ExperimentalMaterial3Api
|
||||
import androidx.compose.material3.HorizontalDivider
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.material3.rememberModalBottomSheetState
|
||||
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.res.stringResource
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
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.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.theme.AllInTheme
|
||||
import fr.iut.alldev.allin.vo.bet.factory.toBetVO
|
||||
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
|
||||
override fun visitYesNoBet(b: YesNoBet) {
|
||||
|
||||
val (participateSheetVisibility, setParticipateSheetVisibility) = remember{
|
||||
this.participateBottomSheetVisibility
|
||||
}
|
||||
|
||||
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.padding(horizontal = 20.dp)
|
||||
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)
|
||||
}
|
||||
)
|
||||
StatBar(percentage = .86f)
|
||||
}
|
||||
}
|
||||
|
||||
BetStatusParticipationBottomSheet(
|
||||
sheetVisibility = participateSheetVisibility && b.betStatus == BetStatus.WAITING,
|
||||
safeBottomPadding = safeBottomPadding,
|
||||
betPhrase = b.phrase,
|
||||
coinAmount = userCoinAmount.value,
|
||||
onDismiss = { setParticipateSheetVisibility(false) },
|
||||
state = rememberModalBottomSheetState()
|
||||
){
|
||||
onParticipate(100)
|
||||
}
|
||||
}
|
||||
@Composable
|
||||
override fun visitMatchBet(b: MatchBet) {
|
||||
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