using Blazored.LocalStorage; using drinkMe.Client.Models; using drinkMe.Client.Services.Interfaces; using drinkMe.Shared; using Microsoft.AspNetCore.Components; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Threading.Tasks; namespace drinkMe.Client.Pages { public partial class Index : ComponentBase { [Inject] ILocalStorageService LocalStorage { get; set; } [Inject] IPriceService PriceService { get; set; } [Inject] IDataService DataService { get; set; } protected List AvailableDrinks { get; set; } = new List(); protected List DiscountCodes { get; set; } = new List(); protected List CartDrinks { get; set; } = new List(); protected string GetDrinksError { get; set; } protected string InvalidDiscountCodeError { get; set; } protected DiscountForm DiscountForm { get; set; } = new DiscountForm(); protected float TotalPrice { get; set; } protected override async Task OnInitializedAsync() { var getDrinksResult = await DataService.GetDrinks(); if (!getDrinksResult.IsValid) { GetDrinksError = getDrinksResult.ErrorMessage; return; } AvailableDrinks = (List)getDrinksResult.Data; DiscountCodes = await LocalStorage.GetItemAsync>(nameof(DiscountCodes)) ?? new List(); CartDrinks = await LocalStorage.GetItemAsync>(nameof(CartDrinks)) ?? new List(); if (CartDrinks.Count > 0) { TotalPrice = PriceService.GetTotalPrice(DiscountCodes, CartDrinks); AvailableDrinks.ForEach(ad => ad.IsInTheCart = CartDrinks.Any(cd => cd.Id == ad.Id)); } } protected async Task AddQuantity(DrinkViewModel drink) { drink.Quantity = drink.Quantity is > 0 and < 20 ? ++drink.Quantity : drink.Quantity; await LocalStorage.SetItemAsync(nameof(CartDrinks), CartDrinks); TotalPrice = PriceService.GetTotalPrice(DiscountCodes, CartDrinks); } protected async Task SubtractQuantity(DrinkViewModel drink) { if (drink.Quantity - 1 == 0) { var availableDrink = AvailableDrinks.First(ad => ad.Id == drink.Id); availableDrink.IsInTheCart = false; CartDrinks.Remove(drink); await LocalStorage.SetItemAsync(nameof(CartDrinks), CartDrinks); return; } drink.Quantity = drink.Quantity is > 1 and < 21 ? --drink.Quantity : drink.Quantity; await LocalStorage.SetItemAsync(nameof(CartDrinks), CartDrinks); TotalPrice = PriceService.GetTotalPrice(DiscountCodes, CartDrinks); } protected async Task AddToCart(DrinkViewModel drink) { drink.IsInTheCart = true; CartDrinks.Add(drink); await LocalStorage.SetItemAsync(nameof(CartDrinks), CartDrinks); TotalPrice = PriceService.GetTotalPrice(DiscountCodes, CartDrinks); } protected async Task TryAddDiscount() { InvalidDiscountCodeError = default; if (DiscountCodes.Any(dc => dc.Code == DiscountForm.DiscountCode)) { InvalidDiscountCodeError = "Discount code already added."; return; } var validationResult = await DataService.IsValidDiscountCode(DiscountForm.DiscountCode); if (!validationResult.IsValid) { InvalidDiscountCodeError = validationResult.ErrorMessage; return; } var discount = validationResult.Data as DiscountCodeViewModel; DiscountCodes.Add(discount); await LocalStorage.SetItemAsync(nameof(DiscountCodes), DiscountCodes); TotalPrice = PriceService.GetTotalPrice(DiscountCodes, CartDrinks); } protected void OnChangeDiscountCode(ChangeEventArgs changeEvent) { InvalidDiscountCodeError = default; DiscountForm.DiscountCode = (string)changeEvent.Value; } } }