"use client"; import { Badge, Box, 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 { 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, displayScale = 1, }: WidgetComponentProps<"networkControllerStatus">) { const summaryQuery = clientApi.widget.networkController.summary.useQuery({ integrationIds, }); const isAdvanced = displayMode === "advanced"; let results = summaryQuery.data ?? []; if (isAdvanced) { results = getUsableWidgetQueryData(summaryQuery) ?? []; } const summaries = results.filter( (result): result is typeof result & { summary: NonNullable } => result.summary !== null, ); 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); let responsiveWidth = width; let responsiveHeight = height; if (!isAdvanced && Number.isFinite(displayScale) && displayScale > 0) { responsiveWidth *= displayScale; responsiveHeight *= displayScale; } const layout = getNetworkControllerStatusLayout({ width: responsiveWidth, height: responsiveHeight, displayMode, content: options.content, }); const indicatorResults = results.length > 0 || !summaryQuery.error ? results : integrationIds.map((integrationId) => ({ integrationId, error: "query" })); const queryIndicators = ( ); if (!isAdvanced) { return ( {queryIndicators} {options.content === "wifi" ? ( ) : ( )} ); } if (summaryQuery.isPending || summaries.length === 0) { return ( {queryIndicators}
{summaryQuery.isPending ? tCommon("action.loading") : tWidgetCommon("integrationDisconnected")}
); } 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} ))} ); }