@inherits LocalizableComponentBase @* Reports an account, and the post it was opened from, to the persona's server's moderators (/api/v1/reports). Forwarded, a remote account's server gets the report too, from PrivaPub's own actor: it never names the persona. A violation names the server's rules it breaks (/api/v1/instance/rules, sent as rule_ids); it is offered only while the server has rules. *@ @Localizer["Report {0}", Account.Name] @if (choices.Count > 0) { } @if (form.Category is ReportCategory.Violation) {
@Localizer["Which of the server's rules does it break?"] @foreach (var choice in choices) { }
} @if (Host is { } host) {

@Localizer["The copy comes from the server, never from you."]

}
@Localizer["Cancel"] @Localizer["Report"]
@code { [Inject] AccountService AccountService { get; set; } [Inject] AboutService AboutService { get; set; } [Parameter, EditorRequired] public Account Account { get; set; } /// The post it was opened from, sent with the report. [Parameter] public Status Post { get; set; } [Parameter] public EventCallback OnClosed { get; set; } ReportForm form = new(); bool isSending; string error; // the server's rules, each ticked or not, for a violation List choices = []; // the account's own server, for a remote account string Host => Account.Acct?.Split('@') is [_, { Length: > 0 } host] ? host : null; protected override async Task OnInitializedAsync() { if (CascadingState.IsOffline) { WhenOnline(LoadData); StartOnlinePolling(); IsLoading = false; return; } await LoadData(); IsLoading = false; } async Task LoadData() => choices = [.. (await AboutService.Rules()).Select(rule => new RuleChoice { Rule = rule })]; async Task Send() { error = null; var ruleIds = form.Category is ReportCategory.Violation ? choices.Where(c => c.Picked).Select(c => c.Rule.Id).ToList() : []; if (form.Category is ReportCategory.Violation && ruleIds.Count == 0) { error = Localizer["Tick the rules it breaks."]; return; } isSending = true; var result = await AccountService.Report(Account.Id, Post is null ? [] : [Post.Id], form.Comment, form.Category, ruleIds, Host is not null && form.Forward); isSending = false; if (result.IsInvalid) { Toast.AddResponseError(result); return; } Toast.AddResponseSuccess(Localizer["Report sent to the moderators."]); await OnClosed.InvokeAsync(); } Task Closed(bool open) => open ? Task.CompletedTask : OnClosed.InvokeAsync(); sealed class RuleChoice { public InstanceRule Rule { get; init; } public bool Picked { get; set; } } }