Error handling in bet creation + bet repository
continuous-integration/drone/push Build is passing
Details
continuous-integration/drone/push Build is passing
Details
parent
716a389be0
commit
19b76360f4
@ -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
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
@ -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.")
|
||||
}
|
||||
}
|
@ -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
|
||||
)
|
@ -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…
Reference in new issue