ViewModel #24

Merged
renaud.beuret merged 2 commits from ViewModel into Android 1 year ago

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

@ -3,22 +3,35 @@ 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() {
private var listeScientifique: MutableList<Scientifique> = mutableStateListOf<Scientifique>()
var listeScientifique: MutableStateFlow<MutableList<Scientifique>> = MutableStateFlow(ArrayList<Scientifique>().toMutableStateList())
fun getScientifiques(): MutableList<Scientifique> {
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.value = it.scientifiques.ToModel().toMutableList()
}
}
}
}

@ -10,36 +10,36 @@ import retrofit2.create
import java.lang.IllegalArgumentException
fun fetchQuestions(index: Int) {
val serviceClient = createRequestService().create<QuestionRequestService>()
Log.d("Requete API","Fetch un scientifique")
serviceClient.getQuestion(index).enqueue(
object: Callback<QuestionListDTO> {
override fun onResponse(
call: Call<QuestionListDTO>,
response: Response<QuestionListDTO>
) {
// 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<QuestionListDTO>, t: Throwable) {
Log.e("Requete API","Erreur lors d'une requete api")
throw t
}
}
)
//val serviceClient = createRequestService().create<QuestionRequestService>()
//Log.d("Requete API","Fetch un scientifique")
//serviceClient.getQuestion(index).enqueue(
// object: Callback<QuestionListDTO> {
// override fun onResponse(
// call: Call<QuestionListDTO>,
// response: Response<QuestionListDTO>
// ) {
// // 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<QuestionListDTO>, t: Throwable) {
// Log.e("Requete API","Erreur lors d'une requete api")
// throw t
// }
// }
//)
}

@ -14,8 +14,8 @@ import retrofit2.http.Query
interface ScientifiqueRequestService {
@GET("scientifiques?page")
fun getScientifiques(@Query("page") index: Int): Call<ScientifiqueListDTO>
suspend fun getScientifiques(@Query("page") index: Int): ScientifiqueListDTO
@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.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<ScientifiqueRequestService>()
Log.d("Requete API","Fetch un scientifique")
serviceClient.getScientifique(id).enqueue(
object: Callback<ScientifiqueDTO> {
override fun onResponse(
call: Call<ScientifiqueDTO>,
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
}
}
)
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<ScientifiqueRequestService>()
Log.d("Requete API","Fetch plusieurs scientifiques")
serviceClient.getScientifiques(index).enqueue(
object: Callback<ScientifiqueListDTO> {
override fun onResponse(
call: Call<ScientifiqueListDTO>,
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
}
}
)
try {
val response = serviceClient.getScientifiques(index)
emit(response)
} catch (e: Exception) {
Log.e("Requete API",e.message.toString())
}
}

@ -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,

@ -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)
}
}
Loading…
Cancel
Save