From 7528e55dca6bd4748489435e26e0f1d5e8ad7d79 Mon Sep 17 00:00:00 2001 From: Valentin CZERYBA Date: Sun, 17 Aug 2025 17:42:02 +0200 Subject: [PATCH 1/6] add button star --- covas_mobile/lib/classes/events.dart | 8 +++++++- covas_mobile/lib/pages/ListItemMenu.dart | 11 +++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/covas_mobile/lib/classes/events.dart b/covas_mobile/lib/classes/events.dart index 25a23e8..8df086e 100644 --- a/covas_mobile/lib/classes/events.dart +++ b/covas_mobile/lib/classes/events.dart @@ -12,6 +12,8 @@ class Events { List? tags; List? organizers; String? imgUrl; + int? interestedCount; + bool? interested; Events( {this.place, this.id, @@ -25,7 +27,9 @@ class Events { this.organizers, this.link, this.ticket, - this.imgUrl}); + this.imgUrl, + this.interestedCount, + this.interested}); Events.fromJson(Map json) { id = json['id'] as String?; @@ -44,5 +48,7 @@ class Events { imgUrl = json['imgUrl'] as String?; link = json['link'] as String?; ticket = json['ticket'] as String?; + interested = json['interested'] as bool?; + interestedCount = json['interested_count'] as int?; } } diff --git a/covas_mobile/lib/pages/ListItemMenu.dart b/covas_mobile/lib/pages/ListItemMenu.dart index d518e9a..bb70a58 100644 --- a/covas_mobile/lib/pages/ListItemMenu.dart +++ b/covas_mobile/lib/pages/ListItemMenu.dart @@ -874,6 +874,17 @@ class _MyHomePageState extends State { return ListTile( title: Text('${post.name!}'), subtitle: Text('${post.place!}\n${dateLongue}'), + trailing: IconButton( + onPressed: () async { + setState(() { + bool checkInterested = post?.interested ?? false; + post?.interested = !checkInterested; + }); + }, + icon: Icon( + post?.interested ?? false ? Icons.star : Icons.star_border, + color: + post?.interested ?? false ? Colors.blue : Colors.grey)), onTap: () { Navigator.push( context, From 924794e8a013d9a95a97aec58fce4b04ac02782e Mon Sep 17 00:00:00 2001 From: Valentin CZERYBA Date: Tue, 19 Aug 2025 00:11:40 +0200 Subject: [PATCH 2/6] ad toogle interested method --- covas_mobile/lib/l10n/app_de.arb | 4 +- covas_mobile/lib/l10n/app_en.arb | 4 +- covas_mobile/lib/l10n/app_fr.arb | 7 ++-- covas_mobile/lib/pages/ListItemMenu.dart | 47 ++++++++++++++++++++---- 4 files changed, 50 insertions(+), 12 deletions(-) diff --git a/covas_mobile/lib/l10n/app_de.arb b/covas_mobile/lib/l10n/app_de.arb index 09ea84b..5a08de1 100644 --- a/covas_mobile/lib/l10n/app_de.arb +++ b/covas_mobile/lib/l10n/app_de.arb @@ -136,6 +136,8 @@ "link": "Link", "edit_link": "Linkereignis bearbeiten", "ticket": "Abendkarte", -"edit_ticket": "Ticketlink bearbeiten" +"edit_ticket": "Ticketlink bearbeiten", +"toogle_interest": "Fehler beim Umschalten des Interesses", +"error_update": "Fehler beim Update" } diff --git a/covas_mobile/lib/l10n/app_en.arb b/covas_mobile/lib/l10n/app_en.arb index c90bd42..de034b1 100644 --- a/covas_mobile/lib/l10n/app_en.arb +++ b/covas_mobile/lib/l10n/app_en.arb @@ -138,5 +138,7 @@ "link": "Link", "edit_link": "Edit link name", "ticket": "Ticket", -"edit_ticket": "Edit ticket link" +"edit_ticket": "Edit ticket link", +"toogle_interest": "Error toggle interest", +"error_update": "Fehler beim Update" } \ No newline at end of file diff --git a/covas_mobile/lib/l10n/app_fr.arb b/covas_mobile/lib/l10n/app_fr.arb index bd8cce8..1555228 100644 --- a/covas_mobile/lib/l10n/app_fr.arb +++ b/covas_mobile/lib/l10n/app_fr.arb @@ -137,7 +137,8 @@ "item_ticket": "Billet : ", "link": "Lien", "edit_link": "Editer le lien", -"ticket": "Ticket", -"edit_ticket": "Edit ticket link" - +"ticket": "Billet", +"edit_ticket": "Editer le lien du billet", +"toogle_interest": "Erreur de bouton de changement", +"error_update": "Erreur lors de la mise à jour" } \ No newline at end of file diff --git a/covas_mobile/lib/pages/ListItemMenu.dart b/covas_mobile/lib/pages/ListItemMenu.dart index bb70a58..f64b747 100644 --- a/covas_mobile/lib/pages/ListItemMenu.dart +++ b/covas_mobile/lib/pages/ListItemMenu.dart @@ -423,7 +423,7 @@ class _MyHomePageState extends State { var url = await getUrlForEvents(); final response = await http.get(url, headers: { "Content-Type": "application/json", - HttpHeaders.cookieHeader: "acce0ss_token=$accessToken" + HttpHeaders.cookieHeader: "access_token=$accessToken" }); if (response.statusCode == 200) { @@ -469,6 +469,30 @@ class _MyHomePageState extends State { } } + Future toogleInterested(String eventId) async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + var accessToken = prefs.getString("access_token") ?? ""; + final url = Uri.parse("${globals.api}/events/${eventId}/interest"); + if (accessToken.isNotEmpty) { + final response = await http.post( + url, + headers: { + "Content-Type": "application/json", + HttpHeaders.cookieHeader: "access_token=$accessToken" + }, + ); + + if (response.statusCode != 200) { + throw (AppLocalizations.of(context)?.toogle_interest ?? + "Error toogle interest: ${response.statusCode}"); + } + + Events? event = json.decode(response.body); + return event?.interested ?? false; + } + return false; + } + Future fetchPostsByLocation() async { SharedPreferences prefs = await SharedPreferences.getInstance(); var accessToken = prefs.getString("access_token") ?? ""; @@ -876,15 +900,24 @@ class _MyHomePageState extends State { subtitle: Text('${post.place!}\n${dateLongue}'), trailing: IconButton( onPressed: () async { - setState(() { - bool checkInterested = post?.interested ?? false; - post?.interested = !checkInterested; - }); + try { + final result = await toogleInterested(post.id!); + setState(() { + post.interested = result; + }); + } catch (e) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + AppLocalizations.of(context)?.error_update ?? + "Error when updating")), + ); + } }, icon: Icon( - post?.interested ?? false ? Icons.star : Icons.star_border, + post.interested ?? false ? Icons.star : Icons.star_border, color: - post?.interested ?? false ? Colors.blue : Colors.grey)), + post.interested ?? false ? Colors.blue : Colors.grey)), onTap: () { Navigator.push( context, From f30aa8f630fca383f790dff2457338a958dfef7c Mon Sep 17 00:00:00 2001 From: Valentin CZERYBA Date: Tue, 19 Aug 2025 21:09:44 +0200 Subject: [PATCH 3/6] togleInterested debug --- covas_mobile/lib/pages/ListItemMenu.dart | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/covas_mobile/lib/pages/ListItemMenu.dart b/covas_mobile/lib/pages/ListItemMenu.dart index f64b747..c1fd965 100644 --- a/covas_mobile/lib/pages/ListItemMenu.dart +++ b/covas_mobile/lib/pages/ListItemMenu.dart @@ -487,8 +487,9 @@ class _MyHomePageState extends State { "Error toogle interest: ${response.statusCode}"); } - Events? event = json.decode(response.body); - return event?.interested ?? false; + var event = json.decode(response.body); + print(event); + return event.interested; } return false; } @@ -902,6 +903,7 @@ class _MyHomePageState extends State { onPressed: () async { try { final result = await toogleInterested(post.id!); + print("result : ${result}"); setState(() { post.interested = result; }); From bd5bfa94ca46f6f8821b860c8f578ba45f078e4c Mon Sep 17 00:00:00 2001 From: Valentin CZERYBA Date: Wed, 20 Aug 2025 22:49:51 +0200 Subject: [PATCH 4/6] remove print debug --- covas_mobile/lib/pages/ListItemMenu.dart | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/covas_mobile/lib/pages/ListItemMenu.dart b/covas_mobile/lib/pages/ListItemMenu.dart index c1fd965..7d1764e 100644 --- a/covas_mobile/lib/pages/ListItemMenu.dart +++ b/covas_mobile/lib/pages/ListItemMenu.dart @@ -469,7 +469,7 @@ class _MyHomePageState extends State { } } - Future toogleInterested(String eventId) async { + Future toggleInterested(String eventId) async { SharedPreferences prefs = await SharedPreferences.getInstance(); var accessToken = prefs.getString("access_token") ?? ""; final url = Uri.parse("${globals.api}/events/${eventId}/interest"); @@ -488,8 +488,7 @@ class _MyHomePageState extends State { } var event = json.decode(response.body); - print(event); - return event.interested; + return event["interested"]; } return false; } @@ -902,8 +901,7 @@ class _MyHomePageState extends State { trailing: IconButton( onPressed: () async { try { - final result = await toogleInterested(post.id!); - print("result : ${result}"); + final result = await toggleInterested(post.id!); setState(() { post.interested = result; }); From 4a936cc267743cfe35960558fa9e10d0ddf646d3 Mon Sep 17 00:00:00 2001 From: Valentin CZERYBA Date: Wed, 20 Aug 2025 23:22:25 +0200 Subject: [PATCH 5/6] change for heart and and count interested people --- covas_mobile/lib/l10n/app_de.arb | 4 ++-- covas_mobile/lib/l10n/app_en.arb | 3 ++- covas_mobile/lib/l10n/app_fr.arb | 4 +++- covas_mobile/lib/pages/ListItemMenu.dart | 22 +++++++++++++++------- 4 files changed, 22 insertions(+), 11 deletions(-) diff --git a/covas_mobile/lib/l10n/app_de.arb b/covas_mobile/lib/l10n/app_de.arb index 5a08de1..c6c07b1 100644 --- a/covas_mobile/lib/l10n/app_de.arb +++ b/covas_mobile/lib/l10n/app_de.arb @@ -138,6 +138,6 @@ "ticket": "Abendkarte", "edit_ticket": "Ticketlink bearbeiten", "toogle_interest": "Fehler beim Umschalten des Interesses", -"error_update": "Fehler beim Update" - +"error_update": "Fehler beim Update", +"count_interested": "Anzahl der Interessenten" } diff --git a/covas_mobile/lib/l10n/app_en.arb b/covas_mobile/lib/l10n/app_en.arb index de034b1..3a1fd28 100644 --- a/covas_mobile/lib/l10n/app_en.arb +++ b/covas_mobile/lib/l10n/app_en.arb @@ -140,5 +140,6 @@ "ticket": "Ticket", "edit_ticket": "Edit ticket link", "toogle_interest": "Error toggle interest", -"error_update": "Fehler beim Update" +"error_update": "Error when updating", +"count_interested": "Interested people number" } \ No newline at end of file diff --git a/covas_mobile/lib/l10n/app_fr.arb b/covas_mobile/lib/l10n/app_fr.arb index 1555228..c8003a3 100644 --- a/covas_mobile/lib/l10n/app_fr.arb +++ b/covas_mobile/lib/l10n/app_fr.arb @@ -140,5 +140,7 @@ "ticket": "Billet", "edit_ticket": "Editer le lien du billet", "toogle_interest": "Erreur de bouton de changement", -"error_update": "Erreur lors de la mise à jour" +"error_update": "Erreur lors de la mise à jour", +"count_interested": "Nombre de personne interessé" + } \ No newline at end of file diff --git a/covas_mobile/lib/pages/ListItemMenu.dart b/covas_mobile/lib/pages/ListItemMenu.dart index 7d1764e..21c411d 100644 --- a/covas_mobile/lib/pages/ListItemMenu.dart +++ b/covas_mobile/lib/pages/ListItemMenu.dart @@ -469,7 +469,7 @@ class _MyHomePageState extends State { } } - Future toggleInterested(String eventId) async { + Future> toggleInterested(String eventId) async { SharedPreferences prefs = await SharedPreferences.getInstance(); var accessToken = prefs.getString("access_token") ?? ""; final url = Uri.parse("${globals.api}/events/${eventId}/interest"); @@ -488,9 +488,9 @@ class _MyHomePageState extends State { } var event = json.decode(response.body); - return event["interested"]; + return event; } - return false; + return {"interested": false, "interested_count": 0}; } Future fetchPostsByLocation() async { @@ -895,15 +895,21 @@ class _MyHomePageState extends State { 'en_US'; final dateLongue = DateFormat('EEEE d MMMM y', locale).format(startDate); + final countInterestedString = + AppLocalizations.of(context)?.count_interested ?? + "Interested people number"; + final countInterested = + "${countInterestedString} : ${post.interestedCount}"; return ListTile( title: Text('${post.name!}'), - subtitle: Text('${post.place!}\n${dateLongue}'), + subtitle: Text('${post.place!}\n${dateLongue}\n${countInterested}'), trailing: IconButton( onPressed: () async { try { final result = await toggleInterested(post.id!); setState(() { - post.interested = result; + post.interested = result["interested"]; + post.interestedCount = result["interested_count"]; }); } catch (e) { ScaffoldMessenger.of(context).showSnackBar( @@ -915,9 +921,11 @@ class _MyHomePageState extends State { } }, icon: Icon( - post.interested ?? false ? Icons.star : Icons.star_border, + post.interested ?? false + ? Icons.favorite + : Icons.favorite_border, color: - post.interested ?? false ? Colors.blue : Colors.grey)), + post.interested ?? false ? Colors.red : Colors.grey)), onTap: () { Navigator.push( context, From dfe21960be9d0b36e042425e5c088faec61a2878 Mon Sep 17 00:00:00 2001 From: Valentin CZERYBA Date: Wed, 20 Aug 2025 23:39:20 +0200 Subject: [PATCH 6/6] add toggle interested in list organizer and tag --- .../lib/pages/ListItemByOrganizers.dart | 55 +++++++++++++++++- covas_mobile/lib/pages/ListItemByTags.dart | 57 ++++++++++++++++++- 2 files changed, 110 insertions(+), 2 deletions(-) diff --git a/covas_mobile/lib/pages/ListItemByOrganizers.dart b/covas_mobile/lib/pages/ListItemByOrganizers.dart index e0bcf08..228bd15 100644 --- a/covas_mobile/lib/pages/ListItemByOrganizers.dart +++ b/covas_mobile/lib/pages/ListItemByOrganizers.dart @@ -94,6 +94,30 @@ class _MyHomePageState extends State { }); } + Future> toggleInterested(String eventId) async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + var accessToken = prefs.getString("access_token") ?? ""; + final url = Uri.parse("${globals.api}/events/${eventId}/interest"); + if (accessToken.isNotEmpty) { + final response = await http.post( + url, + headers: { + "Content-Type": "application/json", + HttpHeaders.cookieHeader: "access_token=$accessToken" + }, + ); + + if (response.statusCode != 200) { + throw (AppLocalizations.of(context)?.toogle_interest ?? + "Error toogle interest: ${response.statusCode}"); + } + + var event = json.decode(response.body); + return event; + } + return {"interested": false, "interested_count": 0}; + } + // variable to call and store future list of posts // function to fetch data from api and return future list of posts @@ -190,10 +214,39 @@ class _MyHomePageState extends State { final dateLongue = DateFormat('EEEE d MMMM y', locale).format(startDate); + final countInterestedString = + AppLocalizations.of(context)?.count_interested ?? + "Interested people number"; + final countInterested = + "${countInterestedString} : ${post.interestedCount}"; return ListTile( title: Text('${post.name!}'), - subtitle: Text('${post.place!}\n${dateLongue}'), + subtitle: + Text('${post.place!}\n${dateLongue}\n${countInterested}'), + trailing: IconButton( + onPressed: () async { + try { + final result = await toggleInterested(post.id!); + setState(() { + post.interested = result["interested"]; + post.interestedCount = result["interested_count"]; + }); + } catch (e) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + AppLocalizations.of(context)?.error_update ?? + "Error when updating")), + ); + } + }, + icon: Icon( + post.interested ?? false + ? Icons.favorite + : Icons.favorite_border, + color: + post.interested ?? false ? Colors.red : Colors.grey)), onTap: () { Navigator.push( context, diff --git a/covas_mobile/lib/pages/ListItemByTags.dart b/covas_mobile/lib/pages/ListItemByTags.dart index 97c8658..14c762e 100644 --- a/covas_mobile/lib/pages/ListItemByTags.dart +++ b/covas_mobile/lib/pages/ListItemByTags.dart @@ -121,6 +121,30 @@ class _MyHomePageState extends State { return body; } + Future> toggleInterested(String eventId) async { + SharedPreferences prefs = await SharedPreferences.getInstance(); + var accessToken = prefs.getString("access_token") ?? ""; + final url = Uri.parse("${globals.api}/events/${eventId}/interest"); + if (accessToken.isNotEmpty) { + final response = await http.post( + url, + headers: { + "Content-Type": "application/json", + HttpHeaders.cookieHeader: "access_token=$accessToken" + }, + ); + + if (response.statusCode != 200) { + throw (AppLocalizations.of(context)?.toogle_interest ?? + "Error toogle interest: ${response.statusCode}"); + } + + var event = json.decode(response.body); + return event; + } + return {"interested": false, "interested_count": 0}; + } + @override void initState() { super.initState(); @@ -168,6 +192,7 @@ class _MyHomePageState extends State { Widget buildPosts(List posts) { // ListView Builder to show data in a list String tag = AppLocalizations.of(context)?.item_tags ?? "Tags : "; + return Scaffold( appBar: AppBar( // Here we take the value from the MyHomePage object that was created by @@ -191,9 +216,39 @@ class _MyHomePageState extends State { final dateLongue = DateFormat('EEEE d MMMM y', locale).format(startDate); + final countInterestedString = + AppLocalizations.of(context)?.count_interested ?? + "Interested people number"; + final countInterested = + "${countInterestedString} : ${post.interestedCount}"; + return ListTile( title: Text('${post.name!}'), - subtitle: Text('${post.place!}\n${dateLongue}'), + subtitle: + Text('${post.place!}\n${dateLongue}\n${countInterested}'), + trailing: IconButton( + onPressed: () async { + try { + final result = await toggleInterested(post.id!); + setState(() { + post.interested = result["interested"]; + post.interestedCount = result["interested_count"]; + }); + } catch (e) { + ScaffoldMessenger.of(context).showSnackBar( + SnackBar( + content: Text( + AppLocalizations.of(context)?.error_update ?? + "Error when updating")), + ); + } + }, + icon: Icon( + post.interested ?? false + ? Icons.favorite + : Icons.favorite_border, + color: + post.interested ?? false ? Colors.red : Colors.grey)), onTap: () { Navigator.push( context,