2026-10-06 16:47:19 +02:00
|
|
|
@inherits LocalizableComponentBase
|
|
|
|
|
|
|
|
|
|
@* Who liked a post, or boosted it (/api/v1/statuses/:id/favourited_by, reblogged_by): the accounts PrivaPub knows to
|
|
|
|
|
have done so, newest first, each opening its profile. *@
|
2026-10-06 22:43:35 +02:00
|
|
|
<DModal Placement="DModalPlacement.ResponsiveBottom" IsOpen="true" IsOpenChanged="Closed" CloseText="@Localizer["Close"]" data-interacted-by="@(Boosts ? "boosts" : "likes")">
|
2026-10-06 16:47:19 +02:00
|
|
|
<Heading>@(Boosts ? Localizer["Boosted by"] : Localizer["Liked by"])</Heading>
|
|
|
|
|
<ChildContent>
|
|
|
|
|
@if (IsLoading)
|
|
|
|
|
{
|
|
|
|
|
<p class="flex items-center gap-2 mt-3"><DLoading Variant="DLoadingVariant.Dots" LabelText="@Localizer["loading"]" />@Localizer["loading"]</p>
|
|
|
|
|
}
|
|
|
|
|
else if (accounts.Count == 0)
|
|
|
|
|
{
|
|
|
|
|
<p class="text-sm opacity-70 mt-3">@Localizer["Nobody this server knows of."]</p>
|
|
|
|
|
}
|
|
|
|
|
<div class="flex flex-col gap-2 mt-3">
|
|
|
|
|
@foreach (var account in accounts)
|
|
|
|
|
{
|
|
|
|
|
<a class="flex items-center gap-3 p-2 rounded-xl neo-raised neo-2xs min-w-0" href="@($"account/{Uri.EscapeDataString(account.Id)}")" data-account="@account.Acct">
|
|
|
|
|
@* alt="": the name is next to it. *@
|
|
|
|
|
<img alt="" class="h-9 w-9 flex-none object-cover rounded-full" src="@(account.Avatar ?? "imgs/icon-192.png")" />
|
|
|
|
|
<span class="flex flex-col min-w-0">
|
|
|
|
|
<b class="truncate">@CustomEmojis.Text(account.Name, account.Emojis)</b>
|
|
|
|
|
<span class="text-xs opacity-70 truncate">@("@" + account.Acct)</span>
|
|
|
|
|
</span>
|
|
|
|
|
</a>
|
|
|
|
|
}
|
|
|
|
|
</div>
|
|
|
|
|
</ChildContent>
|
|
|
|
|
</DModal>
|
|
|
|
|
|
|
|
|
|
@code {
|
|
|
|
|
[Inject] StatusService StatusService { get; set; }
|
|
|
|
|
|
|
|
|
|
[Parameter, EditorRequired] public string StatusId { get; set; }
|
|
|
|
|
/// <summary>Who boosted it, rather than who liked it.</summary>
|
|
|
|
|
[Parameter] public bool Boosts { get; set; }
|
|
|
|
|
[Parameter] public EventCallback OnClosed { get; set; }
|
|
|
|
|
|
|
|
|
|
List<Account> accounts = [];
|
|
|
|
|
|
|
|
|
|
protected override async Task OnInitializedAsync()
|
|
|
|
|
{
|
|
|
|
|
if (CascadingState.IsOffline)
|
|
|
|
|
{
|
|
|
|
|
WhenOnline(LoadData);
|
|
|
|
|
StartOnlinePolling();
|
|
|
|
|
IsLoading = false;
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await LoadData();
|
|
|
|
|
IsLoading = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async Task LoadData() => accounts = await StatusService.InteractedBy(StatusId, Boosts);
|
|
|
|
|
|
|
|
|
|
Task Closed(bool open) => open ? Task.CompletedTask : OnClosed.InvokeAsync();
|
|
|
|
|
}
|