diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Controls/CartButton.xaml b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Controls/AddBasketButton.xaml similarity index 97% rename from src/Mobile/eShopOnContainers/eShopOnContainers.Core/Controls/CartButton.xaml rename to src/Mobile/eShopOnContainers/eShopOnContainers.Core/Controls/AddBasketButton.xaml index 0235d1d19..0cf83094c 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Controls/CartButton.xaml +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Controls/AddBasketButton.xaml @@ -2,7 +2,7 @@ + x:Class="eShopOnContainers.Core.Controls.AddBasketButton"> diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Controls/CartButton.xaml.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Controls/AddBasketButton.xaml.cs similarity index 60% rename from src/Mobile/eShopOnContainers/eShopOnContainers.Core/Controls/CartButton.xaml.cs rename to src/Mobile/eShopOnContainers/eShopOnContainers.Core/Controls/AddBasketButton.xaml.cs index b46235a66..caa4839ac 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Controls/CartButton.xaml.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Controls/AddBasketButton.xaml.cs @@ -2,11 +2,11 @@ namespace eShopOnContainers.Core.Controls { - public partial class CartButton : ContentView + public partial class AddBasketButton : ContentView { - public CartButton() + public AddBasketButton() { InitializeComponent(); } } -} +} \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs index 551e94c96..d942bc439 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/GlobalSettings.cs @@ -5,5 +5,7 @@ public const string RegisterWebsite = "http://104.40.62.65/Account/Register"; public const string CatalogEndpoint = "http://104.40.62.65:5101/"; + + public const string BasketEndpoint = "http://104.40.62.65:5103/"; } } \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Basket/BasketItem.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Basket/BasketItem.cs new file mode 100644 index 000000000..2edfd198b --- /dev/null +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Basket/BasketItem.cs @@ -0,0 +1,100 @@ +using eShopOnContainers.Core.Helpers; +using eShopOnContainers.ViewModels.Base; +using System; +using System.Collections.ObjectModel; + +namespace eShopOnContainers.Core.Models.Basket +{ + public class BasketItem : ExtendedBindableObject + { + private string _id; + private string _productId; + private string _productName; + private decimal _unitPrice; + private int _quantity; + private string _pictureUrl; + private ObservableCollection _numbers; + + public BasketItem() + { + Numbers = NumericHelper.GetNumericList(); + } + + public string Id + { + get { return _id; } + set + { + _id = value; + RaisePropertyChanged(() => Id); + } + } + + public string ProductId + { + get { return _productId; } + set + { + _productId = value; + RaisePropertyChanged(() => ProductId); + } + } + + public string ProductName + { + get { return _productName; } + set + { + _productName = value; + RaisePropertyChanged(() => ProductName); + } + } + + public decimal UnitPrice + { + get { return _unitPrice; } + set + { + _unitPrice = value; + RaisePropertyChanged(() => UnitPrice); + } + } + + public int Quantity + { + get { return _quantity; } + set + { + _quantity = value; + RaisePropertyChanged(() => Quantity); + } + } + + public string PictureUrl + { + get { return _pictureUrl; } + set + { + _pictureUrl = value; + RaisePropertyChanged(() => PictureUrl); + } + } + + public decimal Total { get { return Quantity * UnitPrice; } } + + public ObservableCollection Numbers + { + get { return _numbers; } + set + { + _numbers = value; + RaisePropertyChanged(() => Numbers); + } + } + + public override string ToString() + { + return String.Format("Product Id: {0}, Quantity: {1}", ProductId, Quantity); + } + } +} diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Basket/CustomerBasket.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Basket/CustomerBasket.cs new file mode 100644 index 000000000..66afa7f9a --- /dev/null +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Basket/CustomerBasket.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace eShopOnContainers.Core.Models.Basket +{ + public class CustomerBasket + { + public string BuyerId { get; set; } + public List Items { get; set; } + } +} diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Orders/OrderItem.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Orders/OrderItem.cs index ada28ef5f..10712da68 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Orders/OrderItem.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Orders/OrderItem.cs @@ -10,7 +10,7 @@ namespace eShopOnContainers.Core.Models.Orders public class OrderItem : ExtendedBindableObject { private string _productImage; - private int _productId; + private string _productId; private Guid _orderId; private string _productName; private decimal _unitPrice; @@ -23,7 +23,7 @@ namespace eShopOnContainers.Core.Models.Orders Numbers = NumericHelper.GetNumericList(); } - public int ProductId + public string ProductId { get { return _productId; } set diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/User/User.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/User/User.cs index 7bae593d4..30f133226 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/User/User.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/User/User.cs @@ -1,7 +1,10 @@ -namespace eShopOnContainers.Core.Models.User +using System; + +namespace eShopOnContainers.Core.Models.User { public class User { + public string GuidUser { get; set; } public string Name { get; set; } public string LastName { get; set; } public string CardNumber { get; set; } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketMockService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketMockService.cs new file mode 100644 index 000000000..6bdcf0df5 --- /dev/null +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketMockService.cs @@ -0,0 +1,42 @@ +using eShopOnContainers.Core.Models.Basket; +using System.Collections.Generic; +using System.Threading.Tasks; +using Xamarin.Forms; +using System; + +namespace eShopOnContainers.Core.Services.Basket +{ + public class BasketMockService : IBasketService + { + private CustomerBasket MockCustomBasket = new CustomerBasket + { + BuyerId = "9245fe4a-d402-451c-b9ed-9c1a04247482", + Items = new List + { + new BasketItem { Id = "1", PictureUrl = Device.OS != TargetPlatform.Windows ? "fake_product_01.png" : "Assets/fake_product_01.png", ProductId = "1", ProductName = ".NET Bot Blue Sweatshirt (M)", Quantity = 1, UnitPrice = 19.50M }, + new BasketItem { Id = "2", PictureUrl = Device.OS != TargetPlatform.Windows ? "fake_product_04.png" : "Assets/fake_product_04.png", ProductId = "4", ProductName = ".NET Black Cupt", Quantity = 1, UnitPrice = 17.00M } + } + }; + + public async Task GetBasketAsync(string guidUser) + { + await Task.Delay(500); + + if(string.IsNullOrEmpty(guidUser)) + { + return new CustomerBasket(); + } + + return MockCustomBasket; + } + + public async Task UpdateBasketAsync(CustomerBasket customerBasket) + { + await Task.Delay(500); + + MockCustomBasket = customerBasket; + + return MockCustomBasket; + } + } +} \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketService.cs new file mode 100644 index 000000000..52553ab02 --- /dev/null +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketService.cs @@ -0,0 +1,53 @@ +using System; +using System.Threading.Tasks; +using eShopOnContainers.Core.Services.RequestProvider; +using eShopOnContainers.Core.Models.Basket; + +namespace eShopOnContainers.Core.Services.Basket +{ + public class BasketService : IBasketService + { + private readonly IRequestProvider _requestProvider; + + public BasketService(IRequestProvider requestProvider) + { + _requestProvider = requestProvider; + } + + public async Task GetBasketAsync(string guidUser) + { + try + { + UriBuilder builder = new UriBuilder(GlobalSetting.CatalogEndpoint); + + builder.Path = guidUser; + + string uri = builder.ToString(); + + CustomerBasket basket = + await _requestProvider.GetAsync(uri); + + return basket; + } + catch + { + return new CustomerBasket + { + BuyerId = guidUser, + Items = new System.Collections.Generic.List() + }; + } + } + + public async Task UpdateBasketAsync(CustomerBasket customerBasket) + { + UriBuilder builder = new UriBuilder(GlobalSetting.CatalogEndpoint); + + string uri = builder.ToString(); + + var result = await _requestProvider.PostAsync(uri, customerBasket); + + return result; + } + } +} \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/IBasketService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/IBasketService.cs new file mode 100644 index 000000000..356eb40f7 --- /dev/null +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/IBasketService.cs @@ -0,0 +1,11 @@ +using eShopOnContainers.Core.Models.Basket; +using System.Threading.Tasks; + +namespace eShopOnContainers.Core.Services.Basket +{ + public interface IBasketService + { + Task GetBasketAsync(string guidUser); + Task UpdateBasketAsync(CustomerBasket customerBasket); + } +} \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/NavigationService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/NavigationService.cs index aacae349b..66a723baf 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/NavigationService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Navigation/NavigationService.cs @@ -147,7 +147,7 @@ namespace eShopOnContainers.Services private void CreatePageViewModelMappings() { - _mappings.Add(typeof(CartViewModel), typeof(CartView)); + _mappings.Add(typeof(BasketViewModel), typeof(BasketView)); _mappings.Add(typeof(CatalogViewModel), typeof(CatalogView)); _mappings.Add(typeof(CheckoutViewModel), typeof(CheckoutView)); _mappings.Add(typeof(LoginViewModel), typeof(LoginView)); diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Orders/IOrdersService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Orders/IOrdersService.cs deleted file mode 100644 index 39536bc8e..000000000 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Orders/IOrdersService.cs +++ /dev/null @@ -1,13 +0,0 @@ -using eShopOnContainers.Core.Models.Orders; -using System.Collections.ObjectModel; -using System.Threading.Tasks; - -namespace eShopOnContainers.Core.Services.Orders -{ - public interface IOrdersService - { - Task> GetOrdersAsync(); - - Task GetCartAsync(); - } -} \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Orders/OrdersMockService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Orders/OrdersMockService.cs deleted file mode 100644 index 9c4a7b42c..000000000 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Orders/OrdersMockService.cs +++ /dev/null @@ -1,39 +0,0 @@ -using eShopOnContainers.Core.Models.Orders; -using System; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Threading.Tasks; - -namespace eShopOnContainers.Core.Services.Orders -{ - public class OrdersMockService : IOrdersService - { - public async Task> GetOrdersAsync() - { - await Task.Delay(500); - - return new ObservableCollection - { - new Order { SequenceNumber = 123, Total = 56.40M, OrderDate = DateTime.Now, Status = OrderStatus.Delivered, OrderItems = GetOrderItems() }, - new Order { SequenceNumber = 132, Total = 56.40M, OrderDate = DateTime.Now, Status = OrderStatus.Delivered, OrderItems = GetOrderItems() }, - new Order { SequenceNumber = 231, Total = 56.40M, OrderDate = DateTime.Now, Status = OrderStatus.Delivered, OrderItems = GetOrderItems() }, - }; - } - - public async Task GetCartAsync() - { - await Task.Delay(500); - - return new Order { SequenceNumber = 0123456789, Total = 56.40M, OrderDate = DateTime.Now, Status = OrderStatus.Pending, OrderItems = GetOrderItems() }; - } - - private List GetOrderItems() - { - return new List - { - new OrderItem { OrderId = Guid.NewGuid(), ProductId = 1, Discount = 15, ProductName = ".NET Bot Blue Sweatshirt (M)", Quantity = 1, UnitPrice = 16.50M }, - new OrderItem { OrderId = Guid.NewGuid(), ProductId = 3, Discount = 0, ProductName = ".NET Bot Black Sweatshirt (M)", Quantity = 2, UnitPrice = 19.95M } - }; - } - } -} \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/RequestProvider/RequestProvider.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/RequestProvider/RequestProvider.cs index 75a92ad12..dd6a1bce5 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/RequestProvider/RequestProvider.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/RequestProvider/RequestProvider.cs @@ -34,6 +34,7 @@ namespace eShopOnContainers.Core.Services.RequestProvider await HandleResponse(response); string serialized = await response.Content.ReadAsStringAsync(); + TResult result = await Task.Run(() => JsonConvert.DeserializeObject(serialized, _serializerSettings)); @@ -91,7 +92,8 @@ namespace eShopOnContainers.Core.Services.RequestProvider { var content = await response.Content.ReadAsStringAsync(); - if (response.StatusCode == HttpStatusCode.Forbidden || response.StatusCode == HttpStatusCode.Unauthorized) + if (response.StatusCode == HttpStatusCode.Forbidden + || response.StatusCode == HttpStatusCode.Unauthorized) { throw new ServiceAuthenticationException(content); } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/User/IUserService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/User/IUserService.cs index 4ed3e5755..fac0a47a1 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/User/IUserService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/User/IUserService.cs @@ -1,9 +1,12 @@ -using System.Threading.Tasks; +using eShopOnContainers.Core.Models.Orders; +using System.Collections.Generic; +using System.Threading.Tasks; namespace eShopOnContainers.Core.Services.User { public interface IUserService { Task GetUserAsync(); + Task> GetOrdersAsync(); } -} +} \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/User/UserMockService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/User/UserMockService.cs index 67f7a0bb1..12c3f8e60 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/User/UserMockService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/User/UserMockService.cs @@ -1,4 +1,7 @@ -using System.Threading.Tasks; +using eShopOnContainers.Core.Models.Orders; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; namespace eShopOnContainers.Core.Services.User { @@ -6,6 +9,7 @@ namespace eShopOnContainers.Core.Services.User { private Models.User.User MockUser = new Models.User.User { + GuidUser = "9245fe4a-d402-451c-b9ed-9c1a04247482", Name = "Jhon", LastName = "Doe", City = "Seattle, WA", @@ -14,11 +18,31 @@ namespace eShopOnContainers.Core.Services.User Country = "United States" }; + private List MockOrders = new List() + { + new Order { SequenceNumber = 123, Total = 56.40M, OrderDate = DateTime.Now, Status = OrderStatus.Delivered, OrderItems = MockOrderItems }, + new Order { SequenceNumber = 132, Total = 56.40M, OrderDate = DateTime.Now, Status = OrderStatus.Delivered, OrderItems = MockOrderItems }, + new Order { SequenceNumber = 231, Total = 56.40M, OrderDate = DateTime.Now, Status = OrderStatus.Delivered, OrderItems = MockOrderItems }, + }; + + private static List MockOrderItems = new List() + { + new OrderItem { OrderId = Guid.NewGuid(), ProductId = "1", Discount = 15, ProductName = ".NET Bot Blue Sweatshirt (M)", Quantity = 1, UnitPrice = 16.50M }, + new OrderItem { OrderId = Guid.NewGuid(), ProductId = "3", Discount = 0, ProductName = ".NET Bot Black Sweatshirt (M)", Quantity = 2, UnitPrice = 19.95M } + }; + public async Task GetUserAsync() { await Task.Delay(500); return MockUser; } + + public async Task> GetOrdersAsync() + { + await Task.Delay(500); + + return MockOrders; + } } } \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/MessengerKeys.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/MessengerKeys.cs index ec49e8802..25fd28be6 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/MessengerKeys.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/MessengerKeys.cs @@ -2,10 +2,13 @@ { public class MessengerKeys { - // Add product to cart + // Add product to basket public const string AddProduct = "AddProduct"; - // Update product cart + // Update Basket + public const string UpdateBasket = "UpdateBasket"; + + // Update product basket public const string UpdateProduct = "UpdateProduct"; // Filter diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs index 46b01ba55..e1c28642a 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/Base/ViewModelLocator.cs @@ -1,5 +1,4 @@ using Microsoft.Practices.Unity; -using eShopOnContainers.Core.Services.Orders; using eShopOnContainers.Core.ViewModels; using eShopOnContainers.Services; using System; @@ -7,6 +6,7 @@ using eShopOnContainers.Core.Services.Catalog; using eShopOnContainers.Core.Services.OpenUrl; using eShopOnContainers.Core.Services.User; using eShopOnContainers.Core.Services.RequestProvider; +using eShopOnContainers.Core.Services.Basket; namespace eShopOnContainers.ViewModels.Base { @@ -39,11 +39,11 @@ namespace eShopOnContainers.ViewModels.Base _unityContainer.RegisterType(); _unityContainer.RegisterType(); - _unityContainer.RegisterType(); + _unityContainer.RegisterType(); _unityContainer.RegisterType(); // View models - _unityContainer.RegisterType(); + _unityContainer.RegisterType(); _unityContainer.RegisterType(); _unityContainer.RegisterType(); _unityContainer.RegisterType(); @@ -58,7 +58,7 @@ namespace eShopOnContainers.ViewModels.Base if (!useMockServices) { _unityContainer.RegisterInstance(new CatalogMockService()); - _unityContainer.RegisterInstance(new OrdersMockService()); + _unityContainer.RegisterInstance(new BasketMockService()); _unityContainer.RegisterInstance(new UserMockService()); UseMockService = false; @@ -67,6 +67,8 @@ namespace eShopOnContainers.ViewModels.Base { var requestProvider = Resolve(); _unityContainer.RegisterInstance(new CatalogService(requestProvider)); + _unityContainer.RegisterInstance(new BasketService(requestProvider)); + _unityContainer.RegisterInstance(new UserMockService()); UseMockService = true; } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/BasketViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/BasketViewModel.cs new file mode 100644 index 000000000..0ffea52ad --- /dev/null +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/BasketViewModel.cs @@ -0,0 +1,150 @@ +using eShopOnContainers.Core.Models.Basket; +using eShopOnContainers.Core.Models.Catalog; +using eShopOnContainers.Core.Models.Orders; +using eShopOnContainers.Core.Models.User; +using eShopOnContainers.Core.Services.Basket; +using eShopOnContainers.Core.Services.User; +using eShopOnContainers.Core.ViewModels.Base; +using eShopOnContainers.ViewModels.Base; +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Linq; +using System.Threading.Tasks; +using System.Windows.Input; +using Xamarin.Forms; + +namespace eShopOnContainers.Core.ViewModels +{ + public class BasketViewModel : ViewModelBase + { + private User _user; + private int _badgeCount; + private ObservableCollection _basketItems; + private decimal _total; + + private IUserService _userService; + private IBasketService _basketService; + + public BasketViewModel(IUserService userService, + IBasketService basketService) + { + _userService = userService; + _basketService = basketService; + } + + public int BadgeCount + { + get { return _badgeCount; } + set + { + _badgeCount = value; + RaisePropertyChanged(() => BadgeCount); + } + } + + public ObservableCollection BasketItems + { + get { return _basketItems; } + set + { + _basketItems = value; + RaisePropertyChanged(() => BasketItems); + } + } + + public decimal Total + { + get { return _total; } + set + { + _total = value; + RaisePropertyChanged(() => Total); + } + } + + public ICommand CheckoutCommand => new Command(Checkout); + + public override async Task InitializeAsync(object navigationData) + { + MessagingCenter.Subscribe>(this, MessengerKeys.UpdateBasket, (sender, arg) => + { + BadgeCount = arg.Count; + + foreach (var basketItem in arg) + { + AddBasketItem(basketItem); + } + }); + + MessagingCenter.Subscribe(this, MessengerKeys.AddProduct, (sender, arg) => + { + BadgeCount++; + + AddCatalogItem(arg); + }); + + MessagingCenter.Subscribe(this, MessengerKeys.UpdateProduct, (sender) => + { + ReCalculateTotal(); + }); + + _user = await _userService.GetUserAsync(); + BasketItems = new ObservableCollection(); + } + + private void AddCatalogItem(CatalogItem item) + { + if (BasketItems.Any(o => o.ProductId.Equals(item.Id, StringComparison.CurrentCultureIgnoreCase))) + { + var orderItem = BasketItems.First(o => o.ProductId.Equals(item.Id, StringComparison.CurrentCultureIgnoreCase)); + orderItem.Quantity++; + } + else + { + BasketItems.Add(new BasketItem + { + ProductId = item.Id, + ProductName = item.Name, + PictureUrl = item.PictureUri, + UnitPrice = item.Price, + Quantity = 1 + }); + } + + ReCalculateTotal(); + } + + private void AddBasketItem(BasketItem item) + { + BasketItems.Add(item); + + ReCalculateTotal(); + } + + private void ReCalculateTotal() + { + Total = 0; + + foreach (var orderItem in BasketItems) + { + Total += (orderItem.Quantity * orderItem.UnitPrice); + } + + + _basketService.UpdateBasketAsync(new CustomerBasket + { + BuyerId = _user.GuidUser, + Items = BasketItems.ToList() + }); + } + + private void Checkout() + { + if (BasketItems.Any()) + { + NavigationService.NavigateToAsync(BasketItems); + } + } + } +} \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CartViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CartViewModel.cs deleted file mode 100644 index 8001fa834..000000000 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CartViewModel.cs +++ /dev/null @@ -1,117 +0,0 @@ -using eShopOnContainers.Core.Helpers; -using eShopOnContainers.Core.Models.Catalog; -using eShopOnContainers.Core.Models.Orders; -using eShopOnContainers.Core.Services.Orders; -using eShopOnContainers.Core.ViewModels.Base; -using eShopOnContainers.ViewModels.Base; -using System; -using System.Collections.ObjectModel; -using System.Linq; -using System.Threading.Tasks; -using System.Windows.Input; -using Xamarin.Forms; - -namespace eShopOnContainers.Core.ViewModels -{ - public class CartViewModel : ViewModelBase - { - private int _badgeCount; - private ObservableCollection _orderItems; - private decimal _total; - - private IOrdersService _orderService; - - public CartViewModel(IOrdersService orderService) - { - _orderService = orderService; - } - - public int BadgeCount - { - get { return _badgeCount; } - set - { - _badgeCount = value; - RaisePropertyChanged(() => BadgeCount); - } - } - - public ObservableCollection OrderItems - { - get { return _orderItems; } - set - { - _orderItems = value; - RaisePropertyChanged(() => OrderItems); - } - } - - public decimal Total - { - get { return _total; } - set - { - _total = value; - RaisePropertyChanged(() => Total); - } - } - - public ICommand CheckoutCommand => new Command(Checkout); - - public override Task InitializeAsync(object navigationData) - { - MessagingCenter.Subscribe(this, MessengerKeys.AddProduct, (sender, arg) => - { - BadgeCount++; - - AddCartItem(arg); - }); - - MessagingCenter.Subscribe(this, MessengerKeys.UpdateProduct, (sender) => - { - ReCalculateTotal(); - }); - - OrderItems = new ObservableCollection(); - - return base.InitializeAsync(navigationData); - } - - private void AddCartItem(CatalogItem item) - { - if (OrderItems.Any(o => o.ProductId == Convert.ToInt32(item.Id))) - { - var orderItem = OrderItems.First(o => o.ProductId == Convert.ToInt32(item.Id)); - orderItem.Quantity++; - } - else - { - OrderItems.Add(new OrderItem - { - ProductId = Convert.ToInt32(item.Id), - ProductName = item.Name, - ProductImage = item.PictureUri, - UnitPrice = item.Price, - Quantity = 1 - }); - } - - ReCalculateTotal(); - } - - private void ReCalculateTotal() - { - Total = 0; - - foreach (var orderItem in OrderItems) - { - Total += orderItem.Total; - } - } - - private void Checkout() - { - NavigationService.NavigateToAsync(OrderItems); - } - } -} \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CatalogViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CatalogViewModel.cs index 05e2b461a..5735c5633 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CatalogViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CatalogViewModel.cs @@ -6,6 +6,9 @@ using eShopOnContainers.Core.ViewModels.Base; using eShopOnContainers.Core.Models.Catalog; using eShopOnContainers.Core.Services.Catalog; using System.Windows.Input; +using eShopOnContainers.Core.Services.User; +using System.Linq; +using eShopOnContainers.Core.Services.Basket; namespace eShopOnContainers.Core.ViewModels { @@ -17,10 +20,16 @@ namespace eShopOnContainers.Core.ViewModels private ObservableCollection _types; private CatalogType _type; + private IUserService _userService; + private IBasketService _basketService; private ICatalogService _productsService; - public CatalogViewModel(ICatalogService productsService) + public CatalogViewModel(IUserService userService, + IBasketService basketService, + ICatalogService productsService) { + _userService = userService; + _basketService = basketService; _productsService = productsService; } @@ -92,6 +101,15 @@ namespace eShopOnContainers.Core.ViewModels Brands = await _productsService.GetCatalogBrandAsync(); Types = await _productsService.GetCatalogTypeAsync(); + var user = await _userService.GetUserAsync(); + var basket = await _basketService.GetBasketAsync(user.GuidUser); + + if (basket != null && basket.Items.Any()) + { + System.Diagnostics.Debug.WriteLine(basket.Items.Count); + MessagingCenter.Send(this, MessengerKeys.UpdateBasket, basket.Items); + } + IsBusy = false; } @@ -102,7 +120,7 @@ namespace eShopOnContainers.Core.ViewModels private async void Filter() { - if(Brand == null && Type == null) + if (Brand == null && Type == null) { return; } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs index 938170d6a..e842f310f 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs @@ -9,12 +9,14 @@ using eShopOnContainers.Core.Models.Orders; using System; using System.Collections.ObjectModel; using System.Linq; +using eShopOnContainers.Core.Models.Basket; +using System.Collections.Generic; namespace eShopOnContainers.Core.ViewModels { public class CheckoutViewModel : ViewModelBase { - private ObservableCollection _orderItems; + private ObservableCollection _orderItems; private Order _order; private User _user; @@ -25,7 +27,7 @@ namespace eShopOnContainers.Core.ViewModels _userService = userService; } - public ObservableCollection OrderItems + public ObservableCollection OrderItems { get { return _orderItems; } set @@ -59,11 +61,11 @@ namespace eShopOnContainers.Core.ViewModels public override async Task InitializeAsync(object navigationData) { - if (navigationData is ObservableCollection) + if (navigationData is ObservableCollection) { IsBusy = true; - var orderItems = ((ObservableCollection)navigationData); + var orderItems = ((ObservableCollection)navigationData); OrderItems = orderItems; @@ -72,7 +74,7 @@ namespace eShopOnContainers.Core.ViewModels Order = new Order { ShippingAddress = User, - OrderItems = orderItems.ToList(), + OrderItems = CreateOrderItems(orderItems.ToList()), Status = OrderStatus.Pending, OrderDate = DateTime.Now, Total = GetOrderTotal() @@ -91,6 +93,25 @@ namespace eShopOnContainers.Core.ViewModels await NavigationService.RemoveLastFromBackStackAsync(); } + private List CreateOrderItems(List basketItems) + { + var orderItems = new List(); + + foreach (var basketItem in basketItems) + { + orderItems.Add(new OrderItem + { + ProductId = basketItem.ProductId, + ProductName = basketItem.ProductName, + ProductImage = basketItem.PictureUrl, + Quantity = basketItem.Quantity, + UnitPrice = basketItem.UnitPrice + }); + } + + return orderItems; + } + private decimal GetOrderTotal() { decimal total = 0; diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/MainViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/MainViewModel.cs index 2cc8a9585..08dd09798 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/MainViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/MainViewModel.cs @@ -8,7 +8,7 @@ using System.Windows.Input; namespace eShopOnContainers.Core.ViewModels { public class MainViewModel : ViewModelBase - { + { public ICommand SettingsCommand => new Command(Settings); public override Task InitializeAsync(object navigationData) diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/OrderDetailViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/OrderDetailViewModel.cs index 9d63851f6..f363c200b 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/OrderDetailViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/OrderDetailViewModel.cs @@ -1,10 +1,10 @@ using System.Threading.Tasks; using eShopOnContainers.Core.Models.Orders; using eShopOnContainers.ViewModels.Base; -using eShopOnContainers.Core.Services.Orders; using eShopOnContainers.Core.Services.Catalog; using eShopOnContainers.Core.Services.User; using eShopOnContainers.Core.Models.User; +using eShopOnContainers.Core.Services.Basket; namespace eShopOnContainers.Core.ViewModels { @@ -13,11 +13,11 @@ namespace eShopOnContainers.Core.ViewModels private Order _order; private User _user; - private IOrdersService _orderService; + private IBasketService _orderService; private ICatalogService _catalogService; private IUserService _userService; - public OrderDetailViewModel(IOrdersService orderService, + public OrderDetailViewModel(IBasketService orderService, ICatalogService catalogService, IUserService userService) { diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/ProfileViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/ProfileViewModel.cs index 1c454db31..fe69f36a4 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/ProfileViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/ProfileViewModel.cs @@ -1,5 +1,6 @@ -using eShopOnContainers.Core.Models.Orders; -using eShopOnContainers.Core.Services.Orders; +using eShopOnContainers.Core.Extensions; +using eShopOnContainers.Core.Models.Orders; +using eShopOnContainers.Core.Services.User; using eShopOnContainers.ViewModels.Base; using System.Collections.ObjectModel; using System.Threading.Tasks; @@ -12,11 +13,11 @@ namespace eShopOnContainers.Core.ViewModels { private ObservableCollection _orders; - private IOrdersService _ordersService; + private IUserService _userService; - public ProfileViewModel(IOrdersService ordersService) + public ProfileViewModel(IUserService userService) { - _ordersService = ordersService; + _userService = userService; } public ObservableCollection Orders @@ -37,7 +38,8 @@ namespace eShopOnContainers.Core.ViewModels { IsBusy = true; - Orders = await _ordersService.GetOrdersAsync(); + var orders = await _userService.GetOrdersAsync(); + Orders = orders.ToObservableCollection(); IsBusy = false; } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CartView.xaml b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/BasketView.xaml similarity index 92% rename from src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CartView.xaml rename to src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/BasketView.xaml index c3c127656..c95d9d562 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/CartView.xaml +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Views/BasketView.xaml @@ -1,7 +1,7 @@  @@ -49,7 +49,7 @@ BackgroundColor="{StaticResource BackgroundColor}"> + IsVisible="{Binding BasketItems.Count, Converter={StaticResource CountToBoolConverter}}"> @@ -73,7 +73,7 @@ - + @@ -122,7 +122,7 @@ + IsVisible="{Binding BasketItems.Count, Converter={StaticResource InverseCountToBoolConverter}}">