@inherits LocalizableComponentBase @* "Filter this post", from a card's menu: the persona's filters (/api/v2/filters), one of which takes the post (POST /api/v2/filters/:id/statuses); a filter that holds it already says so. Filters are made and changed on /filters. The card reads the post again afterwards, so the filter applies to it at once. *@ @Localizer["Filter this post"] @if (IsLoading) {

@Localizer["loading"]

} else if (filters.Count == 0) {

@Localizer["This persona has no filter yet."]

}
@foreach (var filter in filters) { @filter.Title @Description(filter) } @Localizer["Make a filter"]
@code { [Inject] FilterService FilterService { get; set; } [Parameter, EditorRequired] public string StatusId { get; set; } [Parameter] public EventCallback OnClosed { get; set; } /// The post went into a filter. [Parameter] public EventCallback OnFiltered { get; set; } List filters = []; bool isSaving; protected override async Task OnInitializedAsync() { if (CascadingState.IsOffline) { WhenOnline(LoadData); StartOnlinePolling(); IsLoading = false; return; } await LoadData(); IsLoading = false; } async Task LoadData() => filters = await FilterService.All(); bool Holds(Filter filter) => filter.Statuses.Any(s => s.StatusId == StatusId); string Description(Filter filter) => Holds(filter) ? Localizer["Already in it"] : !filter.IsActive ? Localizer["Expired"] : filter.FilterAction switch { FilterAction.Hide => Localizer["Hide"], FilterAction.Blur => Localizer["Blur"], _ => Localizer["Warn"] }; async Task Add(Filter filter) { isSaving = true; var result = await FilterService.AddStatus(filter.Id, StatusId); isSaving = false; if (result.IsInvalid) { Toast.AddResponseError(result); return; } Toast.AddResponseSuccess(Localizer["Added to {0}.", filter.Title]); await OnFiltered.InvokeAsync(); } Task Closed(bool open) => open ? Task.CompletedTask : OnClosed.InvokeAsync(); }