'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')}

)}
openDeployDrawer({ appInstanceId })} > {t('card.menu.deploy')} ) : undefined} />
{showFooterCreateReleaseAction ? (
) : } {releaseMeta}
) }