From de65dca150cac66ae9c0b668f7a9e249be347e39 Mon Sep 17 00:00:00 2001 From: Renaud BEURET Date: Tue, 26 Mar 2024 17:29:41 +0100 Subject: [PATCH 1/2] [FIX] Requete API (a appler dans vue) --- .../java/fr/iut/sciencequest/MainActivity.kt | 2 - .../ViewModels/ScientifiquesDecouvertsVM.kt | 32 ++++++--- .../ScientifiqueRequestService.kt | 4 +- .../Scientifique/ScientifiquesRequestor.kt | 68 ++++--------------- 4 files changed, 38 insertions(+), 68 deletions(-) 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 dde03bd..b9642b9 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/MainActivity.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/MainActivity.kt @@ -19,8 +19,6 @@ import fr.iut.sciencequest.ui.theme.ScienceQuestTheme class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - val vm = viewModels().value - vm.addScientifiques(StubScientifique1.ToModel()) setContent { ScienceQuestTheme { // A surface container using the 'background' color from the theme 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 index 826dd20..0f7dd9d 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/ScientifiquesDecouvertsVM.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/ScientifiquesDecouvertsVM.kt @@ -3,22 +3,32 @@ package fr.iut.sciencequest.ViewModels import android.util.Log import androidx.compose.runtime.MutableState import androidx.compose.runtime.mutableStateListOf +import androidx.lifecycle.LiveData import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +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.collect +import kotlinx.coroutines.launch class ScientifiquesDecouvertsVM : ViewModel() { - private var listeScientifique: MutableList = mutableStateListOf() + var listeScientifique: MutableList = mutableStateListOf() - fun getScientifiques(): MutableList { - Log.d("ViewModel","""je get un scientifique, taille act : ${listeScientifique.size}""") - return listeScientifique - } - - fun addScientifiques(scientifique: Scientifique) { - if (listeScientifique.add(scientifique)) { - Log.d("ViewModel","""j'ajoute un scientifique, taille act : ${listeScientifique.size}""") - } else { - Log.d("ViewModel","Erreur lors d'un ajout") + // 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 = it.scientifiques.ToModel().toMutableList(); + } } } } \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/model/buisness/Scientifique/ScientifiqueRequestService.kt b/android/app/src/main/java/fr/iut/sciencequest/model/buisness/Scientifique/ScientifiqueRequestService.kt index 02818fd..b3a5342 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/model/buisness/Scientifique/ScientifiqueRequestService.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/model/buisness/Scientifique/ScientifiqueRequestService.kt @@ -14,8 +14,8 @@ import retrofit2.http.Query interface ScientifiqueRequestService { @GET("scientifiques?page") - fun getScientifiques(@Query("page") index: Int): Call + suspend fun getScientifiques(@Query("page") index: Int): ScientifiqueListDTO @GET("scientifiques/{id}") - fun getScientifique(@Path("id") id: Int): Call + suspend fun getScientifique(@Path("id") id: Int): ScientifiqueDTO } \ No newline at end of file diff --git a/android/app/src/main/java/fr/iut/sciencequest/model/buisness/Scientifique/ScientifiquesRequestor.kt b/android/app/src/main/java/fr/iut/sciencequest/model/buisness/Scientifique/ScientifiquesRequestor.kt index e3bf862..519a8ed 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/model/buisness/Scientifique/ScientifiquesRequestor.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/model/buisness/Scientifique/ScientifiquesRequestor.kt @@ -4,67 +4,29 @@ import android.util.Log import fr.iut.sciencequest.model.buisness.createRequestService import fr.iut.sciencequest.model.dto.ScientifiqueDTOs.ScientifiqueDTO import fr.iut.sciencequest.model.dto.ScientifiqueDTOs.ScientifiqueListDTO +import kotlinx.coroutines.flow.flow import retrofit2.Call import retrofit2.Callback import retrofit2.Response import retrofit2.create import java.lang.IllegalArgumentException -fun fetchScientifiqueById(id: Int) { +suspend fun fetchScientifiqueById(id: Int) = flow { val serviceClient = createRequestService().create() - Log.d("Requete API","Fetch un scientifique") - serviceClient.getScientifique(id).enqueue( - object: Callback { - override fun onResponse( - call: Call, - response: Response - ) { - // NOTE : il faudrait probablement utiliser une autre exception - // exception personnalisée ? - val data = response.body() ?: - throw IllegalArgumentException("ERREUR : l'api a donné une réponse vide") - // Devrait appeler le ModelView, la méthode onResponse ne renvoit rien - // Pour le moment des print pour vérifier que la requêtre fonctionne - // sans avoir besoin des vues. - Log.d("Requete API",data.id.toString()) - Log.d("Requete API", data.nom) - } - - override fun onFailure(call: Call, t: Throwable) { - Log.e("Requete API","Erreur lors d'une requete api") - throw t - } - } - ) + try { + val response = serviceClient.getScientifique(id) + emit(response) + } catch (e: Exception) { + Log.e("Requete API",e.message.toString()) + } } -fun fetchScientifiques(index: Int) { +fun fetchScientifiques(index: Int) = flow { val serviceClient = createRequestService().create() - Log.d("Requete API","Fetch plusieurs scientifiques") - serviceClient.getScientifiques(index).enqueue( - object: Callback { - override fun onResponse( - call: Call, - response: Response - ) { - // NOTE : il faudrait probablement utiliser une autre exception - // exception personnalisée ? - val data = response.body() ?: - throw IllegalArgumentException("ERREUR : l'api a donné une réponse vide") - // Devrait appeler le ModelView, la méthode onResponse ne renvoit rien - // Pour le moment des print pour vérifier que la requêtre fonctionne - // sans avoir besoin des vues. - for (scientifique in data.scientifiques) { - - Log.d("Requete API",scientifique.id.toString()) - Log.d("Requete API", scientifique.nom) - } - } - - override fun onFailure(call: Call, t: Throwable) { - Log.e("Requete API","Erreur lors d'une requete api") - throw t - } - } - ) + try { + val response = serviceClient.getScientifiques(index) + emit(response) + } catch (e: Exception) { + Log.e("Requete API",e.message.toString()) + } } \ No newline at end of file From d274a1e45fee4ead1b7618489126406e0e2d3e1d Mon Sep 17 00:00:00 2001 From: Renaud BEURET Date: Wed, 27 Mar 2024 09:29:46 +0100 Subject: [PATCH 2/2] [FIX] ViewModel basique fonctionnel --- .../java/fr/iut/sciencequest/MainActivity.kt | 4 +- .../ViewModels/ScientifiquesDecouvertsVM.kt | 9 ++- .../buisness/Question/QuestionRequestor.kt | 64 +++++++++---------- .../fr/iut/sciencequest/navigation/NavHost.kt | 3 +- .../scientifiques/ScientifiqueListeScreen.kt | 7 +- 5 files changed, 46 insertions(+), 41 deletions(-) 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 b9642b9..5ed99f9 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/MainActivity.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/MainActivity.kt @@ -10,7 +10,6 @@ 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.buisness.fetchScientifiqueById import fr.iut.sciencequest.model.dto.extensions.ToModel import fr.iut.sciencequest.navigation.NavHost import fr.iut.sciencequest.stub.StubScientifique1 @@ -19,6 +18,7 @@ import fr.iut.sciencequest.ui.theme.ScienceQuestTheme class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) + val vm by viewModels() setContent { ScienceQuestTheme { // A surface container using the 'background' color from the theme @@ -26,7 +26,7 @@ class MainActivity : ComponentActivity() { modifier = Modifier.fillMaxSize(), color = MaterialTheme.colorScheme.background ) { - NavHost() + NavHost(vm) } } } 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 index 0f7dd9d..dd762ab 100644 --- a/android/app/src/main/java/fr/iut/sciencequest/ViewModels/ScientifiquesDecouvertsVM.kt +++ b/android/app/src/main/java/fr/iut/sciencequest/ViewModels/ScientifiquesDecouvertsVM.kt @@ -3,18 +3,21 @@ 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.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: MutableList = mutableStateListOf() + var listeScientifique: MutableStateFlow> = MutableStateFlow(ArrayList().toMutableStateList()) // fun getScientifiqueById(id: Int) { // Log.d("ViewModelScientifique", "Recup un scientifique d'id: $id") @@ -26,8 +29,8 @@ class ScientifiquesDecouvertsVM : ViewModel() { fun getScientifiques(page: Int) { Log.d("ViewModelScientifique","Recup la liste de scientifiques") viewModelScope.launch { - fetchScientifiques(page).collect() { - listeScientifique = it.scientifiques.ToModel().toMutableList(); + fetchScientifiques(page).collect { + listeScientifique.value = it.scientifiques.ToModel().toMutableList() } } } 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 index 3dcbc55..e0c0468 100644 --- 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 @@ -10,36 +10,36 @@ import retrofit2.create import java.lang.IllegalArgumentException fun fetchQuestions(index: Int) { - val serviceClient = createRequestService().create() - Log.d("Requete API","Fetch un scientifique") - serviceClient.getQuestion(index).enqueue( - object: Callback { - override fun onResponse( - call: Call, - response: Response - ) { - // NOTE : il faudrait probablement utiliser une autre exception - // exception personnalisée ? - val data = response.body() ?: - throw IllegalArgumentException("ERREUR : l'api a donné une réponse vide") - // Devrait appeler le ModelView, la méthode onResponse ne renvoit rien - // Pour le moment des print pour vérifier que la requêtre fonctionne - // sans avoir besoin des vues. - for (question in data.questions) { - Log.d("Requete Question", "id question: " + question.id.toString()) - Log.d("Requete Question","Libelle: " + question.question) - Log.d("Requete Question","Reponses: ") - for (reponse in question.reponses) { - Log.d("Requete Question","id: " + reponse.id) - Log.d("Requete Question","Libelle: " + reponse.reponse) - } - } - } - - override fun onFailure(call: Call, t: Throwable) { - Log.e("Requete API","Erreur lors d'une requete api") - throw t - } - } - ) + //val serviceClient = createRequestService().create() + //Log.d("Requete API","Fetch un scientifique") + //serviceClient.getQuestion(index).enqueue( + // object: Callback { + // override fun onResponse( + // call: Call, + // response: Response + // ) { + // // NOTE : il faudrait probablement utiliser une autre exception + // // exception personnalisée ? + // val data = response.body() ?: + // throw IllegalArgumentException("ERREUR : l'api a donné une réponse vide") + // // Devrait appeler le ModelView, la méthode onResponse ne renvoit rien + // // Pour le moment des print pour vérifier que la requêtre fonctionne + // // sans avoir besoin des vues. + // for (question in data.questions) { + // Log.d("Requete Question", "id question: " + question.id.toString()) + // Log.d("Requete Question","Libelle: " + question.question) + // Log.d("Requete Question","Reponses: ") + // for (reponse in question.reponses) { + // Log.d("Requete Question","id: " + reponse.id) + // Log.d("Requete Question","Libelle: " + reponse.reponse) + // } + // } + // } +// + // override fun onFailure(call: Call, t: Throwable) { + // Log.e("Requete API","Erreur lors d'une requete api") + // throw t + // } + // } + //) } \ 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 5478677..65889c6 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 @@ -20,9 +20,8 @@ import fr.iut.sciencequest.view.scientifiques.scientifiqueListeScreen @Composable -fun NavHost() { +fun NavHost(scientifiquesDecouvertsVM: ScientifiquesDecouvertsVM) { val navController = rememberNavController() - NavHost( modifier = Modifier.fillMaxSize(), navController = navController, 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 9136861..45dfaf9 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 @@ -3,6 +3,8 @@ package fr.iut.sciencequest.view.scientifiques import android.util.Log import androidx.compose.material3.Scaffold import androidx.compose.runtime.Composable +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 @@ -17,12 +19,13 @@ import fr.iut.sciencequest.view.TopBar fun scientifiqueListeScreen(viewModel: ScientifiquesDecouvertsVM = viewModel(), goToAccount: () -> Unit, goToHome: () -> Unit) { - Log.d("Vue","je suis la") + val liste by viewModel.listeScientifique.collectAsState() Scaffold( topBar = { TopBar(goToAccount, goToHome, stringResource(id = R.string.sc_decouverts)) }, ) { innerPadding -> - scientifiqueListeContainer(viewModel.getScientifiques(), innerPadding) + viewModel.getScientifiques(1) + scientifiqueListeContainer(liste, innerPadding) } } \ No newline at end of file