"use client"; import { useMemo } from "react"; import { Badge, Card, Center, Group, ScrollArea, SimpleGrid, Stack, Text } from "@mantine/core"; import { clientApi } from "@homarr/api/client"; import { useCurrentIntlLocale, useI18n } from "@homarr/translation/client"; import type { WidgetComponentProps } from "../../definition"; import { IntegrationErrorIndicator } from "../../common/integration-error-indicator"; import { getUsableWidgetQueryData } from "../../common/query-state"; import { WidgetQueryErrorIndicator } from "../../common/query-state-indicator"; import { getNetworkControllerStatusLayout } from "./layout"; import { WifiVariant } from "./variants/wifi-variant"; import { WiredVariant } from "./variants/wired-variant"; const neutralBorderColor = "rgb(from var(--mantine-color-default-border) r g b / calc(var(--opacity, 1) * 0.45))"; export default function NetworkControllerNetworkStatusWidget({ options, integrationIds, displayMode, width, height, }: WidgetComponentProps<"networkControllerStatus">) { const summaryQuery = clientApi.widget.networkController.summary.useQuery({ integrationIds, }); const results = getUsableWidgetQueryData(summaryQuery) ?? []; const summaries = useMemo( () => results.filter( (result): result is typeof result & { summary: NonNullable } => result.summary !== null, ), [results], ); const t = useI18n("widget.networkControllerStatus"); const tWidgetCommon = useI18n("widget.common"); const tCommon = useI18n("common"); const locale = useCurrentIntlLocale(); const countWifiGuests = summaries.reduce((sum, { summary }) => sum + summary.wifi.guests, 0); const countWifiUsers = summaries.reduce((sum, { summary }) => sum + summary.wifi.users, 0); const countLanGuests = summaries.reduce((sum, { summary }) => sum + summary.lan.guests, 0); const countLanUsers = summaries.reduce((sum, { summary }) => sum + summary.lan.users, 0); const layout = getNetworkControllerStatusLayout({ width, height, displayMode, content: options.content }); const isAdvanced = displayMode === "advanced"; const queryIndicators = ( ); if (summaryQuery.isPending || summaries.length === 0) { return ( {queryIndicators}
{summaryQuery.isPending ? tCommon("action.loading") : tWidgetCommon("integrationDisconnected")}
); } if (isAdvanced) { return ( {queryIndicators} 1 ? layout.sourceColumns : 1} spacing="sm"> {summaries.map(({ integration, summary, updatedAt }) => ( {integration.name} {updatedAt && ( {tWidgetCommon("updatedAt", { date: new Date(updatedAt).toLocaleString(locale) })} )} {integration.kind} ))} ); } return ( {queryIndicators} {layout.showWifi && ( )} {layout.showWired && ( )} ); }