Merge pull request 'ViewModel' (#24) from ViewModel into Android

Reviewed-on: #24
RepositoryAndroid
Renaud BEURET 1 year ago
commit 51056b2d92

@ -10,7 +10,6 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface import androidx.compose.material3.Surface
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import fr.iut.sciencequest.ViewModels.ScientifiquesDecouvertsVM 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.model.dto.extensions.ToModel
import fr.iut.sciencequest.navigation.NavHost import fr.iut.sciencequest.navigation.NavHost
import fr.iut.sciencequest.stub.StubScientifique1 import fr.iut.sciencequest.stub.StubScientifique1
@ -19,8 +18,7 @@ import fr.iut.sciencequest.ui.theme.ScienceQuestTheme
class MainActivity : ComponentActivity() { class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
val vm = viewModels<ScientifiquesDecouvertsVM>().value val vm by viewModels<ScientifiquesDecouvertsVM>()
vm.addScientifiques(StubScientifique1.ToModel())
setContent { setContent {
ScienceQuestTheme { ScienceQuestTheme {
// A surface container using the 'background' color from the theme // A surface container using the 'background' color from the theme
@ -28,7 +26,7 @@ class MainActivity : ComponentActivity() {
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background color = MaterialTheme.colorScheme.background
) { ) {
NavHost() NavHost(vm)
} }
} }
} }

@ -3,22 +3,35 @@ package fr.iut.sciencequest.ViewModels
import android.util.Log import android.util.Log
import androidx.compose.runtime.MutableState import androidx.compose.runtime.MutableState
import androidx.compose.runtime.mutableStateListOf 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.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 fr.iut.sciencequest.model.metier.Scientifique
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.launch
class ScientifiquesDecouvertsVM : ViewModel() { class ScientifiquesDecouvertsVM : ViewModel() {
private var listeScientifique: MutableList<Scientifique> = mutableStateListOf<Scientifique>() var listeScientifique: MutableStateFlow<MutableList<Scientifique>> = MutableStateFlow(ArrayList<Scientifique>().toMutableStateList())
fun getScientifiques(): MutableList<Scientifique> { // fun getScientifiqueById(id: Int) {
Log.d("ViewModel","""je get un scientifique, taille act : ${listeScientifique.size}""") // Log.d("ViewModelScientifique", "Recup un scientifique d'id: $id")
return listeScientifique // var scientifique: Scientifique
// viewModelScope.launch {
//
// }
// }
fun getScientifiques(page: Int) {
Log.d("ViewModelScientifique","Recup la liste de scientifiques")
viewModelScope.launch {
fetchScientifiques(page).collect {
listeScientifique.value = it.scientifiques.ToModel().toMutableList()
} }
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")
} }
} }
} }

@ -10,36 +10,36 @@ import retrofit2.create
import java.lang.IllegalArgumentException import java.lang.IllegalArgumentException
fun fetchQuestions(index: Int) { fun fetchQuestions(index: Int) {
val serviceClient = createRequestService().create<QuestionRequestService>() //val serviceClient = createRequestService().create<QuestionRequestService>()
Log.d("Requete API","Fetch un scientifique") //Log.d("Requete API","Fetch un scientifique")
serviceClient.getQuestion(index).enqueue( //serviceClient.getQuestion(index).enqueue(
object: Callback<QuestionListDTO> { // object: Callback<QuestionListDTO> {
override fun onResponse( // override fun onResponse(
call: Call<QuestionListDTO>, // call: Call<QuestionListDTO>,
response: Response<QuestionListDTO> // response: Response<QuestionListDTO>
) { // ) {
// NOTE : il faudrait probablement utiliser une autre exception // // NOTE : il faudrait probablement utiliser une autre exception
// exception personnalisée ? // // exception personnalisée ?
val data = response.body() ?: // val data = response.body() ?:
throw IllegalArgumentException("ERREUR : l'api a donné une réponse vide") // throw IllegalArgumentException("ERREUR : l'api a donné une réponse vide")
// Devrait appeler le ModelView, la méthode onResponse ne renvoit rien // // Devrait appeler le ModelView, la méthode onResponse ne renvoit rien
// Pour le moment des print pour vérifier que la requêtre fonctionne // // Pour le moment des print pour vérifier que la requêtre fonctionne
// sans avoir besoin des vues. // // sans avoir besoin des vues.
for (question in data.questions) { // for (question in data.questions) {
Log.d("Requete Question", "id question: " + question.id.toString()) // Log.d("Requete Question", "id question: " + question.id.toString())
Log.d("Requete Question","Libelle: " + question.question) // Log.d("Requete Question","Libelle: " + question.question)
Log.d("Requete Question","Reponses: ") // Log.d("Requete Question","Reponses: ")
for (reponse in question.reponses) { // for (reponse in question.reponses) {
Log.d("Requete Question","id: " + reponse.id) // Log.d("Requete Question","id: " + reponse.id)
Log.d("Requete Question","Libelle: " + reponse.reponse) // Log.d("Requete Question","Libelle: " + reponse.reponse)
} // }
} // }
} // }
//
override fun onFailure(call: Call<QuestionListDTO>, t: Throwable) { // override fun onFailure(call: Call<QuestionListDTO>, t: Throwable) {
Log.e("Requete API","Erreur lors d'une requete api") // Log.e("Requete API","Erreur lors d'une requete api")
throw t // throw t
} // }
} // }
) //)
} }

@ -14,8 +14,8 @@ import retrofit2.http.Query
interface ScientifiqueRequestService { interface ScientifiqueRequestService {
@GET("scientifiques?page") @GET("scientifiques?page")
fun getScientifiques(@Query("page") index: Int): Call<ScientifiqueListDTO> suspend fun getScientifiques(@Query("page") index: Int): ScientifiqueListDTO
@GET("scientifiques/{id}") @GET("scientifiques/{id}")
fun getScientifique(@Path("id") id: Int): Call<ScientifiqueDTO> suspend fun getScientifique(@Path("id") id: Int): ScientifiqueDTO
} }

@ -4,67 +4,29 @@ import android.util.Log
import fr.iut.sciencequest.model.buisness.createRequestService import fr.iut.sciencequest.model.buisness.createRequestService
import fr.iut.sciencequest.model.dto.ScientifiqueDTOs.ScientifiqueDTO import fr.iut.sciencequest.model.dto.ScientifiqueDTOs.ScientifiqueDTO
import fr.iut.sciencequest.model.dto.ScientifiqueDTOs.ScientifiqueListDTO import fr.iut.sciencequest.model.dto.ScientifiqueDTOs.ScientifiqueListDTO
import kotlinx.coroutines.flow.flow
import retrofit2.Call import retrofit2.Call
import retrofit2.Callback import retrofit2.Callback
import retrofit2.Response import retrofit2.Response
import retrofit2.create import retrofit2.create
import java.lang.IllegalArgumentException import java.lang.IllegalArgumentException
fun fetchScientifiqueById(id: Int) { suspend fun fetchScientifiqueById(id: Int) = flow {
val serviceClient = createRequestService().create<ScientifiqueRequestService>() val serviceClient = createRequestService().create<ScientifiqueRequestService>()
Log.d("Requete API","Fetch un scientifique") try {
serviceClient.getScientifique(id).enqueue( val response = serviceClient.getScientifique(id)
object: Callback<ScientifiqueDTO> { emit(response)
override fun onResponse( } catch (e: Exception) {
call: Call<ScientifiqueDTO>, Log.e("Requete API",e.message.toString())
response: Response<ScientifiqueDTO>
) {
// 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<ScientifiqueDTO>, t: Throwable) {
Log.e("Requete API","Erreur lors d'une requete api")
throw t
}
}
)
} }
fun fetchScientifiques(index: Int) { fun fetchScientifiques(index: Int) = flow {
val serviceClient = createRequestService().create<ScientifiqueRequestService>() val serviceClient = createRequestService().create<ScientifiqueRequestService>()
Log.d("Requete API","Fetch plusieurs scientifiques") try {
serviceClient.getScientifiques(index).enqueue( val response = serviceClient.getScientifiques(index)
object: Callback<ScientifiqueListDTO> { emit(response)
override fun onResponse( } catch (e: Exception) {
call: Call<ScientifiqueListDTO>, Log.e("Requete API",e.message.toString())
response: Response<ScientifiqueListDTO>
) {
// 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<ScientifiqueListDTO>, t: Throwable) {
Log.e("Requete API","Erreur lors d'une requete api")
throw t
}
} }
)
} }

@ -20,9 +20,8 @@ import fr.iut.sciencequest.view.scientifiques.scientifiqueListeScreen
@Composable @Composable
fun NavHost() { fun NavHost(scientifiquesDecouvertsVM: ScientifiquesDecouvertsVM) {
val navController = rememberNavController() val navController = rememberNavController()
NavHost( NavHost(
modifier = Modifier.fillMaxSize(), modifier = Modifier.fillMaxSize(),
navController = navController, navController = navController,

@ -3,6 +3,8 @@ package fr.iut.sciencequest.view.scientifiques
import android.util.Log import android.util.Log
import androidx.compose.material3.Scaffold import androidx.compose.material3.Scaffold
import androidx.compose.runtime.Composable 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.res.stringResource
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.lifecycle.viewmodel.compose.viewModel import androidx.lifecycle.viewmodel.compose.viewModel
@ -17,12 +19,13 @@ import fr.iut.sciencequest.view.TopBar
fun scientifiqueListeScreen(viewModel: ScientifiquesDecouvertsVM = viewModel(), fun scientifiqueListeScreen(viewModel: ScientifiquesDecouvertsVM = viewModel(),
goToAccount: () -> Unit, goToAccount: () -> Unit,
goToHome: () -> Unit) { goToHome: () -> Unit) {
Log.d("Vue","je suis la") val liste by viewModel.listeScientifique.collectAsState()
Scaffold( Scaffold(
topBar = { topBar = {
TopBar(goToAccount, goToHome, stringResource(id = R.string.sc_decouverts)) TopBar(goToAccount, goToHome, stringResource(id = R.string.sc_decouverts))
}, },
) { innerPadding -> ) { innerPadding ->
scientifiqueListeContainer(viewModel.getScientifiques(), innerPadding) viewModel.getScientifiques(1)
scientifiqueListeContainer(liste, innerPadding)
} }
} }
Loading…
Cancel
Save