'use client'; import * as React from 'react'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { Plug, Plus } from 'lucide-react'; import { createEvolutionConfig, deleteEvolutionConfig, listEvolutionConfigs, testarConexaoEvolution, updateEvolutionConfig, type EvolutionConfig, } from '@/lib/api/evolution-config'; import { evolutionConfigSchema, type EvolutionConfigFormValues, } from '@/lib/validators/evolution-config'; import { ApiError } from '@/lib/api/client'; import { formatDate } from '@/lib/format'; import { toast } from '@/lib/toast'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { DataTable, type DataTableColumn } from '@/components/ui/data-table'; import { FormField } from '@/components/ui/form-field'; import { Input } from '@/components/ui/input'; import { ResponsiveDialog } from '@/components/ui/responsive-dialog'; import { ConfirmDialog } from '@/components/domain/confirm-dialog'; export default function EvolutionConfigPage() { const queryClient = useQueryClient(); const { data: configs, isLoading } = useQuery({ queryKey: ['master', 'evolution-config'], queryFn: listEvolutionConfigs, }); const [editing, setEditing] = React.useState(null); const [formOpen, setFormOpen] = React.useState(false); const [deleting, setDeleting] = React.useState(null); const [testingId, setTestingId] = React.useState(null); const form = useForm({ resolver: zodResolver(evolutionConfigSchema) }); function openCreate() { setEditing(null); form.reset({ nome: '', base_url: '', api_key: '', versao: '' }); setFormOpen(true); } function openEdit(config: EvolutionConfig) { setEditing(config); form.reset({ nome: config.nome, base_url: config.base_url, api_key: '', versao: config.versao }); setFormOpen(true); } const saveMutation = useMutation({ mutationFn: (values: EvolutionConfigFormValues) => { if (editing) { return updateEvolutionConfig(editing.id, { nome: values.nome, base_url: values.base_url, versao: values.versao || undefined, ...(values.api_key ? { api_key: values.api_key } : {}), }); } return createEvolutionConfig({ nome: values.nome, base_url: values.base_url, api_key: values.api_key, versao: values.versao || undefined, }); }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['master', 'evolution-config'] }); toast.success(editing ? 'Configuração atualizada.' : 'Configuração criada.'); setFormOpen(false); }, onError: (err) => { toast.error(err instanceof ApiError ? err.message : 'Não foi possível salvar a configuração.'); }, }); const deleteMutation = useMutation({ mutationFn: (id: string) => deleteEvolutionConfig(id), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['master', 'evolution-config'] }); toast.success('Configuração excluída.'); setDeleting(null); }, onError: (err) => { toast.error(err instanceof ApiError ? err.message : 'Não foi possível excluir a configuração.'); setDeleting(null); }, }); const testMutation = useMutation({ mutationFn: (id: string) => testarConexaoEvolution(id), onMutate: (id) => setTestingId(id), onSuccess: (result) => { toast.success(`Conexão OK (status ${result.status_http}${result.versao ? `, versão ${result.versao}` : ''}).`); }, onError: (err) => { toast.error(err instanceof ApiError ? err.message : 'Falha ao testar a conexão.'); }, onSettled: () => setTestingId(null), }); const columns: DataTableColumn[] = [ { id: 'nome', header: 'Nome', primary: true, cell: (row) => row.nome }, { id: 'base_url', header: 'URL base', cell: (row) => row.base_url }, { id: 'api_key', header: 'API key', cell: (row) => {row.api_key} }, { id: 'versao', header: 'Versão', cell: (row) => row.versao }, { id: 'status', header: 'Status', primary: true, cell: (row) => {row.ativo ? 'Ativo' : 'Inativo'}, }, { id: 'criado_em', header: 'Criado em', hideOnMobileCard: true, cell: (row) => formatDate(row.criado_em) }, ]; return (

Evolution API

Conexão usada para disparar mensagens de WhatsApp

row.id} loading={isLoading} emptyTitle="Nenhuma configuração cadastrada" emptyDescription="Cadastre a conexão com a Evolution API para habilitar o envio de WhatsApp." emptyAction={ } rowActions={(row) => ( <> )} /> } >
saveMutation.mutate(values))} >
!open && setDeleting(null)} title={`Excluir "${deleting?.nome}"?`} description="Só é possível excluir se nenhuma instância de WhatsApp estiver usando esta configuração." confirmLabel="Excluir" destructive loading={deleteMutation.isPending} onConfirm={() => deleting && deleteMutation.mutate(deleting.id)} />
); }