Error handling in bet creation + bet repository
continuous-integration/drone/push Build is passing Details

pull/3/head
Arthur VALIN 1 year ago
parent 716a389be0
commit 19b76360f4

@ -67,6 +67,7 @@ android {
}
dependencies {
implementation project(path: ':data')
implementation 'androidx.core:core-ktx:1.12.0'
implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.2'
@ -76,9 +77,6 @@ dependencies {
implementation 'androidx.compose.material3:material3:1.2.0-alpha08'
implementation "androidx.compose.material:material:1.5.3"
implementation "androidx.navigation:navigation-compose:2.7.3"
implementation project(path: ':data')
implementation 'androidx.compose.material:material-icons-core'
implementation 'androidx.compose.material:material-icons-extended'
@ -97,8 +95,11 @@ dependencies {
//Hilt
implementation "com.google.dagger:hilt-android:$hilt_version"
kapt "com.google.dagger:hilt-android-compiler:$hilt_version"
implementation "androidx.hilt:hilt-navigation-compose:1.0.0"
// Smooth Corners
implementation 'com.github.racra:smooth-corner-rect-android-compose:v1.0.0'
//Timber
implementation 'com.jakewharton.timber:timber:5.0.1'
}

@ -8,7 +8,7 @@ import dagger.hilt.android.testing.HiltAndroidTest
import fr.iut.alldev.allin.test.TestTags
import fr.iut.alldev.allin.test.mock.Bets
import fr.iut.alldev.allin.ui.MainActivity
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
import fr.iut.alldev.allin.vo.bet.factory.toBetVO
import fr.iut.alldev.allin.vo.bet.visitor.BetTestVisitor
import org.junit.Before

@ -2,6 +2,15 @@ package fr.iut.alldev.allin
import android.app.Application
import dagger.hilt.android.HiltAndroidApp
import timber.log.Timber
@HiltAndroidApp
class AllInApplication : Application()
class AllInApplication : Application(){
override fun onCreate() {
super.onCreate()
if(BuildConfig.DEBUG){
Timber.plant(Timber.DebugTree())
}
}
}

@ -4,7 +4,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color
import fr.iut.alldev.allin.R
import fr.iut.alldev.allin.data.model.bet.BetStatus
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
fun BetStatus.getTitle(): Int {
return when (this) {

@ -28,6 +28,12 @@ sealed class FieldErrorState(
data class AlreadyUsed(val value: String) :
FieldErrorState(R.string.FieldError_AlreadyUsed, arrayOf(value))
data class PastDate(val fieldName: String)
: FieldErrorState(R.string.FieldError_PastDate, arrayOf(fieldName))
data class DateOrder(val fieldName1: String, val fieldName2: String)
: FieldErrorState(R.string.FieldError_DateOrder, arrayOf(fieldName1, fieldName2))
@Composable
fun errorResource() = stringResourceOrNull(id = messageId, messageArgs)

@ -1,4 +1,4 @@
package fr.iut.alldev.allin.ui.theme
package fr.iut.alldev.allin.theme
import androidx.compose.runtime.Immutable
import androidx.compose.runtime.staticCompositionLocalOf

@ -1,4 +1,4 @@
package fr.iut.alldev.allin.ui.theme
package fr.iut.alldev.allin.theme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Immutable

@ -1,4 +1,4 @@
package fr.iut.alldev.allin.ui.theme
package fr.iut.alldev.allin.theme
import androidx.compose.foundation.isSystemInDarkTheme
import androidx.compose.material.ripple.RippleAlpha

@ -1,4 +1,4 @@
package fr.iut.alldev.allin.ui.theme
package fr.iut.alldev.allin.theme
import androidx.compose.runtime.Immutable
import androidx.compose.runtime.staticCompositionLocalOf

@ -13,7 +13,7 @@ import androidx.core.view.WindowCompat
import androidx.core.view.WindowInsetsCompat
import dagger.hilt.android.AndroidEntryPoint
import fr.iut.alldev.allin.ui.navigation.AllInNavHost
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
@AndroidEntryPoint
class MainActivity : ComponentActivity() {

@ -28,7 +28,7 @@ import fr.iut.alldev.allin.data.model.bet.YesNoBet
import fr.iut.alldev.allin.ui.bet.components.BetScreenCard
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
import fr.iut.alldev.allin.theme.AllInTheme
import java.time.ZonedDateTime
private val bets = listOf(

@ -22,7 +22,7 @@ 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.BetProfilePictureRow
import fr.iut.alldev.allin.ui.core.bet.BetTitleHeader
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
@OptIn(ExperimentalComposeUiApi::class, ExperimentalFoundationApi::class)
@Composable

@ -20,7 +20,7 @@ import fr.iut.alldev.allin.R
import fr.iut.alldev.allin.ext.shadow
import fr.iut.alldev.allin.ui.core.AllInCard
import fr.iut.alldev.allin.ui.core.HighlightedText
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
import kotlin.math.ceil
@Composable

@ -12,6 +12,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalFocusManager
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.hilt.navigation.compose.hiltViewModel
import fr.iut.alldev.allin.R
import fr.iut.alldev.allin.data.model.bet.BetType
import fr.iut.alldev.allin.ext.getIcon
@ -19,28 +20,41 @@ import fr.iut.alldev.allin.ext.getTitle
import fr.iut.alldev.allin.ui.betcreation.tabs.BetCreationScreenAnswerTab
import fr.iut.alldev.allin.ui.betcreation.tabs.BetCreationScreenQuestionTab
import fr.iut.alldev.allin.ui.core.*
import fr.iut.alldev.allin.ui.main.MainViewModel
import java.time.Instant
import java.time.ZoneId
import java.time.ZonedDateTime
@Composable
fun BetCreationScreen(
viewModel: BetCreationViewModel = hiltViewModel(),
mainViewModel: MainViewModel,
) {
val interactionSource = remember { MutableInteractionSource() }
var theme by remember{ mutableStateOf("") }
var phrase by remember{ mutableStateOf("") }
val (registerDate, setRegisterDate) = remember { mutableStateOf<ZonedDateTime>(ZonedDateTime.now()) }
val (betDate, setBetDate) = remember { mutableStateOf<ZonedDateTime>(ZonedDateTime.now()) }
var isPublic by remember{ mutableStateOf(true) }
val betTypes = remember { BetType.values().toList() }
var theme by remember{ viewModel.theme }
var phrase by remember{ viewModel.phrase }
val (registerDate, setRegisterDate) = remember { viewModel.registerDate }
val (betDate, setBetDate) = remember { viewModel.betDate }
var isPublic by remember{ viewModel.isPublic }
var selectedBetType by remember{ viewModel.selectedBetType }
val themeError by remember{ viewModel.themeError }
val phraseError by remember{ viewModel.phraseError }
val registerDateError by remember{ viewModel.registerDateError }
val betDateError by remember{ viewModel.betDateError }
val selectedFriends = remember { mutableListOf<Int>() }
var selectedBetType by remember { mutableStateOf(betTypes[0]) }
var selectionElements by remember { mutableStateOf(listOf<SelectionElement>()) }
var selectedBetTypeElement by remember { mutableStateOf<SelectionElement?>(null)}
val focus = LocalFocusManager.current
val themeFieldName = stringResource(id = R.string.Theme)
val phraseFieldName = stringResource(id = R.string.Bet_Phrase)
val registerDateFieldName = stringResource(id = R.string.End_registration_date)
val betDateFieldName = stringResource(id = R.string.End_bet_date)
LaunchedEffect(key1 = betTypes) {
selectionElements = betTypes.map {
SelectionElement(
@ -92,6 +106,10 @@ fun BetCreationScreen(
setRegisterTimeDialog = { setRegisterTimePicker(it) },
setEndTimeDialog = { setEndTimePicker(it) },
interactionSource = interactionSource,
betThemeError = themeError.errorResource(),
betPhraseError = phraseError.errorResource(),
registerDateError = registerDateError.errorResource(),
betDateError = betDateError.errorResource(),
modifier = Modifier
.fillMaxSize()
.verticalScroll(rememberScrollState())
@ -111,6 +129,7 @@ fun BetCreationScreen(
}
)
)
RainbowButton(
text = stringResource(id = R.string.Publish),
modifier = Modifier
@ -118,6 +137,12 @@ fun BetCreationScreen(
.padding(bottom = 14.dp)
.padding(horizontal = 20.dp),
onClick = {
viewModel.createBet(
themeFieldName = themeFieldName,
phraseFieldName = phraseFieldName,
registerDateFieldName = registerDateFieldName,
betDateFieldName = betDateFieldName
){ mainViewModel.loading.value = it }
}
)
}

@ -0,0 +1,118 @@
package fr.iut.alldev.allin.ui.betcreation
import androidx.compose.runtime.mutableStateOf
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import dagger.hilt.android.lifecycle.HiltViewModel
import fr.iut.alldev.allin.data.model.bet.BetFactory
import fr.iut.alldev.allin.data.model.bet.BetType
import fr.iut.alldev.allin.data.repository.BetRepository
import fr.iut.alldev.allin.ext.FieldErrorState
import kotlinx.coroutines.launch
import java.time.ZonedDateTime
import javax.inject.Inject
const val THEME_MIN_SIZE = 3
const val PHRASE_MIN_SIZE = 5
@HiltViewModel
class BetCreationViewModel @Inject constructor(
private val betRepository: BetRepository,
) : ViewModel() {
var hasError = mutableStateOf(false)
var theme = mutableStateOf("")
var phrase = mutableStateOf("")
val registerDate = mutableStateOf(ZonedDateTime.now())
val betDate = mutableStateOf(ZonedDateTime.now())
var isPublic = mutableStateOf(true)
var selectedBetType = mutableStateOf(BetType.YES_NO)
val themeError = mutableStateOf<FieldErrorState>(FieldErrorState.NoError)
val phraseError = mutableStateOf<FieldErrorState>(FieldErrorState.NoError)
val registerDateError = mutableStateOf<FieldErrorState>(FieldErrorState.NoError)
val betDateError = mutableStateOf<FieldErrorState>(FieldErrorState.NoError)
private fun initErrorField(){
themeError.value = FieldErrorState.NoError
phraseError.value = FieldErrorState.NoError
registerDateError.value = FieldErrorState.NoError
betDateError.value = FieldErrorState.NoError
hasError.value = false
}
private fun verifyField(
themeFieldName: String,
phraseFieldName: String,
registerDateFieldName: String,
betDateFieldName: String,
){
if(theme.value.length < THEME_MIN_SIZE){
themeError.value =
FieldErrorState.TooShort(themeFieldName.lowercase(), THEME_MIN_SIZE)
hasError.value = true
}
if(phrase.value.length < PHRASE_MIN_SIZE){
phraseError.value =
FieldErrorState.TooShort(phraseFieldName.lowercase(), PHRASE_MIN_SIZE)
hasError.value = true
}
if(registerDate.value <= ZonedDateTime.now()){
registerDateError.value =
FieldErrorState.PastDate(registerDateFieldName.lowercase())
hasError.value = true
}
if(betDate.value <= ZonedDateTime.now()){
betDateError.value =
FieldErrorState.PastDate(betDateFieldName.lowercase())
hasError.value = true
}else if(betDate.value < registerDate.value){
betDateError.value =
FieldErrorState.DateOrder(
registerDateFieldName.lowercase(),
betDateFieldName.lowercase()
)
hasError.value = true
}
}
fun createBet(
themeFieldName: String,
phraseFieldName: String,
registerDateFieldName: String,
betDateFieldName: String,
setLoading: (Boolean)->Unit
) {
viewModelScope.launch {
setLoading(true)
initErrorField()
verifyField(
themeFieldName,
phraseFieldName,
registerDateFieldName,
betDateFieldName,
)
if(!hasError.value){
val bet = BetFactory.createBet(
betType = selectedBetType.value,
theme = theme.value,
phrase = phrase.value,
endRegisterDate = registerDate.value,
endBetDate = betDate.value,
isPublic = isPublic.value,
nameTeam1 = "",
nameTeam2 = "",
possibleAnswers = setOf()
)
betRepository.createBet(bet)
}
setLoading(false)
}
}
}

@ -8,7 +8,7 @@ import androidx.compose.ui.draw.alpha
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
@Composable
fun BetCreationScreenBottomText(

@ -9,7 +9,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import fr.iut.alldev.allin.ui.core.AllInCard
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
@Composable
fun BetCreationScreenDateTimeButton(

@ -7,7 +7,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
@Composable
fun BetCreationScreenDateTimeRow(

@ -15,7 +15,7 @@ import androidx.compose.ui.unit.dp
import fr.iut.alldev.allin.ui.core.AllInCoinCount
import fr.iut.alldev.allin.ui.core.AllInRadioButton
import fr.iut.alldev.allin.ui.core.ProfilePicture
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
@Composable
fun BetCreationScreenFriendLine(

@ -20,13 +20,17 @@ fun BetCreationScreenQuestionTab(
modifier: Modifier = Modifier,
nbFriends: Int,
betTheme: String,
betThemeError: String?,
setBetTheme: (String)->Unit,
betPhrase: String,
betPhraseError: String?,
setBetPhrase: (String)->Unit,
isPublic: Boolean,
setIsPublic: (Boolean)->Unit,
registerDate: ZonedDateTime,
registerDateError: String?,
betDate: ZonedDateTime,
betDateError: String?,
selectedFriends: MutableList<Int>,
setRegisterDateDialog: (Boolean)->Unit,
setEndDateDialog: (Boolean)->Unit,
@ -38,8 +42,10 @@ fun BetCreationScreenQuestionTab(
Column(modifier){
QuestionTabThemePhraseSection(
betTheme = betTheme,
betThemeError = betThemeError,
setBetTheme = setBetTheme,
betPhrase = betPhrase,
betPhraseError = betPhraseError,
setBetPhrase = setBetPhrase,
bringIntoViewRequester = bringIntoViewRequester,
interactionSource = interactionSource
@ -48,6 +54,8 @@ fun BetCreationScreenQuestionTab(
QuestionTabDateTimeSection(
registerDate = registerDate.formatToMediumDate(),
registerTime = registerDate.formatToTime(),
registerDateError = registerDateError,
betDateError = betDateError,
endDate = betDate.formatToMediumDate(),
endTime = betDate.formatToTime(),
setEndDateDialog = setEndDateDialog,

@ -12,6 +12,7 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import fr.iut.alldev.allin.R
import fr.iut.alldev.allin.ui.betcreation.components.BetCreationScreenDateTimeRow
import fr.iut.alldev.allin.ui.core.AllInErrorLine
import fr.iut.alldev.allin.ui.core.AllInTitleInfo
@Composable
@ -20,6 +21,8 @@ internal fun QuestionTabDateTimeSection(
setEndDateDialog: (Boolean)->Unit,
setRegisterTimeDialog: (Boolean)->Unit,
setEndTimeDialog: (Boolean)->Unit,
registerDateError: String?,
betDateError: String?,
registerDate: String,
registerTime: String,
endDate: String,
@ -39,6 +42,9 @@ internal fun QuestionTabDateTimeSection(
onClickDate = { setRegisterDateDialog(true) },
onClickTime = { setRegisterTimeDialog(true) },
)
registerDateError?.let{
AllInErrorLine(text = it)
}
Spacer(modifier = Modifier.height(12.dp))
AllInTitleInfo(
text = stringResource(id = R.string.End_bet_date),
@ -53,4 +59,7 @@ internal fun QuestionTabDateTimeSection(
onClickDate = { setEndDateDialog(true) },
onClickTime = { setEndTimeDialog(true) },
)
betDateError?.let{
AllInErrorLine(text = it)
}
}

@ -18,7 +18,7 @@ import fr.iut.alldev.allin.ui.betcreation.components.BetCreationScreenFriendLine
import fr.iut.alldev.allin.ui.core.AllInIconChip
import fr.iut.alldev.allin.ui.core.AllInRetractableCard
import fr.iut.alldev.allin.ui.core.AllInTitleInfo
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
@Composable
fun QuestionTabPrivacySection(

@ -15,16 +15,18 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import fr.iut.alldev.allin.R
import fr.iut.alldev.allin.theme.AllInTheme
import fr.iut.alldev.allin.ui.core.AllInTextField
import fr.iut.alldev.allin.ui.core.AllInTitleInfo
import fr.iut.alldev.allin.ui.theme.AllInTheme
@OptIn(ExperimentalFoundationApi::class)
@Composable
internal fun QuestionTabThemePhraseSection(
betTheme: String,
betThemeError: String?,
setBetTheme: (String)->Unit,
betPhrase: String,
betPhraseError: String?,
setBetPhrase: (String)->Unit,
bringIntoViewRequester: BringIntoViewRequester,
interactionSource: MutableInteractionSource
@ -38,12 +40,13 @@ internal fun QuestionTabThemePhraseSection(
)
AllInTextField(
placeholder = stringResource(id = R.string.Theme_placeholder),
value = betPhrase,
onValueChange = setBetPhrase,
value = betTheme,
onValueChange = setBetTheme,
bringIntoViewRequester = bringIntoViewRequester,
borderColor = AllInTheme.colors.white,
maxChar = 20,
placeholderFontSize = 13.sp,
errorText = betThemeError,
modifier = Modifier.fillMaxWidth()
)
Spacer(modifier = Modifier.height(10.dp))
@ -56,13 +59,14 @@ internal fun QuestionTabThemePhraseSection(
)
AllInTextField(
placeholder = stringResource(id = R.string.Bet_Phrase_placeholder),
value = betTheme,
value = betPhrase,
borderColor = AllInTheme.colors.white,
onValueChange = setBetTheme,
onValueChange = setBetPhrase,
bringIntoViewRequester = bringIntoViewRequester,
multiLine = true,
maxChar = 100,
placeholderFontSize = 13.sp,
errorText = betPhraseError,
modifier = Modifier
.fillMaxWidth()
.height(100.dp)

@ -21,7 +21,7 @@ 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
import fr.iut.alldev.allin.theme.AllInTheme
@Composable
fun BetStatusBottomSheetBack(

@ -18,7 +18,7 @@ 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 fr.iut.alldev.allin.theme.AllInTheme
import kotlinx.coroutines.launch
@OptIn(ExperimentalMaterial3Api::class)

@ -16,7 +16,7 @@ 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
import fr.iut.alldev.allin.theme.AllInTheme
@Composable
fun BetStatusWinner(

@ -11,7 +11,7 @@ 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
import fr.iut.alldev.allin.theme.AllInTheme
@Composable
fun YesNoDetailsLine(

@ -14,7 +14,7 @@ import fr.iut.alldev.allin.R
import fr.iut.alldev.allin.data.ext.toPercentageString
import fr.iut.alldev.allin.ui.core.PercentagePositionnedElement
import fr.iut.alldev.allin.ui.core.StatBar
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
@Composable
fun YesNoStatBar(

@ -36,7 +36,7 @@ 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.theme.AllInTheme
import fr.iut.alldev.allin.vo.bet.factory.toBetVO
import fr.iut.alldev.allin.vo.bet.visitor.DisplayBetVisitor
import java.time.ZonedDateTime

@ -9,7 +9,7 @@ import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.sp
import fr.iut.alldev.allin.R
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
@Composable
fun AllInAlertDialog(

@ -7,7 +7,7 @@ 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 fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
import racra.compose.smooth_corner_rect_library.AbsoluteSmoothCornerShape
@OptIn(ExperimentalMaterial3Api::class)

@ -11,7 +11,7 @@ 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.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
@Composable
fun AllInButton(

@ -22,7 +22,7 @@ import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
import racra.compose.smooth_corner_rect_library.AbsoluteSmoothCornerShape
@OptIn(ExperimentalMaterial3Api::class)

@ -13,7 +13,7 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
import racra.compose.smooth_corner_rect_library.AbsoluteSmoothCornerShape
@OptIn(ExperimentalMaterial3Api::class)

@ -5,7 +5,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.tooling.preview.Preview
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
@Composable
fun AllInCoinCount(

@ -6,7 +6,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import fr.iut.alldev.allin.R
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
import java.time.ZonedDateTime
import java.util.*

@ -20,7 +20,7 @@ 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
import fr.iut.alldev.allin.theme.AllInTheme
@Composable
fun AllInDetailsDrawer(

@ -0,0 +1,28 @@
package fr.iut.alldev.allin.ui.core
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.sp
import fr.iut.alldev.allin.theme.AllInTheme
@Composable
fun AllInErrorLine(text: String) {
Text(
text = text,
style = AllInTheme.typography.r,
color = Color.Red,
fontSize = 10.sp,
overflow = TextOverflow.Ellipsis
)
}
@Preview
@Composable
private fun AllInErrorLinePreview() {
AllInTheme{
AllInErrorLine("Lorem Ipsum.")
}
}

@ -10,7 +10,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import fr.iut.alldev.allin.ext.shadow
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
@Composable
fun AllInGradientButton(

@ -18,7 +18,7 @@ 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.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
import racra.compose.smooth_corner_rect_library.AbsoluteSmoothCornerShape
@OptIn(ExperimentalMaterial3Api::class)

@ -33,7 +33,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.window.Dialog
import androidx.compose.ui.window.DialogProperties
import androidx.compose.ui.window.DialogWindowProvider
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
import kotlin.math.PI
import kotlin.math.abs
import kotlin.math.max

@ -6,7 +6,7 @@ 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.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
@Composable
fun AllInRadioButton(

@ -18,7 +18,7 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
@Composable
fun AllInRetractableCard(

@ -4,7 +4,7 @@ import androidx.compose.material.ripple.LocalRippleTheme
import androidx.compose.runtime.Composable
import androidx.compose.runtime.CompositionLocalProvider
import androidx.compose.ui.graphics.Color
import fr.iut.alldev.allin.ui.theme.AllInRippleTheme
import fr.iut.alldev.allin.theme.AllInRippleTheme
@Composable
fun AllInRipple(

@ -10,7 +10,7 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.sp
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
@Composable

@ -15,7 +15,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
import kotlinx.coroutines.launch
class SectionElement(

@ -22,7 +22,7 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import fr.iut.alldev.allin.R
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
class SelectionElement(

@ -21,7 +21,7 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.TextUnit
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
import kotlinx.coroutines.launch
import racra.compose.smooth_corner_rect_library.AbsoluteSmoothCornerShape
@ -73,15 +73,7 @@ fun AllInTextField(
}
},
supportingText = errorText?.let {
{
Text(
text = it,
style = AllInTheme.typography.r,
color = Color.Red,
fontSize = 10.sp,
overflow = TextOverflow.Ellipsis
)
}
{ AllInErrorLine(text = it) }
},
visualTransformation = visualTransformation,
singleLine = !multiLine,

@ -20,7 +20,7 @@ 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
import fr.iut.alldev.allin.theme.AllInTheme
enum class IconPosition{

@ -6,7 +6,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import fr.iut.alldev.allin.R
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
import java.util.*
@OptIn(ExperimentalMaterial3Api::class)

@ -22,7 +22,7 @@ import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch

@ -13,7 +13,7 @@ import androidx.compose.ui.graphics.Path
import androidx.compose.ui.graphics.Shape
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.*
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
import racra.compose.smooth_corner_rect_library.AbsoluteSmoothCornerShape
@OptIn(ExperimentalMaterial3Api::class)

@ -14,7 +14,7 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.text.withStyle
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.TextUnit
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
@Composable

@ -8,7 +8,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
@Composable
fun PercentagePositionnedElement(

@ -21,7 +21,7 @@ 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.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
@Composable
fun ProfilePicture(

@ -11,7 +11,7 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
@Composable
fun RainbowButton(

@ -13,7 +13,7 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import fr.iut.alldev.allin.R
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
@Composable
fun StatBar(

@ -13,7 +13,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
@Composable
fun BetDateTimeChip(

@ -10,7 +10,7 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
@Composable
fun BetDateTimeRow(

@ -14,7 +14,7 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.zIndex
import fr.iut.alldev.allin.R
import fr.iut.alldev.allin.ui.core.ProfilePicture
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
@Composable
fun BetProfilePictureRow(

@ -14,7 +14,7 @@ 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.HighlightedText
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
@Composable
fun BetTitleHeader(

@ -16,7 +16,7 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
@Composable
fun AllInTopBarCoinCounter(

@ -12,7 +12,7 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import fr.iut.alldev.allin.R
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
@Composable
fun AllInTopBar(

@ -28,7 +28,7 @@ import androidx.compose.ui.unit.sp
import androidx.hilt.navigation.compose.hiltViewModel
import fr.iut.alldev.allin.R
import fr.iut.alldev.allin.ui.core.*
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
@OptIn(ExperimentalFoundationApi::class, ExperimentalMaterial3Api::class)
@Composable

@ -19,16 +19,16 @@ 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 fr.iut.alldev.allin.theme.AllInTheme
import fr.iut.alldev.allin.vo.bet.factory.toBetVO
import kotlinx.coroutines.launch
private val topLevelDestinations = listOf(
TopLevelDestination.PUBLIC_BETS,
TopLevelDestination.BET_CREATION,
TopLevelDestination.BET_HISTORY,
TopLevelDestination.FRIENDS,
TopLevelDestination.CURRENT_BETS
TopLevelDestination.PublicBets,
TopLevelDestination.BetCreation,
TopLevelDestination.BetHistory,
TopLevelDestination.Friends,
TopLevelDestination.CurrentBets
)
@Composable
@ -125,6 +125,7 @@ fun MainScreen(
) {
AllInDrawerNavHost(
navController = navController,
mainViewModel = mainViewModel,
selectBet = { bet, participate ->
setSelectedBet(bet)
betStatusDisplayVisitor.participateBottomSheetVisibility.value = participate

@ -12,12 +12,13 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import fr.iut.alldev.allin.data.model.bet.Bet
import fr.iut.alldev.allin.theme.AllInTheme
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.main.MainScreen
import fr.iut.alldev.allin.ui.main.MainViewModel
import fr.iut.alldev.allin.ui.register.RegisterScreen
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.ui.welcome.WelcomeScreen
object Routes {
@ -81,6 +82,7 @@ fun AllInNavHost(modifier: Modifier = Modifier,
internal fun AllInDrawerNavHost(
modifier: Modifier = Modifier,
navController: NavHostController,
mainViewModel: MainViewModel,
selectBet: (Bet, Boolean) -> Unit,
startDestination: String = Routes.PUBLIC_BETS
) {
@ -97,7 +99,9 @@ internal fun AllInDrawerNavHost(
)
}
composable(route = Routes.BET_CREATION) {
BetCreationScreen()
BetCreationScreen(
mainViewModel = mainViewModel
)
}
}
}

@ -8,31 +8,31 @@ sealed class TopLevelDestination(
val subtitle: Int,
val emoji: Int
) {
object PUBLIC_BETS : TopLevelDestination(
object PublicBets : TopLevelDestination(
route = Routes.PUBLIC_BETS,
title = R.string.public_bets,
subtitle = R.string.public_bets_subtitle,
emoji = R.drawable.globe
)
object BET_CREATION : TopLevelDestination(
object BetCreation : 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(
object BetHistory : TopLevelDestination(
route = Routes.BET_HISTORY,
title = R.string.bet_history,
subtitle = R.string.bet_history_subtitle,
emoji = R.drawable.eyes
)
object FRIENDS : TopLevelDestination(
object Friends : TopLevelDestination(
route = Routes.FRIENDS,
title = R.string.friends,
subtitle = R.string.friends_subtitle,
emoji = R.drawable.holding_hands
)
object CURRENT_BETS : TopLevelDestination(
object CurrentBets : TopLevelDestination(
route = Routes.CURRENT_BETS,
title = R.string.current_bets,
subtitle = R.string.current_bets_subtitle,

@ -17,7 +17,7 @@ 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 fr.iut.alldev.allin.theme.AllInTheme
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.launch

@ -17,7 +17,7 @@ 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
import fr.iut.alldev.allin.theme.AllInTheme
@OptIn(ExperimentalMaterial3Api::class)
@Composable

@ -12,7 +12,7 @@ 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.ProfilePicture
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
@Composable
fun DrawerHeader(

@ -5,7 +5,7 @@ import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.tooling.preview.Preview
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
@Composable
fun DrawerHeaderStat(

@ -25,7 +25,7 @@ import fr.iut.alldev.allin.ui.core.AllInGradientButton
import fr.iut.alldev.allin.ui.core.AllInLoading
import fr.iut.alldev.allin.ui.core.AllInPasswordField
import fr.iut.alldev.allin.ui.core.AllInTextField
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
@OptIn(ExperimentalFoundationApi::class)
@Composable

@ -49,20 +49,24 @@ class RegisterViewModel @Inject constructor(
passwordFieldName:String
){
if(username.value.length < MIN_USERNAME_SIZE){
usernameError.value = FieldErrorState.TooShort(usernameFieldName,MIN_USERNAME_SIZE)
usernameError.value =
FieldErrorState.TooShort(usernameFieldName.lowercase(), MIN_USERNAME_SIZE)
hasError.value = true
}
if(password.value.length < MIN_PASSWORD_SIZE){
passwordError.value = FieldErrorState.TooShort(passwordFieldName, MIN_PASSWORD_SIZE)
passwordError.value =
FieldErrorState.TooShort(passwordFieldName.lowercase(), MIN_PASSWORD_SIZE)
hasError.value = true
}else if(!password.value.containsCharacter(ALLOWED_SYMBOLS)){
passwordError.value = FieldErrorState.NoSpecialCharacter(passwordFieldName)
passwordError.value =
FieldErrorState.NoSpecialCharacter(passwordFieldName.lowercase())
hasError.value = true
}
if(!email.value.isEmail()){
emailError.value = FieldErrorState.BadFormat(emailFieldName, "john@doe.com")
emailError.value =
FieldErrorState.BadFormat(emailFieldName.lowercase(), "john@doe.com")
hasError.value = true
}
@ -85,9 +89,9 @@ class RegisterViewModel @Inject constructor(
initErrorField()
verifyField(
usernameFieldName.lowercase(),
emailFieldName.lowercase(),
passwordFieldName.lowercase()
usernameFieldName,
emailFieldName,
passwordFieldName
)
if(!hasError.value) {
try {

@ -19,7 +19,7 @@ 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.AllInButton
import fr.iut.alldev.allin.ui.theme.AllInTheme
import fr.iut.alldev.allin.theme.AllInTheme
@OptIn(ExperimentalFoundationApi::class)
@Composable

@ -18,6 +18,8 @@
<string name="FieldError_NotIdentical">Les champs ne sont pas identiques.</string>
<string name="FieldError_NoSpecialCharacter">Le %s doit contenir au moins un caractère spécial : %s.</string>
<string name="FieldError_AlreadyUsed">%s est déjà utilisé.</string>
<string name="FieldError_PastDate">La %s doit être dans le futur.</string>
<string name="FieldError_DateOrder">La %s doit venir après %s.</string>
<string name="Yes">Oui</string>
<string name="No">Non</string>
<string name="Details">Détails</string>

@ -20,6 +20,8 @@
<string name="FieldError_NotIdentical">The fields are not identical.</string>
<string name="FieldError_NoSpecialCharacter">The %s must contain at least one special character : %s.</string>
<string name="FieldError_AlreadyUsed">%s is already used.</string>
<string name="FieldError_PastDate">The %s should be in the future.</string>
<string name="FieldError_DateOrder">The %s should come after the %s.</string>
<string name="Yes">Yes</string>
<string name="No">No</string>
<string name="Details">Details</string>

@ -54,7 +54,7 @@ dependencies {
implementation 'androidx.core:core-ktx:1.12.0'
implementation 'androidx.appcompat:appcompat:1.6.1'
implementation 'com.google.android.material:material:1.9.0'
// implementation 'com.google.android.material:material:1.9.0'
//Tests
testImplementation 'junit:junit:4.13.2'
@ -71,4 +71,7 @@ dependencies {
debugImplementation "com.squareup.okhttp3:logging-interceptor:4.11.0"
api "org.jetbrains.kotlinx:kotlinx-serialization-json:1.5.1"
implementation "com.jakewharton.retrofit:retrofit2-kotlinx-serialization-converter:0.8.0"
//Timber
implementation 'com.jakewharton.timber:timber:5.0.1'
}

@ -4,7 +4,9 @@ import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import fr.iut.alldev.allin.data.repository.BetRepository
import fr.iut.alldev.allin.data.repository.UserRepository
import fr.iut.alldev.allin.data.repository.impl.BetRepositoryImpl
import fr.iut.alldev.allin.data.repository.impl.UserRepositoryImpl
import javax.inject.Singleton
@ -14,4 +16,8 @@ abstract class RepositoryModule {
@Singleton
@Binds
abstract fun provideUserRepository(userRepositoryImpl: UserRepositoryImpl): UserRepository
@Singleton
@Binds
abstract fun provideBetRepository(betRepositoryImpl: BetRepositoryImpl): BetRepository
}

@ -3,10 +3,10 @@ package fr.iut.alldev.allin.data.model.bet
import java.time.ZonedDateTime
abstract class Bet(
val theme: String,
val phrase: String,
val endRegisterDate: ZonedDateTime,
val endBetDate: ZonedDateTime,
val isPublic: Boolean,
val betStatus: BetStatus,
open val theme: String,
open val phrase: String,
open val endRegisterDate: ZonedDateTime,
open val endBetDate: ZonedDateTime,
open val isPublic: Boolean,
open val betStatus: BetStatus,
)

@ -0,0 +1,56 @@
package fr.iut.alldev.allin.data.model.bet
import java.time.ZonedDateTime
class BetFactory {
companion object{
fun createBet(
betType: BetType,
theme: String,
phrase: String,
endRegisterDate: ZonedDateTime,
endBetDate: ZonedDateTime,
isPublic: Boolean,
nameTeam1: String = "",
nameTeam2: String = "",
possibleAnswers: Set<String> = emptySet()
): Bet =
when(betType){
BetType.YES_NO -> {
YesNoBet(
theme = theme,
phrase = phrase,
endRegisterDate = endRegisterDate,
endBetDate = endBetDate,
isPublic = isPublic,
betStatus = BetStatus.WAITING
)
}
BetType.MATCH -> {
MatchBet(
theme = theme,
phrase = phrase,
endRegisterDate = endRegisterDate,
endBetDate = endBetDate,
isPublic = isPublic,
betStatus = BetStatus.WAITING,
nameTeam1 = nameTeam1,
nameTeam2 = nameTeam2
)
}
BetType.CUSTOM -> {
CustomBet(
theme = theme,
phrase = phrase,
endRegisterDate = endRegisterDate,
endBetDate = endBetDate,
isPublic = isPublic,
betStatus = BetStatus.WAITING,
possibleAnswers = possibleAnswers
)
}
}
}
}

@ -0,0 +1,20 @@
package fr.iut.alldev.allin.data.model.bet
import java.time.ZonedDateTime
data class CustomBet(
override val theme: String,
override val phrase: String,
override val endRegisterDate: ZonedDateTime,
override val endBetDate: ZonedDateTime,
override val isPublic: Boolean,
override val betStatus: BetStatus,
val possibleAnswers: Set<String>
) : Bet(
theme,
phrase,
endRegisterDate,
endBetDate,
isPublic,
betStatus
)

@ -2,13 +2,13 @@ package fr.iut.alldev.allin.data.model.bet
import java.time.ZonedDateTime
class MatchBet(
theme: String,
phrase: String,
endRegisterDate: ZonedDateTime,
endBetDate: ZonedDateTime,
isPublic: Boolean,
betStatus: BetStatus,
data class MatchBet(
override val theme: String,
override val phrase: String,
override val endRegisterDate: ZonedDateTime,
override val endBetDate: ZonedDateTime,
override val isPublic: Boolean,
override val betStatus: BetStatus,
val nameTeam1: String,
val nameTeam2: String
) : Bet(

@ -2,13 +2,13 @@ package fr.iut.alldev.allin.data.model.bet
import java.time.ZonedDateTime
class YesNoBet(
theme: String,
phrase: String,
endRegisterDate: ZonedDateTime,
endBetDate: ZonedDateTime,
isPublic: Boolean,
betStatus: BetStatus
data class YesNoBet(
override val theme: String,
override val phrase: String,
override val endRegisterDate: ZonedDateTime,
override val endBetDate: ZonedDateTime,
override val isPublic: Boolean,
override val betStatus: BetStatus
) : Bet(
theme,
phrase,

@ -0,0 +1,9 @@
package fr.iut.alldev.allin.data.repository
import fr.iut.alldev.allin.data.model.bet.Bet
abstract class BetRepository {
abstract suspend fun createBet(
bet: Bet,
)
}

@ -0,0 +1,16 @@
package fr.iut.alldev.allin.data.repository.impl
import fr.iut.alldev.allin.data.api.AllInApi
import fr.iut.alldev.allin.data.model.bet.Bet
import fr.iut.alldev.allin.data.repository.BetRepository
import timber.log.Timber
import javax.inject.Inject
class BetRepositoryImpl @Inject constructor(
private val api: AllInApi,
) : BetRepository() {
override suspend fun createBet(bet: Bet) {
// TODO
Timber.d("$bet")
}
}
Loading…
Cancel
Save