"use client"; import { ActionIcon, Anchor, Group, Stack, Text } from "@mantine/core"; import { IconCircleCheckFilled, IconCircleXFilled, IconFileText, IconHelpCircleFilled, IconLink, IconLoader2, } from "@tabler/icons-react"; 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 { cleanFqdn, getResourceTimestamp, getStatusColor, parseStatus } from "./coolify-utils"; interface ResourceRowProps { item: { uuid: string; name: string; status?: string | null; fqdn?: string | null; updated_at?: string | null; last_online_at?: string | null; projectName?: string; projectUuid?: string; environmentName?: string; environmentUuid?: string; }; baseUrl: string; isTiny: boolean; resourceType: "application" | "service"; } export function ResourceRow({ item, baseUrl, isTiny, resourceType }: ResourceRowProps) { const t = useI18n("widget.coolify"); const status = parseStatus(item.status ?? ""); const statusColor = getStatusColor(status); const isTransitioning = status === "starting" || status === "restarting"; const StatusIcon = status === "running" ? IconCircleCheckFilled : isTransitioning ? IconLoader2 : status === "unknown" ? IconHelpCircleFilled : IconCircleXFilled; const statusLabel = status === "running" ? t("status.running") : status === "stopped" ? t("status.stopped") : status === "exited" ? t("status.exited") : status === "starting" ? t("status.starting") : status === "restarting" ? t("status.restarting") : t("status.unknown"); const resourceUrl = getSafeApplicationUrl( item.projectUuid && item.environmentUuid ? `${baseUrl}/project/${item.projectUuid}/environment/${item.environmentUuid}/${resourceType}/${item.uuid}` : undefined, ); const logsUrl = getSafeApplicationUrl(resourceUrl ? `${resourceUrl}/logs` : undefined); const publicUrl = getSafeApplicationUrl(cleanFqdn(item.fqdn)); const resourceTimestamp = getResourceTimestamp(item, resourceType); return ( {resourceUrl ? ( {item.name} ) : ( {item.name} )} {publicUrl && ( )} {!isTiny && logsUrl && ( )} {!isTiny && ( {item.projectName ?? "-"} / {item.environmentName ?? "-"} )} {!isTiny && resourceTimestamp && ( {resourceTimestamp} )} ); }