using GMCabsDriverAssistant.Models; using GMCabsDriverAssistant.Services; using GMCabsDriverAssistant.Utils; using QRCoder; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Text; using System.Threading.Tasks; namespace GMCabsDriverAssistantSolution.ViewModels { public class CouponsV2ViewModel : BaseViewModel { #region Fields Page page; private string emptyViewMessage; public ImageSource image; public float amount; public DateTime expiryDate; private CouponDto _selectedCoupon; private bool _hasCoupons = false; private bool _hasEmptyMessage = false; private bool _isNextButton = false; private bool _isBackButton = false; int couponPosition = 0; int couponCount = 0; #endregion #region Properties public string EmptyViewMessage { get => emptyViewMessage; set => SetProperty(ref emptyViewMessage, value); } public ObservableCollection Coupons { get; } public Command SyncCouponCommand { get; } public ImageSource Image { get => image; set => SetProperty(ref image, value); } public float Amount { get => amount; set => SetProperty(ref amount, value); } public DateTime ExpiryDate { get => expiryDate; set => SetProperty(ref expiryDate, value); } public CouponDto SelectedCoupon { get => _selectedCoupon; set => SetProperty(ref _selectedCoupon, value); } public bool HasCoupons { get => _hasCoupons; set => SetProperty(ref _hasCoupons, value); } public bool HasEmptyMessage { get => _hasEmptyMessage; set => SetProperty(ref _hasEmptyMessage, value); } public bool IsNextButton { get => _isNextButton; set => SetProperty(ref _isNextButton, value); } public bool IsBackButton { get => _isBackButton; set => SetProperty(ref _isBackButton, value); } public Command NextCouponCommand { get; } public Command BackCouponCommand { get; } public Command RedemptionDetails { get; } #endregion #region Constructor public CouponsV2ViewModel(Page page) { this.page = page; Title = "Available Coupons"; SyncCouponCommand = new Command(async () => await GetCoupons()); BackCouponCommand = new Command(() => SelectCouponOption(true)); NextCouponCommand = new Command(() => SelectCouponOption(false)); RedemptionDetails = new Command(() => RedemptionDetailsDialog()); Coupons = new ObservableCollection(); HandleReceivedMessages(); } #endregion #region Methods public void OnAppearing() { Task.Run(async () => await GetCoupons()); } private async Task GetCoupons() { HasCoupons = false; IsBackButton = false; IsNextButton = false; HasEmptyMessage = true; EmptyViewMessage = "Loading Coupons..."; string appToken = Preferences.Get(SecureStorageData.Token, ""); GMCabsDriverService gMCabsDriverService = new GMCabsDriverService(); Coupons.Clear(); List coupons = await gMCabsDriverService.GetCoupons(appToken); if (coupons != null && coupons.Count > 0) { couponPosition = 0; couponCount = coupons.Count; HasCoupons = true; HasEmptyMessage = false; if (couponCount == 1) { IsBackButton = false; IsNextButton = false; } else { IsNextButton = true; } foreach (CouponDto coupon in coupons) { QRCodeGenerator qrGenerator = new QRCodeGenerator(); QRCodeData qrCodeData = qrGenerator.CreateQrCode(coupon.Id.ToString(), QRCodeGenerator.ECCLevel.Q); BitmapByteQRCode qrCode = new BitmapByteQRCode(qrCodeData); byte[] qrCodeAsBitmapByteArr = qrCode.GetGraphic(20); coupon.Image = ImageSource.FromStream(() => new MemoryStream(qrCodeAsBitmapByteArr)); Coupons.Add(coupon); } Console.WriteLine("Before Position :" + couponPosition); Image = Coupons[couponPosition].Image; } else { HasCoupons = false; HasEmptyMessage = true; EmptyViewMessage = "No Coupons available"; } } private void SelectCouponOption(bool isback) { if (isback) { couponPosition = couponPosition - 1; if (couponPosition + 1 == 1 && couponCount > 1) { IsBackButton = false; IsNextButton = true; } else { IsNextButton = true; } } else { couponPosition = couponPosition + 1; IsBackButton = true; if (couponCount == couponPosition + 1 && couponCount > 1) { IsNextButton = false; } } SelectedCoupon = Coupons[couponPosition]; Image = Coupons[couponPosition].Image; } [Obsolete] void HandleReceivedMessages() { MessagingCenter.Unsubscribe(this, nameof(App)); MessagingCenter.Subscribe(this, nameof(App), (sender, couponDto) => { Device.BeginInvokeOnMainThread(() => { CouponDto redeemedcoupon = new CouponDto { Id = couponDto.Id, Status = couponDto.Status }; List copyCoupons = new List(Coupons); Coupons.Clear(); foreach (var item in copyCoupons) { if (item.Id == redeemedcoupon.Id) { item.Image = ImageSource.FromFile("scanned.png"); } Coupons.Add(item); } Console.WriteLine("After Position :" + couponPosition); SelectedCoupon = Coupons[couponPosition]; Image = Coupons[couponPosition].Image; }); }); } private async void RedemptionDetailsDialog() { int issuedFromLocationID = Coupons[couponPosition].IssuedLocationID; string appToken = Preferences.Get(SecureStorageData.Token, ""); GMCabsDriverService gMCabsDriverService = new GMCabsDriverService(); LocationVoucherDto locationVoucher = await gMCabsDriverService.GetLocationVoucherByLocationID(appToken, issuedFromLocationID); if (locationVoucher != null) { string voucherOfferText = locationVoucher.VoucherOfferText.Replace("

", "").Replace("

", ""); await page.DisplayAlert("Redemption Details", voucherOfferText, "Ok"); } } #endregion } }