Correction TP 7

This commit is contained in:
Chocolaterie
2025-01-29 13:59:31 +01:00
parent 7b313b2ca8
commit 586f854b9d
5 changed files with 141 additions and 67 deletions

View File

@@ -17,33 +17,22 @@
android:theme="@style/Theme.TpFilRouge"
tools:targetApi="31" >
<activity
android:name=".article.ListArticleActivity"
android:name=".article.ArticleActivity"
android:exported="true"
android:label="@string/title_activity_list_article"
android:theme="@style/Theme.TpFilRouge">
</activity>
<activity
android:name=".auth.ResetPasswordActivity"
android:exported="false"
android:label="@string/title_activity_reset_password"
android:theme="@style/Theme.TpFilRouge" />
<activity
android:name=".auth.SignUpActivity"
android:exported="true"
android:label="@string/title_activity_sign_up"
android:theme="@style/Theme.TpFilRouge">
</activity>
<activity
android:name=".auth.LoginActivity"
android:exported="true"
android:label="@string/app_name"
android:theme="@style/Theme.TpFilRouge" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".auth.AuthActivity"
android:exported="true"
android:label="@string/app_name"
android:theme="@style/Theme.TpFilRouge" >
</activity>
</application>
</manifest>

View File

@@ -0,0 +1,46 @@
package com.example.tpfilrouge.article
import android.os.Bundle
import androidx.activity.ComponentActivity
import androidx.activity.compose.setContent
import androidx.activity.enableEdgeToEdge
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 ArticleActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
ArticleActivityPage()
}
}
}
@Composable
fun ArticleActivityPage() {
val navController = rememberNavController();
var viewModel = ListArticleViewModel();
NavHost(
navController = navController,
startDestination = "list_article"
) {
composable("list_article") { ListArticleFragmentPage(viewModel, navController) }
composable("article_form") { ArticleFormFragmentPage(viewModel) }
}
}
@Preview(
showBackground = true,
locale = "en"
)
@Composable
fun ActivityActivityPreview() {
ArticleActivityPage()
}

View File

@@ -0,0 +1,80 @@
package com.example.tpfilrouge.article
import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.foundation.lazy.items
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
import androidx.compose.ui.res.stringResource
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.compose.ui.unit.sp
import com.example.tpfilrouge.R
import com.example.tpfilrouge.ui.theme.EniButton
import com.example.tpfilrouge.ui.theme.EniPage
import com.example.tpfilrouge.ui.theme.EniTextField
import kotlinx.coroutines.flow.MutableStateFlow
@Composable
fun ArticleForm(viewModel: ListArticleViewModel){
var titleFieldState by remember { mutableStateOf("Un article") }
var descFieldState by remember { mutableStateOf("Une description") }
Column {
EniTextField(label = "Saisir un Email", value = titleFieldState,
onValueChange = { newValue -> titleFieldState = newValue })
EniTextField(label = "Saisir une Description", value = descFieldState,
onValueChange = { newValue -> descFieldState = newValue })
EniButton("Ajouter") {
// Instancer un article avec les infos de la saisie
val newArticle = Article(titleFieldState, descFieldState,
"https://avatar.iran.liara.run/public");
// Envoyer l'article via une méthode view model
viewModel.addArticle(newArticle)
}
}
}
@Composable
fun ArticleFormFragmentPage(viewModel: ListArticleViewModel) {
EniPage {
Column(
horizontalAlignment = Alignment.CenterHorizontally,
modifier = Modifier.padding(40.dp)
) {
Text(text = "Ajouter un article",
modifier = Modifier.fillMaxWidth(),
textAlign = TextAlign.Center,
style = TextStyle(color = Color.White, fontSize = 28.sp)
)
ArticleForm(viewModel)
}
}
}
@Preview(
showBackground = true,
)
@Composable
fun ArticleFormFragmentPreview() {
var viewModel = ListArticleViewModel();
viewModel.articles = MutableStateFlow(listOf(
Article("Teletubies", "Meilleur série du monde", "https://avatar.iran.liara.run/public"),
Article("Velocipastor", "Meilleur film du monde, gros budget", "https://avatar.iran.liara.run/public"),
Article("Photo mouton béret paille ?", "Pourquoi", "https://avatar.iran.liara.run/public")
));
ArticleFormFragmentPage(viewModel)
}

View File

@@ -1,10 +1,5 @@
package com.example.tpfilrouge.article
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.Row
import androidx.compose.foundation.layout.fillMaxWidth
@@ -15,13 +10,9 @@ import androidx.compose.foundation.lazy.items
import androidx.compose.material3.CardDefaults
import androidx.compose.material3.ElevatedCard
import androidx.compose.material3.Text
import androidx.compose.material3.TextField
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color
@@ -33,47 +24,13 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.compose.ui.unit.sp
import androidx.navigation.NavController
import coil.compose.AsyncImage
import com.example.tpfilrouge.R
import com.example.tpfilrouge.ui.theme.EniButton
import com.example.tpfilrouge.ui.theme.EniPage
import com.example.tpfilrouge.ui.theme.EniTextField
import kotlinx.coroutines.flow.MutableStateFlow
class ListArticleActivity : ComponentActivity() {
// Instancier le view model
var viewModel = ListArticleViewModel();
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
ListArticleActivityPage(viewModel)
}
}
}
@Composable
fun ArticleForm(viewModel: ListArticleViewModel){
var titleFieldState by remember { mutableStateOf("Un article") }
var descFieldState by remember { mutableStateOf("Une description") }
Column {
EniTextField(label = "Saisir un Email", value = titleFieldState,
onValueChange = { newValue -> titleFieldState = newValue })
EniTextField(label = "Saisir une Description", value = descFieldState,
onValueChange = { newValue -> descFieldState = newValue })
EniButton("Ajouter") {
// Instancer un article avec les infos de la saisie
val newArticle = Article(titleFieldState, descFieldState,
"https://avatar.iran.liara.run/public");
// Envoyer l'article via une méthode view model
viewModel.addArticle(newArticle)
}
}
}
@Composable
fun ArticleCard(article: Article){
ElevatedCard(
@@ -97,7 +54,7 @@ fun ArticleCard(article: Article){
}
@Composable
fun ListArticleActivityPage(viewModel: ListArticleViewModel) {
fun ListArticleFragmentPage(viewModel: ListArticleViewModel, navController: NavController? = null) {
// Ecouter les changements de la liste d'article dans le ViewModel
val articlesState by viewModel.articles.collectAsState();
@@ -110,7 +67,9 @@ fun ListArticleActivityPage(viewModel: ListArticleViewModel) {
modifier = Modifier.fillMaxWidth(),
textAlign = TextAlign.Center,
style = TextStyle(color = Color.White, fontSize = 28.sp))
ArticleForm(viewModel)
EniButton("Ajouter un Article") {
navController!!.navigate("article_form")
}
EniButton("Rafraichir") {
// Appeler l'api du viewmodel
viewModel.callArticlesApi()
@@ -135,5 +94,5 @@ fun ListArticleActivityPreview() {
Article("Velocipastor", "Meilleur film du monde, gros budget", "https://avatar.iran.liara.run/public"),
Article("Photo mouton béret paille ?", "Pourquoi", "https://avatar.iran.liara.run/public")
));
ListArticleActivityPage(viewModel)
ListArticleFragmentPage(viewModel)
}

View File

@@ -21,7 +21,7 @@ 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.article.ArticleActivity
import com.example.tpfilrouge.ui.theme.EniButton
import com.example.tpfilrouge.ui.theme.EniPage
import com.example.tpfilrouge.ui.theme.EniTextField
@@ -62,7 +62,7 @@ fun LoginFragmentPage(loginViewModel: LoginViewModel, navController: NavControll
loginViewModel.callLoginApi(
onSuccess = {
// je change de page (page article
context.startActivity(Intent(context, ListArticleActivity::class.java))
context.startActivity(Intent(context, ArticleActivity::class.java))
}
)
})