'use client' import type { AgentAppCreatePayload } from '@dify/contracts/api/console/agent/types.gen' import type { Ref } from 'react' import type { AgentFormValues, AgentIconSelection } from './agent-form' import { Button } from '@langgenius/dify-ui/button' import { Dialog, DialogClose, DialogContent, DialogDescription, DialogTitle, DialogTrigger, } from '@langgenius/dify-ui/dialog' import { Form } from '@langgenius/dify-ui/form' import { IconButton } from '@langgenius/dify-ui/icon-button' import { useMutation } from '@tanstack/react-query' import { useRef, useState } from 'react' import { useTranslation } from 'react-i18next' import AppIconPicker from '@/app/components/base/app-icon-picker' import { AgentScope } from '@/features/agent-v2/analytics' import { useRouter } from '@/next/navigation' import { consoleQuery } from '@/service/client' import { trackCreateApp } from '@/utils/create-app-tracking' import { getAgentDetailPath } from '../../agent-detail/routes' import { defaultAgentIcon } from './agent-form' import { AgentFormFields } from './agent-form-fields' type CreateAgentDialogProps = { open?: boolean onOpenChange?: (open: boolean) => void } type CreateAgentFormSessionProps = { nameInputRef: Ref pending: boolean onCancel: () => void onSubmit: (formValues: AgentFormValues, agentIcon: AgentIconSelection) => void } const createAgentDefaultValues = { description: '', name: '', role: '', } satisfies AgentFormValues function CreateAgentFormSession({ nameInputRef, pending, onCancel, onSubmit, }: CreateAgentFormSessionProps) { const { t } = useTranslation('agentV2') const { t: tCommon } = useTranslation('common') const [agentIcon, setAgentIcon] = useState(defaultAgentIcon) const [iconPickerOpen, setIconPickerOpen] = useState(false) return ( <>
{t(($) => $['roster.createDialog.title'])} {t(($) => $['roster.createDialog.description'])}
className="flex min-h-0 flex-1 flex-col" onFormSubmit={(formValues) => onSubmit(formValues, agentIcon)} > $['roster.createForm.changeIcon'])} onIconClick={() => setIconPickerOpen(true)} />
) } export function CreateAgentDialog({ open, onOpenChange }: CreateAgentDialogProps = {}) { const { t } = useTranslation('agentV2') const router = useRouter() const [uncontrolledOpen, setUncontrolledOpen] = useState(false) const nameInputRef = useRef(null) const createAgentMutation = useMutation(consoleQuery.agent.post.mutationOptions()) const setDialogOpen = (nextOpen: boolean) => { if (open === undefined) setUncontrolledOpen(nextOpen) onOpenChange?.(nextOpen) } const handleOpenChange = (nextOpen: boolean) => { if (!nextOpen && createAgentMutation.isPending) return setDialogOpen(nextOpen) } const handleSubmit = (formValues: AgentFormValues, agentIcon: AgentIconSelection) => { if (createAgentMutation.isPending) return const body = { 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, } satisfies AgentAppCreatePayload createAgentMutation.mutate( { body, }, { onSuccess: (createdAgent) => { trackCreateApp({ source: 'studio_blank', appMode: 'agent-v2', agentScope: AgentScope.Global, }) setDialogOpen(false) router.push(getAgentDetailPath(createdAgent.id, 'configure')) }, }, ) } return ( <> {open === undefined && ( }> {t(($) => $['roster.createAgent'])} )} $['operation.close'], { ns: 'common' })} size="lg" className="absolute inset-e-5 top-5" > } /> setDialogOpen(false)} onSubmit={handleSubmit} /> ) }