import { useState } from 'react'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; import { useTranslation } from 'react-i18next'; import { toast } from 'sonner'; import { Bot, Workflow, Puzzle } from 'lucide-react'; import { httpClient } from '@/app/infra/http/HttpClient'; import { AgentKind } from '@/app/infra/entities/api'; import { Button } from '@/components/ui/button'; import { ToggleGroup, ToggleGroupItem } from '@/components/ui/toggle-group'; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from '@/components/ui/card'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from '@/components/ui/form'; import { Input } from '@/components/ui/input'; import EmojiPicker from '@/components/ui/emoji-picker'; import ProcessorTypeDiagram from './ProcessorTypeDiagram'; export default function AgentCreateContent({ onCreated, }: { onCreated: (agentId: string) => void; }) { const { t } = useTranslation(); const [kind, setKind] = useState('agent'); const formSchema = z.object({ name: z.string().min(1, { message: t('agents.nameRequired') }), description: z.string().optional(), emoji: z.string().optional(), }); type FormValues = z.infer; const form = useForm({ resolver: zodResolver(formSchema), defaultValues: { name: '', description: '', emoji: '🤖', }, }); function handleKindChange(nextKind: AgentKind) { const previousDefaultEmoji = kind === 'pipeline' ? '⚙️' : kind === 'event_processor' ? '🧩' : '🤖'; const nextDefaultEmoji = nextKind === 'pipeline' ? '⚙️' : nextKind === 'event_processor' ? '🧩' : '🤖'; setKind(nextKind); const currentEmoji = form.getValues('emoji'); if (!currentEmoji || currentEmoji === previousDefaultEmoji) { form.setValue('emoji', nextDefaultEmoji); } } async function handleSubmit(values: FormValues) { return httpClient .createAgent({ kind, name: values.name, description: values.description ?? '', emoji: values.emoji || (kind === 'pipeline' ? '⚙️' : kind === 'event_processor' ? '🧩' : '🤖'), }) .then((resp) => { toast.success(t('agents.createSuccess')); onCreated(resp.uuid); }) .catch((err) => { toast.error(t('agents.createError') + err.msg); }); } const typeOptions = [ { kind: 'agent' as const, icon: Bot, title: t('agents.agentType'), description: t('agents.agentTypeDescription'), }, { kind: 'pipeline' as const, icon: Workflow, title: t('agents.pipelineType'), description: t('agents.pipelineTypeDescription'), }, { kind: 'event_processor' as const, icon: Puzzle, title: t('agents.eventProcessor.type'), description: t('agents.eventProcessor.description'), }, ]; return (

{t('agents.eventProcessor.createPageTitle')}

{t('agents.chooseType')}

{t('agents.chooseTypeDescription')}

{ if (value) handleKindChange(value as AgentKind); }} variant="outline" spacing={3} className="grid w-full gap-3 sm:grid-cols-2 lg:grid-cols-1" > {typeOptions.map((option) => { const Icon = option.icon; return ( {option.title} {option.description} ); })}
{t('agents.basicInfo')} {t('agents.basicInfoDescription')}
( {t('common.name')} * )} /> ( {t('common.icon')} )} />
( {t('common.description')} )} />
); }