@page "/voiceworks" @using JSMR.Application.Common.Search @using JSMR.Application.VoiceWorks.Queries.Search @using JSMR.Domain.Enums @using JSMR.Domain.ValueObjects @using JSMR.UI.Blazor.Components @using JSMR.UI.Blazor.Services @inject VoiceWorksClient Client @inject IJSRuntime JS Voice Works

Voice Works

@if (searchResults is not null) { } @code { public string? Keywords { get; set; } public SaleStatus? SelectedSaleStatus { get; set; } public CircleStatus? SelectedCircleStatus { get; set; } public TagStatus? SelectedTagStatus { get; set; } public CreatorStatus? SelectedCreatorStatus { get; set; } public bool ShowOnlyFavoriteWorks { get; set; } public bool ShowOnlyInvalidWorks { get; set; } public IEnumerable SupportedLanguages { get; set; } = []; public IEnumerable SelectedAgeRatings { get; set; } = []; public DateTimeOffset? ReleaseDateStart { get; set; } public DateTimeOffset? ReleaseDateEnd { get; set; } public int PageNumber { get; set; } = 1; public int PageSize { get; set; } = 100; IEnumerable> SaleStatuses = [ new(SaleStatus.Available, "Available"), new(SaleStatus.Upcoming, "Upcoming"), new(null, "All") ]; List> BasicItems = [ new() { Text = "Available", Value = SaleStatus.Available }, new() { Text = "Upcoming", Value = SaleStatus.Upcoming }, new() { Text = "All", Value = null } ]; List> CircleStatuses = [ new() { Text = "Not Blacklisted", Value = CircleStatus.NotBlacklisted }, new() { Text = "Favorites", Value = CircleStatus.Favorited }, new() { Text = "Blacklisted", Value = CircleStatus.Blacklisted }, new() { Text = "All", Value = null } ]; List> TagStatuses = [ new() { Text = "Not Blacklisted", Value = TagStatus.NotBlacklisted }, new() { Text = "Favorites (Exclude Blacklisted)", Value = TagStatus.FavoriteExcludeBlacklist }, new() { Text = "Favorites (Include Blacklisted)", Value = TagStatus.FavoriteIncludeBlacklist }, new() { Text = "Blacklisted", Value = TagStatus.Blacklisted }, new() { Text = "All", Value = null } ]; List> CreatorStatuses = [ new() { Text = "Not Blacklisted", Value = CreatorStatus.NotBlacklisted }, new() { Text = "Favorites (Exclude Blacklisted)", Value = CreatorStatus.FavoriteExcludeBlacklist }, new() { Text = "Favorites (Include Blacklisted)", Value = CreatorStatus.FavoriteIncludeBlacklist }, new() { Text = "Blacklisted", Value = CreatorStatus.Blacklisted }, new() { Text = "All", Value = null } ]; List> Languages = [ new() { Text = "Japanese", Value = Language.Japanese }, new() { Text = "English", Value = Language.English }, new() { Text = "Chinese (Traditional)", Value = Language.ChineseTraditional }, new() { Text = "Chinese (Simplified)", Value = Language.ChineseSimplified }, new() { Text = "Korean", Value = Language.Korean } ]; List> AgeRatings = [ new() { Text = "All Ages", Value = AgeRating.AllAges }, new() { Text = "R15", Value = AgeRating.R15 }, new() { Text = "R18", Value = AgeRating.R18 } ]; SearchResult? searchResults; protected override async Task OnInitializedAsync() { await UpdateDataAsync(true); } private async Task UpdateDataAsync(bool resetPageNumber) { await JS.InvokeVoidAsync("pageHelpers.scrollToTop"); if (resetPageNumber) PageNumber = 1; SearchVoiceWorksRequest request = new( Options: new() { Criteria = new() { Keywords = Keywords, SaleStatus = SelectedSaleStatus, CircleStatus = SelectedCircleStatus, TagStatus = SelectedTagStatus, CreatorStatus = SelectedCreatorStatus, ShowFavoriteVoiceWorks = ShowOnlyFavoriteWorks, ShowInvalidVoiceWorks = ShowOnlyInvalidWorks, SupportedLanguages = [.. SupportedLanguages], AgeRatings = [.. SelectedAgeRatings], ReleaseDateStart = ReleaseDateStart != null ? DateOnly.FromDateTime(ReleaseDateStart.Value.Date) : null, ReleaseDateEnd = ReleaseDateEnd != null ? DateOnly.FromDateTime(ReleaseDateEnd.Value.Date) : null }, SortOptions = [ new(GetSortField(), Application.Common.Search.SortDirection.Descending) ], PageNumber = PageNumber, PageSize = PageSize } ); SearchVoiceWorksResponse? response = await Client.SearchAsync(request); searchResults = response?.Results; } public async Task OnKeywordsChanged(string? newKeywords) { Keywords = newKeywords; await UpdateDataAsync(true); } public async Task OnSaleStatusChanged(SaleStatus? saleStatus) { SelectedSaleStatus = saleStatus; await UpdateDataAsync(true); } public async Task OnCircleStatusChanged(CircleStatus? circleStatus) { SelectedCircleStatus = circleStatus; await UpdateDataAsync(true); } public async Task OnTagStatusChanged(TagStatus? tagStatus) { SelectedTagStatus = tagStatus; await UpdateDataAsync(true); } public async Task OnCreatorStatusChanged(CreatorStatus? creatorStatus) { SelectedCreatorStatus = creatorStatus; await UpdateDataAsync(true); } public async Task OnSupportedLanguagesChanged(IEnumerable languages) { SupportedLanguages = languages; await UpdateDataAsync(true); } public async Task OnAgeRatingsChanged(IEnumerable ageRatings) { SelectedAgeRatings = ageRatings; await UpdateDataAsync(true); } public async Task OnShowOnlyFavoriteWorksChanged(bool showOnlyFavoriteWorks) { ShowOnlyFavoriteWorks = showOnlyFavoriteWorks; await UpdateDataAsync(true); } public async Task OnShowOnlyInvalidWorksChanged(bool showOnlyInvalidWorks) { ShowOnlyInvalidWorks = showOnlyInvalidWorks; await UpdateDataAsync(true); } public async Task OnReleaseDateStartChanged(DateTimeOffset? releaseDateStart) { ReleaseDateStart = releaseDateStart; await UpdateDataAsync(true); } public async Task OnReleaseDateEndChanged(DateTimeOffset? releaseDateEnd) { ReleaseDateEnd = releaseDateEnd; await UpdateDataAsync(true); } public async Task OnPageNumberChanged(int newPageNumber) { PageNumber = newPageNumber; await UpdateDataAsync(false); } public async Task OnPageSizeChanged(int newPageSize) { PageSize = newPageSize; await UpdateDataAsync(true); } private VoiceWorkSortField GetSortField() { switch (SelectedSaleStatus) { case SaleStatus.Available: return VoiceWorkSortField.ReleaseDate; case SaleStatus.Upcoming: return VoiceWorkSortField.ExpectedReleaseDate; default: return VoiceWorkSortField.AnyReleaseDate; } } }