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 })}
{t.assignedResourceName ?? (