diff --git a/README.md b/README.md
index 6210e70..b0bfd5d 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,42 @@
-# WF-Android
+# Projet Android What the Fantasy
+# Description
+L'application mobile **What the Fantasy** est une application pour android permettant aux utilisateurs de découvrir des citations célèbres du monde de la fantasy. En plus de pouvoir lire et apprécier les citations, les utilisateurs peuvent créer un compte pour interagir avec elles en les likant, en les commentant, et en participant à des quiz à thème ou aléatoires.
+
+### Fonctionnalités principales
+
+- **Découverte de citations** : Parcourez une large sélection de citations tirées de l'univers de la fantasy.
+- **Interaction avec les citations** : Les utilisateurs connectés peuvent **liker** et **commenter** les citations.
+- **Création de compte utilisateur** : Inscription et connexion des utilisateurs pour accéder à des fonctionnalités supplémentaires.
+- **Quiz interactifs** : Les utilisateurs peuvent participer à des quiz à thème (par exemple, quiz sur les personnages de la fantasy) ou un quiz aléatoire pour deviner qui a dit une citation parmi une liste d'auteurs célèbres.
+
+## Prérequis
+
+Avant d'exécuter l'application sur votre android, vous devez avoir installé les éléments suivants sur votre machine :
+
+- **Android Studio** : L'IDE officiel des applications Android
+ - [Installation d'Android Studio](https://developer.android.com/studio?hl=fr)
+
+
+## Installation
+### 1. Cloner le dépôt
+
+Clonez le dépôt Git sur votre machine locale avec la commande suivante :
+
+```bash
+git clone https://codefirst.iut.uca.fr/git/WhatTheFantasy/WF-Android.git
+```
+### 2. Lancer l'application à travers Android Studio
+Une fois le projet ouvert dans Android Studio, lancer le build du projet, soit sur votre smartphone android physique, soit par un émulateur intégré à Android Studio
+
+
+
+
+## Auteurs
+BRONGNIART Kentin
+BEAULATON Léni
+ROCHER Maxime
+MONDEJAR Kevin
+GUICHARD-MONTGUERS Louis
+NGUYEN Tommy
+
\ No newline at end of file
diff --git a/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/MainActivity.kt b/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/MainActivity.kt
index 2d893b5..cbed7f2 100644
--- a/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/MainActivity.kt
+++ b/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/MainActivity.kt
@@ -4,19 +4,8 @@ import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
-import androidx.compose.foundation.layout.Column
-import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.foundation.layout.padding
-import androidx.compose.material3.Scaffold
-import androidx.compose.material3.Text
-import androidx.compose.runtime.Composable
-import androidx.compose.ui.Modifier
-import androidx.navigation.NavController
import com.example.what_the_fantasy.ui.navigations.AppNavigator
import com.example.what_the_fantasy.ui.theme.What_The_FantasyTheme
-import com.example.what_the_fantasy.ui.screens.LoginPage
-import com.example.what_the_fantasy.ui.screens.ProfilPage
-import com.example.what_the_fantasy.ui.screens.QuizPage
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
@@ -24,9 +13,7 @@ class MainActivity : ComponentActivity() {
enableEdgeToEdge()
setContent {
What_The_FantasyTheme {
-
AppNavigator()
- //QuizPage()
}
}
}
diff --git a/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/ui/components/NavBar.kt b/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/ui/components/NavBar.kt
index 9b64162..49cc408 100644
--- a/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/ui/components/NavBar.kt
+++ b/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/ui/components/NavBar.kt
@@ -1,5 +1,6 @@
package com.example.what_the_fantasy.ui.components
+import androidx.compose.foundation.Image
import androidx.compose.foundation.background
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
@@ -64,7 +65,10 @@ fun NavBar(onProfile : Boolean = false ,
Button(onClick = {},
colors = ButtonDefaults.buttonColors(containerColor = Color.Transparent)
) {
- Text("Theme", fontSize = 25.sp, color = Color.White)
+ Image(
+ painter = painterResource(id = R.drawable.toggle),
+ contentDescription = "Theme"
+ )
}
}
diff --git a/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/ui/components/hashPassword.kt b/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/ui/components/hashPassword.kt
new file mode 100644
index 0000000..2f46a9d
--- /dev/null
+++ b/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/ui/components/hashPassword.kt
@@ -0,0 +1,14 @@
+package com.example.what_the_fantasy.ui.components
+
+import java.security.MessageDigest
+
+fun hashPassword(password: String): String {
+ // SHA-256
+ val digest = MessageDigest.getInstance("SHA-256")
+
+ // Convertir mdp en bytes et appliquer le hash
+ val hashedBytes = digest.digest(password.toByteArray())
+
+ // Convertir le tableau de bytes en une chaîne hexadécimale
+ return hashedBytes.joinToString("") { "%02x".format(it) }
+}
\ No newline at end of file
diff --git a/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/ui/navigations/AppNavigator.kt b/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/ui/navigations/AppNavigator.kt
index cdfdc50..e331f2c 100644
--- a/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/ui/navigations/AppNavigator.kt
+++ b/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/ui/navigations/AppNavigator.kt
@@ -104,7 +104,7 @@ fun AppNavigator() {
}
composable(Destination.Quote.route) { QuotePage() }
composable(Destination.Search.route) { SearchPage() }
- composable(Destination.SignUp.route) { SignUpPage(navController) }
+ composable(Destination.SignUp.route) { SignUpPage(navController, services) }
composable(Destination.SubmitQuote.route) { SubmitQuotePage() }
composable(Destination.QuizMenu.route) {
@@ -138,4 +138,3 @@ fun AppNavigator() {
}
}
}
-
diff --git a/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/ui/screens/ProfilPage.kt b/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/ui/screens/ProfilPage.kt
index 4df4756..57a1fe5 100644
--- a/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/ui/screens/ProfilPage.kt
+++ b/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/ui/screens/ProfilPage.kt
@@ -62,6 +62,8 @@ import com.example.what_the_fantasy.R
import com.example.what_the_fantasy.data.local.QuestionStub
import com.example.what_the_fantasy.data.local.UserStub
import com.example.what_the_fantasy.data.services.IServices
+//import com.example.what_the_fantasy.data.local.UserStub.users
+import com.example.what_the_fantasy.data.services.ServicesStub
import com.example.what_the_fantasy.ui.components.ErrorMessageProfileComponent
import com.example.what_the_fantasy.ui.components.NavBar
import com.example.what_the_fantasy.ui.components.SpaceHeightComponent
@@ -110,14 +112,14 @@ fun ProfilPage(index: Int,
ImageProfil(user.imgUrl, 120)
SpaceHeightComponent(16)
- EditUsername(user.username)// Édition du Username
- SpaceHeightComponent(16)
+ EditUsername(user.username, index, services)// Édition du Username
+ SpaceHeightComponent(16)
- EditEmail(user.email)// Édition du Email
- Spacer(modifier = Modifier.height(8.dp))
+ EditEmail(user.email,index, services)// Édition du Email
+ Spacer(modifier = Modifier.height(8.dp))
- EditPasswd()
- SpaceHeightComponent(16)
+ EditPasswd(index, services)
+ SpaceHeightComponent(16)
// Bouton
ButtonProfile(R.string.ButtonAddQuoteprofile, 18, Color.Black, Color.White)
@@ -145,20 +147,27 @@ fun ImageProfil(imgProfil : String, size :Int){
}
@Composable
-fun EditEmail(userEmail: String) {
+fun EditEmail(userEmail: String, index: Int, service: IServices) {
var email by remember { mutableStateOf(userEmail) }
var isEditingEmail by remember { mutableStateOf(false) }
var emailError by remember { mutableStateOf(false) }
+ fun onDoneEditing() {
+ service.EditEmail(email, index)
+ isEditingEmail = false
+ }
+
if (isEditingEmail) {
EmailEditingField(
email = email,
onEmailChange = { newEmail ->
email = newEmail
- emailError = !Patterns.EMAIL_ADDRESS.matcher(newEmail).matches()
+ emailError = !Patterns.EMAIL_ADDRESS.matcher(newEmail).matches() // Validation email
},
onDone = {
- if (!emailError) isEditingEmail = false
+ if (!emailError) {
+ onDoneEditing()
+ }
},
emailError = emailError
)
@@ -224,18 +233,21 @@ fun DisplayEmail(email: String, onEdit: () -> Unit) {
-
-
@Composable
-fun EditUsername(userName: String) {
+fun EditUsername(userName: String, index: Int, service : IServices) {
var username by remember { mutableStateOf(userName) }
var isEditingUsername by remember { mutableStateOf(false) }
+ fun onDoneEditing() {
+ service.EditUsername(username, index)
+ isEditingUsername = false
+ }
+
if (isEditingUsername) {
UsernameEditingField(
username = username,
onUsernameChange = { username = it },
- onDone = { isEditingUsername = false }
+ onDone = { onDoneEditing() }
)
} else {
DisplayUsername(username = username, onEdit = { isEditingUsername = true })
@@ -258,7 +270,7 @@ fun UsernameEditingField(
imeAction = ImeAction.Done
),
keyboardActions = KeyboardActions(
- onDone = { onDone() } // Quand on appuie sur "Done", on met fin à l'édition
+ onDone = { onDone() }
),
trailingIcon = {
IconButton(onClick = { onDone() }) {
@@ -291,18 +303,22 @@ fun DisplayUsername(username: String, onEdit: () -> Unit) {
-
-
-
@Composable
-fun EditPasswd() {
- var password by remember { mutableStateOf("*******") }
+fun EditPasswd(index: Int, service: IServices) {
+ var password by remember { mutableStateOf("*******") } // Mot de passe actuel (affiché comme un masque)
var isEditingPassword by remember { mutableStateOf(false) }
var newPassword by remember { mutableStateOf("") }
var confirmPassword by remember { mutableStateOf("") }
var passwordVisible by remember { mutableStateOf(false) }
var passwordError by remember { mutableStateOf(false) }
+ // Fonction pour finaliser l'édition du mot de passe et appeler la méthode EditPasswd2
+ fun onDoneEditing() {
+ // Appeler EditPasswd2 pour mettre à jour le mot de passe de l'utilisateur
+ service.EditPasswd(newPassword, index)
+ isEditingPassword = false
+ }
+
if (isEditingPassword) {
PasswordEditingFields(
newPassword = newPassword,
@@ -310,20 +326,19 @@ fun EditPasswd() {
onNewPasswordChange = { newPassword = it },
onConfirmPasswordChange = {
confirmPassword = it
- passwordError = newPassword != it
+ passwordError = newPassword != it // Vérifier si les mots de passe correspondent
},
passwordVisible = passwordVisible,
onPasswordVisibilityChange = { passwordVisible = it },
passwordError = passwordError,
onDone = {
if (!passwordError && newPassword.isNotEmpty()) {
- password = newPassword
- isEditingPassword = false
+ onDoneEditing() // Appeler la fonction onDoneEditing() pour mettre à jour le mot de passe
}
}
)
} else {
- DisplayPassword(onEdit = { isEditingPassword = true })
+ DisplayPassword(onEdit = { isEditingPassword = true }) // Afficher l'option pour modifier le mot de passe
}
}
diff --git a/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/ui/screens/QuizEndPage.kt b/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/ui/screens/QuizEndPage.kt
index 3548590..6b1d652 100644
--- a/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/ui/screens/QuizEndPage.kt
+++ b/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/ui/screens/QuizEndPage.kt
@@ -37,6 +37,25 @@ fun QuizEndPage(idQuiz: Int, points: Int, navControllerQuizMenu: () -> Unit) {
Column(
modifier = Modifier.fillMaxSize().background(Color(0xFF100C1B))
) {
+// // Bandeau supérieur
+// Row(
+// modifier = Modifier
+// .fillMaxWidth()
+// .weight(0.1f)
+// .padding(20.dp),
+// horizontalArrangement = Arrangement.SpaceBetween,
+// verticalAlignment = Alignment.CenterVertically
+// ) {
+// Image(
+// painter = painterResource(id = R.drawable.profile_icon),
+// contentDescription = "Profil",
+// modifier = Modifier.size(50.dp)
+// )
+// Image(
+// painter = painterResource(id = R.drawable.toggle),
+// contentDescription = "Profil"
+// )
+// }
// Contenu principal
Column(
@@ -80,5 +99,34 @@ fun QuizEndPage(idQuiz: Int, points: Int, navControllerQuizMenu: () -> Unit) {
}
}
+// // Bandeau inférieur
+// Row(
+// modifier = Modifier
+// .fillMaxWidth()
+// .weight(0.1f)
+// .background(Color(0xFF300052))
+// .padding(20.dp),
+// horizontalArrangement = Arrangement.SpaceAround,
+// verticalAlignment = Alignment.CenterVertically
+// ) {
+// // Bouton Likes
+// Image(
+// painter = painterResource(id = R.drawable.like_icon),
+// contentDescription = "Bouton",
+// modifier = Modifier.size(50.dp)
+// )
+// // Bouton WhatTheFantasy
+// Image(
+// painter = painterResource(R.drawable.wf_logo),
+// contentDescription = "Menu Button",
+// Modifier.clickable { navControllerQuizMenu() }
+// )
+// // Bouton Quiz
+// Image(
+// painter = painterResource(id = R.drawable.quiz_icon),
+// contentDescription = "Bouton",
+// modifier = Modifier.size(50.dp)
+// )
+// }
}
}
\ No newline at end of file
diff --git a/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/ui/screens/QuizMenu.kt b/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/ui/screens/QuizMenu.kt
index 1a26099..7002a82 100644
--- a/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/ui/screens/QuizMenu.kt
+++ b/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/ui/screens/QuizMenu.kt
@@ -47,12 +47,12 @@ fun QuizMenu(
) {
Spacer(modifier = Modifier.weight(0.1f))
- Column(
- modifier = Modifier
- .weight(0.9f)
- .fillMaxHeight(),
- horizontalAlignment = Alignment.CenterHorizontally
- ) {
+ Column(
+ modifier = Modifier
+ .weight(0.9f)
+ .fillMaxHeight(),
+ horizontalAlignment = Alignment.CenterHorizontally
+ ) {
Box(
modifier = Modifier
.size(width = 150.dp, height = 100.dp)
diff --git a/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/ui/screens/QuizPage.kt b/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/ui/screens/QuizPage.kt
index 8647b43..4d4ed93 100644
--- a/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/ui/screens/QuizPage.kt
+++ b/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/ui/screens/QuizPage.kt
@@ -54,7 +54,25 @@ fun QuizPage(
Column (
modifier = Modifier.fillMaxSize().background(Color(0xFF100C1B))
) {
-
+// // Bandeau supérieur
+// Row(
+// modifier = Modifier
+// .fillMaxWidth()
+// .weight(0.1f)
+// //.background(Color(0xFF300052))
+// .padding(20.dp),
+// horizontalArrangement = Arrangement.SpaceBetween,
+// verticalAlignment = Alignment.CenterVertically
+// ) {
+// Image(
+// painter = painterResource(id = R.drawable.profile_icon),
+// contentDescription = "Profil"
+// )
+// Image(
+// painter = painterResource(id = R.drawable.toggle),
+// contentDescription = "Profil"
+// )
+// }
// Contenu princiapl
Column(
@@ -124,5 +142,33 @@ fun QuizPage(
}
}
+// // Bandeau inférieur
+// Row(
+// modifier = Modifier
+// .fillMaxWidth()
+// .weight(0.1f)
+// .background(Color(0xFF300052))
+// .padding(20.dp),
+// horizontalArrangement = Arrangement.SpaceAround,
+// verticalAlignment = Alignment.CenterVertically
+// ) {
+// // Bouton Likes
+// Image(
+// painter = painterResource(id = R.drawable.like_icon),
+// contentDescription = "Bouton"
+// )
+// // Bouton WhatTheFantasy
+// Image(
+// painter = painterResource(R.drawable.wf_logo),
+// contentDescription = "Menu Button",
+// Modifier.clickable { navControllerQuizMenu() }
+// )
+// // Bouton Quiz
+// Image(
+// painter = painterResource(id = R.drawable.quiz_icon),
+// contentDescription = "Bouton"
+// )
+// }
+
}
}
\ No newline at end of file
diff --git a/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/ui/screens/SignUpPage.kt b/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/ui/screens/SignUpPage.kt
index 3e77782..48c21b8 100644
--- a/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/ui/screens/SignUpPage.kt
+++ b/What_The_Fantasy/app/src/main/java/com/example/what_the_fantasy/ui/screens/SignUpPage.kt
@@ -15,8 +15,11 @@ import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.text.KeyboardOptions
+import androidx.compose.material.icons.Icons
+import androidx.compose.material.icons.filled.Check
import androidx.compose.material3.Button
import androidx.compose.material3.ButtonDefaults
+import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Text
@@ -40,15 +43,23 @@ import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.navigation.NavController
import com.example.what_the_fantasy.R
+import com.example.what_the_fantasy.data.services.IServices
import com.example.what_the_fantasy.ui.components.SpaceHeightComponent
import com.example.what_the_fantasy.ui.components.TitlePageComponent
import com.example.what_the_fantasy.ui.theme.What_The_FantasyTheme
import com.example.what_the_fantasy.ui.theme.colorBackground
import com.example.what_the_fantasy.ui.theme.gradienBox
+import com.example.what_the_fantasy.data.services.ServicesStub
+import com.example.what_the_fantasy.ui.components.ErrorMessageProfileComponent
@Composable
-fun SignUpPage(navController: NavController) {
-
+fun SignUpPage(navController: NavController, services : IServices) {
+ var username by remember { mutableStateOf("") }
+ var email by remember { mutableStateOf("") }
+ var password by remember { mutableStateOf("") }
+ var confirmPassword by remember { mutableStateOf("") }
+ var passwordVisible by remember { mutableStateOf(false) }
+ //val servicesStub = ServicesStub()
Box(
modifier = Modifier
@@ -67,14 +78,14 @@ fun SignUpPage(navController: NavController) {
) {
TitlePageComponent(R.string.titleSignUp, 20,Color.White)
- IdentifiantTextFieldSign(R.string.IdentifiantLogin)
- EmailTextFieldSign("Email*")
- PassWdTextFieldSign(R.string.PasswdLogin)
- PassWdConfirmTextFieldSign(R.string.ConfirmPassWdSignUp)
+ IdentifiantTextFieldSign(R.string.IdentifiantLogin,identifiant = username,onValueChange = { username = it })
+ EmailTextFieldSign(R.string.EmailSignUp, email, onValueChange = { email = it })
+ PassWdTextFieldSign(R.string.PasswdLogin,password, onValueChange = { password = it },passwordVisible,onPasswordVisibilityChange = { passwordVisible = !passwordVisible })
+ PassWdConfirmTextFieldSign(R.string.ConfirmPassWdSignUp,confirmPassword,onValueChange = { confirmPassword = it },passwordVisible,onPasswordVisibilityChange = { passwordVisible = !passwordVisible })
SpaceHeightComponent(16)
- ConnexionButtonSign(R.string.ButtonSignUp,18, Color.White, Color.Black)
+ ConnexionButtonSign(R.string.ButtonSignUp,18, Color.White, Color.Black, username, email, password, confirmPassword, services, navController = navController)
SpaceHeightComponent(16)
- CreateAccountButtonSign(R.string.ButtonLogin,12, Color.White, navController = navController)
+ ReturnLogin(R.string.ButtonLogin,12, Color.White, navController = navController)
}
}
@@ -84,50 +95,47 @@ fun SignUpPage(navController: NavController) {
@Composable
-fun IdentifiantTextFieldSign(textIdentifiantResId : Int){
+fun IdentifiantTextFieldSign(textIdentifiantResId : Int, identifiant: String, onValueChange: (String) -> Unit){
val textIdentifiant = stringResource(id = textIdentifiantResId)
- var identifiant by remember { mutableStateOf("") } // Stocke la valeur du champ
Column(modifier = Modifier.padding(top = 16.dp)) {
OutlinedTextField(
value = identifiant,
- onValueChange = { identifiant = it },
+ onValueChange = onValueChange,
label = { Text(textIdentifiant) },
modifier = Modifier
.fillMaxWidth()
.padding(top = 8.dp),
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Text),
- shape = RoundedCornerShape(16.dp) // 🔹 Bords arrondis
+ shape = RoundedCornerShape(16.dp)
)
}
}
@Composable
-fun EmailTextFieldSign(textIdentifiant : String){
- var identifiant by remember { mutableStateOf("") } // Stocke la valeur du champ
+fun EmailTextFieldSign(textIdentifiantResId: Int, email: String, onValueChange: (String) -> Unit){
+ val textIdentifiant = stringResource(id = textIdentifiantResId)
Column(modifier = Modifier.padding(top = 16.dp)) {
OutlinedTextField(
- value = identifiant,
- onValueChange = { identifiant = it },
+ value = email,
+ onValueChange = onValueChange,
label = { Text(textIdentifiant) },
modifier = Modifier
.fillMaxWidth()
.padding(top = 8.dp),
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Email),
- shape = RoundedCornerShape(16.dp) // Bords arrondis
+ shape = RoundedCornerShape(16.dp)
)
}
}
@Composable
-fun PassWdTextFieldSign(textpasswdResId : Int){
+fun PassWdTextFieldSign(textpasswdResId : Int, passwd: String, onValueChange: (String) -> Unit, passwordVisible: Boolean, onPasswordVisibilityChange: () -> Unit){
val textpasswd = stringResource(id = textpasswdResId)
- var passwd by remember { mutableStateOf("") } // Stocke la valeur du champ
- var passwordVisible by remember { mutableStateOf(false) } // État pour afficher/masquer
Column(modifier = Modifier.padding(top = 10.dp)) {
OutlinedTextField(
value = passwd,
- onValueChange = { passwd = it },
+ onValueChange = onValueChange,
label = { Text(textpasswd) },
modifier = Modifier
.fillMaxWidth()
@@ -135,23 +143,22 @@ fun PassWdTextFieldSign(textpasswdResId : Int){
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password),
visualTransformation = if (passwordVisible) VisualTransformation.None else PasswordVisualTransformation(),
trailingIcon = {
- IconButton(onClick = { passwordVisible = !passwordVisible }) {
+ IconButton(onClick = onPasswordVisibilityChange) {
+ Icon(imageVector = Icons.Default.Check, contentDescription = "Valider")
}
},
- shape = RoundedCornerShape(16.dp) // 🔹 Bords arrondis
+ shape = RoundedCornerShape(16.dp)
)
}
}
@Composable
-fun PassWdConfirmTextFieldSign(textpasswdResId : Int){
+fun PassWdConfirmTextFieldSign(textpasswdResId : Int,confirmPassword: String, onValueChange: (String) -> Unit, passwordVisible: Boolean, onPasswordVisibilityChange: () -> Unit){
val textpasswd = stringResource(id = textpasswdResId)
- var passwd by remember { mutableStateOf("") } // Stocke la valeur du champ
- var passwordVisible by remember { mutableStateOf(false) } // État pour afficher/masquer
Column(modifier = Modifier.padding(top = 10.dp)) {
OutlinedTextField(
- value = passwd,
- onValueChange = { passwd = it },
+ value = confirmPassword,
+ onValueChange = onValueChange,
label = { Text(textpasswd) },
modifier = Modifier
.fillMaxWidth()
@@ -159,31 +166,88 @@ fun PassWdConfirmTextFieldSign(textpasswdResId : Int){
keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Password),
visualTransformation = if (passwordVisible) VisualTransformation.None else PasswordVisualTransformation(),
trailingIcon = {
- IconButton(onClick = { passwordVisible = !passwordVisible }) {
+ IconButton(onClick = onPasswordVisibilityChange) {
+ Icon(imageVector = Icons.Default.Check, contentDescription = "Valider")
}
},
- shape = RoundedCornerShape(16.dp) // 🔹 Bords arrondis
+ shape = RoundedCornerShape(16.dp)
)
}
}
+// Validation de email
+fun isValidEmail(email: String): Boolean {
+ val emailRegex = "[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,6}"
+ return email.matches(emailRegex.toRegex())
+}
+
+// Vérification mots de passe
+fun arePasswordsMatching(password: String, confirmPassword: String): Boolean {
+ return password == confirmPassword
+}
@Composable
-fun ConnexionButtonSign(titleResId : Int, size : Int, colorButton : Color, colorText : Color){
+fun ConnexionButtonSign(
+ titleResId: Int,
+ size: Int,
+ colorButton: Color,
+ colorText: Color,
+ username: String,
+ email: String,
+ password: String,
+ confirmPassword: String,
+ service: IServices,
+ navController: NavController
+) {
val title = stringResource(id = titleResId)
+ var emailError by remember { mutableStateOf(false) }
+ var passwordError by remember { mutableStateOf(false) }
+ var usernameErrorEmpty by remember { mutableStateOf(false) }
+ var usernameErrorExist by remember { mutableStateOf(false) }
+
+
Button(
- onClick = { /* Action */ },
+ onClick = {
+ emailError = !isValidEmail(email)
+
+ passwordError = !arePasswordsMatching(password, confirmPassword)
+
+ usernameErrorEmpty = username.isBlank()
+
+ if (!emailError && !passwordError && !usernameErrorEmpty) {
+ usernameErrorExist = !service.CreateUser(username, email, password, "https://img.freepik.com/vecteurs-libre/personnage-magicien-malefique-fantaisie_1045-193.jpg?size=338&ext=jpg", service)
+ }
+ },
colors = ButtonDefaults.buttonColors(containerColor = colorButton),
- modifier = Modifier
- .fillMaxWidth(),
+ modifier = Modifier.fillMaxWidth(),
) {
Text(title, fontSize = size.sp, color = colorText)
}
+
+ // Afficher erreurs
+ if (usernameErrorEmpty) {
+ ErrorMessageProfileComponent(R.string.ErrorUserEmptySignUp)
+ }
+
+ if (usernameErrorExist) {
+ ErrorMessageProfileComponent(R.string.ErrorUserExistSignUp)
+ }
+
+ if (emailError) {
+ ErrorMessageProfileComponent(R.string.ErrorEmailSignUp)
+
+ }
+ if (passwordError) {
+ ErrorMessageProfileComponent(R.string.ErrorPasswordSignUp)
+ }
+
}
+
+
@Composable
-fun CreateAccountButtonSign(titleResId: Int, size: Int, color: Color, navController: NavController) {
+fun ReturnLogin(titleResId: Int, size: Int, color: Color, navController: NavController) {
val title = stringResource(id = titleResId)
Text(
text = title,
diff --git a/What_The_Fantasy/app/src/main/res/drawable/like_icon.png b/What_The_Fantasy/app/src/main/res/drawable/like_icon.png
new file mode 100644
index 0000000..6d62a6c
Binary files /dev/null and b/What_The_Fantasy/app/src/main/res/drawable/like_icon.png differ
diff --git a/What_The_Fantasy/app/src/main/res/drawable/profile_icon.png b/What_The_Fantasy/app/src/main/res/drawable/profile_icon.png
new file mode 100644
index 0000000..4fe3158
Binary files /dev/null and b/What_The_Fantasy/app/src/main/res/drawable/profile_icon.png differ
diff --git a/What_The_Fantasy/app/src/main/res/drawable/quiz_icon.png b/What_The_Fantasy/app/src/main/res/drawable/quiz_icon.png
new file mode 100644
index 0000000..a4aca0e
Binary files /dev/null and b/What_The_Fantasy/app/src/main/res/drawable/quiz_icon.png differ
diff --git a/What_The_Fantasy/app/src/main/res/drawable/toggle.png b/What_The_Fantasy/app/src/main/res/drawable/toggle.png
new file mode 100644
index 0000000..a21a368
Binary files /dev/null and b/What_The_Fantasy/app/src/main/res/drawable/toggle.png differ
diff --git a/What_The_Fantasy/app/src/main/res/drawable/wf_logo.png b/What_The_Fantasy/app/src/main/res/drawable/wf_logo.png
new file mode 100644
index 0000000..7388be9
Binary files /dev/null and b/What_The_Fantasy/app/src/main/res/drawable/wf_logo.png differ
diff --git a/What_The_Fantasy/app/src/main/res/values-fr/strings.xml b/What_The_Fantasy/app/src/main/res/values-fr/strings.xml
index 9d55b61..a9a859b 100644
--- a/What_The_Fantasy/app/src/main/res/values-fr/strings.xml
+++ b/What_The_Fantasy/app/src/main/res/values-fr/strings.xml
@@ -11,11 +11,17 @@
Votre mot de passe*
Se connecter
Créer son compte
+ Identifiant ou mot de passe incorrect
//Page Sign Up
Inscription
Confirmer mot de passe*
S\'inscrire
+ Email*
+ Email invalide
+ Les mots de passe ne correspondent pas
+ Le nom d\'utilisateur ne peut pas être vide
+ Le nom d\'utilisateur n\'est pas disponible
//Page Profil
Profil
diff --git a/What_The_Fantasy/app/src/main/res/values/strings.xml b/What_The_Fantasy/app/src/main/res/values/strings.xml
index c9ab3e1..b74a681 100644
--- a/What_The_Fantasy/app/src/main/res/values/strings.xml
+++ b/What_The_Fantasy/app/src/main/res/values/strings.xml
@@ -10,11 +10,17 @@
Your password*
Login
Create your account
+ Incorrect username or password
//Page Sign Up
Account creation
Confirm your password*
Create
+ Your email*
+ Invalid email
+ Passwords do not match
+ Username cannot be empty
+ Username is not available
//Page Profil
Profile