finition de la barre de navigation (avec sauvegarde de l'utilisateur)

pull/24/head
Kentin BRONGNIART 2 months ago
parent 69859097ac
commit 4f9e791fd3

@ -3,95 +3,38 @@ package com.example.what_the_fantasy.data.local
import com.example.what_the_fantasy.data.model.User import com.example.what_the_fantasy.data.model.User
object UserStub { object UserStub {
val user1 = User( //LE MOT DE PASSE POUR TOUS LES UTILISATEURS EST : 1234
id = 1, val users: MutableList<User> = mutableListOf(
username = "Aragorn123", User(1, "Aragorn123", "aragorn@example.com", "2022-01-15", "https://img.freepik.com/vecteurs-libre/personnage-guerrier-fantaisie_1045-185.jpg?size=338&ext=jpg", "03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4"), //1234
email = "aragorn@example.com", User(2, "Legolas456", "legolas@example.com", "2021-05-23", "https://img.freepik.com/vecteurs-libre/personnage-elfe-fantaisie_1045-186.jpg?size=338&ext=jpg", "03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4"),//1234
date = "2022-01-15", User(3, "Gandalf789", "gandalf@example.com", "2020-09-10", "https://img.freepik.com/vecteurs-libre/personnage-magicien-fantaisie_1045-187.jpg?size=338&ext=jpg", "03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4"),//1234
imgUrl = "https://img.freepik.com/vecteurs-libre/personnage-guerrier-fantaisie_1045-185.jpg?size=338&ext=jpg", User(4, "FrodoBaggins", "frodo@example.com", "2023-03-18", "https://img.freepik.com/vecteurs-libre/personnage-hobbit-fantaisie_1045-188.jpg?size=338&ext=jpg", "03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4"),//1234
password = "03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4") // 1234 User(5, "Gimli999", "gimli@example.com", "2022-07-04", "https://img.freepik.com/vecteurs-libre/personnage-nain-fantaisie_1045-189.jpg?size=338&ext=jpg", "03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4"),//1234
User(6, "Galadriel321", "galadriel@example.com", "2021-11-30", "https://img.freepik.com/vecteurs-libre/personnage-elfe-femme-fantaisie_1045-190.jpg?size=338&ext=jpg", "03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4"),//1234
val user2 = User( User(7, "Boromir654", "boromir@example.com", "2023-06-22", "https://img.freepik.com/vecteurs-libre/personnage-guerrier-homme-fantaisie_1045-191.jpg?size=338&ext=jpg", "03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4"),//1234
id = 2, User(8, "Eowyn777", "eowyn@example.com", "2022-04-11", "https://img.freepik.com/vecteurs-libre/personnage-guerriere-femme-fantaisie_1045-192.jpg?size=338&ext=jpg", "03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4"),//1234
username = "Legolas456", User(9, "Saruman888", "saruman@example.com", "2021-08-15", "https://img.freepik.com/vecteurs-libre/personnage-magicien-malefique-fantaisie_1045-193.jpg?size=338&ext=jpg", "03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4"),//1234
email = "legolas@example.com", User(10, "Faramir222", "faramir@example.com", "2023-02-08", "https://img.freepik.com/vecteurs-libre/personnage-guerrier-homme-fantaisie_1045-194.jpg?size=338&ext=jpg", "03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4"),//1234
date = "2021-05-23", User(11, "dev", "testeur@example.com", "2023-02-08", "https://img.freepik.com/vecteurs-libre/personnage-guerrier-homme-fantaisie_1045-194.jpg?size=338&ext=jpg", "03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4")//1234
imgUrl = "https://img.freepik.com/vecteurs-libre/personnage-elfe-fantaisie_1045-186.jpg?size=338&ext=jpg", )
password = "03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4") // 1234
val user3 = User(
id = 3,
username = "Gandalf789",
email = "gandalf@example.com",
date = "2020-09-10",
imgUrl = "https://img.freepik.com/vecteurs-libre/personnage-magicien-fantaisie_1045-187.jpg?size=338&ext=jpg",
password = "03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4") // 1234
val user4 = User(
id = 4,
username = "FrodoBaggins",
email = "frodo@example.com",
date = "2023-03-18",
imgUrl = "https://img.freepik.com/vecteurs-libre/personnage-hobbit-fantaisie_1045-188.jpg?size=338&ext=jpg",
password = "03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4") // 1234
val user5 = User(
id = 5,
username = "Gimli999",
email = "gimli@example.com",
date = "2022-07-04",
imgUrl = "https://img.freepik.com/vecteurs-libre/personnage-nain-fantaisie_1045-189.jpg?size=338&ext=jpg",
password = "03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4") // 1234
val user6 = User(
id = 6,
username = "Galadriel321",
email = "galadriel@example.com",
date = "2021-11-30",
imgUrl = "https://img.freepik.com/vecteurs-libre/personnage-elfe-femme-fantaisie_1045-190.jpg?size=338&ext=jpg",
password = "03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4") // 1234
val user7 = User(
id = 7,
username = "Boromir654",
email = "boromir@example.com",
date = "2023-06-22",
imgUrl = "https://img.freepik.com/vecteurs-libre/personnage-guerrier-homme-fantaisie_1045-191.jpg?size=338&ext=jpg",
password = "03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4") // 1234
val user8 = User(
id = 8,
username = "Eowyn777",
email = "eowyn@example.com",
date = "2022-04-11",
imgUrl = "https://img.freepik.com/vecteurs-libre/personnage-guerriere-femme-fantaisie_1045-192.jpg?size=338&ext=jpg",
password = "03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4") // 1234
val user9 = User(
id = 9,
username = "Saruman888",
email = "saruman@example.com",
date = "2021-08-15",
imgUrl = "https://img.freepik.com/vecteurs-libre/personnage-magicien-malefique-fantaisie_1045-193.jpg?size=338&ext=jpg",
password = "03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4") // 1234
val user10 = User(
id = 10,
username = "Faramir222",
email = "faramir@example.com",
date = "2023-02-08",
imgUrl = "https://img.freepik.com/vecteurs-libre/personnage-guerrier-homme-fantaisie_1045-194.jpg?size=338&ext=jpg",
password = "03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4") // 1234
val user11 = User( fun addUser(user: User) {
id = 10, users.add(user)
username = "dev", }
email = "testeur@example.com",
date = "2023-02-08", //
imgUrl = "https://img.freepik.com/vecteurs-libre/personnage-guerrier-homme-fantaisie_1045-194.jpg?size=338&ext=jpg", // // Modifier un utilisateur
password = "03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4") // 1234 // fun updateUser(id: Int, updatedUser: User) {
// val index = users.indexOfFirst { it.id == id }
// if (index != -1) {
// users[index] = updatedUser
// }
// }
//
// // Supprimer un utilisateur
// fun removeUser(id: Int) {
// users.removeAll { it.id == id }
// }
//
val allUsers: List<User> = listOf(
user1, user2, user3, user4, user5, user6, user7, user8, user9, user10, user11
)
} }

@ -6,5 +6,5 @@ class User(
var email:String, var email:String,
var date:String, var date:String,
val imgUrl: String, val imgUrl: String,
val password: String var password: String
) )

@ -1,13 +1,19 @@
package com.example.what_the_fantasy.data.services package com.example.what_the_fantasy.data.services
import com.example.what_the_fantasy.data.local.UserStub.users
import com.example.what_the_fantasy.data.model.User
interface IServices { interface IServices {
fun EditUsername(username : String) fun EditUsername(username : String, index : Int)
fun EditEmail(email : String) fun EditEmail(email : String, index : Int)
fun EditPasswd(passwd : String, passwdValid : String) fun EditPasswd(passwd : String, index : Int)
fun EditImage(imageURL : String) fun EditImage(imageURL : String, index : Int)
fun CreateUser(username : String, email : String, passwd : String, imageURL: String) fun CreateUser(username : String, email : String, passwd : String, imageURL: String, services : IServices) : Boolean
fun getFavorite(username: String) fun getFavorite(username: String)
fun getAllUsers(): List<User>
fun getUserById(id: Int): User?
fun SearchQuote(quote : String) fun SearchQuote(quote : String)

@ -1,23 +1,25 @@
package com.example.what_the_fantasy.data.services package com.example.what_the_fantasy.data.services
import com.example.what_the_fantasy.data.model.User
class ServicesAPI : IServices { class ServicesAPI : IServices {
override fun EditUsername(username: String) { override fun EditUsername(username: String, index : Int) {
TODO("Not yet implemented") TODO("Not yet implemented")
} }
override fun EditEmail(email: String) { override fun EditEmail(email: String, index : Int) {
TODO("Not yet implemented") TODO("Not yet implemented")
} }
override fun EditPasswd(passwd: String, passwdValid: String) { override fun EditPasswd(passwd: String, index : Int) {
TODO("Not yet implemented") TODO("Not yet implemented")
} }
override fun EditImage(imageURL: String) { override fun EditImage(imageURL: String, index : Int) {
TODO("Not yet implemented") TODO("Not yet implemented")
} }
override fun CreateUser(username: String, email: String, passwd: String, imageURL: String) { override fun CreateUser(username: String, email: String, passwd: String, imageURL: String, services: IServices) : Boolean {
TODO("Not yet implemented") TODO("Not yet implemented")
} }
@ -28,4 +30,12 @@ class ServicesAPI : IServices {
override fun getFavorite(username: String) { override fun getFavorite(username: String) {
TODO("Not yet implemented") TODO("Not yet implemented")
} }
override fun getAllUsers(): List<User> {
TODO("Not yet implemented")
}
override fun getUserById(id: Int): User? {
TODO("Not yet implemented")
}
} }

@ -1,24 +1,67 @@
package com.example.what_the_fantasy.data.services package com.example.what_the_fantasy.data.services
import android.annotation.SuppressLint
import android.util.Log
import com.example.what_the_fantasy.data.local.UserStub
import com.example.what_the_fantasy.data.local.UserStub.users
import com.example.what_the_fantasy.data.model.User
import com.example.what_the_fantasy.ui.components.hashPassword
import java.time.LocalDate
class ServicesStub : IServices { class ServicesStub : IServices {
override fun EditUsername(username: String) { override fun EditUsername(username: String, index : Int) {
TODO("Not yet implemented") val user = getUserById(index)
user?.username = username
//Afficher tous les users
debugDisplayUser(getAllUsers(), "UsernameUpdate")
} }
override fun EditEmail(email: String) { override fun EditEmail(email: String,index : Int) {
TODO("Not yet implemented") val user = getUserById(index)
user?.email = email
//Afficher tous les users
debugDisplayUser(getAllUsers(), "EmailUpdate")
} }
override fun EditPasswd(passwd: String, passwdValid: String) { override fun EditPasswd(passwd: String,index : Int) {
TODO("Not yet implemented") val user = getUserById(index)
val passwordhash = hashPassword(passwd)
user?.password = passwordhash
//Afficher tous les users en log
debugDisplayUser(getAllUsers(), "PasswordUpdate")
} }
override fun EditImage(imageURL: String) { override fun EditImage(imageURL: String,index : Int) {
TODO("Not yet implemented") TODO("Not yet implemented")
} }
override fun CreateUser(username: String, email: String, passwd: String, imageURL: String) { override fun CreateUser(username: String, email: String, passwd: String, imageURL: String, services : IServices) : Boolean {
TODO("Not yet implemented") val date =dateDuJour()
val passwordhash = hashPassword(passwd)
val userStub = services.getAllUsers()
val nbUser = userStub.size
for (user in userStub) {
if (user.username == username) {
return false
}
}
val user = User(nbUser+1,username, email, imageURL, date, passwordhash)
users.add(user)//ajout au stub
//Afficher tous les users
debugDisplayUser(users, "CreateUser")
return true
}
override fun getAllUsers(): List<User> = users
override fun getUserById(id: Int): User? {
return (users.find { it.id == id+1 })
} }
override fun SearchQuote(quote: String) { override fun SearchQuote(quote: String) {
@ -28,4 +71,19 @@ class ServicesStub : IServices {
override fun getFavorite(username: String) { override fun getFavorite(username: String) {
TODO("Not yet implemented") TODO("Not yet implemented")
} }
//------------------------------------------------------
@SuppressLint("NewApi")
fun dateDuJour(): String {
val date = LocalDate.now()
return date.toString()
}
private fun debugDisplayUser(users : List<User>, titleLog : String){
for(user in users){
Log.e(titleLog, "User created: ${user.username} => ${user.email} => ${user.password}")
}
}
} }

@ -29,6 +29,7 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import com.example.what_the_fantasy.R import com.example.what_the_fantasy.R
import com.example.what_the_fantasy.data.services.IServices
import com.example.what_the_fantasy.ui.theme.* import com.example.what_the_fantasy.ui.theme.*
@Composable @Composable
@ -36,12 +37,11 @@ fun NavBar(onProfile : Boolean = false ,
onFavorite : Boolean = false , onFavorite : Boolean = false ,
onAccueil : Boolean = false , onAccueil : Boolean = false ,
onQuiz : Boolean = false , onQuiz : Boolean = false ,
index:Int,
navControllerProfil: (Int) -> Unit, navControllerProfil: (Int) -> Unit,
navControllerFavorite: () -> Unit, navControllerFavorite:(Int) -> Unit,
navControllerAccueil: () -> Unit, navControllerAccueil: (Int) -> Unit,
navControllerQuiz: () -> Unit, navControllerQuiz: (Int) -> Unit,
content : @Composable ()-> Unit ) { content : @Composable ()-> Unit ) {
@ -58,7 +58,7 @@ fun NavBar(onProfile : Boolean = false ,
Arrangement.SpaceBetween, Arrangement.SpaceBetween,
verticalAlignment = Alignment.Bottom verticalAlignment = Alignment.Bottom
) { ) {
ButtonIconVectorInt(Icons.Rounded.AccountCircle,"Profile",{},onProfile) ButtonIconVectorInt(Icons.Rounded.AccountCircle,"Profile",navControllerProfil,index,onProfile)
Button(onClick = {}, Button(onClick = {},
@ -80,11 +80,11 @@ fun NavBar(onProfile : Boolean = false ,
verticalAlignment = Alignment.CenterVertically verticalAlignment = Alignment.CenterVertically
) { ) {
ButtonIconVector(Icons.Rounded.Favorite,"Favorite",navControllerFavorite,onFavorite) ButtonIconVectorInt(Icons.Rounded.Favorite,"Favorite",navControllerFavorite,index,onFavorite)
ButtonIconPainter(painterResource(R.mipmap.ic_launcher_foreground),"Accueil",navControllerAccueil,onAccueil) ButtonIconPainterInt(painterResource(R.mipmap.ic_launcher_foreground),"Accueil",navControllerAccueil,index,onAccueil)
ButtonIconVector(Icons.Rounded.Create,"Quiz",navControllerQuiz,onQuiz) ButtonIconVectorInt(Icons.Rounded.Create,"Quiz",navControllerQuiz,index,onQuiz)
} }
} }
} }
@ -105,8 +105,8 @@ fun ButtonIconVector(img : ImageVector, name : String, nav : ()->Unit ,onPage :
} }
} }
@Composable @Composable
fun ButtonIconVectorInt(img : ImageVector, name : String, nav : (Int)->Unit ,onPage : Boolean){ fun ButtonIconVectorInt(img : ImageVector, name : String, nav : (Int)->Unit ,index: Int,onPage : Boolean){
IconButton(onClick = {}, IconButton(onClick = {nav(index)},
enabled = !onPage, enabled = !onPage,
colors = IconButtonColors(Color.Transparent,Color.White,//couleur quand il n'est pas selectionné colors = IconButtonColors(Color.Transparent,Color.White,//couleur quand il n'est pas selectionné
Color.Transparent, colorButtonNav),//couleur quand il est selectionné Color.Transparent, colorButtonNav),//couleur quand il est selectionné
@ -127,7 +127,7 @@ fun ButtonIconPainter(img : Painter, name : String, nav : ()->Unit,onPage : Bool
IconButton(onClick = {nav()}, IconButton(onClick = {nav()},
enabled = !onPage, enabled = !onPage,
colors = IconButtonColors(Color.Transparent,Color.White,//couleur quand il n'est pas selectionné colors = IconButtonColors(Color.Transparent,Color.White,//couleur quand il n'est pas selectionné
Color.Transparent, colorButtonNav),//couleur quand il est selectionné Color.Transparent, colorButtonNav),//couleur quand il est selectionné
modifier = Modifier modifier = Modifier
.size(60.dp) .size(60.dp)
) { ) {
@ -138,3 +138,20 @@ fun ButtonIconPainter(img : Painter, name : String, nav : ()->Unit,onPage : Bool
) )
} }
} }
@Composable
fun ButtonIconPainterInt(img : Painter, name : String, nav : (Int)->Unit,index: Int,onPage : Boolean){
IconButton(onClick = {nav(index)},
enabled = !onPage,
colors = IconButtonColors(Color.Transparent,Color.White,//couleur quand il n'est pas selectionné
Color.Transparent, colorButtonNav),//couleur quand il est selectionné
modifier = Modifier
.size(60.dp)
) {
Icon(img,
contentDescription = name,
modifier = Modifier
.size(60.dp)
)
}
}

@ -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) }
}

@ -4,12 +4,13 @@ import androidx.compose.runtime.Composable
import androidx.navigation.compose.NavHost import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController import androidx.navigation.compose.rememberNavController
import com.example.what_the_fantasy.data.services.ServicesStub
import com.example.what_the_fantasy.ui.screens.AccueilPage import com.example.what_the_fantasy.ui.screens.AccueilPage
import com.example.what_the_fantasy.ui.screens.FavoritePage import com.example.what_the_fantasy.ui.screens.FavoritePage
import com.example.what_the_fantasy.ui.screens.LoginPage 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.ProfilPage
import com.example.what_the_fantasy.ui.screens.QuizAccueil
import com.example.what_the_fantasy.ui.screens.QuizEndPage import com.example.what_the_fantasy.ui.screens.QuizEndPage
import com.example.what_the_fantasy.ui.screens.QuizMenu
import com.example.what_the_fantasy.ui.screens.QuizPage import com.example.what_the_fantasy.ui.screens.QuizPage
import com.example.what_the_fantasy.ui.screens.QuotePage import com.example.what_the_fantasy.ui.screens.QuotePage
import com.example.what_the_fantasy.ui.screens.SearchPage import com.example.what_the_fantasy.ui.screens.SearchPage
@ -17,11 +18,14 @@ import com.example.what_the_fantasy.ui.screens.SignUpPage
import com.example.what_the_fantasy.ui.screens.SubmitQuotePage import com.example.what_the_fantasy.ui.screens.SubmitQuotePage
sealed class Destination(val route: String) { sealed class Destination(val route: String) {
data object Login : Destination("Login") data object Login : Destination("Login")
data object Accueil : Destination("Accueil") data object Accueil : Destination("Accueil/{userIndex}") { // Ajout du paramètre userIndex
data object Favorite : Destination("Favorite") fun createRoute(userIndex: Int) = "Accueil/$userIndex" // Fonction pour créer la route avec l'index
}
data object Favorite : Destination("Favorite/{userIndex}") { // Ajout du paramètre userIndex
fun createRoute(userIndex: Int) = "Favorite/$userIndex" // Fonction pour créer la route avec l'index
}
data object Profil : Destination("Profil/{userIndex}") { // Ajout du paramètre userIndex data object Profil : Destination("Profil/{userIndex}") { // Ajout du paramètre userIndex
fun createRoute(userIndex: Int) = "Profil/$userIndex" // Fonction pour créer la route avec l'index fun createRoute(userIndex: Int) = "Profil/$userIndex" // Fonction pour créer la route avec l'index
} }
@ -31,37 +35,71 @@ sealed class Destination(val route: String) {
data object SignUp : Destination("SignUp") data object SignUp : Destination("SignUp")
data object SubmitQuote : Destination("SubmitQuote") data object SubmitQuote : Destination("SubmitQuote")
data object QuizAccueil : Destination("QuizAccueil") data object QuizMenu : Destination("QuizMenu/{userIndex}") { // Ajout du paramètre userIndex
data object QuizPage : Destination("QuizPage") fun createRoute(userIndex: Int) = "QuizMenu/$userIndex" // Fonction pour créer la route avec l'index
data object QuizEndPage : Destination("QuizEndPage") }
data object Quiz : Destination("Quiz")
data object QuizEnd : Destination("QuizEnd/{idQuiz}/{pts}") {
// Ajout paramètres idQuiz et pts
fun createIdAndPts(idQuiz : Int, pts : Int) = "QuizEnd/$idQuiz/$pts"
}
} }
@Composable @Composable
fun AppNavigator() { fun AppNavigator() {
val navController = rememberNavController() val navController = rememberNavController()
val services = ServicesStub()
NavHost(navController, startDestination = Destination.Accueil.route) { NavHost(navController, startDestination = Destination.Login.route) {
composable(Destination.Login.route) { LoginPage( composable(Destination.Login.route) { LoginPage(
navControllerSignUp = { navController.navigate(Destination.SignUp.route) }, navControllerSignUp = { navController.navigate(Destination.SignUp.route) },
navControllerProfil = { userIndex -> navControllerProfil = { userIndex ->
navController.navigate(Destination.Profil.createRoute(userIndex)) // Passe l'index à Profil navController.navigate(Destination.Profil.createRoute(userIndex)) // Passe l'index à Profil
} },
services
) } ) }
composable(Destination.Accueil.route) { AccueilPage( composable(Destination.Accueil.route) {
navFavorite = { navController.navigate(Destination.Favorite.route) }, val userIndex = it.arguments?.getString("userIndex")?.toInt() ?: -1
navQuiz = { navController.navigate(Destination.QuizAccueil.route) } AccueilPage(
index = userIndex,
navFavorite = { userIndex ->
navController.navigate(Destination.Favorite.createRoute(userIndex)) // Passe l'index à Profil
},
navQuiz = { userIndex ->
navController.navigate(Destination.QuizMenu.createRoute(userIndex)) // Passe l'index à Profil
},
navProfil = { userIndex ->
navController.navigate(Destination.Profil.createRoute(userIndex)) // Passe l'index à Profil
}
) } ) }
composable(Destination.Favorite.route) { FavoritePage( composable(Destination.Favorite.route) {
navAccueil = { navController.navigate(Destination.Accueil.route) }, val userIndex = it.arguments?.getString("userIndex")?.toInt() ?: -1
navQuiz = { navController.navigate(Destination.QuizAccueil.route) } FavoritePage(
index = userIndex,
navAccueil ={ userIndex ->
navController.navigate(Destination.Accueil.createRoute(userIndex)) // Passe l'index à Profil
},
navQuiz = { userIndex ->
navController.navigate(Destination.QuizMenu.createRoute(userIndex)) // Passe l'index à Profil
},
navProfil = { userIndex ->
navController.navigate(Destination.Profil.createRoute(userIndex)) // Passe l'index à Profil
}
) } ) }
composable(Destination.Profil.route) { backStackEntry -> composable(Destination.Profil.route) {
// Récupère l'index passé dans la route // Récupère l'index passé dans la route
val userIndex = backStackEntry.arguments?.getString("userIndex")?.toInt() ?: -1 val userIndex = it.arguments?.getString("userIndex")?.toInt() ?: -1
ProfilPage(index = userIndex, ProfilPage(
navController = navController, index = userIndex,
navFavorite = { userIndex ->
navController.navigate(Destination.Favorite.createRoute(userIndex)) // Passe l'index à Profil
},
navAccueil ={ userIndex ->
navController.navigate(Destination.Accueil.createRoute(userIndex)) // Passe l'index à Profil
},
navQuiz = { userIndex ->
navController.navigate(Destination.QuizMenu.createRoute(userIndex)) // Passe l'index à Profil
},
services = services
) )
} }
composable(Destination.Quote.route) { QuotePage() } composable(Destination.Quote.route) { QuotePage() }
@ -69,25 +107,35 @@ fun AppNavigator() {
composable(Destination.SignUp.route) { SignUpPage(navController) } composable(Destination.SignUp.route) { SignUpPage(navController) }
composable(Destination.SubmitQuote.route) { SubmitQuotePage() } composable(Destination.SubmitQuote.route) { SubmitQuotePage() }
composable(Destination.QuizMenu.route) {
val userIndex = it.arguments?.getString("userIndex")?.toInt() ?: -1
composable(Destination.QuizAccueil.route) { QuizAccueil( QuizMenu(
navFavorite = { navController.navigate(Destination.Favorite.route) }, index = userIndex,
navAccueil = { navController.navigate(Destination.Accueil.route) }, navAccueil = { navController.navigate(Destination.Accueil.route) },
navFavorite = { navController.navigate(Destination.Favorite.route) },
navControllerQuizPage = { navController.navigate(Destination.QuizPage.route) }, navControllerQuiz = { navController.navigate(Destination.Quiz.route) },
navControllerQuizEndPage = { navController.navigate(Destination.QuizEndPage.route) } navProfil = { userIndex ->
) } navController.navigate(Destination.Profil.createRoute(userIndex)) // Passe l'index à Profil
}
composable(Destination.QuizPage.route) { QuizPage( )
navControllerQuiz = {navController.navigate(Destination.QuizAccueil.route)}, }
navControllerQuizEndPage = {navController.navigate(Destination.QuizEndPage.route)} composable(Destination.Quiz.route) {
) } QuizPage(
composable(Destination.QuizEndPage.route) { QuizEndPage( navControllerQuizEnd = { idQuiz, pts ->
points = 5, navController.navigate(Destination.QuizEnd.createIdAndPts(idQuiz, pts))
idQuiz = 1 },
) } navControllerQuizMenu = { navController.navigate(Destination.QuizMenu.route) }
)
}
composable(Destination.QuizEnd.route) { backStackEntry ->
val idQuiz = backStackEntry.arguments?.getString("idQuiz")?.toInt() ?: 0
val pts = backStackEntry.arguments?.getString("pts")?.toInt() ?: 0
QuizEndPage(
idQuiz,
pts,
navControllerQuizMenu = { navController.navigate(Destination.QuizMenu.route) }
)
}
} }
} }

@ -10,18 +10,22 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import com.example.what_the_fantasy.data.services.IServices
import com.example.what_the_fantasy.ui.components.NavBar import com.example.what_the_fantasy.ui.components.NavBar
import com.example.what_the_fantasy.ui.theme.colorBackground import com.example.what_the_fantasy.ui.theme.colorBackground
@Composable @Composable
fun AccueilPage( fun AccueilPage(
navFavorite: () -> Unit, index: Int,
navQuiz: () -> Unit navFavorite:(Int) -> Unit,
navQuiz: (Int) -> Unit,
navProfil:(Int) -> Unit
) { ) {
NavBar(onAccueil = true, NavBar(onAccueil = true,
index = index,
navControllerFavorite = navFavorite, navControllerFavorite = navFavorite,
navControllerAccueil = { }, navControllerAccueil = { },
navControllerProfil = {}, navControllerProfil = navProfil,
navControllerQuiz = navQuiz navControllerQuiz = navQuiz
){ ){
Box( Box(

@ -10,18 +10,22 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import com.example.what_the_fantasy.data.services.IServices
import com.example.what_the_fantasy.ui.components.NavBar import com.example.what_the_fantasy.ui.components.NavBar
import com.example.what_the_fantasy.ui.theme.colorBackground import com.example.what_the_fantasy.ui.theme.colorBackground
@Composable @Composable
fun FavoritePage( fun FavoritePage(
navAccueil: () -> Unit, index: Int,
navQuiz: () -> Unit navAccueil: (Int) -> Unit,
navQuiz: (Int) -> Unit,
navProfil:(Int) -> Unit
) { ) {
NavBar(onFavorite = true, NavBar(onFavorite = true,
index = index,
navControllerFavorite = { }, navControllerFavorite = { },
navControllerAccueil = navAccueil, navControllerAccueil = navAccueil,
navControllerProfil = {}, navControllerProfil = navProfil,
navControllerQuiz = navQuiz navControllerQuiz = navQuiz
) { ) {
Box( Box(

@ -39,17 +39,19 @@ import androidx.navigation.compose.composable
import com.example.what_the_fantasy.R import com.example.what_the_fantasy.R
import com.example.what_the_fantasy.data.local.UserStub import com.example.what_the_fantasy.data.local.UserStub
import com.example.what_the_fantasy.data.model.User import com.example.what_the_fantasy.data.model.User
import com.example.what_the_fantasy.ui.components.NavBar import com.example.what_the_fantasy.data.services.IServices
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.SpaceHeightComponent 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.components.TitlePageComponent
import com.example.what_the_fantasy.ui.components.hashPassword
import com.example.what_the_fantasy.ui.theme.colorBackground import com.example.what_the_fantasy.ui.theme.colorBackground
import com.example.what_the_fantasy.ui.theme.gradienBox import com.example.what_the_fantasy.ui.theme.gradienBox
import java.security.MessageDigest import java.security.MessageDigest
@Composable @Composable
fun LoginPage(navControllerSignUp: () -> Unit, navControllerProfil: (Int) -> Unit) { fun LoginPage(navControllerSignUp: () -> Unit, navControllerProfil: (Int) -> Unit, services : IServices) {
val users = services.getAllUsers()
val users = UserStub.allUsers;
Box( Box(
modifier = Modifier modifier = Modifier
@ -57,7 +59,6 @@ fun LoginPage(navControllerSignUp: () -> Unit, navControllerProfil: (Int) -> Uni
.background(colorBackground), .background(colorBackground),
contentAlignment = Alignment.Center contentAlignment = Alignment.Center
){ ){
Column( Column(
modifier = Modifier modifier = Modifier
.fillMaxWidth(0.9f) .fillMaxWidth(0.9f)
@ -76,9 +77,7 @@ fun LoginPage(navControllerSignUp: () -> Unit, navControllerProfil: (Int) -> Uni
SpaceHeightComponent(16) SpaceHeightComponent(16)
CreateAccountButton(R.string.ButtonCreateLogin,12, Color.White, navControllerSignUp) CreateAccountButton(R.string.ButtonCreateLogin,12, Color.White, navControllerSignUp)
} }
} }
} }
@ -130,6 +129,7 @@ fun PassWdTextField(textpasswdResId : Int) : String{
@Composable @Composable
fun ConnexionButtonLogin(userStub : List<User>, id : String, passwd : String, titleResId : Int, size : Int, colorButton : Color, colorText : Color, navController: (Int) -> Unit){ fun ConnexionButtonLogin(userStub : List<User>, id : String, passwd : String, titleResId : Int, size : Int, colorButton : Color, colorText : Color, navController: (Int) -> Unit){
val title = stringResource(id = titleResId) val title = stringResource(id = titleResId)
Button( Button(
onClick = { validLogin(id, passwd, userStub, navController) }, onClick = { validLogin(id, passwd, userStub, navController) },
colors = ButtonDefaults.buttonColors(containerColor = colorButton), colors = ButtonDefaults.buttonColors(containerColor = colorButton),
@ -142,6 +142,7 @@ fun ConnexionButtonLogin(userStub : List<User>, id : String, passwd : String, ti
fun validLogin(identifiant : String, passwd : String, users : List<User>, navController: (Int) -> Unit){ fun validLogin(identifiant : String, passwd : String, users : List<User>, navController: (Int) -> Unit){
users.forEachIndexed { index, user -> users.forEachIndexed { index, user ->
val hashPassWd = hashPassword(passwd) val hashPassWd = hashPassword(passwd)
if (user.username == identifiant && user.password == hashPassWd) { if (user.username == identifiant && user.password == hashPassWd) {
@ -151,18 +152,6 @@ fun validLogin(identifiant : String, passwd : String, users : List<User>, navCon
} }
} }
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) }
}
@Composable @Composable
fun CreateAccountButton(titleResId : Int, size : Int, color : Color, navController: () -> Unit){ fun CreateAccountButton(titleResId : Int, size : Int, color : Color, navController: () -> Unit){
val title = stringResource(id = titleResId) val title = stringResource(id = titleResId)

@ -61,6 +61,7 @@ import coil.compose.AsyncImage
import com.example.what_the_fantasy.R import com.example.what_the_fantasy.R
import com.example.what_the_fantasy.data.local.QuestionStub 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.local.UserStub
import com.example.what_the_fantasy.data.services.IServices
import com.example.what_the_fantasy.ui.components.ErrorMessageProfileComponent 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.NavBar
import com.example.what_the_fantasy.ui.components.SpaceHeightComponent import com.example.what_the_fantasy.ui.components.SpaceHeightComponent
@ -69,15 +70,21 @@ import com.example.what_the_fantasy.ui.theme.What_The_FantasyTheme
import com.example.what_the_fantasy.ui.theme.gradienBox import com.example.what_the_fantasy.ui.theme.gradienBox
@Composable @Composable
fun ProfilPage(index: Int, navController: NavController) { fun ProfilPage(index: Int,
navFavorite: (Int) -> Unit,
navAccueil: (Int) -> Unit,
navQuiz: (Int) -> Unit,
services: IServices
) {
val user = services.getUserById(index) ?: return
NavBar(onProfile = true, NavBar(onProfile = true,
navControllerFavorite = {}, index = index,
navControllerAccueil = {}, navControllerFavorite = navFavorite,
navControllerAccueil = navAccueil,
navControllerProfil = {}, navControllerProfil = {},
navControllerQuiz = {} navControllerQuiz = navQuiz
) { ) {
val userList = UserStub.allUsers
val user = userList[index]
Box( Box(
modifier = Modifier modifier = Modifier

@ -2,6 +2,7 @@ package com.example.what_the_fantasy.ui.screens
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
@ -31,37 +32,11 @@ val gradient = Brush.linearGradient(
end = Offset(1000f, 0f) end = Offset(1000f, 0f)
) )
@Composable @Composable
fun QuizEndPage(points: Int, idQuiz: Int) { fun QuizEndPage(idQuiz: Int, points: Int, navControllerQuizMenu: () -> Unit) {
Column( Column(
modifier = Modifier.fillMaxSize().background(Color(0xFF100C1B)) 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
) {
IconButton(onClick = { }) {
Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = "Retour", tint = Color.White)
}
Image(
painter = painterResource(id = R.drawable.quiz),
contentDescription = "Profil",
modifier = Modifier.size(50.dp).background(Color.Yellow, CircleShape)
)
Image(
painter = painterResource(id = R.drawable.quiz),
contentDescription = "Profil",
modifier = Modifier.size(50.dp).background(Color.Yellow, CircleShape)
)
}
// Contenu principal // Contenu principal
Column( Column(
@ -102,62 +77,8 @@ fun QuizEndPage(points: Int, idQuiz: Int) {
color = Color.White, color = Color.White,
style = TextStyle(fontSize = 15.sp, fontWeight = FontWeight.Bold, textAlign = TextAlign.Center) style = TextStyle(fontSize = 15.sp, fontWeight = FontWeight.Bold, textAlign = TextAlign.Center)
) )
Row (
modifier = Modifier
.fillMaxWidth(),
horizontalArrangement = Arrangement.SpaceAround
) {
// Bouton Quiz Précédent
Image(
painter = painterResource(id = R.drawable.quiz),
contentDescription = "Profil",
modifier = Modifier.size(50.dp).background(Color.Yellow, CircleShape)
)
// Bouton Retour Menu Quiz
Image(
painter = painterResource(id = R.drawable.quiz),
contentDescription = "Profil",
modifier = Modifier.size(50.dp).background(Color.Yellow, CircleShape)
)
// Bouton Quiz Suivant
Image(
painter = painterResource(id = R.drawable.quiz),
contentDescription = "Profil",
modifier = Modifier.size(50.dp).background(Color.Yellow, CircleShape)
)
}
} }
} }
// 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.quiz),
contentDescription = "Bouton",
modifier = Modifier.size(50.dp).background(Color.Yellow, CircleShape)
)
// Bouton WhatTheFantasy
Image(
painter = painterResource(id = R.drawable.quiz),
contentDescription = "Bouton",
modifier = Modifier.size(50.dp).background(Color.Yellow, CircleShape)
)
// Bouton Quiz
Image(
painter = painterResource(id = R.drawable.quiz),
contentDescription = "Bouton",
modifier = Modifier.size(50.dp).background(Color.Yellow, CircleShape)
)
}
} }
} }

@ -19,28 +19,26 @@ import androidx.compose.ui.graphics.Color
import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.ContentScale
import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.painterResource
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.navigation.NavController
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import com.example.what_the_fantasy.R import com.example.what_the_fantasy.R
import com.example.what_the_fantasy.data.services.IServices
import com.example.what_the_fantasy.ui.components.NavBar import com.example.what_the_fantasy.ui.components.NavBar
@Composable @Composable
fun QuizAccueil( fun QuizMenu(
navFavorite: () -> Unit, index: Int,
navAccueil: () -> Unit, navFavorite: (Int) -> Unit,
navControllerQuizPage: () -> Unit, navAccueil: (Int) -> Unit,
navControllerQuizEndPage: () -> Unit navProfil:(Int) -> Unit,
navControllerQuiz: () -> Unit
) { ) {
NavBar(onQuiz = true, NavBar(onQuiz = true,
index = index,
navControllerFavorite = navFavorite, navControllerFavorite = navFavorite,
navControllerAccueil = navAccueil, navControllerAccueil = navAccueil,
navControllerProfil = {}, navControllerProfil = navProfil,
navControllerQuiz = { } navControllerQuiz = { }
) { ) {
Row( Row(
modifier = Modifier modifier = Modifier
.fillMaxSize() .fillMaxSize()
@ -60,7 +58,7 @@ fun QuizAccueil(
.size(width = 150.dp, height = 100.dp) .size(width = 150.dp, height = 100.dp)
.padding(8.dp) .padding(8.dp)
.clickable { .clickable {
navControllerQuizPage() navControllerQuiz()
} }
) { ) {
Image( Image(
@ -76,7 +74,7 @@ fun QuizAccueil(
.size(width = 150.dp, height = 100.dp) .size(width = 150.dp, height = 100.dp)
.padding(8.dp) .padding(8.dp)
.clickable { .clickable {
navControllerQuizPage() navControllerQuiz()
} }
) { ) {
Image( Image(
@ -101,7 +99,7 @@ fun QuizAccueil(
.size(width = 150.dp, height = 100.dp) .size(width = 150.dp, height = 100.dp)
.padding(8.dp) .padding(8.dp)
.clickable { .clickable {
navControllerQuizPage() navControllerQuiz()
} }
) { ) {
Image( Image(
@ -117,7 +115,7 @@ fun QuizAccueil(
.size(width = 150.dp, height = 100.dp) .size(width = 150.dp, height = 100.dp)
.padding(8.dp) .padding(8.dp)
.clickable { .clickable {
navControllerQuizPage() navControllerQuiz()
} }
) { ) {
Image( Image(

@ -1,14 +1,11 @@
package com.example.what_the_fantasy.ui.screens package com.example.what_the_fantasy.ui.screens
import androidx.compose.foundation.Image
import androidx.compose.foundation.background import androidx.compose.foundation.background
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.* import androidx.compose.foundation.layout.*
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.icons.filled.ArrowBack
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.* import androidx.compose.runtime.*
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@ -16,17 +13,19 @@ import androidx.compose.ui.Modifier
import androidx.compose.ui.geometry.Offset import androidx.compose.ui.geometry.Offset
import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Brush
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp import androidx.compose.ui.unit.sp
import androidx.navigation.NavController import com.example.what_the_fantasy.R
import com.example.what_the_fantasy.data.local.QuestionStub import com.example.what_the_fantasy.data.local.QuestionStub
import com.example.what_the_fantasy.data.model.Question
import com.example.what_the_fantasy.ui.components.NavBar
@Composable @Composable
fun QuizPage( fun QuizPage(
navControllerQuiz: () -> Unit, navControllerQuizEnd: (Int, Int) -> Unit,
navControllerQuizEndPage: () -> Unit navControllerQuizMenu: () -> Unit
) { ) {
val questions = QuestionStub.allQuestions val questions = QuestionStub.allQuestions
var idCurrentQuestion by remember { mutableIntStateOf(0) } var idCurrentQuestion by remember { mutableIntStateOf(0) }
@ -49,61 +48,81 @@ fun QuizPage(
if (answer == correctAnswer) pts++ if (answer == correctAnswer) pts++
if (idCurrentQuestion < questions.size - 1) idCurrentQuestion++ if (idCurrentQuestion < questions.size - 1) idCurrentQuestion++
else navControllerQuiz() // Retour menu else navControllerQuizEnd(0, pts) // Retour menu
} }
Box( Column (
modifier = Modifier modifier = Modifier.fillMaxSize().background(Color(0xFF100C1B))
.fillMaxSize()
.background(Color(0xFF100C1B))
.padding(16.dp)
) { ) {
// Contenu princiapl
Column( Column(
modifier = Modifier modifier = Modifier
.fillMaxSize(), .weight(0.8f)
.fillMaxWidth()
.padding(horizontal = 50.dp, vertical = 20.dp),
horizontalAlignment = Alignment.CenterHorizontally horizontalAlignment = Alignment.CenterHorizontally
) { ) {
val question = questions[idCurrentQuestion] val question = questions[idCurrentQuestion]
Column ( Column(
horizontalAlignment = Alignment.CenterHorizontally, horizontalAlignment = Alignment.CenterHorizontally,
) { ) {
Box( Text(
modifier = Modifier.fillMaxWidth() text = "▶ Quiz ◀",
color = Color.White,
style = TextStyle(fontSize = 25.sp, fontWeight = FontWeight.Bold, textAlign = TextAlign.Center)
)
Column (
modifier = Modifier
.background(brush = gradient, shape = RoundedCornerShape(20.dp)),
horizontalAlignment = Alignment.CenterHorizontally
) { ) {
IconButton( Text(
onClick = { navControllerQuiz() }, "Question ${question.id}",
modifier = Modifier.align(Alignment.TopStart) color = Color.White,
) { fontSize = 18.sp,
Icon(Icons.AutoMirrored.Filled.ArrowBack, contentDescription = "Retour", tint = Color.White) modifier = Modifier.padding(top = 20.dp),
} style = TextStyle(
} fontSize = 25.sp,
Text("Question ${question.id}", color = Color.White, fontSize = 18.sp, modifier = Modifier.padding(top = 20.dp)) fontWeight = FontWeight.Bold,
Text("Points : $pts", color = Color.White, fontSize = 18.sp, modifier = Modifier.padding(top = 40.dp)) textAlign = TextAlign.Center
Text(question.question, color = Color.White, fontSize = 22.sp, modifier = Modifier.padding(40.dp)) )
} )
Column ( Text(
modifier = Modifier question.question,
.padding(top = 30.dp) color = Color.White,
) { fontSize = 22.sp,
listOf(question.ansA, question.ansB, question.ansC, question.ansD).forEach { answer -> modifier = Modifier.padding(40.dp)
Box( )
Column(
modifier = Modifier modifier = Modifier
.width(220.dp) .padding(top = 30.dp)
.height(50.dp)
.background(brush = gradient, shape = RoundedCornerShape(16.dp))
.clickable { onAnswerSelected(answer) }
.padding(horizontal = 8.dp),
contentAlignment = Alignment.Center
) { ) {
Text(answer, color = Color.White, fontSize = 18.sp) listOf(
question.ansA,
question.ansB,
question.ansC,
question.ansD
).forEach { answer ->
Box(
modifier = Modifier
.width(220.dp)
.height(50.dp)
.background(Color.White, shape = RoundedCornerShape(16.dp))
.clickable { onAnswerSelected(answer) }
.padding(horizontal = 8.dp),
contentAlignment = Alignment.Center
) {
Text(answer, color = Color.Black, fontSize = 18.sp)
}
Spacer(modifier = Modifier.height(60.dp))
}
} }
Spacer(modifier = Modifier.height(60.dp))
} }
} }
} }
} }
} }

Loading…
Cancel
Save