"use client"; import { Accordion, ActionIcon, Anchor, Badge, Group, Stack, Text } from "@mantine/core"; import { IconCircleCheckFilled, IconCircleFilled, IconCircleXFilled, IconEye, IconEyeOff, IconServer, } from "@tabler/icons-react"; import type { CoolifyServer } from "@homarr/integrations/types"; import { useI18n } from "@homarr/translation/client"; import actionTargetClasses from "../common/action-target.module.css"; import { getSafeApplicationUrl, SAFE_NEW_TAB_REL } from "../common/application-url"; import { getBadgeColor, getCoolifyServerState, isCoolifyServerOnline } from "./coolify-utils"; interface ServersSectionProps { servers: CoolifyServer[]; serverResourceCounts: Map; baseUrl: string; isTiny: boolean; isAdvanced: boolean; showIp: boolean; onToggleIp: () => void; } export function ServersSection({ servers, serverResourceCounts, baseUrl, isTiny, isAdvanced, showIp, onToggleIp, }: ServersSectionProps) { const t = useI18n("widget.coolify"); const tCommon = useI18n("common"); const onlineServers = servers.filter(isCoolifyServerOnline).length; return ( } style={{ flex: 1, minWidth: 0 }} > {tCommon("servers")} {onlineServers} / {servers.length} {showIp ? : } {servers.length > 0 ? ( {servers.map((server) => ( ))} ) : ( {t("empty.servers")} )} ); } interface ServerRowProps { server: CoolifyServer; counts: { apps: number; services: number }; baseUrl: string; isTiny: boolean; isAdvanced: boolean; showIp: boolean; } function ServerRow({ server, counts, baseUrl, isTiny, isAdvanced, showIp }: ServerRowProps) { const t = useI18n("widget.coolify"); const isBuildServer = server.settings?.is_build_server === true; const reachability = getCoolifyServerState(server, "is_reachable"); const usability = getCoolifyServerState(server, "is_usable"); const serverUrl = getSafeApplicationUrl(`${baseUrl}/server/${server.uuid}`); const status = reachability === true ? "online" : reachability === false ? "offline" : "unknown"; const StatusIcon = reachability === true ? IconCircleCheckFilled : reachability === false ? IconCircleXFilled : IconCircleFilled; const statusColor = reachability === true ? "green" : reachability === false ? "red" : "gray"; return ( {server.name} {isBuildServer ? ( {t("server.buildServer")} ) : ( ({t("server.resourceCounts", { applications: counts.apps, services: counts.services })}) )} {showIp ? (server.ip ?? "—") : "***.***.***.***"} {isAdvanced && ( )} ); } const ServerStateBadge = ({ field, value }: { field: "reachability" | "usability"; value: boolean | undefined }) => { const t = useI18n("widget.coolify"); const status = value === undefined ? t("status.unknown") : field === "reachability" ? t(value ? "status.reachable" : "status.unreachable") : t(value ? "status.usable" : "status.unusable"); return ( {t(`server.${field}`)}: {status} ); };