diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Controls/BindablePicker.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Controls/BindablePicker.cs index 5699f5b2d..6e4edbbee 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Controls/BindablePicker.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Controls/BindablePicker.cs @@ -1,5 +1,6 @@ using System; using System.Collections; +using System.Windows.Input; using Xamarin.Forms; namespace eShopOnContainers.Core.Controls @@ -12,6 +13,9 @@ namespace eShopOnContainers.Core.Controls public static readonly BindableProperty SelectedItemProperty = BindableProperty.Create("SelectedItem", typeof(object), typeof(BindablePicker), null, BindingMode.TwoWay, propertyChanged: OnSelectedItemChanged); + public static readonly BindableProperty ItemSelectedCommandProperty = BindableProperty.Create("ItemSelectedCommand", + typeof(ICommand), typeof(BindablePicker), null); + public BindablePicker() { SelectedIndexChanged += (o, e) => @@ -23,6 +27,7 @@ namespace eShopOnContainers.Core.Controls } var index = 0; + foreach (var item in ItemsSource) { if (index == SelectedIndex) @@ -54,6 +59,12 @@ namespace eShopOnContainers.Core.Controls } } + public ICommand ItemSelectedCommand + { + get { return (ICommand)GetValue(ItemSelectedCommandProperty); } + set { SetValue(ItemSelectedCommandProperty, value); } + } + public event EventHandler ItemSelected; private void InternalUpdateSelectedIndex() @@ -107,6 +118,11 @@ namespace eShopOnContainers.Core.Controls boundPicker.ItemSelected(boundPicker, new SelectedItemChangedEventArgs(newValue)); } + if(boundPicker.ItemSelectedCommand != null) + { + boundPicker.ItemSelectedCommand.Execute(newValue); + } + boundPicker.InternalUpdateSelectedIndex(); } } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Basket/BasketItem.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Basket/BasketItem.cs index c10da754f..e427dba64 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Basket/BasketItem.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Models/Basket/BasketItem.cs @@ -105,4 +105,4 @@ namespace eShopOnContainers.Core.Models.Basket return String.Format("Product Id: {0}, Quantity: {1}", ProductId, Quantity); } } -} +} \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketMockService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketMockService.cs index d7fce6abc..35e8cc941 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketMockService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketMockService.cs @@ -29,19 +29,29 @@ namespace eShopOnContainers.Core.Services.Basket return MockCustomBasket; } - public async Task UpdateBasketAsync(CustomerBasket customerBasket) + public async Task UpdateBasketAsync(CustomerBasket customerBasket, string token) { await Task.Delay(500); + if (string.IsNullOrEmpty(token)) + { + return new CustomerBasket(); + } + MockCustomBasket = customerBasket; return MockCustomBasket; } - public async Task ClearBasketAsync(string guidUser) + public async Task ClearBasketAsync(string guidUser, string token) { await Task.Delay(500); + if (string.IsNullOrEmpty(token)) + { + return; + } + if (!string.IsNullOrEmpty(guidUser)) { MockCustomBasket.Items.Clear(); diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketService.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketService.cs index cbed3317b..104d8fe11 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/BasketService.cs @@ -39,18 +39,18 @@ namespace eShopOnContainers.Core.Services.Basket } } - public async Task UpdateBasketAsync(CustomerBasket customerBasket) + public async Task UpdateBasketAsync(CustomerBasket customerBasket, string token) { UriBuilder builder = new UriBuilder(GlobalSetting.Instance.BasketEndpoint); string uri = builder.ToString(); - var result = await _requestProvider.PostAsync(uri, customerBasket); + var result = await _requestProvider.PostAsync(uri, customerBasket, token); return result; } - public async Task ClearBasketAsync(string guidUser) + public async Task ClearBasketAsync(string guidUser, string token) { UriBuilder builder = new UriBuilder(GlobalSetting.Instance.BasketEndpoint); @@ -58,7 +58,7 @@ namespace eShopOnContainers.Core.Services.Basket string uri = builder.ToString(); - await _requestProvider.DeleteAsync(uri); + await _requestProvider.DeleteAsync(uri, token); } } } \ 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 index 90ceb236f..26b785acc 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/IBasketService.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/Basket/IBasketService.cs @@ -6,7 +6,7 @@ namespace eShopOnContainers.Core.Services.Basket public interface IBasketService { Task GetBasketAsync(string guidUser, string token); - Task UpdateBasketAsync(CustomerBasket customerBasket); - Task ClearBasketAsync(string guidUser); + Task UpdateBasketAsync(CustomerBasket customerBasket, string token); + Task ClearBasketAsync(string guidUser, string token); } } \ No newline at end of file diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/RequestProvider/IRequestProvider.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/RequestProvider/IRequestProvider.cs index 81772cad6..b2ba46100 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/RequestProvider/IRequestProvider.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/RequestProvider/IRequestProvider.cs @@ -4,18 +4,16 @@ namespace eShopOnContainers.Core.Services.RequestProvider { public interface IRequestProvider { - Task GetAsync(string uri); + Task GetAsync(string uri, string token = ""); - Task GetAsync(string uri, string token); + Task PostAsync(string uri, TResult data, string token = ""); - Task PostAsync(string uri, TResult data); + Task PostAsync(string uri, TRequest data, string token = ""); - Task PostAsync(string uri, TRequest data); + Task PutAsync(string uri, TResult data, string token = ""); - Task PutAsync(string uri, TResult data); + Task PutAsync(string uri, TRequest data, string token = ""); - Task PutAsync(string uri, TRequest data); - - Task DeleteAsync(string uri); + Task DeleteAsync(string uri, string token = ""); } } \ 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 c926e56e3..ee41d4da8 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/RequestProvider/RequestProvider.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/Services/RequestProvider/RequestProvider.cs @@ -26,9 +26,9 @@ namespace eShopOnContainers.Core.Services.RequestProvider _serializerSettings.Converters.Add(new StringEnumConverter()); } - public async Task GetAsync(string uri) + public async Task GetAsync(string uri, string token = "") { - HttpClient httpClient = CreateHttpClient(); + HttpClient httpClient = CreateHttpClient(token); HttpResponseMessage response = await httpClient.GetAsync(uri); await HandleResponse(response); @@ -41,30 +41,14 @@ namespace eShopOnContainers.Core.Services.RequestProvider return result; } - public async Task GetAsync(string uri, string token) + public Task PostAsync(string uri, TResult data, string token = "") { - HttpClient httpClient = CreateHttpClient(); - httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); - HttpResponseMessage response = await httpClient.GetAsync(uri); - - await HandleResponse(response); - - string serialized = await response.Content.ReadAsStringAsync(); - - TResult result = await Task.Run(() => - JsonConvert.DeserializeObject(serialized, _serializerSettings)); - - return result; - } - - public Task PostAsync(string uri, TResult data) - { - return PostAsync(uri, data); + return PostAsync(uri, data, token); } - public async Task PostAsync(string uri, TRequest data) + public async Task PostAsync(string uri, TRequest data, string token = "") { - HttpClient httpClient = CreateHttpClient(); + HttpClient httpClient = CreateHttpClient(token); string serialized = await Task.Run(() => JsonConvert.SerializeObject(data, _serializerSettings)); HttpResponseMessage response = await httpClient.PostAsync(uri, new StringContent(serialized, Encoding.UTF8, "application/json")); @@ -75,14 +59,14 @@ namespace eShopOnContainers.Core.Services.RequestProvider return await Task.Run(() => JsonConvert.DeserializeObject(responseData, _serializerSettings)); } - public Task PutAsync(string uri, TResult data) + public Task PutAsync(string uri, TResult data, string token = "") { - return PutAsync(uri, data); + return PutAsync(uri, data, token); } - public async Task PutAsync(string uri, TRequest data) + public async Task PutAsync(string uri, TRequest data, string token = "") { - HttpClient httpClient = CreateHttpClient(); + HttpClient httpClient = CreateHttpClient(token); string serialized = await Task.Run(() => JsonConvert.SerializeObject(data, _serializerSettings)); HttpResponseMessage response = await httpClient.PutAsync(uri, new StringContent(serialized, Encoding.UTF8, "application/json")); @@ -93,19 +77,24 @@ namespace eShopOnContainers.Core.Services.RequestProvider return await Task.Run(() => JsonConvert.DeserializeObject(responseData, _serializerSettings)); } - public async Task DeleteAsync(string uri) + public async Task DeleteAsync(string uri, string token = "") { - HttpClient httpClient = CreateHttpClient(); + HttpClient httpClient = CreateHttpClient(token); await httpClient.DeleteAsync(uri); } - private HttpClient CreateHttpClient() + private HttpClient CreateHttpClient(string token = "") { var httpClient = new HttpClient(); httpClient.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); + if (!string.IsNullOrEmpty(token)) + { + httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token); + } + return httpClient; } diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/BasketViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/BasketViewModel.cs index c24f3cbba..da30f4379 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/BasketViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/BasketViewModel.cs @@ -1,4 +1,5 @@ -using eShopOnContainers.Core.Models.Basket; +using eShopOnContainers.Core.Helpers; +using eShopOnContainers.Core.Models.Basket; using eShopOnContainers.Core.Models.Catalog; using eShopOnContainers.Core.Models.User; using eShopOnContainers.Core.Services.Basket; @@ -133,12 +134,14 @@ namespace eShopOnContainers.Core.ViewModels { Total += (orderItem.Quantity * orderItem.UnitPrice); } - + + var authToken = Settings.AuthAccessToken; + _basketService.UpdateBasketAsync(new CustomerBasket { BuyerId = _user.GuidUser, Items = BasketItems.ToList() - }); + }, authToken); } private void Checkout() diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs index a2a6df96d..219cd5aab 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/CheckoutViewModel.cs @@ -13,6 +13,7 @@ using eShopOnContainers.Core.Models.Basket; using System.Collections.Generic; using eShopOnContainers.Core.Services.Basket; using eShopOnContainers.Core.Services.Order; +using eShopOnContainers.Core.Helpers; namespace eShopOnContainers.Core.ViewModels { @@ -94,8 +95,10 @@ namespace eShopOnContainers.Core.ViewModels private async void Checkout() { + var authToken = Settings.AuthAccessToken; + await _orderService.CreateOrderAsync(Order); - await _basketService.ClearBasketAsync(User.GuidUser); + await _basketService.ClearBasketAsync(User.GuidUser, authToken); await NavigationService.NavigateToAsync(new TabParameter { TabIndex = 1 }); await NavigationService.RemoveLastFromBackStackAsync(); diff --git a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/LoginViewModel.cs b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/LoginViewModel.cs index 63f32f7cf..ea4719a59 100644 --- a/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/LoginViewModel.cs +++ b/src/Mobile/eShopOnContainers/eShopOnContainers.Core/ViewModels/LoginViewModel.cs @@ -186,9 +186,9 @@ namespace eShopOnContainers.Core.ViewModels if(!string.IsNullOrEmpty(logoutRequest)) { - IsValid = false; LoginUrl = logoutRequest; Settings.AuthAccessToken = string.Empty; + IsValid = true; } } @@ -209,6 +209,13 @@ namespace eShopOnContainers.Core.ViewModels } } } + + /* + if(url.Contains("endsession")) + { + await SignInAsync(); + } + */ } private bool Validate()