"use client"; import { useMemo } from "react"; import { Box, Group, Stack, Text } from "@mantine/core"; import { clientApi } from "@homarr/api/client"; import { useI18n } from "@homarr/translation/client"; import type { WidgetComponentProps } from "../definition"; import { IntegrationErrorIndicator } from "../common/integration-error-indicator"; import { getUsableWidgetQueryData } from "../common/query-state"; import { WidgetEmptyState } from "../common/empty-state"; import { AveragesSection } from "./averages"; import { combineSpeedtestDashboards, getAvailableSpeedtestDashboards } from "./helpers"; import { LatestResultSection } from "./latest-result"; import { RecentResultsSection } from "./recent-results"; const emptyDashboardData = [] as const; export default function SpeedtestTrackerWidget({ options, integrationIds, width, }: WidgetComponentProps<"speedtestTracker">) { const t = useI18n("widget.speedtestTracker"); const dashboardQuery = clientApi.widget.speedtestTracker.getDashboard.useQuery({ integrationIds }); const dashboardData = getUsableWidgetQueryData(dashboardQuery) ?? emptyDashboardData; const successfulDashboards = useMemo(() => getAvailableSpeedtestDashboards(dashboardData), [dashboardData]); const combined = useMemo( () => combineSpeedtestDashboards(successfulDashboards.map(({ dashboard }) => dashboard)), [successfulDashboards], ); const cutoff = Date.now() - 12 * 60 * 60 * 1000; const recentFiltered = combined.recentResults.filter((result) => result.created_at.getTime() > cutoff); const showLatestResult = options.showLatestResult; const showStats = options.showStats; const showRecentResults = options.showRecentResults; const showPingGraph = options.showPingGraph; const hasStatSection = (showLatestResult && combined.latestResult !== null) || (showStats && combined.stats !== null); const hasChart = showRecentResults && recentFiltered.length > 0; const noSectionsEnabled = !options.showLatestResult && !options.showStats && !options.showRecentResults; const latest = showLatestResult && combined.latestResult && ( ); const averages = showStats && combined.stats && ( ); return ( {dashboardData.length > 1 && ( {successfulDashboards.map(({ integrationName }) => integrationName).join(" ยท ")} )} {(latest || averages) && ( {latest &&
{latest}
} {averages &&
{averages}
}
)} {hasChart && (
)} {noSectionsEnabled && ( {t("noSectionsEnabled")} )} {!noSectionsEnabled && !hasStatSection && !hasChart && }
); }