"use client"; import { Badge, Box, Group, ScrollArea, SimpleGrid, Stack, Text } from "@mantine/core"; import { clientApi } from "@homarr/api/client"; import { useScopedI18n } from "@homarr/translation/client"; import { getUsableWidgetQueryData } from "../common/query-state"; import { WidgetQueryErrorIndicator } from "../common/query-state-indicator"; import { WidgetEmptyState } from "../common/empty-state"; import type { WidgetComponentProps } from "../definition"; import { createWidgetKey, getCoolifySectionVisibility } from "./coolify-utils"; import { InstanceCard } from "./instance-card"; import { SingleInstanceLayout } from "./single-instance-layout"; import type { InstanceData } from "./types"; export default function CoolifyWidget({ options, integrationIds, width, height, displayMode, }: WidgetComponentProps<"coolify">) { const t = useScopedI18n("widget.coolify"); if (integrationIds.length === 0) { return ( {t("error.noIntegration")} ); } const isAdvanced = displayMode === "advanced"; const sectionVisibility = getCoolifySectionVisibility(options, displayMode); return ( ); } interface CoolifyContentProps { integrationIds: string[]; options: WidgetComponentProps<"coolify">["options"]; width: number; height: number; isAdvanced: boolean; } function CoolifyContent({ integrationIds, options, width, height, isAdvanced }: CoolifyContentProps) { const t = useScopedI18n("common"); const instancesQuery = clientApi.widget.coolify.getInstancesInfo.useQuery({ integrationIds, }); const instancesData = getUsableWidgetQueryData(instancesQuery) ?? []; const { isPending } = instancesQuery; const successfulInstances = instancesData.filter( (instance): instance is InstanceData => instance.instanceInfo !== null, ); const failedInstances = instancesData.filter((instance) => instance.instanceInfo === null); const isTiny = width < 256 || height < 144; const hideFooter = height < 112; const [firstInstance] = successfulInstances; const widgetKey = createWidgetKey(integrationIds); if (isPending) { return ( {t("action.loading")} ); } if (successfulInstances.length === 0) { return ( ); } if (successfulInstances.length === 1 && firstInstance) { return (
); } return ( = 760 ? 2 : 1} spacing="sm" p="xs"> {successfulInstances.map((instance) => ( ))} ); } const FailedSourceBadges = ({ sources, queryError, }: { sources: { integrationId: string; integrationName: string }[]; queryError: unknown; }) => { const t = useScopedI18n("widget.coolify"); if (sources.length === 0 && !queryError) return null; return ( {sources.map((source) => ( {t("source.unavailable", { source: source.integrationName })} ))} ); };