diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 962a776..1a15121 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -21,11 +21,6 @@ android:exported="true" android:label="@string/title_activity_list_article" android:theme="@style/Theme.TpFilRouge"> - - - - - + + + + + diff --git a/app/src/main/java/com/example/tpfilrouge/auth/AuthService.kt b/app/src/main/java/com/example/tpfilrouge/auth/AuthService.kt new file mode 100644 index 0000000..1775952 --- /dev/null +++ b/app/src/main/java/com/example/tpfilrouge/auth/AuthService.kt @@ -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 + + object AuthApi { + val authService : AuthService by lazy { retrofit.create(AuthService::class.java) } + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/example/tpfilrouge/auth/LoginActivity.kt b/app/src/main/java/com/example/tpfilrouge/auth/LoginActivity.kt index 2b5ec17..25c4854 100644 --- a/app/src/main/java/com/example/tpfilrouge/auth/LoginActivity.kt +++ b/app/src/main/java/com/example/tpfilrouge/auth/LoginActivity.kt @@ -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()) } \ No newline at end of file diff --git a/app/src/main/java/com/example/tpfilrouge/auth/LoginRequestDTO.kt b/app/src/main/java/com/example/tpfilrouge/auth/LoginRequestDTO.kt new file mode 100644 index 0000000..eb64fe1 --- /dev/null +++ b/app/src/main/java/com/example/tpfilrouge/auth/LoginRequestDTO.kt @@ -0,0 +1,4 @@ +package com.example.tpfilrouge.auth + +data class LoginRequestDTO(var email: String, var password : String) { +} \ No newline at end of file diff --git a/app/src/main/java/com/example/tpfilrouge/auth/LoginViewModel.kt b/app/src/main/java/com/example/tpfilrouge/auth/LoginViewModel.kt new file mode 100644 index 0000000..f2046a8 --- /dev/null +++ b/app/src/main/java/com/example/tpfilrouge/auth/LoginViewModel.kt @@ -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") + } + } + } +} \ No newline at end of file