Correction TP 7 Auth Fragment

This commit is contained in:
Chocolaterie
2025-01-29 12:21:21 +01:00
parent 87bf72571a
commit 7b313b2ca8
6 changed files with 120 additions and 85 deletions

View File

@@ -49,6 +49,7 @@ dependencies {
implementation(libs.androidx.ui.graphics) implementation(libs.androidx.ui.graphics)
implementation(libs.androidx.ui.tooling.preview) implementation(libs.androidx.ui.tooling.preview)
implementation(libs.androidx.material3) implementation(libs.androidx.material3)
implementation(libs.androidx.navigation.compose)
testImplementation(libs.junit) testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit) androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core) androidTestImplementation(libs.androidx.espresso.core)

View File

@@ -0,0 +1,46 @@
package com.example.tpfilrouge.auth
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.tooling.preview.Preview
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
class AuthActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
AuthActivityPage()
}
}
}
@Composable
fun AuthActivityPage() {
val navController = rememberNavController();
NavHost(
navController = navController,
startDestination = "login"
){
composable("login") { LoginFragmentPage(LoginViewModel(), navController) }
composable("sign_up") { SignUpFragmentPage(SignUpViewModel()) }
composable("reset_password") { ResetPasswordFragmentPage(ResetPasswordViewModel()) }
}
}
@Preview(
showBackground = true,
locale = "en"
)
@Composable
fun AuthActivityPreview() {
AuthActivityPage()
}

View File

@@ -1,10 +1,6 @@
package com.example.tpfilrouge.auth package com.example.tpfilrouge.auth
import android.content.Intent import android.content.Intent
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.Spacer
@@ -23,27 +19,15 @@ import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import com.example.tpfilrouge.R import com.example.tpfilrouge.R
import com.example.tpfilrouge.article.ListArticleActivity import com.example.tpfilrouge.article.ListArticleActivity
import com.example.tpfilrouge.ui.theme.EniButton import com.example.tpfilrouge.ui.theme.EniButton
import com.example.tpfilrouge.ui.theme.EniPage import com.example.tpfilrouge.ui.theme.EniPage
import com.example.tpfilrouge.ui.theme.EniTextField import com.example.tpfilrouge.ui.theme.EniTextField
class LoginActivity : ComponentActivity() {
var loginViewModel = LoginViewModel();
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
LoginActivityPage(loginViewModel);
}
}
}
@Composable @Composable
fun LoginActivityPage(loginViewModel: LoginViewModel) { fun LoginFragmentPage(loginViewModel: LoginViewModel, navController: NavController? = null) {
// Ecouter les changements de l'email et mot de passe saisies // Ecouter les changements de l'email et mot de passe saisies
val emailField by loginViewModel.email.collectAsState() val emailField by loginViewModel.email.collectAsState()
val passwordField by loginViewModel.password.collectAsState() val passwordField by loginViewModel.password.collectAsState()
@@ -66,18 +50,25 @@ fun LoginActivityPage(loginViewModel: LoginViewModel) {
textAlign = TextAlign.Center, textAlign = TextAlign.Center,
style = TextStyle(color = Color(0xCCFFFFFF)) style = TextStyle(color = Color(0xCCFFFFFF))
) )
EniTextField(stringResource(R.string.email), value = emailField, onValueChange = { value -> loginViewModel.email.value = value; }) EniTextField(
EniTextField(stringResource(R.string.password), value = passwordField, onValueChange = { value -> loginViewModel.password.value = value; }) stringResource(R.string.email),
EniButton(stringResource(R.string.connection), onClick = { loginViewModel.callLoginApi( 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 = { onSuccess = {
// je change de page (page article // je change de page (page article
context.startActivity(Intent(context, ListArticleActivity::class.java)) context.startActivity(Intent(context, ListArticleActivity::class.java))
} }
) }) )
})
EniButton(stringResource(R.string.forget_password), EniButton(stringResource(R.string.forget_password),
onClick = { onClick = {
// Changer de page (d'activity) navController!!.navigate("reset_password");
context.startActivity(Intent(context, ResetPasswordActivity::class.java))
}) })
Spacer(modifier = Modifier.weight(1f)) Spacer(modifier = Modifier.weight(1f))
Text( Text(
@@ -88,8 +79,7 @@ fun LoginActivityPage(loginViewModel: LoginViewModel) {
) )
EniButton(stringResource(R.string.register_now), EniButton(stringResource(R.string.register_now),
onClick = { onClick = {
// Changer de page (d'activity) navController!!.navigate("sign_up");
context.startActivity(Intent(context, SignUpActivity::class.java))
}) })
} }
} }
@@ -101,6 +91,6 @@ fun LoginActivityPage(loginViewModel: LoginViewModel) {
locale = "en" locale = "en"
) )
@Composable @Composable
fun LoginActivityPreview() { fun LoginFragmentPreview() {
LoginActivityPage(LoginViewModel()) LoginFragmentPage(LoginViewModel())
} }

View File

@@ -1,9 +1,5 @@
package com.example.tpfilrouge.auth package com.example.tpfilrouge.auth
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
@@ -20,39 +16,33 @@ import com.example.tpfilrouge.ui.theme.EniButton
import com.example.tpfilrouge.ui.theme.EniPage import com.example.tpfilrouge.ui.theme.EniPage
import com.example.tpfilrouge.ui.theme.EniTextField import com.example.tpfilrouge.ui.theme.EniTextField
class ResetPasswordActivity : ComponentActivity() {
var resetPasswordViewModel = ResetPasswordViewModel();
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
ResetPasswordActivityPage(resetPasswordViewModel)
}
}
}
@Composable @Composable
fun ResetPasswordActivityPage(resetPasswordViewModel: ResetPasswordViewModel) { fun ResetPasswordFragmentPage(resetPasswordViewModel: ResetPasswordViewModel) {
val emailField by resetPasswordViewModel.email.collectAsState(); val emailField by resetPasswordViewModel.email.collectAsState();
EniPage { EniPage {
Column( Column(
horizontalAlignment = Alignment.CenterHorizontally, horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier.padding(40.dp)) { modifier = Modifier.padding(40.dp)
) {
Image( Image(
painter = painterResource(id = R.drawable.reset_password_ic), painter = painterResource(id = R.drawable.reset_password_ic),
contentDescription = "Logo SignUp", contentDescription = "Logo SignUp",
modifier = Modifier.padding(vertical = 40.dp)) modifier = Modifier.padding(vertical = 40.dp)
EniTextField("Email", value = emailField, onValueChange = { value -> resetPasswordViewModel.email.value = value}) )
EniButton("Envoyer le lien de récupération", onClick = { resetPasswordViewModel.callResetPasswordApi() }) EniTextField(
"Email",
value = emailField,
onValueChange = { value -> resetPasswordViewModel.email.value = value })
EniButton(
"Envoyer le lien de récupération",
onClick = { resetPasswordViewModel.callResetPasswordApi() })
} }
} }
} }
@Preview(showBackground = true) @Preview(showBackground = true)
@Composable @Composable
fun ResetPasswordActivityPreview() { fun ResetPasswordFragmentPreview() {
ResetPasswordActivityPage(ResetPasswordViewModel()) ResetPasswordFragmentPage(ResetPasswordViewModel())
} }

View File

@@ -1,9 +1,5 @@
package com.example.tpfilrouge.auth package com.example.tpfilrouge.auth
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
@@ -20,21 +16,8 @@ import com.example.tpfilrouge.ui.theme.EniButton
import com.example.tpfilrouge.ui.theme.EniPage import com.example.tpfilrouge.ui.theme.EniPage
import com.example.tpfilrouge.ui.theme.EniTextField import com.example.tpfilrouge.ui.theme.EniTextField
class SignUpActivity : ComponentActivity() {
var signUpViewModel = SignUpViewModel();
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
SignUpActivityPage(signUpViewModel)
}
}
}
@Composable @Composable
fun SignUpActivityPage(signUpViewModel: SignUpViewModel) { fun SignUpFragmentPage(signUpViewModel: SignUpViewModel) {
// Ecouter et synchronser les champs saisies // Ecouter et synchronser les champs saisies
val emailField by signUpViewModel.email.collectAsState() val emailField by signUpViewModel.email.collectAsState()
val pseudoField by signUpViewModel.pseudo.collectAsState() val pseudoField by signUpViewModel.pseudo.collectAsState()
@@ -47,18 +30,41 @@ fun SignUpActivityPage(signUpViewModel: SignUpViewModel) {
EniPage { EniPage {
Column( Column(
horizontalAlignment = Alignment.CenterHorizontally, horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier.padding(40.dp)) { modifier = Modifier.padding(40.dp)
) {
Image( Image(
painter = painterResource(id = R.drawable.sign_up), painter = painterResource(id = R.drawable.sign_up),
contentDescription = "Logo SignUp", contentDescription = "Logo SignUp",
modifier = Modifier.padding(vertical = 10.dp)) modifier = Modifier.padding(vertical = 10.dp)
EniTextField("Pseudo", value = pseudoField, onValueChange = { value -> signUpViewModel.pseudo.value = value; }) )
EniTextField("Email", value = emailField, onValueChange = { value -> signUpViewModel.email.value = value; }) EniTextField(
EniTextField("Password", value = passwordField, onValueChange = { value -> signUpViewModel.password.value = value; }) "Pseudo",
EniTextField("Password Confirmation", value = passwordConfirmField, onValueChange = { value -> signUpViewModel.passwordConfirm.value = value; }) value = pseudoField,
EniTextField("City Code", value = cityCodeField, onValueChange = { value -> signUpViewModel.cityCode.value = value; }) onValueChange = { value -> signUpViewModel.pseudo.value = value; })
EniTextField("City", value = cityField, onValueChange = { value -> signUpViewModel.city.value = value; }) EniTextField(
EniTextField("Phone Number", value = phoneField, onValueChange = { value -> signUpViewModel.phone.value = value; }) "Email",
value = emailField,
onValueChange = { value -> signUpViewModel.email.value = value; })
EniTextField(
"Password",
value = passwordField,
onValueChange = { value -> signUpViewModel.password.value = value; })
EniTextField(
"Password Confirmation",
value = passwordConfirmField,
onValueChange = { value -> signUpViewModel.passwordConfirm.value = value; })
EniTextField(
"City Code",
value = cityCodeField,
onValueChange = { value -> signUpViewModel.cityCode.value = value; })
EniTextField(
"City",
value = cityField,
onValueChange = { value -> signUpViewModel.city.value = value; })
EniTextField(
"Phone Number",
value = phoneField,
onValueChange = { value -> signUpViewModel.phone.value = value; })
EniButton("Sign Up", onClick = { signUpViewModel.callSignUpApi() }) EniButton("Sign Up", onClick = { signUpViewModel.callSignUpApi() })
} }
} }
@@ -66,6 +72,6 @@ fun SignUpActivityPage(signUpViewModel: SignUpViewModel) {
@Preview(showBackground = true) @Preview(showBackground = true)
@Composable @Composable
fun SignUpActivityPreview() { fun SignUpFragmentPreview() {
SignUpActivityPage(SignUpViewModel()) SignUpFragmentPage(SignUpViewModel())
} }

View File

@@ -8,6 +8,7 @@ espressoCore = "3.5.1"
lifecycleRuntimeKtx = "2.6.1" lifecycleRuntimeKtx = "2.6.1"
activityCompose = "1.8.0" activityCompose = "1.8.0"
composeBom = "2024.04.01" composeBom = "2024.04.01"
navigationCompose = "2.8.5"
[libraries] [libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
@@ -24,6 +25,7 @@ androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-toolin
androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" } androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" }
androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" } androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" }
androidx-material3 = { group = "androidx.compose.material3", name = "material3" } androidx-material3 = { group = "androidx.compose.material3", name = "material3" }
androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigationCompose" }
[plugins] [plugins]
android-application = { id = "com.android.application", version.ref = "agp" } android-application = { id = "com.android.application", version.ref = "agp" }