using ExCSS; using Microsoft.AspNetCore.Mvc; using Nop.Core; using Nop.Core.Domain.Catalog; using Nop.Plugin.Misc.AuctionPlugin.Domains.Dtos; using Nop.Plugin.Misc.AuctionPlugin.Domains.Entities; using Nop.Plugin.Misc.AuctionPlugin.Domains.Enums; using Nop.Plugin.Misc.AuctionPlugin.Models; using Nop.Plugin.Misc.AuctionPlugin.Services; using Nop.Services.Cms; using Nop.Services.Common; using Nop.Services.Customers; using Nop.Services.Logging; using Nop.Web.Framework.Components; using Nop.Web.Framework.Infrastructure; using Nop.Web.Models.Catalog; using Nop.Web.Framework.Mvc.Routing; using DocumentFormat.OpenXml.EMMA; using Nop.Services.Catalog; namespace Nop.Plugin.Misc.AuctionPlugin.Components; public class AuctionPublicViewComponent : NopViewComponent { #region Fields protected readonly IAddressService _addressService; protected readonly IGenericAttributeService _genericAttributeService; protected readonly IWidgetPluginManager _widgetPluginManager; protected readonly IWorkContext _workContext; protected readonly AuctionService _auctionService; protected readonly AuctionSettings _auctionSettings; protected readonly ICustomerService _customerService; protected readonly IWebHelper _webHelper; protected readonly IProductService _productService; protected readonly ILogger _logger; protected readonly MyProductModelFactory _myProductModelFactory; #endregion #region Ctor public AuctionPublicViewComponent(IAddressService addressService, IGenericAttributeService genericAttributeService, IWidgetPluginManager widgetPluginManager, IWorkContext workContext, AuctionService auctionService, AuctionSettings auctionSettings, ICustomerService customerService, IWebHelper webHelper, IProductService productService, MyProductModelFactory myProductModelFactory, ILogger logger) { _addressService = addressService; _genericAttributeService = genericAttributeService; _widgetPluginManager = widgetPluginManager; _workContext = workContext; _auctionService = auctionService; _auctionSettings = auctionSettings; _customerService = customerService; _webHelper = webHelper; _productService = productService; _myProductModelFactory = myProductModelFactory; _logger = logger; } #endregion #region Methods /// /// Invoke the widget view component /// /// Widget zone /// Additional parameters /// /// A task that represents the asynchronous operation /// The task result contains the view component result /// public async Task InvokeAsync(string widgetZone, object additionalData) { await _logger.InformationAsync("WidgetViewComponent called"); //ensure that widget is active and enabled var customer = await _workContext.GetCurrentCustomerAsync(); await _logger.InformationAsync($"WidgetViewComponent customer: {customer.Email}"); if (!await _widgetPluginManager.IsPluginActiveAsync(AuctionDefaults.SystemName, customer)) return Content(string.Empty); await _logger.InformationAsync("WidgetViewComponent widget active"); //if (!_auctionSettings.Enabled) // return Content(string.Empty); var productDetailsModel = additionalData as ProductDetailsModel; await _logger.InformationAsync($"WidgetViewComponent product: {productDetailsModel.Name}"); //if (productDetailsModel is null) //{ // await _logger.InformationAsync("WidgetViewComponent productdetailsmodel is null"); // return Content(string.Empty); //} if (!widgetZone.Equals(PublicWidgetZones.ProductDetailsOverviewTop)) { await _logger.InformationAsync($"WidgetViewComponent is NOT in ProductDetailsTop now {widgetZone}"); return Content(string.Empty); } await _logger.InformationAsync("WidgetViewComponent called II"); //is it under Auction? var productId = productDetailsModel.Id; var productToAuction = (await _auctionService.GetProductToAuctionDtosByProductIdAsync(productId)).FirstOrDefault(); if (productToAuction == null) { return Content(string.Empty); } var auctionDto = (await _auctionService.GetAuctionDtoByIdAsync(productToAuction.AuctionId, false, false)); auctionDto.ProductToAuctionDtos.Add(productToAuction); var productBidBoxViewModel = new ProductBidBoxViewModel(auctionDto); //List productToAuctionId = await _auctionService.GetProductToAuctionByAuctionIdAndProductIdAsync(auctionId, productDetailsModel.Id); AuctionStatus status = productToAuction.AuctionStatus; //bool isActive = status == AuctionStatus.Active || status == AuctionStatus.FirstWarning || status == AuctionStatus.SecondWarning; //bool isFirstWarning = status == AuctionStatus.FirstWarning; var detailedAuctionDto = (await _auctionService.GetAuctionDtoByIdAsync(productToAuction.AuctionId, true, false)); ProductToAuctionDto nextProductToAuction; ProductToAuctionDto lastProductToAuction; string nextUrl = ""; string lastUrl = ""; string nextImageUrl = ""; string lastImageUrl = ""; string nextProductName = ""; string lastProductName = ""; if (productToAuction.SortIndex < detailedAuctionDto.ProductToAuctionDtos.Count) { nextProductToAuction = detailedAuctionDto.ProductToAuctionDtos.Where(x => x.SortIndex == productToAuction.SortIndex + 1).FirstOrDefault(); var nextProductId = nextProductToAuction.ProductId; var nextProduct = await _productService.GetProductByIdAsync(nextProductId); var nextDetails = await _myProductModelFactory.PrepareProductDetailsModelAsync(nextProduct); nextUrl = Url.RouteUrl(new { nextDetails.SeName }, _webHelper.GetCurrentRequestProtocol()).ToLowerInvariant(); nextImageUrl = nextDetails.DefaultPictureModel.FullSizeImageUrl; nextProductName = nextDetails.SeName; } else { nextProductToAuction = null; } if (productToAuction.SortIndex > 1) { lastProductToAuction = detailedAuctionDto.ProductToAuctionDtos.Where(x => x.SortIndex == productToAuction.SortIndex - 1).FirstOrDefault(); var lastProductId = lastProductToAuction.ProductId; var lastProduct = await _productService.GetProductByIdAsync(lastProductId); var lastDetails = await _myProductModelFactory.PrepareProductDetailsModelAsync(lastProduct); lastUrl = Url.RouteUrl(new { lastDetails.SeName }, _webHelper.GetCurrentRequestProtocol()).ToLowerInvariant(); lastImageUrl = lastDetails.DefaultPictureModel.FullSizeImageUrl; lastProductName = lastDetails.SeName; } else { lastProductToAuction = null; } productBidBoxViewModel.IsAdmin = await _customerService.IsAdminAsync(customer); productBidBoxViewModel.IsGuest = await _customerService.IsGuestAsync(customer); productBidBoxViewModel.AuctionClosed = auctionDto.Closed; productBidBoxViewModel.AuctionStatus = status; productBidBoxViewModel.WidgetZone = widgetZone; productBidBoxViewModel.BasePrice = productDetailsModel.ProductPrice.OldPriceValue; productBidBoxViewModel.CurrentPrice = productDetailsModel.ProductPrice.PriceValue; //productBidBoxViewModel.ProductToAuctionId = productToAuctionId.FirstOrDefault().Id; //productBidBoxViewModel.AuctionId = auctionId; productBidBoxViewModel.CustomerId = customer.Id; productBidBoxViewModel.ProductId = productDetailsModel.Id; //productBidBoxViewModel.NextProductUrl = Url.RouteUrl("Product", productDetailsModel.SeName); productBidBoxViewModel.NextProductUrl = nextUrl; productBidBoxViewModel.LastProductUrl = lastUrl; productBidBoxViewModel.LastProductImageUrl = lastImageUrl; productBidBoxViewModel.NextProductImageUrl = nextImageUrl; productBidBoxViewModel.LastProductName = lastProductName; productBidBoxViewModel.NextProductName = nextProductName; productBidBoxViewModel.LicitStep = AuctionService.GetStepAmount(productToAuction.CurrentPrice); //add calculation productBidBoxViewModel.NextBidPrice = productToAuction.CurrentPrice + productBidBoxViewModel.LicitStep; return View("~/Plugins/Misc.AuctionPlugin/Views/PublicProductBidBox.cshtml", productBidBoxViewModel); } #endregion }