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/l10n/app_de.arb b/covas_mobile/lib/l10n/app_de.arb index 09ea84b..c6c07b1 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", +"count_interested": "Anzahl der Interessenten" } diff --git a/covas_mobile/lib/l10n/app_en.arb b/covas_mobile/lib/l10n/app_en.arb index c90bd42..3a1fd28 100644 --- a/covas_mobile/lib/l10n/app_en.arb +++ b/covas_mobile/lib/l10n/app_en.arb @@ -138,5 +138,8 @@ "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": "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 bd8cce8..c8003a3 100644 --- a/covas_mobile/lib/l10n/app_fr.arb +++ b/covas_mobile/lib/l10n/app_fr.arb @@ -137,7 +137,10 @@ "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", +"count_interested": "Nombre de personne interessé" } \ No newline at end of file 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, diff --git a/covas_mobile/lib/pages/ListItemMenu.dart b/covas_mobile/lib/pages/ListItemMenu.dart index d518e9a..21c411d 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> 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}; + } + Future fetchPostsByLocation() async { SharedPreferences prefs = await SharedPreferences.getInstance(); var accessToken = prefs.getString("access_token") ?? ""; @@ -871,9 +895,37 @@ 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["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,