From 96edfb44447ecbc81171d30930e305c99b46527a Mon Sep 17 00:00:00 2001 From: lorentz Date: Thu, 7 May 2026 08:34:58 -0400 Subject: [PATCH] feat(07.1-05): user-tz on analyzer pages - itglue/applications, applications/[id], configurations, configurations/[id], sites/[companyId], queue, ticket/[ticketNumber], tickets, reports, reports/[id]: useUserTimezone() in default export; thread tz into every inline toLocale*String call. - analyzer/tickets/page.tsx converts module-scope formatRelative(iso) helper to formatRelative(iso, tz); updates 1 callsite. Migrates 16 of 81 audit leak callsites. --- app/analyzer/itglue/applications/[id]/page.tsx | 8 +++++--- app/analyzer/itglue/applications/page.tsx | 4 +++- app/analyzer/itglue/configurations/[id]/page.tsx | 8 +++++--- app/analyzer/itglue/configurations/page.tsx | 4 +++- app/analyzer/itglue/sites/[companyId]/page.tsx | 4 +++- app/analyzer/queue/page.tsx | 4 +++- app/analyzer/reports/[id]/page.tsx | 8 +++++--- app/analyzer/reports/page.tsx | 4 +++- app/analyzer/ticket/[ticketNumber]/page.tsx | 4 +++- app/analyzer/tickets/page.tsx | 8 +++++--- 10 files changed, 38 insertions(+), 18 deletions(-) diff --git a/app/analyzer/itglue/applications/[id]/page.tsx b/app/analyzer/itglue/applications/[id]/page.tsx index 4df64eb..0204c4b 100644 --- a/app/analyzer/itglue/applications/[id]/page.tsx +++ b/app/analyzer/itglue/applications/[id]/page.tsx @@ -23,6 +23,7 @@ import { CheckCircle2, Undo2, } from 'lucide-react'; +import { useUserTimezone } from '@/lib/hooks/use-user-timezone'; import { useSession } from '@/lib/auth-client'; interface FieldRow { @@ -157,6 +158,7 @@ export default function ApplicationAuditPage({ }: { params: Promise<{ id: string }>; }) { + const tz = useUserTimezone(); const { id } = use(params); const { data: session } = useSession(); const role = (session?.user as { role?: string } | undefined)?.role ?? 'user'; @@ -408,7 +410,7 @@ export default function ApplicationAuditPage({ Audit findings - {new Date(audit.generated_at).toLocaleString()} + {new Date(audit.generated_at).toLocaleString(undefined, { timeZone: tz })} {' · '} {audit.provider === 'openrouter' ? 'DeepSeek' : 'Claude'} {audit.estimated_cost_usd !== null @@ -717,7 +719,7 @@ export default function ApplicationAuditPage({

- {new Date(w.performed_at).toLocaleString()} + {new Date(w.performed_at).toLocaleString(undefined, { timeZone: tz })}

Before: @@ -776,7 +778,7 @@ export default function ApplicationAuditPage({ className="py-2 flex items-center justify-between text-sm" > - {new Date(h.generated_at).toLocaleString()} + {new Date(h.generated_at).toLocaleString(undefined, { timeZone: tz })} {' · '} {h.provider === 'openrouter' ? 'DeepSeek' : 'Claude'} diff --git a/app/analyzer/itglue/applications/page.tsx b/app/analyzer/itglue/applications/page.tsx index 08ac8f4..0f50df5 100644 --- a/app/analyzer/itglue/applications/page.tsx +++ b/app/analyzer/itglue/applications/page.tsx @@ -7,6 +7,7 @@ import { Badge } from '@/components/ui/badge'; import { Skeleton } from '@/components/ui/skeleton'; import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'; import { Input } from '@/components/ui/input'; +import { useUserTimezone } from '@/lib/hooks/use-user-timezone'; interface ApplicationRow { id: string; @@ -32,6 +33,7 @@ function scoreBadgeVariant( } export default function ApplicationsListPage() { + const tz = useUserTimezone(); const [rows, setRows] = useState(null); const [error, setError] = useState(null); const [filter, setFilter] = useState(''); @@ -126,7 +128,7 @@ export default function ApplicationsListPage() { {' · '} last audited{' '} {r.latestAudit.generatedAt - ? new Date(r.latestAudit.generatedAt).toLocaleDateString() + ? new Date(r.latestAudit.generatedAt).toLocaleDateString(undefined, { timeZone: tz }) : 'unknown'} {' '} ( diff --git a/app/analyzer/itglue/configurations/[id]/page.tsx b/app/analyzer/itglue/configurations/[id]/page.tsx index 55c7ee1..c7556ac 100644 --- a/app/analyzer/itglue/configurations/[id]/page.tsx +++ b/app/analyzer/itglue/configurations/[id]/page.tsx @@ -25,6 +25,7 @@ import { Server, } from 'lucide-react'; import { useSession } from '@/lib/auth-client'; +import { useUserTimezone } from '@/lib/hooks/use-user-timezone'; interface FieldRow { id: string; @@ -136,6 +137,7 @@ export default function ConfigurationAuditPage({ params: Promise<{ id: string }>; }) { const { id } = use(params); + const tz = useUserTimezone(); const { data: session } = useSession(); const role = (session?.user as { role?: string } | undefined)?.role ?? 'user'; const canWrite = role === 'admin' || role === 'super-admin'; @@ -390,7 +392,7 @@ export default function ConfigurationAuditPage({ Audit findings - {new Date(audit.generated_at).toLocaleString()} + {new Date(audit.generated_at).toLocaleString(undefined, { timeZone: tz })} {' · '} {audit.provider === 'openrouter' ? 'DeepSeek' : 'Claude'} {audit.estimated_cost_usd !== null @@ -685,7 +687,7 @@ export default function ConfigurationAuditPage({

- {new Date(w.performed_at).toLocaleString()} + {new Date(w.performed_at).toLocaleString(undefined, { timeZone: tz })}

Before: @@ -738,7 +740,7 @@ export default function ConfigurationAuditPage({ {history.map((h) => (

  • - {new Date(h.generated_at).toLocaleString()} + {new Date(h.generated_at).toLocaleString(undefined, { timeZone: tz })} {' · '} {h.provider === 'openrouter' ? 'DeepSeek' : 'Claude'} diff --git a/app/analyzer/itglue/configurations/page.tsx b/app/analyzer/itglue/configurations/page.tsx index f793e27..ffe7ee0 100644 --- a/app/analyzer/itglue/configurations/page.tsx +++ b/app/analyzer/itglue/configurations/page.tsx @@ -7,6 +7,7 @@ import { Badge } from '@/components/ui/badge'; import { Skeleton } from '@/components/ui/skeleton'; import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'; import { Input } from '@/components/ui/input'; +import { useUserTimezone } from '@/lib/hooks/use-user-timezone'; interface ConfigurationRow { id: string; @@ -34,6 +35,7 @@ function scoreBadgeVariant( } export default function ConfigurationsListPage() { + const tz = useUserTimezone(); const [rows, setRows] = useState(null); const [error, setError] = useState(null); const [filter, setFilter] = useState(''); @@ -127,7 +129,7 @@ export default function ConfigurationsListPage() { <> {' · '}last audited{' '} {r.latestAudit.generatedAt - ? new Date(r.latestAudit.generatedAt).toLocaleDateString() + ? new Date(r.latestAudit.generatedAt).toLocaleDateString(undefined, { timeZone: tz }) : 'unknown'} {' '} ( diff --git a/app/analyzer/itglue/sites/[companyId]/page.tsx b/app/analyzer/itglue/sites/[companyId]/page.tsx index 0b6c98b..d98de26 100644 --- a/app/analyzer/itglue/sites/[companyId]/page.tsx +++ b/app/analyzer/itglue/sites/[companyId]/page.tsx @@ -7,6 +7,7 @@ import { Skeleton } from '@/components/ui/skeleton'; import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'; import { RmmScriptPicker } from '@/components/rmm/rmm-script-picker'; import { Server } from 'lucide-react'; +import { useUserTimezone } from '@/lib/hooks/use-user-timezone'; interface SiteInfo { companyId: string; @@ -45,6 +46,7 @@ export default function SiteDiscoveryPage({ params: Promise<{ companyId: string }>; }) { const { companyId } = use(params); + const tz = useUserTimezone(); const [info, setInfo] = useState(null); const [executions, setExecutions] = useState(null); const [error, setError] = useState(null); @@ -209,7 +211,7 @@ export default function SiteDiscoveryPage({

    {e.targetHostname ?? '—'} ·{' '} - {new Date(e.queuedAt).toLocaleString()} + {new Date(e.queuedAt).toLocaleString(undefined, { timeZone: tz })}

    diff --git a/app/analyzer/queue/page.tsx b/app/analyzer/queue/page.tsx index 6178fe2..a9ca728 100644 --- a/app/analyzer/queue/page.tsx +++ b/app/analyzer/queue/page.tsx @@ -8,8 +8,10 @@ import { Skeleton } from '@/components/ui/skeleton'; import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'; import { AlertTriangle } from 'lucide-react'; import type { PersistedAnalysis } from '@/lib/types/analyzer'; +import { useUserTimezone } from '@/lib/hooks/use-user-timezone'; export default function AnalyzerQueuePage() { + const tz = useUserTimezone(); const [analyses, setAnalyses] = useState(null); const [error, setError] = useState(null); @@ -100,7 +102,7 @@ export default function AnalyzerQueuePage() { )}

    - {new Date(a.triggeredAt).toLocaleString()} + {new Date(a.triggeredAt).toLocaleString(undefined, { timeZone: tz })}

    diff --git a/app/analyzer/reports/[id]/page.tsx b/app/analyzer/reports/[id]/page.tsx index e690cbd..106a8f9 100644 --- a/app/analyzer/reports/[id]/page.tsx +++ b/app/analyzer/reports/[id]/page.tsx @@ -13,6 +13,7 @@ import { XCircle, } from 'lucide-react'; import { AnalysisMarkdown } from '@/components/analyzer/analysis-markdown'; +import { useUserTimezone } from '@/lib/hooks/use-user-timezone'; type Report = { id: string; @@ -124,6 +125,7 @@ export default function AggregateReportPage({ params: Promise<{ id: string }>; }) { const { id } = use(params); + const tz = useUserTimezone(); const [report, setReport] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); @@ -183,7 +185,7 @@ export default function AggregateReportPage({ {report.reportTitle ?? `Aggregate report · ${report.ticketCount} tickets`}

    - {new Date(report.generatedAt).toLocaleString()} + {new Date(report.generatedAt).toLocaleString(undefined, { timeZone: tz })} {report.modelUsed && ` · ${report.modelUsed}`} {report.estimatedCostUsd !== null && ( <> · ${report.estimatedCostUsd.toFixed(4)} @@ -196,9 +198,9 @@ export default function AggregateReportPage({ {report.dateRangeActual?.earliest && report.dateRangeActual?.latest && ( <> {' · '} - {new Date(report.dateRangeActual.earliest).toLocaleDateString()} + {new Date(report.dateRangeActual.earliest).toLocaleDateString(undefined, { timeZone: tz })} {' – '} - {new Date(report.dateRangeActual.latest).toLocaleDateString()} + {new Date(report.dateRangeActual.latest).toLocaleDateString(undefined, { timeZone: tz })} )}

    diff --git a/app/analyzer/reports/page.tsx b/app/analyzer/reports/page.tsx index 0e855aa..4976d2a 100644 --- a/app/analyzer/reports/page.tsx +++ b/app/analyzer/reports/page.tsx @@ -14,6 +14,7 @@ import { TableRow, } from '@/components/ui/table'; import { CheckCircle2, XCircle, Loader2 } from 'lucide-react'; +import { useUserTimezone } from '@/lib/hooks/use-user-timezone'; interface ReportSummary { id: string; @@ -27,6 +28,7 @@ interface ReportSummary { } export default function ReportsListPage() { + const tz = useUserTimezone(); const [reports, setReports] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); @@ -133,7 +135,7 @@ export default function ReportsListPage() { : `$${r.estimatedCostUsd.toFixed(4)}`} - {new Date(r.generatedAt).toLocaleString()} + {new Date(r.generatedAt).toLocaleString(undefined, { timeZone: tz })}