@using System.Timers @using Iceshrimp.Frontend.Localization @using Microsoft.Extensions.Localization @inject IStringLocalizer Loc; @RenderTimestamp() @code { [Parameter, EditorRequired] public required DateTime Date { get; set; } private string RenderTimestamp() { var diff = DateTime.UtcNow - Date.ToUniversalTime(); return diff switch { { TotalDays: >= 365 } => Loc["{0}y", Math.Floor(diff.TotalDays / 365)], { TotalDays: >= 30 } => Loc["{0}mo", Math.Floor(diff.TotalDays / 30)], { TotalDays: >= 7 } => Loc["{0}w", Math.Floor(diff.TotalDays / 7)], { TotalDays: >= 1 } => Loc["{0}d", Math.Floor(diff.TotalDays)], { TotalHours: >= 1 } => Loc["{0}h", Math.Floor(diff.TotalHours)], { TotalMinutes: >= 1 } => Loc["{0}m", Math.Floor(diff.TotalMinutes)], { TotalSeconds: >= 5 } => Loc["{0}s", Math.Floor(diff.TotalSeconds)], _ => Loc["now"] }; } protected override void OnInitialized() { ResetTimer(); } private void UpdateDisplay(object? _, ElapsedEventArgs elapsedEventArgs) { StateHasChanged(); ResetTimer(); } private void ResetTimer() { var diff = DateTime.Now - Date; if (diff.TotalMinutes < 1) // Default of 1 seconds { SetTimer(); } else if (diff.TotalHours < 1) { SetTimer(20000); // 20 seconds } else if (diff.TotalDays < 1 && diff.TotalHours > 1) { SetTimer(600000); // 10 minutes } else { SetTimer(3600000); // 1 hour } } private void SetTimer(int duration = 1000) { var timer = new Timer(duration); timer.Elapsed += UpdateDisplay; timer.AutoReset = false; timer.Enabled = true; } }