From 12bf6ee4be6556796551edc79234ca9e36b9807a Mon Sep 17 00:00:00 2001 From: Thomas Camlong Date: Sat, 27 Jun 2026 12:13:52 +0200 Subject: [PATCH] fix: address CodeRabbit review findings - docker-table: inspect refetch result instead of .catch() (TQ v5 compat) - rssFeed: sort all entries by date before slicing to max posts - toValidDate: reject null/boolean inputs before Date construction - system-resources: reset chart history when integrationIds changes - settleIntegrationQueries: wrap fn in async boundary for safe allSettled --- .../manage/tools/docker/docker-table.tsx | 18 +++++++++--------- packages/api/src/router/widgets/rssFeed.ts | 4 ++-- packages/api/src/settle-integrations.ts | 2 +- packages/common/src/date.ts | 1 + .../widgets/src/system-resources/component.tsx | 7 +++++-- 5 files changed, 18 insertions(+), 14 deletions(-) diff --git a/apps/nextjs/src/app/[locale]/manage/tools/docker/docker-table.tsx b/apps/nextjs/src/app/[locale]/manage/tools/docker/docker-table.tsx index e3cfae9c9..43bbc3ff3 100644 --- a/apps/nextjs/src/app/[locale]/manage/tools/docker/docker-table.tsx +++ b/apps/nextjs/src/app/[locale]/manage/tools/docker/docker-table.tsx @@ -163,19 +163,19 @@ export function DockerTable({ initialData }: DockerTableProps) { }); const relativeTime = useTimeAgo(data?.timestamp ?? new Date()); const mutate = useCallback(() => { - void refetch() - .then(() => { - showSuccessNotification({ - title: tDocker("action.refresh.notification.success.title"), - message: tDocker("action.refresh.notification.success.message"), - }); - }) - .catch(() => { + void refetch().then((result) => { + if (result.isError) { showErrorNotification({ title: tDocker("action.refresh.notification.error.title"), message: tDocker("action.refresh.notification.error.message"), }); - }); + } else { + showSuccessNotification({ + title: tDocker("action.refresh.notification.success.title"), + message: tDocker("action.refresh.notification.success.message"), + }); + } + }); }, [refetch, tDocker]); const containers = data?.containers ?? []; diff --git a/packages/api/src/router/widgets/rssFeed.ts b/packages/api/src/router/widgets/rssFeed.ts index 5c49ea9db..5e43efe3e 100644 --- a/packages/api/src/router/widgets/rssFeed.ts +++ b/packages/api/src/router/widgets/rssFeed.ts @@ -40,12 +40,12 @@ export const rssFeedRouter = createTRPCRouter({ logger.warn("RSS feed fetch failed", { url: urls[index], error: result.reason }); return []; }) - .slice(0, input.maximumAmountPosts) .toSorted((entryA, entryB) => { return entryA.published && entryB.published ? new Date(entryB.published).getTime() - new Date(entryA.published).getTime() : 0; - }); + }) + .slice(0, input.maximumAmountPosts); }), }); diff --git a/packages/api/src/settle-integrations.ts b/packages/api/src/settle-integrations.ts index a359f7544..9ae1b8f04 100644 --- a/packages/api/src/settle-integrations.ts +++ b/packages/api/src/settle-integrations.ts @@ -13,7 +13,7 @@ export async function settleIntegrationQueries Promise, ): Promise { - const settled = await Promise.allSettled(integrations.map(fn)); + const settled = await Promise.allSettled(integrations.map(async (integration) => fn(integration))); return settled.flatMap((result, index) => { if (result.status === "fulfilled") return [result.value]; const integration = integrations[index]; diff --git a/packages/common/src/date.ts b/packages/common/src/date.ts index 487684dba..5d46e45e1 100644 --- a/packages/common/src/date.ts +++ b/packages/common/src/date.ts @@ -18,6 +18,7 @@ export function formatDuration(milliseconds: number) { } export const toValidDate = (value: unknown): Date | null => { + if (value == null || typeof value === "boolean") return null; const date = value instanceof Date ? value : new Date(value as string | number); return Number.isFinite(date.getTime()) ? date : null; }; diff --git a/packages/widgets/src/system-resources/component.tsx b/packages/widgets/src/system-resources/component.tsx index 36f5d745d..75c101ed5 100644 --- a/packages/widgets/src/system-resources/component.tsx +++ b/packages/widgets/src/system-resources/component.tsx @@ -44,13 +44,16 @@ export default function SystemResources({ integrationIds, options }: WidgetCompo >(() => (data[0] ? [toChartItem(data[0].healthInfo)] : [])); const lastUpdatedAt = useRef(dataUpdatedAt); + const prevIntegrationIds = useRef(integrationIds); useEffect(() => { if (dataUpdatedAt === lastUpdatedAt.current) return; lastUpdatedAt.current = dataUpdatedAt; const firstItem = data[0]; if (!firstItem) return; - setItems((prev) => [...prev, toChartItem(firstItem.healthInfo)].slice(-MAX_QUEUE_SIZE)); - }, [dataUpdatedAt, data]); + const idsChanged = prevIntegrationIds.current !== integrationIds; + prevIntegrationIds.current = integrationIds; + setItems((prev) => (idsChanged ? [toChartItem(firstItem.healthInfo)] : [...prev, toChartItem(firstItem.healthInfo)].slice(-MAX_QUEUE_SIZE))); + }, [dataUpdatedAt, data, integrationIds]); const showNetwork = items.length === 0 || (items.every((item) => item.network !== null) && options.visibleCharts.includes("network"));