'use client' import type { AppInstanceSummary } from '@dify/contracts/enterprise/types.gen' import { Button } from '@langgenius/dify-ui/button' import { useSetAtom } from 'jotai' import { useTranslation } from 'react-i18next' import { useFormatTimeFromNow } from '@/hooks/use-format-time-from-now' import Link from '@/next/link' import { CreateReleaseControl } from '../../create-release' import { openDeployDrawerAtom } from '../../deploy-drawer/state' import { DeploymentActionsMenu } from '../../deployment-actions' import { DeploymentAccessLinks, DeploymentStatusContent, ReleaseMetaTooltip, } from './instance-card-sections' import { getInstanceTabHref, isActiveDeployment, isReleaseDeployed } from './instance-card-utils' export function InstanceCard({ summary }: { summary: AppInstanceSummary }) { const { t } = useTranslation('deployments') const { formatTimeFromNow } = useFormatTimeFromNow() const openDeployDrawer = useSetAtom(openDeployDrawerAtom) const appInstance = summary.appInstance const appInstanceId = appInstance.id const appName = appInstance.displayName const detailHref = getInstanceTabHref(appInstanceId, 'overview') const description = appInstance.description.trim() const access = summary.accessChannels const releaseRows = summary.latestRelease ? [summary.latestRelease] : [] const hasRelease = releaseRows.length > 0 const activeDeploymentRows = summary.environmentDeployments.filter(isActiveDeployment) const latestRelease = releaseRows[0] const latestReleaseTime = latestRelease?.createdAt const latestReleaseTimeMs = latestReleaseTime ? Date.parse(latestReleaseTime) : Number.NaN const latestReleaseDeployed = isReleaseDeployed(latestRelease, activeDeploymentRows) const releaseMeta = latestRelease ? [ latestRelease.displayName, Number.isNaN(latestReleaseTimeMs) ? undefined : formatTimeFromNow(latestReleaseTimeMs), ] .filter(Boolean) .join(' ยท ') : t(($) => $['card.notDeployed']) const showDeployAction = hasRelease && activeDeploymentRows.length === 0 const showFooterCreateReleaseAction = !hasRelease return (

{appName}

{description ? (

{description}

) : (

{t(($) => $['card.noDescription'])}

)}
$['card.tooltip.deploymentStatus'])} className="min-h-8 px-4 pt-4 pb-3" > openDeployDrawer({ appInstanceId })} > {t(($) => $['card.menu.deploy'])} ) : undefined } />
{showFooterCreateReleaseAction ? (
$['card.createFirstRelease'])} className="max-w-full" />
) : ( )} {releaseMeta}
) }