fix: use SuperJSON for cache persistence and add null guards to all widgets

SuperJSON preserves Date/Map/Set types through the Redis cache round-trip,
fixing RangeError crashes from date formatting. Added defensive null/undefined
guards across all widget components to handle useQuery loading states and
potential cache shape mismatches.
This commit is contained in:
Thomas Camlong committed 2026-07-04 10:19:16 +02:00
1 parent e20053b2c1
commit cf075040e8
31 files changed
+124 -117

No files matched your search

@@ -24,7 +24,7 @@ export default function SpeedtestTrackerWidget({ options, integrationIds }: Widg
(acc, item) => ({
latestResult: item.dashboard.latestResult ?? acc.latestResult,
stats: mergeStats(acc.stats, item.dashboard.stats),
recentResults: [...acc.recentResults, ...item.dashboard.recentResults],
recentResults: [...acc.recentResults, ...(item.dashboard.recentResults ?? [])],
}),
{ latestResult: null, stats: null, recentResults: [] },
),
@@ -32,7 +32,7 @@ export default function SpeedtestTrackerWidget({ options, integrationIds }: Widg
);
const twelveHoursAgo = Date.now() - 12 * 60 * 60 * 1000;
const recentFiltered = combined.recentResults.filter((result) => result.created_at.getTime() > twelveHoursAgo);
const recentFiltered = combined.recentResults.filter((result) => new Date(result.created_at).getTime() > twelveHoursAgo);
const hasStatSection =
(options.showLatestResult && combined.latestResult !== null) || (options.showStats && combined.stats !== null);