using System.Globalization; using Elternbeirat.Contracts; using Elternbeirat.PocketBase; using Microsoft.AspNetCore.Components; namespace Elternbeirat.Web.Features.Events; public partial class EventList { private static readonly CultureInfo German = CultureInfo.GetCultureInfo("de-DE"); [LoggerMessage(Level = LogLevel.Warning, Message = "Could not load events from PocketBase.")] private static partial void LogLoadFailed(ILogger logger, Exception exception); [Inject] private PocketBaseClient PocketBase { get; set; } = default!; [Inject] private ILogger Logger { get; set; } = default!; private IReadOnlyList _upcoming = []; private IReadOnlyList _past = []; protected override async Task OnInitializedAsync() { IReadOnlyList events; try { events = await PocketBase.GetEventsAsync(); } catch (HttpRequestException ex) { // Source unreachable -> show empty sections instead of a 500. The page // stays up; the "keine Termine" note is rendered. LogLoadFailed(Logger, ex); return; } // Split into upcoming and past by date, so an event earlier today still // counts as upcoming. Upcoming earliest first, past most recent first. var today = DateOnly.FromDateTime(DateTime.Today); _upcoming = events .Where(e => DateOnly.FromDateTime(e.Start) >= today) .OrderBy(e => e.Start) .ToList(); _past = events .Where(e => DateOnly.FromDateTime(e.Start) < today) .OrderByDescending(e => e.Start) .ToList(); } // An event counts as all-day when its start carries no wall-clock time // (00:00); PocketBase has no separate flag. private static bool HasTime(Event ev) => ev.Start.TimeOfDay != TimeSpan.Zero; // Formats the entry's date range for display: a single day, a date with a // time, or a span across days. private static string Format(Event ev) { var start = HasTime(ev) ? ev.Start.ToString("dddd, d. MMMM yyyy, HH:mm", German) + " Uhr" : ev.Start.ToString("dddd, d. MMMM yyyy", German); if (ev.End is not { } end) { return start; } // Same day: append just the end time. Different days: append the full // end date. if (end.Date == ev.Start.Date) { return HasTime(ev) ? start + "–" + end.ToString("HH:mm", German) + " Uhr" : start; } var endText = HasTime(ev) ? end.ToString("d. MMMM yyyy, HH:mm", German) + " Uhr" : end.ToString("d. MMMM yyyy", German); return start + " – " + endText; } }