@using AntDesign @using JSMR.Application.VoiceWorks.Commands.Delete @using JSMR.Application.VoiceWorks.Commands.SetFavorite @using JSMR.Application.VoiceWorks.Queries.Search @using JSMR.Domain.Enums @using JSMR.UI.Blazor.Components.Chips @using JSMR.UI.Blazor.Enums @using JSMR.UI.Blazor.Filters @using JSMR.UI.Blazor.Services @using System.Globalization @using Microsoft.AspNetCore.WebUtilities @inject VoiceWorksClient Client @inject MessageService MessageService @inject ModalService ModalService
@Product.Maker @if (Product.OriginalCircle is not null) { @Product.OriginalCircle.Name } @foreach (var creator in Product.Creators) { @creator.Name } @foreach (string supportedLanguage in Product.SupportedLanguages) { @GetSupportedLanguageDescription(supportedLanguage) } @if (Product.OriginalProductId is not null) { Translation } @if (Product.Rating == AgeRating.AllAges) { All Ages } else if (Product.Rating == AgeRating.R15) { R-15 } @if (Product.HasTrial || Product.HasChobit) { Trial } @if (Product.Favorite) { Favorite }
@Product.Description
@foreach (var tag in Product.Tags) { }
@GetReleaseDateText(Product)
@((Product.WishlistCount ?? 0).ToString("n0"))
@if (Product.SalesDate is not null) {
@((Product.Downloads ?? 0).ToString("n0"))
} @*
*@
@if (Product.IsValid != true) { @* *@ } @if (Product.OriginalProductId is not null) { @* *@ } @if (Product.Favorite) { @* *@ } @if (Product.HasTrial || Product.HasChobit) { @* *@ } @if (!Product.Favorite) { Add to Favorites } @if (Product.Favorite) { Remove from Favorites } @if (Product.IsValid != true) { Delete }
@code { [Parameter] public required VoiceWorkSearchResult Product { get; set; } [Parameter] public EventCallback ProductDeleted { get; set; } private string GetCardClasses(VoiceWorkSearchResult voiceWork) { List classNames = ["j-card", "j-voice-work-card"]; if (voiceWork.Status == (byte)VoiceWorkStatus.NewRelease) { classNames.Add("type-sale"); } else if (voiceWork.Status == (byte)VoiceWorkStatus.NewAndUpcoming) { classNames.Add("type-new"); } return string.Join(" ", classNames); } private string GetReleaseDateText(VoiceWorkSearchResult voiceWork) { if (voiceWork.SalesDate.HasValue) { return voiceWork.SalesDate.Value.ToString("MMMM d, yyyy", CultureInfo.CurrentCulture); } if (voiceWork.PlannedReleaseDate.HasValue) { return voiceWork.PlannedReleaseDate.Value.ToString("MMMM d, yyyy", CultureInfo.CurrentCulture); } if (voiceWork.ExpectedDate.HasValue) { string part = voiceWork.ExpectedDate.Value.Day switch { 21 => "Late", 11 => "Middle", _ => "Early" }; return $"{part} {voiceWork.ExpectedDate.Value.ToString("MMMM yyyy")}"; } return "Unknown"; } private string GetFlagClassSuffix(VoiceWorkSearchResult voiceWork) { switch (voiceWork.SubtitleLanguage) { case 1: return "us"; case 2: return "cn"; case 3: return "kr"; default: return "jp"; } } private string GetSupportedLanguageDescription(string code) { switch (code) { case "JPN": return "Japanese"; case "ENG": return "English"; case "CHI_HANS": return "Chinese (Simplified)"; case "CHI_HANT": return "Chinese (Traditional)"; case "KO_KR": return "Korean"; default: return code; } } private async Task SetFavorite(bool value) { SetVoiceWorkFavoriteRequest request = new( VoiceWorkId: Product.VoiceWorkId, IsFavorite: value ); SetVoiceWorkFavoriteResponse? response = await Client.SetVoiceWorkFavoriteeAsync(request); if (response is not null) { Product.Favorite = response.IsFavorite; } //await InvokeAsync(StateHasChanged); MessageConfig messageConfig = new() { Content = $"Product '{Product.ProductName}' has been {(Product.Favorite ? "added to your favorites" : "removed from your favorites")}.", Type = MessageType.Success }; _ = MessageService.OpenAsync(messageConfig); } private async Task Delete() { RenderFragment icon = @; AntDesign.ConfirmOptions options = new() { Title = "Are you sure you want to delete the following product?", Icon = icon, Content = Product.ProductName, Centered = true, OnOk = async (e) => { DeleteVoiceWorkRequest request = new( VoiceWorkIds: [Product.VoiceWorkId] ); try { DeleteVoiceWorkResponse? response = await Client.DeleteVoiceWorkAsync(request); if (response is null || response.Results[Product.VoiceWorkId] != DeleteVoiceWorkStatus.Deleted) return; await ProductDeleted.InvokeAsync(); } catch (Exception ex) { AntDesign.ConfirmOptions errorOptions = new() { Title = "Unable to delete product", Content = "Something went wrong while deleting this product. The product was not deleted. Check the API logs for details.", Centered = true, //Width = "70vw", }; await ModalService.ErrorAsync(errorOptions); e.Cancel = true; } } }; await ModalService.ConfirmAsync(options); } }