mirror of
https://github.com/langgenius/dify.git
synced 2026-05-13 08:57:28 +08:00
99 lines
3.6 KiB
TypeScript
99 lines
3.6 KiB
TypeScript
'use client'
|
|
|
|
import { cn } from '@langgenius/dify-ui/cn'
|
|
import {
|
|
DropdownMenu,
|
|
DropdownMenuContent,
|
|
DropdownMenuItem,
|
|
DropdownMenuTrigger,
|
|
} from '@langgenius/dify-ui/dropdown-menu'
|
|
import { useQuery } from '@tanstack/react-query'
|
|
import { useMemo, useState } from 'react'
|
|
import { useTranslation } from 'react-i18next'
|
|
import { consoleQuery } from '@/service/client'
|
|
import { useDeploymentsStore } from '../../store'
|
|
import {
|
|
activeRelease,
|
|
deployedRows,
|
|
deploymentStatus,
|
|
environmentId,
|
|
environmentName,
|
|
environmentOptionsFromOptionsReply,
|
|
} from '../../utils'
|
|
|
|
type DeployReleaseMenuProps = {
|
|
appInstanceId: string
|
|
releaseId: string
|
|
}
|
|
|
|
export function DeployReleaseMenu({ appInstanceId, releaseId }: DeployReleaseMenuProps) {
|
|
const { t } = useTranslation('deployments')
|
|
const openDeployDrawer = useDeploymentsStore(state => state.openDeployDrawer)
|
|
const [open, setOpen] = useState(false)
|
|
const { data: environmentDeployments } = useQuery(consoleQuery.enterprise.appDeploy.listRuntimeInstances.queryOptions({
|
|
input: {
|
|
params: { appInstanceId },
|
|
},
|
|
enabled: open,
|
|
}))
|
|
const { data: environmentOptionsReply } = useQuery(consoleQuery.enterprise.appDeploy.listDeploymentEnvironmentOptions.queryOptions({
|
|
enabled: open,
|
|
}))
|
|
|
|
const environmentOptions = useMemo(
|
|
() => environmentOptionsFromOptionsReply(environmentOptionsReply),
|
|
[environmentOptionsReply],
|
|
)
|
|
const environments = environmentOptions.filter(env => env.id)
|
|
const deploymentRows = deployedRows(environmentDeployments?.data)
|
|
|
|
return (
|
|
<DropdownMenu modal={false} open={open} onOpenChange={setOpen}>
|
|
<DropdownMenuTrigger
|
|
className={cn(
|
|
'inline-flex h-7 items-center gap-1 rounded-md px-2 system-xs-medium',
|
|
'border border-components-button-secondary-border bg-components-button-secondary-bg text-components-button-secondary-accent-text',
|
|
'hover:bg-components-button-secondary-bg-hover',
|
|
)}
|
|
>
|
|
{t('versions.deploy')}
|
|
<span className="i-ri-arrow-down-s-line h-3.5 w-3.5" />
|
|
</DropdownMenuTrigger>
|
|
{open && (
|
|
<DropdownMenuContent placement="bottom-end" sideOffset={4} popupClassName="w-[220px]">
|
|
{environments.map((env) => {
|
|
const envId = env.id!
|
|
const row = deploymentRows.find(item => environmentId(item.environment) === envId)
|
|
const isCurrent = activeRelease(row)?.id === releaseId
|
|
const isEnvironmentDeploying = row ? deploymentStatus(row) === 'deploying' : false
|
|
const disabled = Boolean(env.disabled || isCurrent || isEnvironmentDeploying)
|
|
return (
|
|
<DropdownMenuItem
|
|
key={envId}
|
|
className="gap-2 px-3"
|
|
disabled={disabled}
|
|
onClick={() => {
|
|
setOpen(false)
|
|
if (disabled)
|
|
return
|
|
openDeployDrawer({ appInstanceId, environmentId: envId, releaseId })
|
|
}}
|
|
>
|
|
<span className="system-sm-regular text-text-secondary">
|
|
{isEnvironmentDeploying
|
|
? t('versions.deployingTo', { name: environmentName(env) })
|
|
: isCurrent
|
|
? t('versions.currentOn', { name: environmentName(env) })
|
|
: row
|
|
? t('versions.promoteTo', { name: environmentName(env) })
|
|
: t('versions.deployTo', { name: environmentName(env) })}
|
|
</span>
|
|
</DropdownMenuItem>
|
|
)
|
|
})}
|
|
</DropdownMenuContent>
|
|
)}
|
|
</DropdownMenu>
|
|
)
|
|
}
|