@using Iceshrimp.Frontend.Core.Services @using Iceshrimp.Frontend.Core.Services.NoteStore @using Iceshrimp.Frontend.Localization @using Iceshrimp.Shared.Schemas.Web @using Microsoft.Extensions.Localization @inject NoteActions NoteActions; @inject IStringLocalizer Loc;
@if (CanVote()) {
@foreach (var (choice, i) in Poll.Choices.Select((c, i) => (c, i))) { @if (Poll.Multiple) { } else { } }
} else {
@{ var total = Poll.Choices.Sum(p => p.Votes); } @foreach (var choice in Poll.Choices) { @Loc["{0} votes", choice.Votes]@(Math.Floor(choice.Votes / (double)total * 100))% }
} @{ List footerText = []; @if (Poll.Multiple) footerText.Add(Loc["Multiple choice"]); @if (Poll.VotersCount != null) footerText.Add(Loc["{0} users voted", Poll.VotersCount]); @if (Poll.ExpiresAt != null) footerText.Add(Poll.ExpiresAt <= DateTime.UtcNow ? Loc["Ended"] : Loc["Ends at {0}", Poll.ExpiresAt.Value.ToLocalTime().ToString("G")]); } @string.Join(" - ", footerText)
@code { [Parameter, EditorRequired] public required NotePollSchema Poll { get; set; } [Parameter, EditorRequired] public required List Emoji { get; set; } private List Choices { get; set; } = []; private bool CanVote() { return !Poll.Choices.Any(p => p.Voted) && (Poll.ExpiresAt == null || Poll.ExpiresAt > DateTime.UtcNow); } private void SelectMultiple(int choice) { if (Choices.Contains(choice)) Choices.RemoveAll(p => p == choice); else Choices.Add(choice); } private void SelectSingle(int choice) { Choices = [choice]; } private async Task Vote() { if (!CanVote()) return; await NoteActions.AddPollVoteAsync(Poll, Choices); } }