Correction TP 6 - P1

This commit is contained in:
Chocolaterie
2025-01-27 16:56:31 +01:00
parent e7d5b82ebe
commit 4a0be3b9d2
5 changed files with 90 additions and 11 deletions

View File

@@ -21,11 +21,6 @@
android:exported="true"
android:label="@string/title_activity_list_article"
android:theme="@style/Theme.TpFilRouge">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".auth.ResetPasswordActivity"
@@ -42,6 +37,11 @@
android:exported="true"
android:label="@string/app_name"
android:theme="@style/Theme.TpFilRouge" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>

View File

@@ -0,0 +1,19 @@
package com.example.tpfilrouge.auth
import com.example.tpfilrouge.api.RetrofitTools.Companion.retrofit
import com.example.tpfilrouge.api.ServiceResponseDTO
import com.example.tpfilrouge.article.Article
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.POST
interface AuthService {
@POST("login")
suspend fun login(@Body loginRequestDTO: LoginRequestDTO) : ServiceResponseDTO<String>
object AuthApi {
val authService : AuthService by lazy { retrofit.create(AuthService::class.java) }
}
}

View File

@@ -11,6 +11,8 @@ import androidx.compose.foundation.layout.Spacer
import androidx.compose.foundation.layout.padding
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
@@ -22,22 +24,29 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import com.example.tpfilrouge.R
import com.example.tpfilrouge.article.ListArticleActivity
import com.example.tpfilrouge.ui.theme.EniButton
import com.example.tpfilrouge.ui.theme.EniPage
import com.example.tpfilrouge.ui.theme.EniTextField
class LoginActivity : ComponentActivity() {
var loginViewModel = LoginViewModel();
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
LoginActivityPage()
LoginActivityPage(loginViewModel);
}
}
}
@Composable
fun LoginActivityPage() {
fun LoginActivityPage(loginViewModel: LoginViewModel) {
// Ecouter les changements de l'email et mot de passe saisies
val emailField by loginViewModel.email.collectAsState()
val passwordField by loginViewModel.password.collectAsState()
val context = LocalContext.current;
@@ -57,9 +66,14 @@ fun LoginActivityPage() {
textAlign = TextAlign.Center,
style = TextStyle(color = Color(0xCCFFFFFF))
)
EniTextField(stringResource(R.string.email))
EniTextField(stringResource(R.string.password))
EniButton(stringResource(R.string.connection), onClick = {})
EniTextField(stringResource(R.string.email), value = emailField, onValueChange = { value -> loginViewModel.email.value = value; })
EniTextField(stringResource(R.string.password), value = passwordField, onValueChange = { value -> loginViewModel.password.value = value; })
EniButton(stringResource(R.string.connection), onClick = { loginViewModel.callLoginApi(
onSuccess = {
// je change de page (page article
context.startActivity(Intent(context, ListArticleActivity::class.java))
}
) })
EniButton(stringResource(R.string.forget_password),
onClick = {
// Changer de page (d'activity)
@@ -88,5 +102,5 @@ fun LoginActivityPage() {
)
@Composable
fun LoginActivityPreview() {
LoginActivityPage()
LoginActivityPage(LoginViewModel())
}

View File

@@ -0,0 +1,4 @@
package com.example.tpfilrouge.auth
data class LoginRequestDTO(var email: String, var password : String) {
}

View File

@@ -0,0 +1,42 @@
package com.example.tpfilrouge.auth
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.example.tpfilrouge.helpers.AppDialogHelpers
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.launch
class LoginViewModel : ViewModel() {
// Ecouter la saisie de email et password
var email = MutableStateFlow("isaac@gmail.com")
var password = MutableStateFlow("password")
fun callLoginApi(onSuccess : () -> Unit = {}){
AppDialogHelpers.get().showDialog("Tentive de connexion...");
viewModelScope.launch {
// Preparer le DTO à envoyer dans request body
// Le DTO qui contient : email et password
val loginRequest = LoginRequestDTO(email.value, password.value);
// Appel api async
val responseService = AuthService.AuthApi.authService.login(loginRequest);
// Fermer la popup de chargement aprés l'appel de API
AppDialogHelpers.get().closeDialog()
// Si connexion ok
if (responseService.code.equals("200")){
// Je notifie que c'est ok
println("Connexion OK")
// Note: J'appel la fonction que j'envoie en parametre de la fonction
onSuccess();
}
else{
// Erreur
println("Connexion échouée")
}
}
}
}