"use client"; import { Badge, Card, Center, Group, List, ScrollArea, SimpleGrid, Stack, Text, useMantineTheme } from "@mantine/core"; import { IconCircleCheckFilled, IconCircleXFilled } from "@tabler/icons-react"; import dayjs from "dayjs"; import duration from "dayjs/plugin/duration"; import objectSupport from "dayjs/plugin/objectSupport"; import relativeTime from "dayjs/plugin/relativeTime"; import { clientApi } from "@homarr/api/client"; import { useI18n } from "@homarr/translation/client"; import type { WidgetComponentProps } from "../../definition"; dayjs.extend(objectSupport); dayjs.extend(relativeTime); dayjs.extend(duration); export default function NetworkControllerSummaryWidget({ integrationIds, width, height, displayMode, }: WidgetComponentProps<"networkControllerSummary">) { const { data: summaries = [], isPending } = clientApi.widget.networkController.summary.useQuery({ integrationIds, }); const t = useI18n(); const isAdvanced = displayMode === "advanced"; const isDense = !isAdvanced && height < 160; const columns = isAdvanced && width >= 720 ? 2 : 1; if (isPending || summaries.length === 0) { return (
{isPending ? t("common.action.loading") : t("widget.networkControllerSummary.error.integrationsDisconnected")}
); } return ( {summaries.map(({ integration, summary }) => ( 1 || isAdvanced}> {(isAdvanced || summaries.length > 1) && ( {integration.name} {integration.kind} )} }>WAN }> WWW {summary.www.latency}ms{isAdvanced ? ` · ${summary.www.ping}ms` : ""} }> Wi-Fi{isAdvanced ? ` · ${summary.wifi.users + summary.wifi.guests}` : ""} {isAdvanced && ( }> LAN · {summary.lan.users + summary.lan.guests} )} }> VPN {t("widget.networkControllerSummary.card.vpn.countConnected", { count: `${summary.vpn.users}` })} ))} ); } const StatusIcon = ({ status, size }: { status?: "enabled" | "disabled"; size: number }) => { const mantineTheme = useMantineTheme(); if (status === "enabled") { return ; } if (status === "disabled") { return ; } return ; };