diff --git a/Sources/Stim.Model/Game.cs b/Sources/Stim.Model/Game.cs index ac85d17..2100563 100644 --- a/Sources/Stim.Model/Game.cs +++ b/Sources/Stim.Model/Game.cs @@ -74,8 +74,10 @@ namespace Model } private ObservableCollection tags; + public ReadOnlyCollection Reviews => reviews.AsReadOnly(); + [DataMember] - public List Reviews { get; private init; } + private readonly List reviews; public double Average => Reviews.Any() ? Math.Round(Reviews.Select(review => review.Rate).Average(), 1) : 0; @@ -104,7 +106,7 @@ namespace Model else Cover = cover; if (string.IsNullOrWhiteSpace(c_lien)) Lien = "Pas de lien"; else Lien = c_lien; - Reviews = new List(); + reviews = new List(); } public event PropertyChangedEventHandler? PropertyChanged; @@ -147,11 +149,16 @@ namespace Model public void AddReview(Review review) { - Reviews.Add(review); + reviews.Add(review); + NotifyPropertyChanged(nameof(Reviews)); + NotifyPropertyChanged(nameof(Average)); } public void RemoveReview(Review review) { - Reviews.Remove(review); + reviews.Remove(review); + NotifyPropertyChanged(nameof(Reviews)); + NotifyPropertyChanged(nameof(Average)); + } public void DescChange(string newdesc) { diff --git a/Sources/Stim.Model/Manager.cs b/Sources/Stim.Model/Manager.cs index 0e02977..af3e69f 100644 --- a/Sources/Stim.Model/Manager.cs +++ b/Sources/Stim.Model/Manager.cs @@ -7,7 +7,7 @@ namespace Model public class Manager { public readonly IPersistance mgrpersistance; - public ReadOnlyCollection GameList { get; private set; } + public ReadOnlyCollection GameList => gameList.AsReadOnly(); private readonly List gameList; public Game? SelectedGame { get; set; } public User? CurrentUser { get; set; } @@ -17,7 +17,6 @@ namespace Model { mgrpersistance = persistance; gameList = persistance.LoadGame(); - GameList = new ReadOnlyCollection(gameList); Users = persistance.LoadUser(); } @@ -54,7 +53,11 @@ namespace Model gameList.Remove(game); mgrpersistance.SaveGame(gameList); } - + [ExcludeFromCodeCoverage] + public void SaveGames() + { + mgrpersistance.SaveGame(gameList); + } public User? SearchUser(string username) { foreach (User user in Users) @@ -63,5 +66,10 @@ namespace Model } return null; } + [ExcludeFromCodeCoverage] + public void SaveUser() + { + mgrpersistance.SaveUser(Users); + } } } diff --git a/Sources/Stim.Model/Review.cs b/Sources/Stim.Model/Review.cs index c3e24da..894244b 100644 --- a/Sources/Stim.Model/Review.cs +++ b/Sources/Stim.Model/Review.cs @@ -58,7 +58,7 @@ namespace Model } public void EditRate(double newval) { - Rate= newval; + if (newval >= 0 && newval <= 5) Rate= newval; } } } diff --git a/Sources/Stim.Model/User.cs b/Sources/Stim.Model/User.cs index faffa5a..3566534 100644 --- a/Sources/Stim.Model/User.cs +++ b/Sources/Stim.Model/User.cs @@ -38,7 +38,7 @@ namespace Model public string Biographie { get => biographie; - private set + set { if (string.IsNullOrWhiteSpace(value)) biographie = "Pas de biographie"; else biographie = value; @@ -50,12 +50,15 @@ namespace Model public string Email { get => email; - private set + set { - Regex rg_email = new Regex("^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$"); - if (!(string.IsNullOrWhiteSpace(value)) && rg_email.IsMatch(value)) email = value; + Regex rg_email = new Regex("^([a-zA-Z0-9_-]+[.])*[a-zA-Z0-9_-]+@([a-zA-Z0-9_-]+[.])+[a-zA-Z0-9_-]{2,4}$"); + if (!(string.IsNullOrWhiteSpace(value)) && rg_email.IsMatch(value)) + { + email = value; + NotifyPropertyChanged(); + } else email = "Default"; - NotifyPropertyChanged(); } } private string email = default!; @@ -63,7 +66,7 @@ namespace Model public string Password { get => password; - private set + set { Regex rg = new Regex("^(?=.*[A-Za-z])(?=.*[0-9@$!%*#?&])[A-Za-z-0-9@$!%*#?&]{8,}$"); if (string.IsNullOrWhiteSpace(value) || !rg.IsMatch(value)) throw new ArgumentNullException(value); @@ -122,7 +125,7 @@ namespace Model return 0; } - public void AddReview(Game game, float rate, string text) + public void AddReview(Game game, double rate, string text) { game.AddReview(new Review(Username, rate, text)); } @@ -155,5 +158,6 @@ namespace Model foreach (Game game in Followed_Games) builder.Append($"{game.Name}\n"); return builder.ToString(); } + } } diff --git a/Sources/Stim/Create.xaml.cs b/Sources/Stim/Create.xaml.cs index b317763..2ca4b5d 100644 --- a/Sources/Stim/Create.xaml.cs +++ b/Sources/Stim/Create.xaml.cs @@ -16,7 +16,7 @@ public partial class Create : ContentPage { if (((App)App.Current).Manager.SearchUser(Username.Text) == null) { - Regex rg = new Regex("^[\\w-\\.]+@([\\w-]+\\.)+[\\w-]{2,4}$"); + Regex rg = new Regex("^([a-zA-Z0-9_-]+[.])*[a-zA-Z0-9_-]+@([a-zA-Z0-9_-]+[.])+[a-zA-Z0-9_-]{2,4}$"); if (rg.IsMatch(Email.Text)) { rg = new Regex("^(?=.*[A-Za-z])(?=.*[0-9@$!%*#?&])[A-Za-z-0-9@$!%*#?&]{8,}$"); diff --git a/Sources/Stim/DetailledPage.xaml.cs b/Sources/Stim/DetailledPage.xaml.cs index 57e7de1..5dcb5a9 100644 --- a/Sources/Stim/DetailledPage.xaml.cs +++ b/Sources/Stim/DetailledPage.xaml.cs @@ -1,6 +1,5 @@ using CommunityToolkit.Maui.Views; using Model; -using StimPersistance; namespace Stim; @@ -9,8 +8,8 @@ public partial class DetailledPage : ContentPage public DetailledPage() { InitializeComponent(); - BindingContext = (App.Current as App).Manager.SelectedGame; if ((App.Current as App).Manager.SelectedGame is null) Navigation.RemovePage(this); + BindingContext = (App.Current as App).Manager.SelectedGame; } private async void GoToMainPage(object sender, EventArgs e) @@ -18,9 +17,9 @@ public partial class DetailledPage : ContentPage await Navigation.PushModalAsync(new MainPage()); } - private void AddReview(object sender, EventArgs e) + private async void AddReview(object sender, EventArgs e) { - //popup add review + await this.ShowPopupAsync(new ReviewPopUp()); } private async void AddFollow(object sender, EventArgs e) diff --git a/Sources/Stim/EntryPopup.xaml b/Sources/Stim/EntryPopup.xaml index 0a88012..dacf7d9 100644 --- a/Sources/Stim/EntryPopup.xaml +++ b/Sources/Stim/EntryPopup.xaml @@ -10,5 +10,6 @@