feat: centralise date/time formatting with European conventions

All dates now use day-first ordering (14 Mar 2025) and 24-hour time
(14:30) via a single formatDate.ts module, replacing scattered inline
toLocaleDateString/toLocaleTimeString calls across 12 files.
This commit is contained in:
Usman Baig
2026-03-14 13:31:30 +01:00
parent 7ba5e063ca
commit 25210013d3
13 changed files with 126 additions and 77 deletions

View File

@@ -7,6 +7,7 @@ import { createGoal, updateGoal, deleteGoal, type Goal } from '@/lib/api/goals'
import { createReportSchedule, updateReportSchedule, deleteReportSchedule, testReportSchedule, type ReportSchedule, type CreateReportScheduleRequest, type EmailConfig, type WebhookConfig } from '@/lib/api/report-schedules'
import { toast } from '@ciphera-net/ui'
import { getAuthErrorMessage } from '@ciphera-net/ui'
import { formatDateTime } from '@/lib/utils/formatDate'
import { SettingsFormSkeleton, GoalsListSkeleton, useMinimumLoading, useSkeletonFade } from '@/components/skeletons'
import VerificationModal from '@/components/sites/VerificationModal'
import ScriptSetupBlock from '@/components/sites/ScriptSetupBlock'
@@ -1341,7 +1342,7 @@ export default function SiteSettingsPage() {
<div className="flex items-center gap-3 mt-1 text-xs text-neutral-400 dark:text-neutral-500">
<span>
Last sent: {schedule.last_sent_at
? new Date(schedule.last_sent_at).toLocaleDateString(undefined, { month: 'short', day: 'numeric', year: 'numeric', hour: '2-digit', minute: '2-digit' })
? formatDateTime(new Date(schedule.last_sent_at))
: 'Never'}
</span>
</div>

View File

@@ -21,6 +21,7 @@ import { useTheme } from '@ciphera-net/ui'
import { getAuthErrorMessage } from '@ciphera-net/ui'
import { Button, Modal } from '@ciphera-net/ui'
import { UptimeSkeleton, ChecksSkeleton, useMinimumLoading, useSkeletonFade } from '@/components/skeletons'
import { formatDateFull, formatTime, formatDateTimeShort } from '@/lib/utils/formatDate'
import {
AreaChart,
Area,
@@ -165,11 +166,7 @@ function StatusBarTooltip({
}) {
if (!visible) return null
const formattedDate = new Date(date + 'T00:00:00').toLocaleDateString('en-US', {
weekday: 'short',
month: 'short',
day: 'numeric',
})
const formattedDate = formatDateFull(new Date(date + 'T00:00:00'))
return (
<div
@@ -275,10 +272,7 @@ function ResponseTimeChart({ checks }: { checks: UptimeCheck[] }) {
.reverse()
.filter((c) => c.response_time_ms !== null)
.map((c) => ({
time: new Date(c.checked_at).toLocaleTimeString('en-US', {
hour: '2-digit',
minute: '2-digit',
}),
time: formatTime(new Date(c.checked_at)),
ms: c.response_time_ms as number,
status: c.status,
}))
@@ -500,12 +494,7 @@ function MonitorCard({
<div className="flex items-center gap-2">
<div className={`w-2 h-2 rounded-full ${getStatusDotColor(check.status)}`} />
<span className="text-neutral-600 dark:text-neutral-300 text-xs">
{new Date(check.checked_at).toLocaleString('en-US', {
month: 'short',
day: 'numeric',
hour: '2-digit',
minute: '2-digit',
})}
{formatDateTimeShort(new Date(check.checked_at))}
</span>
</div>
<div className="flex items-center gap-3">