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.tooling.preview)
implementation(libs.androidx.material3)
implementation(libs.androidx.navigation.compose)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
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
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.layout.Column
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.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
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(loginViewModel);
}
}
}
@Composable
fun LoginActivityPage(loginViewModel: LoginViewModel) {
fun LoginFragmentPage(loginViewModel: LoginViewModel, navController: NavController? = null) {
// Ecouter les changements de l'email et mot de passe saisies
val emailField by loginViewModel.email.collectAsState()
val passwordField by loginViewModel.password.collectAsState()
@@ -66,18 +50,25 @@ fun LoginActivityPage(loginViewModel: LoginViewModel) {
textAlign = TextAlign.Center,
style = TextStyle(color = Color(0xCCFFFFFF))
)
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(
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)
context.startActivity(Intent(context, ResetPasswordActivity::class.java))
navController!!.navigate("reset_password");
})
Spacer(modifier = Modifier.weight(1f))
Text(
@@ -88,8 +79,7 @@ fun LoginActivityPage(loginViewModel: LoginViewModel) {
)
EniButton(stringResource(R.string.register_now),
onClick = {
// Changer de page (d'activity)
context.startActivity(Intent(context, SignUpActivity::class.java))
navController!!.navigate("sign_up");
})
}
}
@@ -101,6 +91,6 @@ fun LoginActivityPage(loginViewModel: LoginViewModel) {
locale = "en"
)
@Composable
fun LoginActivityPreview() {
LoginActivityPage(LoginViewModel())
fun LoginFragmentPreview() {
LoginFragmentPage(LoginViewModel())
}

View File

@@ -1,9 +1,5 @@
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.layout.Column
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.EniTextField
class ResetPasswordActivity : ComponentActivity() {
var resetPasswordViewModel = ResetPasswordViewModel();
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
ResetPasswordActivityPage(resetPasswordViewModel)
}
}
}
@Composable
fun ResetPasswordActivityPage(resetPasswordViewModel: ResetPasswordViewModel) {
fun ResetPasswordFragmentPage(resetPasswordViewModel: ResetPasswordViewModel) {
val emailField by resetPasswordViewModel.email.collectAsState();
EniPage {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier.padding(40.dp)) {
modifier = Modifier.padding(40.dp)
) {
Image(
painter = painterResource(id = R.drawable.reset_password_ic),
contentDescription = "Logo SignUp",
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() })
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() })
}
}
}
@Preview(showBackground = true)
@Composable
fun ResetPasswordActivityPreview() {
ResetPasswordActivityPage(ResetPasswordViewModel())
fun ResetPasswordFragmentPreview() {
ResetPasswordFragmentPage(ResetPasswordViewModel())
}

View File

@@ -1,9 +1,5 @@
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.layout.Column
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.EniTextField
class SignUpActivity : ComponentActivity() {
var signUpViewModel = SignUpViewModel();
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
SignUpActivityPage(signUpViewModel)
}
}
}
@Composable
fun SignUpActivityPage(signUpViewModel: SignUpViewModel) {
fun SignUpFragmentPage(signUpViewModel: SignUpViewModel) {
// Ecouter et synchronser les champs saisies
val emailField by signUpViewModel.email.collectAsState()
val pseudoField by signUpViewModel.pseudo.collectAsState()
@@ -47,18 +30,41 @@ fun SignUpActivityPage(signUpViewModel: SignUpViewModel) {
EniPage {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier.padding(40.dp)) {
modifier = Modifier.padding(40.dp)
) {
Image(
painter = painterResource(id = R.drawable.sign_up),
contentDescription = "Logo SignUp",
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("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; })
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(
"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() })
}
}
@@ -66,6 +72,6 @@ fun SignUpActivityPage(signUpViewModel: SignUpViewModel) {
@Preview(showBackground = true)
@Composable
fun SignUpActivityPreview() {
SignUpActivityPage(SignUpViewModel())
fun SignUpFragmentPreview() {
SignUpFragmentPage(SignUpViewModel())
}

View File

@@ -8,6 +8,7 @@ espressoCore = "3.5.1"
lifecycleRuntimeKtx = "2.6.1"
activityCompose = "1.8.0"
composeBom = "2024.04.01"
navigationCompose = "2.8.5"
[libraries]
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-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" }
androidx-material3 = { group = "androidx.compose.material3", name = "material3" }
androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigationCompose" }
[plugins]
android-application = { id = "com.android.application", version.ref = "agp" }