From 2cd9657ae18af0969fef4c56d310a2a5bea7fec1 Mon Sep 17 00:00:00 2001 From: seojcarlos Date: Tue, 7 Apr 2026 21:24:11 +0200 Subject: [PATCH 1/3] fix: prevent NaN timestamps from breaking event charts in Firefox When date-fns-tz zonedTimeToUtc returns Invalid Date in Firefox, the unary + operator produces NaN, which gets sent as "NaN" in query parameters. Routes using z.coerce.number().int() validation (events/series, event-data/properties) reject NaN as non-integer, returning 400 errors and showing "Something went wrong". This fix: - Falls back to raw date timestamps when timezone conversion produces NaN in useDateParameters - Filters out NaN values in getQueryString to prevent invalid parameters from reaching the server Fixes #4121 --- src/components/hooks/useDateParameters.ts | 7 +++++-- src/lib/url.ts | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/components/hooks/useDateParameters.ts b/src/components/hooks/useDateParameters.ts index d84b4236a..6600ce8bc 100644 --- a/src/components/hooks/useDateParameters.ts +++ b/src/components/hooks/useDateParameters.ts @@ -7,9 +7,12 @@ export function useDateParameters() { } = useDateRange(); const { timezone, localToUtc, canonicalizeTimezone } = useTimezone(); + const startAtValue = +localToUtc(startDate); + const endAtValue = +localToUtc(endDate); + return { - startAt: +localToUtc(startDate), - endAt: +localToUtc(endDate), + startAt: Number.isFinite(startAtValue) ? startAtValue : +startDate, + endAt: Number.isFinite(endAtValue) ? endAtValue : +endDate, startDate: localToUtc(startDate).toISOString(), endDate: localToUtc(endDate).toISOString(), unit, diff --git a/src/lib/url.ts b/src/lib/url.ts index f6772feec..a4cc7cb30 100644 --- a/src/lib/url.ts +++ b/src/lib/url.ts @@ -2,7 +2,7 @@ export function getQueryString(params: object = {}): string { const searchParams = new URLSearchParams(); Object.entries(params).forEach(([key, value]) => { - if (value !== undefined) { + if (value !== undefined && value !== null && !Number.isNaN(value)) { searchParams.append(key, value); } }); From 816b51096df27bdcb806bd3bf82028e9ab474a58 Mon Sep 17 00:00:00 2001 From: seojcarlos Date: Wed, 8 Apr 2026 08:22:16 +0200 Subject: [PATCH 2/3] fix: guard toISOString calls against Invalid Date in Firefox The previous fix guarded startAt/endAt numeric values but left startDate/endDate calling .toISOString() on the potentially invalid result of localToUtc(), which throws TypeError in Firefox when zonedTimeToUtc returns Invalid Date. Now falls back to raw date .toISOString() when the UTC conversion is invalid. --- src/components/hooks/useDateParameters.ts | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/src/components/hooks/useDateParameters.ts b/src/components/hooks/useDateParameters.ts index 6600ce8bc..e174d8d54 100644 --- a/src/components/hooks/useDateParameters.ts +++ b/src/components/hooks/useDateParameters.ts @@ -7,14 +7,18 @@ export function useDateParameters() { } = useDateRange(); const { timezone, localToUtc, canonicalizeTimezone } = useTimezone(); - const startAtValue = +localToUtc(startDate); - const endAtValue = +localToUtc(endDate); + const utcStart = localToUtc(startDate); + const utcEnd = localToUtc(endDate); + const startAtValue = +utcStart; + const endAtValue = +utcEnd; + const isStartValid = Number.isFinite(startAtValue); + const isEndValid = Number.isFinite(endAtValue); return { - startAt: Number.isFinite(startAtValue) ? startAtValue : +startDate, - endAt: Number.isFinite(endAtValue) ? endAtValue : +endDate, - startDate: localToUtc(startDate).toISOString(), - endDate: localToUtc(endDate).toISOString(), + startAt: isStartValid ? startAtValue : +startDate, + endAt: isEndValid ? endAtValue : +endDate, + startDate: isStartValid ? utcStart.toISOString() : startDate.toISOString(), + endDate: isEndValid ? utcEnd.toISOString() : endDate.toISOString(), unit, timezone: canonicalizeTimezone(timezone), }; From dbcd51ac2c616547f4f3c0e5e4213241013725fd Mon Sep 17 00:00:00 2001 From: seojcarlos Date: Sun, 12 Apr 2026 09:45:43 +0200 Subject: [PATCH 3/3] fix: guard toISOString against Invalid Date in Firefox Wrap toISOString calls with try-catch to prevent TypeError when date-fns-tz localToUtc returns Invalid Date in Firefox. Falls back to the original pre-conversion date if conversion fails. --- src/components/hooks/useDateParameters.ts | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/components/hooks/useDateParameters.ts b/src/components/hooks/useDateParameters.ts index e174d8d54..a16949017 100644 --- a/src/components/hooks/useDateParameters.ts +++ b/src/components/hooks/useDateParameters.ts @@ -1,6 +1,14 @@ import { useDateRange } from './useDateRange'; import { useTimezone } from './useTimezone'; +function safeToISOString(date: Date, fallback: Date): string { + try { + return date.toISOString(); + } catch { + return fallback.toISOString(); + } +} + export function useDateParameters() { const { dateRange: { startDate, endDate, unit }, @@ -17,8 +25,8 @@ export function useDateParameters() { return { startAt: isStartValid ? startAtValue : +startDate, endAt: isEndValid ? endAtValue : +endDate, - startDate: isStartValid ? utcStart.toISOString() : startDate.toISOString(), - endDate: isEndValid ? utcEnd.toISOString() : endDate.toISOString(), + startDate: safeToISOString(isStartValid ? utcStart : startDate, startDate), + endDate: safeToISOString(isEndValid ? utcEnd : endDate, endDate), unit, timezone: canonicalizeTimezone(timezone), };