@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;
}
}
}