@inherits LocalizableComponentBase @* The persona's own followers or the accounts it follows (/api/v1/accounts/:id/followers, /following), 40 a page by the Link header, each opening its profile. PrivaPub lists them to the persona alone (hide_collections), so only the persona's own profile opens this. A follower can be removed (remove_from_followers), asked first. *@ @(Followers ? Localizer["followers"] : Localizer["following"]) @if (IsLoading) {

@Localizer["loading"]

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

@Localizer["Nobody yet."]

}
@foreach (var account in accounts) { }
@if (maxId is not null) {
@if (isLoadingMore) { } @Localizer["Load more"]
}
@code { [Inject] AccountService AccountService { get; set; } [Inject] ConfirmService Confirm { get; set; } /// The persona's own account id. [Parameter, EditorRequired] public string AccountId { get; set; } /// Its followers, rather than the accounts it follows. [Parameter] public bool Followers { get; set; } [Parameter] public EventCallback OnClosed { get; set; } /// A follower was removed. [Parameter] public EventCallback OnRemoved { get; set; } List accounts = []; HashSet busy = []; string maxId; bool isLoadingMore; protected override async Task OnInitializedAsync() { if (CascadingState.IsOffline) { WhenOnline(LoadData); StartOnlinePolling(); IsLoading = false; return; } await LoadData(); IsLoading = false; } async Task LoadData() { accounts = []; maxId = null; await LoadPage(); } async Task LoadPage() { var result = Followers ? await AccountService.Followers(AccountId, maxId) : await AccountService.Following(AccountId, maxId); if (result.IsInvalid) { Toast.AddResponseError(result); return; } var page = (AccountPage)result.Data; var known = accounts.Select(a => a.Id).ToHashSet(); accounts.AddRange(page.Accounts.Where(a => known.Add(a.Id))); maxId = page.MaxId; } async Task LoadMore() { isLoadingMore = true; await LoadPage(); isLoadingMore = false; } async Task RemoveFollower(Account account) { var name = account.Name ?? account.Acct; if (!await Confirm.Ask(Localizer["Remove {0} from your followers?", name], Localizer["They no longer see your followers-only posts, and may ask to follow you again."], Localizer["Remove from followers"], true)) return; busy.Add(account.Id); var result = await AccountService.RemoveFromFollowers(account.Id); busy.Remove(account.Id); if (result.IsInvalid) { Toast.AddResponseError(result); return; } accounts.Remove(account); Toast.AddResponseSuccess(Localizer["{0} removed from your followers.", name]); await OnRemoved.InvokeAsync(account); } Task Closed(bool open) => open ? Task.CompletedTask : OnClosed.InvokeAsync(); }