@page "/voiceworks" @using JSMR.Application.Common.Search @using JSMR.Application.Creators.Queries.Search @using JSMR.Application.Enums @using JSMR.Application.Tags.Queries.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 Locale Locale { get; set; } = Locale.English; public SaleStatus? SelectedSaleStatus { get; set; } public CircleStatus? SelectedCircleStatus { get; set; } public TagStatus? SelectedTagStatus { get; set; } public CreatorStatus? SelectedCreatorStatus { get; set; } public int[] SelectedTagIds { get; set; } = []; public bool IncludeAllTags { get; set; } public int[] SelectedCreatorIds { get; set; } = []; public bool IncludeAllCreators { 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 MinDownloads { get; set; } public int PageNumber { get; set; } = 1; public int PageSize { get; set; } = 100; List> Locales = [ new() { Text = "Japanese", Value = Locale.Japanese }, new() { Text = "English", Value = Locale.English } ]; List> SaleStatuses = [ 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 } ]; List> Tags = []; List> Creators = []; SearchResult? searchResults; protected override async Task OnInitializedAsync() { await UpdateDataAsync(true); await GetTags(); await GetCreators(); } private async Task GetTags() { SearchTagsRequest request = new( Options: new() { PageNumber = 1, PageSize = 99999 } ); SearchTagsResponse? response = await Client.SearchAsync(request); if (response is null) return; Tags = response.Results.Items .OrderByDescending(x => x.Favorite) .ThenBy(x => x.EnglishName ?? x.Name) .Select(x => new BitDropdownItem() { Text = x.EnglishName ?? x.Name, Value = x.TagId }).ToList(); } private async Task GetCreators() { SearchCreatorsRequest request = new( Options: new() { PageNumber = 1, PageSize = 99999 } ); SearchCreatorsResponse? response = await Client.SearchAsync(request); if (response is null) return; Creators = response.Results.Items.Select(x => new BitDropdownItem() { Text = x.Name, Value = x.CreatorId }).ToList(); } private async Task UpdateDataAsync(bool resetPageNumber) { await JS.InvokeVoidAsync("pageHelpers.scrollToTop"); if (resetPageNumber) PageNumber = 1; SearchVoiceWorksRequest request = new( Options: new() { Criteria = new() { Keywords = Keywords, Locale = Locale, SaleStatus = SelectedSaleStatus, CircleStatus = SelectedCircleStatus, TagStatus = SelectedTagStatus, CreatorStatus = SelectedCreatorStatus, TagIds = [.. SelectedTagIds], IncludeAllTags = IncludeAllTags, CreatorIds = [.. SelectedCreatorIds], IncludeAllCreators = IncludeAllCreators, 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, //MinDownloads = MinDownloads }, 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 OnLocaleChanged(Locale locale) { Locale = locale; 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 OnTagIdsChanged(IEnumerable tagIds) { SelectedTagIds = [..tagIds]; await UpdateDataAsync(true); } public async Task OnIncludeAllTagsChanged(bool includeAllTags) { IncludeAllTags = includeAllTags; await UpdateDataAsync(true); } public async Task OnCreatorIdsChanged(IEnumerable creatorIds) { SelectedCreatorIds = [..creatorIds]; await UpdateDataAsync(true); } public async Task OnIncludeAllCreatorsChanged(bool includeAllCreators) { IncludeAllCreators = includeAllCreators; 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 OnMinDownloadsChanged(double minDownloads) { MinDownloads = (int)minDownloads; 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; } } }