From 810931d74895e9e0d18f307b796f21c0b9cf015d Mon Sep 17 00:00:00 2001 From: Official-Krish Date: Mon, 13 Jul 2026 14:29:17 +0530 Subject: [PATCH 1/3] fix: date format showing MM/DD/YYYY instead of DD/MM/YYYY --- src/components/common/day-time-picker.tsx | 2 +- src/features/database/components/health-grid.tsx | 2 +- .../components/organization-member-card.tsx | 3 ++- .../profile/components/profile-security.tsx | 1 - .../projects/components/bulk-restore-modal.tsx | 3 ++- src/utils/date-formatting.ts | 13 +++++++------ 6 files changed, 13 insertions(+), 11 deletions(-) diff --git a/src/components/common/day-time-picker.tsx b/src/components/common/day-time-picker.tsx index 7ca3c98e..5273de1a 100644 --- a/src/components/common/day-time-picker.tsx +++ b/src/components/common/day-time-picker.tsx @@ -55,7 +55,7 @@ export function DateTimePicker({ name }: DateTimePickerProps) { diff --git a/src/features/database/components/health-grid.tsx b/src/features/database/components/health-grid.tsx index 38b1a30c..b8578521 100644 --- a/src/features/database/components/health-grid.tsx +++ b/src/features/database/components/health-grid.tsx @@ -92,7 +92,7 @@ function getOldestLog(logs: HealthcheckLog[]): HealthcheckLog { } function formatTime(date: Date): string { - return date.toLocaleTimeString("en-US", { + return date.toLocaleTimeString("en-GB", { hour: "2-digit", minute: "2-digit", hour12: false, diff --git a/src/features/organizations/components/organization-member-card.tsx b/src/features/organizations/components/organization-member-card.tsx index 9eccb8ef..edf8a721 100644 --- a/src/features/organizations/components/organization-member-card.tsx +++ b/src/features/organizations/components/organization-member-card.tsx @@ -19,6 +19,7 @@ import { OrganizationMemberChangeRoleModal } from "@/features/organizations/components/organization-member-change-role"; import {MemberWithUser, OrganizationWithMembersAndUsers} from "@/db/schema/03_organization"; +import {formatDayOnly} from "@/utils/date-formatting"; type OrganizationMemberCardProps = { member: MemberWithUser; @@ -56,7 +57,7 @@ export const OrganizationMemberCard = ({member, organization}: OrganizationMembe
{member.user.name}
{member.user.email}
Joined {new Date(member.createdAt).toLocaleDateString()}
+ className="text-xs text-muted-foreground">Joined {formatDayOnly(new Date(member.createdAt))}
diff --git a/src/features/profile/components/profile-security.tsx b/src/features/profile/components/profile-security.tsx index 7a9582c3..f744629f 100644 --- a/src/features/profile/components/profile-security.tsx +++ b/src/features/profile/components/profile-security.tsx @@ -44,7 +44,6 @@ import { Account, Session, User } from "@/db/schema/02_user"; import { Icon } from "@iconify/react"; import Image from "next/image"; import type { AuthProviderConfig } from "@/lib/auth/config"; -import { is } from "date-fns/locale"; interface ProfileSecurityProps { user: User; diff --git a/src/features/projects/components/bulk-restore-modal.tsx b/src/features/projects/components/bulk-restore-modal.tsx index 6e485e43..61015f14 100644 --- a/src/features/projects/components/bulk-restore-modal.tsx +++ b/src/features/projects/components/bulk-restore-modal.tsx @@ -6,6 +6,7 @@ import {Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter} from "@/ import {Button} from "@/components/ui/button"; import {Input} from "@/components/ui/input"; import type {RestorePreviewRow} from "@/features/database/actions/bulk-restore.action"; +import {formatLocalizedDate} from "@/utils/date-formatting"; const CONFIRM_WORD = "restore"; @@ -54,7 +55,7 @@ export const BulkRestoreModal = (props: BulkRestoreModalProps) => { {r.name} {r.restorable - ? {r.backupDate ? new Date(r.backupDate).toLocaleString() : "latest backup"} + ? {r.backupDate ? formatLocalizedDate(r.backupDate) : "latest backup"} : {r.reason ?? "no successful backup"} — skipped} diff --git a/src/utils/date-formatting.ts b/src/utils/date-formatting.ts index 81cba7a2..88f95474 100644 --- a/src/utils/date-formatting.ts +++ b/src/utils/date-formatting.ts @@ -1,23 +1,24 @@ import {formatDistanceToNow} from "date-fns"; /** - * Get user's locale and timezone from the browser + * Detect the user's timezone from the browser (or server during SSR fallback). */ const TIMEZONE = Intl.DateTimeFormat().resolvedOptions().timeZone; -const LOCALE = Intl.DateTimeFormat().resolvedOptions().locale; /** - * Format a date in DD/MM/YYYY HH:mm 24-hour format + * Format a date to DD/MM/YYYY HH:mm in 24-hour format using the en-GB locale. + * en-GB natively orders day before month, which matches the desired DD/MM/YYYY layout + * regardless of the runtime environment (SSR vs client). */ export function formatLocalizedDate(date: string | number | Date) { const d = new Date(date); - return new Intl.DateTimeFormat(LOCALE, { + return new Intl.DateTimeFormat("en-GB", { day: "2-digit", month: "2-digit", year: "numeric", hour: "2-digit", minute: "2-digit", - hour12: false, // 24-hour format + hour12: false, timeZone: TIMEZONE, }).format(d); } @@ -38,7 +39,7 @@ export function formatDateLastContact(lastContact: string | number | Date | null } export function formatDayOnly(date: Date) { - return new Intl.DateTimeFormat(LOCALE, { + return new Intl.DateTimeFormat("en-GB", { day: "2-digit", month: "2-digit", year: "numeric", From 91b09552a4c0c64cccd1652072da9c3d2ef4bb3b Mon Sep 17 00:00:00 2001 From: Official-Krish Date: Mon, 13 Jul 2026 15:14:05 +0530 Subject: [PATCH 2/3] fix: widen formatDayOnly to accept string | number | Date --- .../organizations/components/organization-member-card.tsx | 2 +- src/utils/date-formatting.ts | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/features/organizations/components/organization-member-card.tsx b/src/features/organizations/components/organization-member-card.tsx index edf8a721..f25e5d1c 100644 --- a/src/features/organizations/components/organization-member-card.tsx +++ b/src/features/organizations/components/organization-member-card.tsx @@ -57,7 +57,7 @@ export const OrganizationMemberCard = ({member, organization}: OrganizationMembe
{member.user.name}
{member.user.email}
Joined {formatDayOnly(new Date(member.createdAt))}
+ className="text-xs text-muted-foreground">Joined {formatDayOnly(member.createdAt)}
diff --git a/src/utils/date-formatting.ts b/src/utils/date-formatting.ts index 88f95474..ad7964d7 100644 --- a/src/utils/date-formatting.ts +++ b/src/utils/date-formatting.ts @@ -38,13 +38,14 @@ export function formatDateLastContact(lastContact: string | number | Date | null : "Never connected."; } -export function formatDayOnly(date: Date) { +export function formatDayOnly(date: string | number | Date) { + const d = new Date(date); return new Intl.DateTimeFormat("en-GB", { day: "2-digit", month: "2-digit", year: "numeric", timeZone: TIMEZONE, - }).format(date); + }).format(d); } export function getTodayISODate() { From 2b9b67230494fad17e9383d854a14b5d4a57ffa6 Mon Sep 17 00:00:00 2001 From: Charles GTE Date: Mon, 13 Jul 2026 16:39:53 +0200 Subject: [PATCH 3/3] fix --- src/features/telemetry/constants.ts | 3 +-- src/lib/logger.ts | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/features/telemetry/constants.ts b/src/features/telemetry/constants.ts index 5b6eb738..1ce0c132 100644 --- a/src/features/telemetry/constants.ts +++ b/src/features/telemetry/constants.ts @@ -10,6 +10,5 @@ export const OTLP_AUTH_TOKEN = export function getOtlpEndpoint(): string { return process.env.NODE_ENV === "production" ? "https://telemetry.portabase.io" - // : "http://localhost:4318"; - : "https://sandbox.telemetry.portabase.io"; + : "http://localhost:4318" } diff --git a/src/lib/logger.ts b/src/lib/logger.ts index d788af3e..5f30938e 100644 --- a/src/lib/logger.ts +++ b/src/lib/logger.ts @@ -7,7 +7,7 @@ const level = (process.env.LOG_LEVEL ?? defaultLevel) as pino.Level; function getLocalTimestamp() { const date = new Date(); - const formatted = new Intl.DateTimeFormat("en-US", { + const formatted = new Intl.DateTimeFormat("en-GB", { timeZone: process.env.TZ, year: "numeric", month: "2-digit",