'use client' import type { AgentAppCopyPayload } from '@dify/contracts/api/console/agent/types.gen' import type { Ref } from 'react' import type { AgentFormSource, AgentFormValues, AgentIconSelection } from './agent-form' import { Button } from '@langgenius/dify-ui/button' import { Dialog, DialogClose, DialogContent, DialogDescription, DialogTitle, } from '@langgenius/dify-ui/dialog' import { Form } from '@langgenius/dify-ui/form' import { IconButton } from '@langgenius/dify-ui/icon-button' import { toast } from '@langgenius/dify-ui/toast' import { useMutation, useQueryClient } from '@tanstack/react-query' import { useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import AppIconPicker from '@/app/components/base/app-icon-picker' import { consoleQuery } from '@/service/client' import { createAgentIconSelection } from './agent-form' import { AgentFormFields } from './agent-form-fields' type DuplicateAgentDialogProps = { agent: AgentFormSource open: boolean onOpenChange: (open: boolean) => void } type DuplicateAgentFormSessionProps = { agent: AgentFormSource nameInputRef: Ref pending: boolean onCancel: () => void onSubmit: (formValues: AgentFormValues, agentIcon: AgentIconSelection) => void } const getDefaultCopyName = (name: string) => { const suffix = ' copy' return `${name.slice(0, 255 - suffix.length)}${suffix}` } function DuplicateAgentFormSession({ agent, nameInputRef, pending, onCancel, onSubmit, }: DuplicateAgentFormSessionProps) { const { t } = useTranslation('agentV2') const { t: tCommon } = useTranslation('common') const [initialValues] = useState(() => ({ fields: { description: agent.description ?? '', name: getDefaultCopyName(agent.name), role: agent.role ?? '', } satisfies AgentFormValues, icon: createAgentIconSelection(agent), sourceName: agent.name, })) const [agentIcon, setAgentIcon] = useState(initialValues.icon) const [iconPickerOpen, setIconPickerOpen] = useState(false) return ( <>
{t(($) => $['roster.duplicateDialog.title'])} {t(($) => $['roster.duplicateDialog.description'], { name: initialValues.sourceName, })}
className="flex min-h-0 flex-1 flex-col" onFormSubmit={(formValues) => onSubmit(formValues, agentIcon)} > $['roster.duplicateForm.changeIcon'], { name: initialValues.sourceName, })} onIconClick={() => setIconPickerOpen(true)} />
) } export function DuplicateAgentDialog({ agent, open, onOpenChange }: DuplicateAgentDialogProps) { const { t } = useTranslation('agentV2') const queryClient = useQueryClient() const latestAgent = queryClient.getQueryData( consoleQuery.agent.byAgentId.get.queryKey({ input: { params: { agent_id: agent.id, }, }, }), ) ?? agent const nameInputRef = useRef(null) const duplicateAgentMutation = useMutation( consoleQuery.agent.byAgentId.copy.post.mutationOptions(), ) const handleOpenChange = (nextOpen: boolean) => { if (!nextOpen && duplicateAgentMutation.isPending) return onOpenChange(nextOpen) } const handleSubmit = (formValues: AgentFormValues, agentIcon: AgentIconSelection) => { if (duplicateAgentMutation.isPending) return const body: AgentAppCopyPayload = { name: formValues.name.trim(), description: formValues.description.trim(), role: formValues.role.trim(), icon_type: agentIcon.type, icon: agentIcon.type === 'image' ? agentIcon.fileId : agentIcon.icon, icon_background: agentIcon.type === 'emoji' ? agentIcon.background : undefined, } duplicateAgentMutation.mutate( { params: { agent_id: agent.id, }, body, }, { onSuccess: () => { toast.success(t(($) => $['roster.duplicateSuccess'])) onOpenChange(false) }, }, ) } return ( <> $['operation.close'], { ns: 'common' })} size="lg" className="absolute inset-e-5 top-5" > } /> onOpenChange(false)} onSubmit={handleSubmit} /> ) }