From 16094876fab96d633edc08bf01f4391e43aa4530 Mon Sep 17 00:00:00 2001 From: Thomas Camlong Date: Mon, 15 Jun 2026 15:55:26 +0200 Subject: [PATCH] fix(beszel): restore timePeriod cast and improve error visibility - Restore timePeriod union cast to fix typecheck (TS2769) - Clear live data on subscription error so error UI always shows - Emit error when no integration is configured for live subscription - Add error state to system select input when query fails --- packages/api/src/router/widgets/beszel.ts | 5 ++++- packages/translation/src/lang/en.json | 3 ++- packages/widgets/src/_inputs/widget-beszel-system-input.tsx | 4 +++- packages/widgets/src/beszel-system-stats/component.tsx | 2 +- packages/widgets/src/beszel/_shared/use-live-stats.ts | 1 + 5 files changed, 11 insertions(+), 4 deletions(-) diff --git a/packages/api/src/router/widgets/beszel.ts b/packages/api/src/router/widgets/beszel.ts index 423c750a1..f20da7530 100644 --- a/packages/api/src/router/widgets/beszel.ts +++ b/packages/api/src/router/widgets/beszel.ts @@ -162,7 +162,10 @@ export const beszelRouter = createTRPCRouter({ containerStats: BeszelContainerStatsRecord | null; }>((emit) => { const integration = ctx.integrations[0]; - if (!integration) return () => {}; + if (!integration) { + emit.error(new Error("No Beszel integration configured")); + return () => {}; + } const abortController = new AbortController(); diff --git a/packages/translation/src/lang/en.json b/packages/translation/src/lang/en.json index 7f04d6b06..db654f202 100644 --- a/packages/translation/src/lang/en.json +++ b/packages/translation/src/lang/en.json @@ -3669,7 +3669,8 @@ "configureIntegrationFirst": "Configure a Beszel integration first", "loading": "Loading systems...", "placeholder": "Select a system", - "noSystems": "No systems found" + "noSystems": "No systems found", + "loadError": "Failed to load systems" }, "timePeriod": { "label": "Time period" diff --git a/packages/widgets/src/_inputs/widget-beszel-system-input.tsx b/packages/widgets/src/_inputs/widget-beszel-system-input.tsx index 4b5604c28..94b45351d 100644 --- a/packages/widgets/src/_inputs/widget-beszel-system-input.tsx +++ b/packages/widgets/src/_inputs/widget-beszel-system-input.tsx @@ -16,7 +16,7 @@ export const WidgetBeszelSystemInput = ({ property, kind }: CommonWidgetInputPro const integrationIds = form.values.integrationIds; - const { data: systemsResult = [], isPending } = clientApi.widget.beszel.getSystems.useQuery( + const { data: systemsResult = [], isPending, isError } = clientApi.widget.beszel.getSystems.useQuery( { integrationIds }, { enabled: integrationIds.length > 0, staleTime: 30_000 }, ); @@ -40,6 +40,8 @@ export const WidgetBeszelSystemInput = ({ property, kind }: CommonWidgetInputPro searchable nothingFoundMessage={t("noSystems")} data={systems} + disabled={isError} + error={isError ? t("loadError") : undefined} {...form.getInputProps(`options.${property}`)} /> ); diff --git a/packages/widgets/src/beszel-system-stats/component.tsx b/packages/widgets/src/beszel-system-stats/component.tsx index 0f5e0df59..1f242e070 100644 --- a/packages/widgets/src/beszel-system-stats/component.tsx +++ b/packages/widgets/src/beszel-system-stats/component.tsx @@ -71,7 +71,7 @@ export default function BeszelSystemStatsWidget({ { integrationIds, systemId: selectedSystem, - timePeriod: options.timePeriod, + timePeriod: options.timePeriod as "1m" | "1h" | "12h" | "24h" | "1w" | "30d", includeDocker: showDocker, }, { staleTime: 30 * 1000, enabled: !isLive && systemReady && selectedSystem !== "" }, diff --git a/packages/widgets/src/beszel/_shared/use-live-stats.ts b/packages/widgets/src/beszel/_shared/use-live-stats.ts index 1f1326e8a..7cd103254 100644 --- a/packages/widgets/src/beszel/_shared/use-live-stats.ts +++ b/packages/widgets/src/beszel/_shared/use-live-stats.ts @@ -37,6 +37,7 @@ export const useLiveStats = (integrationIds: string[], systemId: string, enabled ); const onError = useCallback((err: unknown) => { + setData(null); setError(err instanceof Error ? err : new Error(String(err))); }, []);