67 lines
No EOL
2 KiB
Text
67 lines
No EOL
2 KiB
Text
@using System.Timers
|
|
@using Iceshrimp.Frontend.Localization
|
|
@using Microsoft.Extensions.Localization
|
|
@inject IStringLocalizer<Localization> Loc;
|
|
|
|
<span title="@Date.ToLocalTime().ToString("G")">@RenderTimestamp()</span>
|
|
|
|
@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;
|
|
}
|
|
} |