diff --git a/.idea/deploymentTargetDropDown.xml b/.idea/deploymentTargetDropDown.xml index 31d6335..0c0c338 100644 --- a/.idea/deploymentTargetDropDown.xml +++ b/.idea/deploymentTargetDropDown.xml @@ -3,20 +3,7 @@ - - - - - - - - - - - - - - + diff --git a/android/app/src/main/java/fr/iut/sciencequest/MainActivity.kt b/android/app/src/main/java/fr/iut/sciencequest/MainActivity.kt index 3ea7785..bd86650 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/MainActivity.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/MainActivity.kt @@ -1,18 +1,13 @@ package fr.iut.sciencequest import android.os.Bundle -import android.util.Log import androidx.activity.ComponentActivity import androidx.activity.compose.setContent -import androidx.activity.viewModels import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.ui.Modifier -import fr.iut.sciencequest.ViewModels.ScientifiquesDecouvertsVM -import fr.iut.sciencequest.model.dto.extensions.ToModel import fr.iut.sciencequest.navigation.NavHost -import fr.iut.sciencequest.stub.StubScientifique1 import fr.iut.sciencequest.ui.theme.ScienceQuestTheme class MainActivity : ComponentActivity() { diff --git a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/KahootViewModel.kt b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/KahootViewModel.kt deleted file mode 100644 index eea6a93..0000000 --- a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/KahootViewModel.kt +++ /dev/null @@ -1,52 +0,0 @@ -package fr.iut.sciencequest.ViewModels - -import android.os.Handler -import android.os.Looper -import android.util.Log -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import fr.iut.sciencequest.ViewModels.UiStates.KahootUIState -import fr.iut.sciencequest.model.buisness.Question.fetchQuestions -import fr.iut.sciencequest.stub.StubQuestionWithReponses2 -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.launch - -class KahootViewModel: ViewModel() { - var uiState = MutableStateFlow(KahootUIState()) - - private val handler = Handler(Looper.getMainLooper()) - - fun lancerPartie() { - viewModelScope.launch { - fetchQuestions(2).collect() { - for (question in it.questions) { - handler.postDelayed( - { - Log.d("KahootViewModel","J'actualise les questions") - uiState.value = KahootUIState(question, - duréePartie = uiState.value.duréePartie, - nbPoints = uiState.value.nbPoints, - reponseChoisie = false) - }, - uiState.value.duréePartie - ) - } - } - } - } - - // NOTE : tpsReponse en ms - fun ajouterPoints(tpsReponse: Long) { - Log.d("KahootViewModel","Je reçois une réponse") - if (uiState.value.reponseChoisie) { - Log.d("KahootViewModel","Le joueur a déjà répondu") - return - } - val nbPoints: Int = (10_000 - tpsReponse).toInt() - uiState.value = KahootUIState(uiState.value.question, - duréePartie = uiState.value.duréePartie, - nbPoints = uiState.value.nbPoints + nbPoints, - reponseChoisie = true) - Log.d("KahootViewModel","Le joueur à ${uiState.value.nbPoints}") - } -} \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/ScientifiquesDecouvertsVM.kt b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/ScientifiquesDecouvertsVM.kt deleted file mode 100644 index f2e3f0e..0000000 --- a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/ScientifiquesDecouvertsVM.kt +++ /dev/null @@ -1,38 +0,0 @@ -package fr.iut.sciencequest.ViewModels - -import android.util.Log -import androidx.compose.runtime.MutableState -import androidx.compose.runtime.mutableStateListOf -import androidx.compose.runtime.toMutableStateList -import androidx.lifecycle.LiveData -import androidx.lifecycle.MutableLiveData -import androidx.lifecycle.ViewModel -import androidx.lifecycle.viewModelScope -import fr.iut.sciencequest.ViewModels.UiStates.ScientifiqueDecouvertsUIState -import fr.iut.sciencequest.model.buisness.Scientifique.fetchScientifiqueById -import fr.iut.sciencequest.model.buisness.Scientifique.fetchScientifiques -import fr.iut.sciencequest.model.dto.extensions.ToModel -import fr.iut.sciencequest.model.metier.Scientifique -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.collect -import kotlinx.coroutines.launch - -class ScientifiquesDecouvertsVM : ViewModel() { - var listeScientifique: MutableStateFlow = MutableStateFlow(ScientifiqueDecouvertsUIState()) - - // fun getScientifiqueById(id: Int) { - // Log.d("ViewModelScientifique", "Recup un scientifique d'id: $id") - // var scientifique: Scientifique - // viewModelScope.launch { -// - // } - // } - fun getScientifiques(page: Int) { - Log.d("ViewModelScientifique","Recup la liste de scientifiques") - viewModelScope.launch { - fetchScientifiques(page).collect { - listeScientifique.value = ScientifiqueDecouvertsUIState(it.scientifiques.ToModel().toMutableList()) - } - } - } - } \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/KahootUIState.kt b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/KahootUIState.kt deleted file mode 100644 index 3048aa3..0000000 --- a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/KahootUIState.kt +++ /dev/null @@ -1,13 +0,0 @@ -package fr.iut.sciencequest.ViewModels.UiStates - -import fr.iut.sciencequest.model.dto.question.QuestionWithSimpleResponseDTO -import fr.iut.sciencequest.model.dto.reponse.ReponseSimpleDTO -import fr.iut.sciencequest.stub.StubQuestionWithReponses - -data class KahootUIState ( - val question: QuestionWithSimpleResponseDTO = StubQuestionWithReponses, - val reponseChoisie: Boolean = false, - // NOTE : Supposé en millisecondes - val duréePartie: Long = 10_000, - val nbPoints: Int = 0 -) \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/model/buisness/Question/QuestionRequestor.kt b/android/app/src/main/java/fr/iut/sciencequest/model/buisness/Question/QuestionRequestor.kt deleted file mode 100644 index 3a0652c..0000000 --- a/android/app/src/main/java/fr/iut/sciencequest/model/buisness/Question/QuestionRequestor.kt +++ /dev/null @@ -1,22 +0,0 @@ -package fr.iut.sciencequest.model.buisness.Question - -import android.util.Log -import fr.iut.sciencequest.model.buisness.Scientifique.ScientifiqueRequestService -import fr.iut.sciencequest.model.buisness.createRequestService -import fr.iut.sciencequest.model.dto.question.QuestionListDTO -import kotlinx.coroutines.flow.flow -import retrofit2.Call -import retrofit2.Callback -import retrofit2.Response -import retrofit2.create -import java.lang.IllegalArgumentException - -suspend fun fetchQuestions(index: Int) = flow { - val serviceClient = createRequestService().create() - try { - val response = serviceClient.getQuestions(index) - emit(response) - } catch (e: Exception) { - Log.e("Requete API Question",e.message.toString()) - } -} diff --git a/android/app/src/main/java/fr/iut/sciencequest/model/dto/extensions/QuestionExtension.kt b/android/app/src/main/java/fr/iut/sciencequest/model/dto/extensions/QuestionExtension.kt new file mode 100644 index 0000000..b42908e --- /dev/null +++ b/android/app/src/main/java/fr/iut/sciencequest/model/dto/extensions/QuestionExtension.kt @@ -0,0 +1,30 @@ +package fr.iut.sciencequest.model.dto.extensions + +import fr.iut.sciencequest.model.dto.question.QuestionDTO +import fr.iut.sciencequest.model.dto.question.QuestionWithSimpleResponseDTO +import fr.iut.sciencequest.model.metier.question.Question +import fr.iut.sciencequest.model.metier.question.QuestionWithSimpleReponse + +fun QuestionDTO.ToModel(): Question { + return Question( + this.id, + this.question, + this.reponses.ToModel() + ) +} + +fun List.ToModel(): List { + val liste = mutableListOf() + for (question in this) { + liste.add(question.ToModel()) + } + return liste +} + +fun Question.ToQuestionWithSimpleReponse(): QuestionWithSimpleReponse { + return QuestionWithSimpleReponse( + this.id, + this.question, + this.reponses.ToSimpleReponses() + ) +} \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/model/dto/extensions/QuestionWithSimpleReponseExtension.kt b/android/app/src/main/java/fr/iut/sciencequest/model/dto/extensions/QuestionWithSimpleReponseExtension.kt new file mode 100644 index 0000000..c0587e4 --- /dev/null +++ b/android/app/src/main/java/fr/iut/sciencequest/model/dto/extensions/QuestionWithSimpleReponseExtension.kt @@ -0,0 +1,20 @@ +package fr.iut.sciencequest.model.dto.extensions + +import fr.iut.sciencequest.model.dto.question.QuestionWithSimpleResponseDTO +import fr.iut.sciencequest.model.metier.question.QuestionWithSimpleReponse + +fun QuestionWithSimpleResponseDTO.ToModel(): QuestionWithSimpleReponse { + return QuestionWithSimpleReponse( + this.id, + this.question, + this.reponses.ToModel() + ) +} + +fun List.ToModel(): List { + val liste = ArrayList() + for (question in this) { + liste.add(question.ToModel()) + } + return liste +} \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/model/dto/extensions/ReponseExtension.kt b/android/app/src/main/java/fr/iut/sciencequest/model/dto/extensions/ReponseExtension.kt new file mode 100644 index 0000000..eca76bd --- /dev/null +++ b/android/app/src/main/java/fr/iut/sciencequest/model/dto/extensions/ReponseExtension.kt @@ -0,0 +1,37 @@ +package fr.iut.sciencequest.model.dto.extensions + +import fr.iut.sciencequest.model.dto.reponse.ReponseDTO +import fr.iut.sciencequest.model.metier.reponse.Reponse +import fr.iut.sciencequest.model.metier.reponse.ReponseSimple + +fun ReponseDTO.ToModel(): Reponse { + return Reponse( + this.id, + this.reponse, + this.question.ToModel(), + this.scientifique.ToModel() + ) +} + +fun List.ToModel(): List { + val liste = ArrayList() + for (reponse in this) { + liste.add(reponse.ToModel()) + } + return liste +} + +fun Reponse.ToSimpleReponse(): ReponseSimple { + return ReponseSimple( + this.id, + this.reponse + ) +} + +fun List.ToSimpleReponses(): List { + val liste = ArrayList() + for (reponse in this) { + liste.add(reponse.ToSimpleReponse()) + } + return liste +} \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/model/dto/extensions/SimpleReponseExtension.kt b/android/app/src/main/java/fr/iut/sciencequest/model/dto/extensions/SimpleReponseExtension.kt new file mode 100644 index 0000000..bae8326 --- /dev/null +++ b/android/app/src/main/java/fr/iut/sciencequest/model/dto/extensions/SimpleReponseExtension.kt @@ -0,0 +1,19 @@ +package fr.iut.sciencequest.model.dto.extensions + +import fr.iut.sciencequest.model.dto.reponse.ReponseSimpleDTO +import fr.iut.sciencequest.model.metier.reponse.ReponseSimple + +fun ReponseSimpleDTO.ToModel(): ReponseSimple { + return ReponseSimple( + this.id, + this.reponse + ) +} + +fun List.ToModel(): List { + val liste = ArrayList() + for (reponse in this) { + liste.add(reponse.ToModel()) + } + return liste +} \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/model/metier/Question.kt b/android/app/src/main/java/fr/iut/sciencequest/model/metier/Question.kt deleted file mode 100644 index d6c1550..0000000 --- a/android/app/src/main/java/fr/iut/sciencequest/model/metier/Question.kt +++ /dev/null @@ -1,7 +0,0 @@ -package fr.iut.sciencequest.model.metier -class Question( - val id: Int, - val question: String, - val reponses: List -) {} - diff --git a/android/app/src/main/java/fr/iut/sciencequest/model/metier/Reponse.kt b/android/app/src/main/java/fr/iut/sciencequest/model/metier/Reponse.kt deleted file mode 100644 index aaacc6d..0000000 --- a/android/app/src/main/java/fr/iut/sciencequest/model/metier/Reponse.kt +++ /dev/null @@ -1,9 +0,0 @@ -package fr.iut.sciencequest.model.metier - -class Reponse ( - val id: Int, - val reponse: String, - val question: Question, - val scientifique: Scientifique -) {} - diff --git a/android/app/src/main/java/fr/iut/sciencequest/model/metier/question/Question.kt b/android/app/src/main/java/fr/iut/sciencequest/model/metier/question/Question.kt new file mode 100644 index 0000000..d0b7802 --- /dev/null +++ b/android/app/src/main/java/fr/iut/sciencequest/model/metier/question/Question.kt @@ -0,0 +1,10 @@ +package fr.iut.sciencequest.model.metier.question + +import fr.iut.sciencequest.model.metier.reponse.Reponse + +class Question( + val id: Int, + val question: String, + val reponses: List +) {} + diff --git a/android/app/src/main/java/fr/iut/sciencequest/model/metier/question/QuestionWithSimpleReponse.kt b/android/app/src/main/java/fr/iut/sciencequest/model/metier/question/QuestionWithSimpleReponse.kt new file mode 100644 index 0000000..19f39a9 --- /dev/null +++ b/android/app/src/main/java/fr/iut/sciencequest/model/metier/question/QuestionWithSimpleReponse.kt @@ -0,0 +1,10 @@ +package fr.iut.sciencequest.model.metier.question + +import fr.iut.sciencequest.model.metier.reponse.Reponse +import fr.iut.sciencequest.model.metier.reponse.ReponseSimple + +class QuestionWithSimpleReponse ( + val id: Int, + val question: String, + val reponses: List +) \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/model/metier/reponse/Reponse.kt b/android/app/src/main/java/fr/iut/sciencequest/model/metier/reponse/Reponse.kt new file mode 100644 index 0000000..40f5f28 --- /dev/null +++ b/android/app/src/main/java/fr/iut/sciencequest/model/metier/reponse/Reponse.kt @@ -0,0 +1,12 @@ +package fr.iut.sciencequest.model.metier.reponse + +import fr.iut.sciencequest.model.metier.question.Question +import fr.iut.sciencequest.model.metier.Scientifique + +class Reponse ( + val id: Int, + val reponse: String, + val question: Question, + val scientifique: Scientifique +) {} + diff --git a/android/app/src/main/java/fr/iut/sciencequest/model/metier/reponse/ReponseSimple.kt b/android/app/src/main/java/fr/iut/sciencequest/model/metier/reponse/ReponseSimple.kt new file mode 100644 index 0000000..2bcddb3 --- /dev/null +++ b/android/app/src/main/java/fr/iut/sciencequest/model/metier/reponse/ReponseSimple.kt @@ -0,0 +1,11 @@ +package fr.iut.sciencequest.model.metier.reponse + +class ReponseSimple { + val id: Int + val reponse: String + + constructor(id: Int, reponse: String) { + this.id = id + this.reponse = reponse + } +} \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/model/repositories/question/IQuestionRepository.kt b/android/app/src/main/java/fr/iut/sciencequest/model/repositories/question/IQuestionRepository.kt new file mode 100644 index 0000000..4518060 --- /dev/null +++ b/android/app/src/main/java/fr/iut/sciencequest/model/repositories/question/IQuestionRepository.kt @@ -0,0 +1,11 @@ +package fr.iut.sciencequest.model.repositories.question + +import fr.iut.sciencequest.model.metier.question.Question +import fr.iut.sciencequest.model.metier.question.QuestionWithSimpleReponse +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.StateFlow + +interface IQuestionRepository { + val questions: StateFlow> + suspend fun fetchQuestions(index: Int) +} \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/model/repositories/question/QuestionAPIRepository.kt b/android/app/src/main/java/fr/iut/sciencequest/model/repositories/question/QuestionAPIRepository.kt new file mode 100644 index 0000000..45b69c5 --- /dev/null +++ b/android/app/src/main/java/fr/iut/sciencequest/model/repositories/question/QuestionAPIRepository.kt @@ -0,0 +1,31 @@ +package fr.iut.sciencequest.model.repositories.question + +import android.util.Log +import fr.iut.sciencequest.model.buisness.Question.QuestionRequestService +import fr.iut.sciencequest.model.buisness.createRequestService +import fr.iut.sciencequest.model.dto.extensions.ToModel +import fr.iut.sciencequest.model.metier.question.Question +import fr.iut.sciencequest.model.metier.question.QuestionWithSimpleReponse +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.flow +import kotlinx.coroutines.flow.update +import retrofit2.create + +class QuestionAPIRepository : IQuestionRepository { + + private val _questions = MutableStateFlow>(emptyList()) + override val questions: StateFlow> + get() = _questions.asStateFlow() + + override suspend fun fetchQuestions(index: Int) { + val serviceClient = createRequestService().create() + try { + _questions.value = serviceClient.getQuestions(index).questions.ToModel() + } catch (e: Exception) { + Log.e("Requete API Question", e.message.toString()) + } + } +} \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/model/repositories/scientifique/IScientifiqueRepository.kt b/android/app/src/main/java/fr/iut/sciencequest/model/repositories/scientifique/IScientifiqueRepository.kt new file mode 100644 index 0000000..b99473f --- /dev/null +++ b/android/app/src/main/java/fr/iut/sciencequest/model/repositories/scientifique/IScientifiqueRepository.kt @@ -0,0 +1,14 @@ +package fr.iut.sciencequest.model.repositories.scientifique + +import fr.iut.sciencequest.model.metier.Scientifique +import fr.iut.sciencequest.model.metier.question.QuestionWithSimpleReponse +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.StateFlow + +interface IScientifiqueRepository { + + val scientifique: StateFlow + val scientifiques: StateFlow> + suspend fun fetchScientifiques(index: Int) + suspend fun fetchScientifiqueById(id: Int) +} \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/model/repositories/scientifique/ScientifiqueAPIRepository.kt b/android/app/src/main/java/fr/iut/sciencequest/model/repositories/scientifique/ScientifiqueAPIRepository.kt new file mode 100644 index 0000000..52e9a65 --- /dev/null +++ b/android/app/src/main/java/fr/iut/sciencequest/model/repositories/scientifique/ScientifiqueAPIRepository.kt @@ -0,0 +1,44 @@ +package fr.iut.sciencequest.model.repositories.scientifique + +import android.util.Log +import fr.iut.sciencequest.model.buisness.Question.QuestionRequestService +import fr.iut.sciencequest.model.buisness.Scientifique.ScientifiqueRequestService +import fr.iut.sciencequest.model.buisness.createRequestService +import fr.iut.sciencequest.model.dto.extensions.ToModel +import fr.iut.sciencequest.model.metier.Scientifique +import fr.iut.sciencequest.stub.StubScientifique1 +import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.flow.flow +import retrofit2.create + +class ScientifiqueAPIRepository: IScientifiqueRepository { + + private val _scientifique = MutableStateFlow(StubScientifique1.ToModel()) + override val scientifique: StateFlow + get() = _scientifique.asStateFlow() + + private val _scientifiques = MutableStateFlow>(emptyList()) + override val scientifiques: StateFlow> + get() = _scientifiques.asStateFlow() + + override suspend fun fetchScientifiqueById(id: Int) { + val serviceClient = createRequestService().create() + try { + _scientifique.value = serviceClient.getScientifique(id).ToModel() + } catch (e: Exception) { + Log.e("Requete API Scientifiqu", e.message.toString()) + } + } + + override suspend fun fetchScientifiques(index: Int) { + val serviceClient = createRequestService().create() + try { + _scientifiques.value = serviceClient.getScientifiques(index).scientifiques.ToModel() + } catch (e: Exception) { + Log.e("Requete API Scientifiqu", e.message.toString()) + } + } +} \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/model/repositories/scientifique/ScientifiqueStubRepostory.kt b/android/app/src/main/java/fr/iut/sciencequest/model/repositories/scientifique/ScientifiqueStubRepostory.kt new file mode 100644 index 0000000..65226a5 --- /dev/null +++ b/android/app/src/main/java/fr/iut/sciencequest/model/repositories/scientifique/ScientifiqueStubRepostory.kt @@ -0,0 +1,39 @@ +package fr.iut.sciencequest.model.repositories.scientifique + +import android.content.res.Resources.NotFoundException +import fr.iut.sciencequest.model.dto.extensions.ToModel +import fr.iut.sciencequest.model.metier.Scientifique +import fr.iut.sciencequest.stub.StubScientifique1 +import fr.iut.sciencequest.stub.StubScientifique2 +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.flow.asStateFlow + +class ScientifiqueStubRepostory : IScientifiqueRepository { + + private var listeStub : MutableList = mutableListOf( + StubScientifique1.ToModel(), + StubScientifique2.ToModel() + ) + private val _scientifique = MutableStateFlow(StubScientifique1.ToModel()) + override val scientifique: StateFlow + get() = _scientifique.asStateFlow() + private val _scientifiques = MutableStateFlow>(emptyList()) + override val scientifiques: StateFlow> + get() = _scientifiques.asStateFlow() + + override suspend fun fetchScientifiques(index: Int) { + _scientifiques.value = listeStub + } + + override suspend fun fetchScientifiqueById(id: Int) { + val retrieved = listeStub.find { + it.id == id + } ?: throw NotFoundException("Scientifique introuvable dans le stub") + _scientifique.value = retrieved + } + + fun setScientifiqueStubList(scientifiques: MutableList) { + listeStub = scientifiques + } +} \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/navigation/NavHost.kt b/android/app/src/main/java/fr/iut/sciencequest/navigation/NavHost.kt index 3e1dcb7..cd50bd8 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/navigation/NavHost.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/navigation/NavHost.kt @@ -1,17 +1,11 @@ package fr.iut.sciencequest.navigation -import android.content.Context import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.rememberNavController -import fr.iut.sciencequest.ViewModels.KahootViewModel -import fr.iut.sciencequest.ViewModels.PenduViewModel -import fr.iut.sciencequest.ViewModels.ScientifiquesDecouvertsVM -import fr.iut.sciencequest.stub.StubQuestionWithReponses import fr.iut.sciencequest.view.AccountScreen import fr.iut.sciencequest.view.HomeScreen import fr.iut.sciencequest.view.LoginScreen @@ -22,7 +16,7 @@ import fr.iut.sciencequest.view.scientifiques.scientifiqueListeScreen @Composable -fun NavHost(kahootVM: KahootViewModel = viewModel(), penduVM: PenduViewModel = viewModel()) { +fun NavHost() { val navController = rememberNavController() NavHost( modifier = Modifier.fillMaxSize(), @@ -38,11 +32,9 @@ fun NavHost(kahootVM: KahootViewModel = viewModel(), penduVM: PenduViewModel = v navController.navigate("home") }, goToPendu = { - penduVM.InitPartie() navController.navigate("pendu") }, goToKahoot = { - kahootVM.lancerPartie() navController.navigate("kahoot") }, goToQui = { @@ -75,7 +67,6 @@ fun NavHost(kahootVM: KahootViewModel = viewModel(), penduVM: PenduViewModel = v composable(route = "pendu") { PenduScreen( - viewModel = penduVM, goToAccount = { navController.navigate("account") }, @@ -92,8 +83,7 @@ fun NavHost(kahootVM: KahootViewModel = viewModel(), penduVM: PenduViewModel = v }, goToHome = { navController.navigate("home") - }, - viewModel = kahootVM + } ) } diff --git a/android/app/src/main/java/fr/iut/sciencequest/view/HomeScreen.kt b/android/app/src/main/java/fr/iut/sciencequest/view/HomeScreen.kt index b816e43..376271c 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/view/HomeScreen.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/view/HomeScreen.kt @@ -14,8 +14,6 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import androidx.lifecycle.viewmodel.compose.viewModel -import fr.iut.sciencequest.ViewModels.KahootViewModel @Composable fun HomeScreen(goToHome: () -> Unit, diff --git a/android/app/src/main/java/fr/iut/sciencequest/view/Login.kt b/android/app/src/main/java/fr/iut/sciencequest/view/Login.kt index 82cd26f..9b8ecd8 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/view/Login.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/view/Login.kt @@ -26,7 +26,7 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel import fr.iut.sciencequest.R -import fr.iut.sciencequest.ViewModels.LoginViewModel +import fr.iut.sciencequest.viewModels.LoginViewModel @Composable fun LoginScreen(viewModel: LoginViewModel = viewModel(), diff --git a/android/app/src/main/java/fr/iut/sciencequest/view/games/Kahoot.kt b/android/app/src/main/java/fr/iut/sciencequest/view/games/Kahoot.kt index 3ab141e..a25a34a 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/view/games/Kahoot.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/view/games/Kahoot.kt @@ -11,6 +11,7 @@ import androidx.compose.foundation.lazy.grid.LazyVerticalGrid import androidx.compose.material3.Button import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -22,17 +23,21 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.lifecycle.viewmodel.compose.viewModel import fr.iut.sciencequest.R -import fr.iut.sciencequest.ViewModels.KahootViewModel -import fr.iut.sciencequest.model.dto.question.QuestionWithSimpleResponseDTO -import fr.iut.sciencequest.model.dto.reponse.ReponseSimpleDTO +import fr.iut.sciencequest.viewModels.KahootViewModel +import fr.iut.sciencequest.model.dto.extensions.ToModel +import fr.iut.sciencequest.model.metier.question.QuestionWithSimpleReponse +import fr.iut.sciencequest.model.metier.reponse.ReponseSimple import fr.iut.sciencequest.stub.StubQuestionWithReponses import fr.iut.sciencequest.view.TopBar @Composable -fun KahootScreen(viewModel: KahootViewModel = viewModel(), +fun KahootScreen(viewModel: KahootViewModel = viewModel(factory = KahootViewModel.ApiFactory), goToAccount: () -> Unit, goToHome: () -> Unit) { val state = viewModel.uiState.collectAsState() + LaunchedEffect(key1 = Unit) { + viewModel.lancerPartie() + } Column(modifier = Modifier.fillMaxWidth()) { TopBar(goToAccount, goToHome, stringResource(id = R.string.kahoot)) @@ -53,13 +58,14 @@ fun KahootScreenPreview(){ @Composable fun KahootPlayerPreview(){ val i = 0 - KahootPlayer(question = StubQuestionWithReponses) {} + KahootPlayer(question = StubQuestionWithReponses.ToModel()) {} } @Composable -fun KahootPlayer(question: QuestionWithSimpleResponseDTO, - sendResponse: (Long) -> Unit){ +fun KahootPlayer(question: QuestionWithSimpleReponse, + sendReponse: (Long) -> Unit){ + val context = LocalContext.current; val currTime = System.currentTimeMillis() Column ( @@ -69,7 +75,7 @@ fun KahootPlayer(question: QuestionWithSimpleResponseDTO, ) { KahootQuestion(question = question.question) KahootReponses(reponses = question.reponses) { - sendResponse(currTime - System.currentTimeMillis()) + sendReponse(currTime - System.currentTimeMillis()) Toast.makeText(context, it.reponse, Toast.LENGTH_SHORT).show() } } @@ -77,7 +83,7 @@ fun KahootPlayer(question: QuestionWithSimpleResponseDTO, @Composable -fun KahootReponses(reponses : List, action: (ReponseSimpleDTO)->Unit) { +fun KahootReponses(reponses : List, action: (ReponseSimple)->Unit) { LazyVerticalGrid(columns = GridCells.Fixed(2), contentPadding = PaddingValues(12.dp), verticalArrangement = Arrangement.spacedBy(10.dp), diff --git a/android/app/src/main/java/fr/iut/sciencequest/view/games/Pendu.kt b/android/app/src/main/java/fr/iut/sciencequest/view/games/Pendu.kt index 7922a2b..44c7c6a 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/view/games/Pendu.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/view/games/Pendu.kt @@ -22,11 +22,11 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.lifecycle.viewmodel.compose.viewModel import fr.iut.sciencequest.R -import fr.iut.sciencequest.ViewModels.PenduViewModel +import fr.iut.sciencequest.viewModels.PenduViewModel import fr.iut.sciencequest.view.TopBar @Composable -fun PenduScreen(viewModel: PenduViewModel = viewModel(), +fun PenduScreen(viewModel: PenduViewModel = viewModel(factory = PenduViewModel.ApiFactory), goToAccount: () -> Unit, goToHome: () -> Unit ) { diff --git a/android/app/src/main/java/fr/iut/sciencequest/view/games/Qui.kt b/android/app/src/main/java/fr/iut/sciencequest/view/games/Qui.kt index 61b749b..3ce5cb6 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/view/games/Qui.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/view/games/Qui.kt @@ -20,11 +20,14 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.lifecycle.viewmodel.compose.viewModel import fr.iut.sciencequest.R -import fr.iut.sciencequest.ViewModels.KahootViewModel +import fr.iut.sciencequest.model.dto.extensions.ToModel import fr.iut.sciencequest.model.dto.question.QuestionWithSimpleResponseDTO import fr.iut.sciencequest.model.dto.reponse.ReponseSimpleDTO +import fr.iut.sciencequest.model.metier.question.QuestionWithSimpleReponse +import fr.iut.sciencequest.model.metier.reponse.ReponseSimple import fr.iut.sciencequest.stub.StubQuestionWithReponses import fr.iut.sciencequest.view.TopBar +import fr.iut.sciencequest.viewModels.KahootViewModel import java.util.Timer @Composable @@ -51,12 +54,12 @@ fun QuiScreenPreview(){ @Composable fun QuiPlayerPreview(){ val i = 0 - QuiPlayer(question = StubQuestionWithReponses) {} + QuiPlayer(question = StubQuestionWithReponses.ToModel()) {} } @Composable -fun QuiPlayer(question: QuestionWithSimpleResponseDTO, +fun QuiPlayer(question: QuestionWithSimpleReponse, sendReponse: (Long) -> Unit){ val context = LocalContext.current; val currTime = System.currentTimeMillis() @@ -71,7 +74,7 @@ fun QuiPlayer(question: QuestionWithSimpleResponseDTO, @Composable -fun QuiReponses(reponses : List, action: (ReponseSimpleDTO)->Unit) { +fun QuiReponses(reponses : List, action: (ReponseSimple)->Unit) { LazyVerticalGrid(columns = GridCells.Fixed(2), contentPadding = PaddingValues(12.dp), verticalArrangement = Arrangement.spacedBy(10.dp), diff --git a/android/app/src/main/java/fr/iut/sciencequest/view/scientifiques/ScientifiqueListeScreen.kt b/android/app/src/main/java/fr/iut/sciencequest/view/scientifiques/ScientifiqueListeScreen.kt index 6431a3a..3f8ceb4 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/view/scientifiques/ScientifiqueListeScreen.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/view/scientifiques/ScientifiqueListeScreen.kt @@ -1,22 +1,18 @@ package fr.iut.sciencequest.view.scientifiques -import android.util.Log import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.ui.res.stringResource -import androidx.compose.ui.tooling.preview.Preview import androidx.lifecycle.viewmodel.compose.viewModel import fr.iut.sciencequest.R -import fr.iut.sciencequest.ViewModels.ScientifiquesDecouvertsVM -import fr.iut.sciencequest.model.dto.extensions.ToModel -import fr.iut.sciencequest.model.metier.Scientifique -import fr.iut.sciencequest.stub.getScientifiqueListeStub +import fr.iut.sciencequest.viewModels.ScientifiquesDecouvertsVM import fr.iut.sciencequest.view.TopBar @Composable -fun scientifiqueListeScreen(viewModel: ScientifiquesDecouvertsVM = viewModel(), +fun scientifiqueListeScreen(viewModel: ScientifiquesDecouvertsVM = viewModel(factory = ScientifiquesDecouvertsVM.ApiFactory), goToAccount: () -> Unit, goToHome: () -> Unit) { val liste by viewModel.listeScientifique.collectAsState() @@ -25,7 +21,9 @@ fun scientifiqueListeScreen(viewModel: ScientifiquesDecouvertsVM = viewModel(), TopBar(goToAccount, goToHome, stringResource(id = R.string.sc_decouverts)) }, ) { innerPadding -> - viewModel.getScientifiques(1) + LaunchedEffect(key1 = Unit) { + viewModel.getScientifiques(1) + } scientifiqueListeContainer(liste.scientifiques, innerPadding) } } \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/viewModels/KahootViewModel.kt b/android/app/src/main/java/fr/iut/sciencequest/viewModels/KahootViewModel.kt new file mode 100644 index 0000000..0e534f0 --- /dev/null +++ b/android/app/src/main/java/fr/iut/sciencequest/viewModels/KahootViewModel.kt @@ -0,0 +1,72 @@ +package fr.iut.sciencequest.viewModels + +import android.os.Handler +import android.os.Looper +import android.util.Log +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.viewModelScope +import fr.iut.sciencequest.model.repositories.question.IQuestionRepository +import fr.iut.sciencequest.model.repositories.question.QuestionAPIRepository +import fr.iut.sciencequest.viewModels.uixStates.KahootUIState +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.launch + +class KahootViewModel( + val questionRepo: IQuestionRepository +): ViewModel() { + var uiState = MutableStateFlow(KahootUIState()) + + private val handler = Handler(Looper.getMainLooper()) + + fun lancerPartie() { + viewModelScope.launch { + questionRepo.fetchQuestions(2) + Log.d("KahootViewModel","J'ai trouvé ${questionRepo.questions.value.size} questions") + var count = 1 + for (question in questionRepo.questions.value) { + handler.postDelayed( + { + Log.d("KahootViewModel", "J'actualise les questions") + uiState.value = KahootUIState( + question, + duréePartie = uiState.value.duréePartie, + nbPoints = uiState.value.nbPoints, + reponseChoisie = false + ) + }, + uiState.value.duréePartie * count + ) + count++ + } + } + } + + // NOTE : tpsReponse en ms + fun ajouterPoints(tpsReponse: Long) { + Log.d("KahootViewModel","Je reçois une réponse") + if (uiState.value.reponseChoisie) { + Log.d("KahootViewModel","Le joueur a déjà répondu") + return + } + val nbPoints: Int = (10_000 - tpsReponse).toInt() + uiState.value = KahootUIState(uiState.value.question, + duréePartie = uiState.value.duréePartie, + nbPoints = uiState.value.nbPoints + nbPoints, + reponseChoisie = true) + Log.d("KahootViewModel","Le joueur à ${uiState.value.nbPoints}") + } + companion object { + + val ApiFactory: ViewModelProvider.Factory = object : ViewModelProvider.Factory { + @Suppress("UNCHECKED_CAST") + override fun create( + modelClass: Class + ): T { + return KahootViewModel( + QuestionAPIRepository() + ) as T + } + } + } +} \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/LoginViewModel.kt b/android/app/src/main/java/fr/iut/sciencequest/viewModels/LoginViewModel.kt similarity index 79% rename from android/app/src/main/java/fr/iut/sciencequest/ViewModels/LoginViewModel.kt rename to android/app/src/main/java/fr/iut/sciencequest/viewModels/LoginViewModel.kt index 2f99c5a..1b4d704 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/LoginViewModel.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/viewModels/LoginViewModel.kt @@ -1,7 +1,7 @@ -package fr.iut.sciencequest.ViewModels +package fr.iut.sciencequest.viewModels import androidx.lifecycle.ViewModel -import fr.iut.sciencequest.ViewModels.UiStates.LoginUIState +import fr.iut.sciencequest.viewModels.uiStates.LoginUIState import kotlinx.coroutines.flow.MutableStateFlow class LoginViewModel: ViewModel() { diff --git a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/PenduViewModel.kt b/android/app/src/main/java/fr/iut/sciencequest/viewModels/PenduViewModel.kt similarity index 67% rename from android/app/src/main/java/fr/iut/sciencequest/ViewModels/PenduViewModel.kt rename to android/app/src/main/java/fr/iut/sciencequest/viewModels/PenduViewModel.kt index 57e9985..f2f1d94 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/PenduViewModel.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/viewModels/PenduViewModel.kt @@ -1,32 +1,33 @@ -package fr.iut.sciencequest.ViewModels +package fr.iut.sciencequest.viewModels import android.util.Log import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope -import fr.iut.sciencequest.ViewModels.UiStates.PenduUIState -import fr.iut.sciencequest.model.buisness.Scientifique.fetchScientifiqueById -import fr.iut.sciencequest.model.buisness.Scientifique.fetchScientifiquesInfos +import fr.iut.sciencequest.viewModels.uiStates.PenduUIState +import fr.iut.sciencequest.model.repositories.scientifique.IScientifiqueRepository +import fr.iut.sciencequest.model.repositories.scientifique.ScientifiqueAPIRepository import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.launch -class PenduViewModel : ViewModel() { +class PenduViewModel( + val scientifiqueRepo: IScientifiqueRepository +) : ViewModel() { var uiState = MutableStateFlow(PenduUIState()) fun InitPartie() { Log.d("PenduViewModel","Un utilisateur initialise une partie") viewModelScope.launch { - fetchScientifiquesInfos().collect { scientifiquesInfos -> - Log.e("PenduViewModel",scientifiquesInfos.nbScientfiques.toString()) - fetchScientifiqueById((1..scientifiquesInfos.nbScientfiques).random()).collect { - val nomComplet = it.prenom + " " + it.nom - Log.d("ViewModelPendu",nomComplet) - var motATrou = "" - for (chr in nomComplet) { - motATrou += if (chr == ' ') { - ' ' - } else { - '_' - } + scientifiqueRepo.fetchScientifiqueById(1) + val scientifique = scientifiqueRepo.scientifique.value + val nomComplet = scientifique.prenom + " " + scientifique.nom + Log.d("ViewModelPendu",nomComplet) + var motATrou = "" + for (chr in nomComplet) { + motATrou += if (chr == ' ') { + ' ' + } else { + '_' } uiState.value = PenduUIState( isActionGood = true, @@ -37,7 +38,6 @@ class PenduViewModel : ViewModel() { } } - } // mot : mot à trouver // motAct : état actuel du mot trouvé par l'utilisateur @@ -84,4 +84,17 @@ class PenduViewModel : ViewModel() { ) } } + companion object { + + val ApiFactory: ViewModelProvider.Factory = object : ViewModelProvider.Factory { + @Suppress("UNCHECKED_CAST") + override fun create( + modelClass: Class + ): T { + return PenduViewModel( + ScientifiqueAPIRepository() + ) as T + } + } + } } \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/viewModels/ScientifiquesDecouvertsVM.kt b/android/app/src/main/java/fr/iut/sciencequest/viewModels/ScientifiquesDecouvertsVM.kt new file mode 100644 index 0000000..1521430 --- /dev/null +++ b/android/app/src/main/java/fr/iut/sciencequest/viewModels/ScientifiquesDecouvertsVM.kt @@ -0,0 +1,40 @@ +package fr.iut.sciencequest.viewModels + +import android.util.Log +import androidx.lifecycle.ViewModel +import androidx.lifecycle.ViewModelProvider +import androidx.lifecycle.viewModelScope +import fr.iut.sciencequest.viewModels.uiStates.ScientifiqueDecouvertsUIState +import fr.iut.sciencequest.model.repositories.scientifique.IScientifiqueRepository +import fr.iut.sciencequest.model.repositories.scientifique.ScientifiqueAPIRepository +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.asStateFlow +import kotlinx.coroutines.launch + +class ScientifiquesDecouvertsVM( + val repository: IScientifiqueRepository +) : ViewModel() { + private val _listeScientifique: MutableStateFlow = MutableStateFlow(ScientifiqueDecouvertsUIState()) + val listeScientifique = _listeScientifique.asStateFlow() + + fun getScientifiques(page: Int) { + Log.d("ViewModelScientifique","Recup la liste de scientifiques") + viewModelScope.launch { + repository.fetchScientifiques(page) + _listeScientifique.value = ScientifiqueDecouvertsUIState(repository.scientifiques.value.toMutableList()) + } + } + companion object { + + val ApiFactory: ViewModelProvider.Factory = object : ViewModelProvider.Factory { + @Suppress("UNCHECKED_CAST") + override fun create( + modelClass: Class + ): T { + return ScientifiquesDecouvertsVM( + ScientifiqueAPIRepository() + ) as T + } + } + } + } \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/viewModels/uiStates/KahootUIState.kt b/android/app/src/main/java/fr/iut/sciencequest/viewModels/uiStates/KahootUIState.kt new file mode 100644 index 0000000..13054d9 --- /dev/null +++ b/android/app/src/main/java/fr/iut/sciencequest/viewModels/uiStates/KahootUIState.kt @@ -0,0 +1,13 @@ +package fr.iut.sciencequest.viewModels.uixStates + +import fr.iut.sciencequest.model.dto.extensions.ToModel +import fr.iut.sciencequest.model.metier.question.QuestionWithSimpleReponse +import fr.iut.sciencequest.stub.StubQuestionWithReponses + +data class KahootUIState ( + val question: QuestionWithSimpleReponse = StubQuestionWithReponses.ToModel(), + val reponseChoisie: Boolean = false, + // NOTE : Supposé en millisecondes + val duréePartie: Long = 10_000, + val nbPoints: Int = 0 +) \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/LoginUIState.kt b/android/app/src/main/java/fr/iut/sciencequest/viewModels/uiStates/LoginUIState.kt similarity index 66% rename from android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/LoginUIState.kt rename to android/app/src/main/java/fr/iut/sciencequest/viewModels/uiStates/LoginUIState.kt index bf2161f..febb072 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/LoginUIState.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/viewModels/uiStates/LoginUIState.kt @@ -1,4 +1,4 @@ -package fr.iut.sciencequest.ViewModels.UiStates +package fr.iut.sciencequest.viewModels.uiStates data class LoginUIState ( val pseudo: String = "Pseudo", diff --git a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/PenduUIState.kt b/android/app/src/main/java/fr/iut/sciencequest/viewModels/uiStates/PenduUIState.kt similarity index 83% rename from android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/PenduUIState.kt rename to android/app/src/main/java/fr/iut/sciencequest/viewModels/uiStates/PenduUIState.kt index 369fbed..2ec2219 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/PenduUIState.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/viewModels/uiStates/PenduUIState.kt @@ -1,4 +1,4 @@ -package fr.iut.sciencequest.ViewModels.UiStates +package fr.iut.sciencequest.viewModels.uiStates data class PenduUIState( val isWon: Boolean = false, diff --git a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/ScientifiqueDecouvertsUIState.kt b/android/app/src/main/java/fr/iut/sciencequest/viewModels/uiStates/ScientifiqueDecouvertsUIState.kt similarity index 87% rename from android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/ScientifiqueDecouvertsUIState.kt rename to android/app/src/main/java/fr/iut/sciencequest/viewModels/uiStates/ScientifiqueDecouvertsUIState.kt index 68eec9e..11b066a 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/UiStates/ScientifiqueDecouvertsUIState.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/viewModels/uiStates/ScientifiqueDecouvertsUIState.kt @@ -1,4 +1,4 @@ -package fr.iut.sciencequest.ViewModels.UiStates +package fr.iut.sciencequest.viewModels.uiStates import fr.iut.sciencequest.model.metier.Scientifique