@inherits LocalizableComponentBase @* The staff's picks (/clientapi/admin/staff-picks): the accounts suggested first to every persona, in their order, a persona here or a person elsewhere, found among the accounts this server knows (/api/v2/search, never resolving). PrivaPub keeps 40 at most and refuses an account picked already (409) or one it can't suggest (404: a community, a server's actor, a suspended or deleted account). One deleted, suspended or silenced since stays listed, suggested to nobody. A pick is removed at once: it can be picked again. Every change is in the staff's log. *@
@if (IsLoading) {

@Localizer["loading"]

} else {

@Localizer["Suggested first to every persona of this server, in this order, under Explore's Who to follow."]

@if (picks.Count == 0) {

@Localizer["No account is picked yet."]

} else { }
@picks.Count/@MaxPicks
@if (query is { Length: > 0 }) {
@foreach (var account in matches) { @account.Name@("@" + account.Acct) } @if (matches.Count == 0 && !isSearching) { @Localizer["No account matches."] }
}
}
@code { [Inject] InstanceAdminService InstanceAdminService { get; set; } [Inject] AccountService AccountService { get; set; } /// PrivaPub's limit (InstanceAdminController.MaxStaffPicks). const int MaxPicks = 40; List picks = []; string query; List matches = []; int searching; bool isSearching; bool isActing; bool IsFull => picks.Count >= MaxPicks; protected override async Task OnInitializedAsync() { if (CascadingState.IsOffline) { WhenOnline(LoadData); StartOnlinePolling(); IsLoading = false; return; } await LoadData(); IsLoading = false; } async Task LoadData() => picks = await InstanceAdminService.StaffPicks(); async Task Search(string typed) { query = typed; var lookup = ++searching; if (string.IsNullOrWhiteSpace(typed)) { matches = []; isSearching = false; return; } isSearching = true; await Task.Delay(300); if (lookup != searching) return; var found = await AccountService.Suggest(typed.Trim(), false); if (lookup != searching) return; // people only (PrivaPub takes no community), and none picked already matches = [.. found.Accounts.Where(a => !a.Group && picks.All(p => p.AccountId != a.Id))]; isSearching = false; } async Task Add(Account account) { isActing = true; var result = await InstanceAdminService.AddStaffPick(account.Id); isActing = false; if (result.IsInvalid) { Toast.AddResponseError(result); return; } picks = (List)result.Data; query = null; matches = []; Toast.AddResponseSuccess(Localizer["{0} is suggested to every persona.", account.Name]); } async Task Remove(ViewStaffPick pick) { isActing = true; var result = await InstanceAdminService.RemoveStaffPick(pick.AccountId); isActing = false; if (result.IsInvalid) { Toast.AddResponseError(result); return; } picks = (List)result.Data; Toast.AddResponseSuccess(Localizer["{0} is no longer suggested by the staff.", pick.Name ?? pick.Handle ?? pick.AccountId]); } }