@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
{
}
@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]);
}
}