/** * AddImapAccountForm.tsx * * @author Descomplicar® Crescimento Digital * @link https://descomplicar.pt * @copyright 2025 Descomplicar® */ import React, { useState } from 'react'; import Spinner from './Spinner'; // Certifique-se que este componente exista interface AddImapAccountFormProps { onConnect: (email: string, user: string, host: string, port: number, secure: boolean) => void; onBack: () => void; } const AddImapAccountForm: React.FC = ({ onConnect, onBack }) => { const [email, setEmail] = useState(''); const [user, setUser] = useState(''); const [password, setPassword] = useState(''); const [host, setHost] = useState(''); const [port, setPort] = useState(993); const [secure, setSecure] = useState(true); const [testStatus, setTestStatus] = useState<'idle' | 'testing' | 'success' | 'error'>('idle'); const [testMessage, setTestMessage] = useState(''); const handleTestConnection = async () => { setTestStatus('testing'); setTestMessage(''); // A API que criamos espera um corpo de requisição (body). // Como estamos em um ambiente de desenvolvimento sem um servidor Node rodando, // não podemos chamar a API diretamente. A lógica abaixo é como o frontend // se comportaria se estivesse fazendo um fetch para /api/test-imap. // Por enquanto, vamos simular a chamada e focar na UI. try { const response = await fetch('/api/test-imap', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ host, port, user, password, secure }) }); if (!response.ok) { // Tenta extrair uma mensagem de erro amigável do corpo da resposta const errorResult = await response.json().catch(() => null); throw new Error(errorResult?.message || `Erro no servidor: ${response.statusText}`); } const result = await response.json(); if (result.success) { setTestStatus('success'); setTestMessage(result.message); } else { setTestStatus('error'); setTestMessage(result.message || 'Ocorreu um erro desconhecido.'); } } catch (error) { setTestStatus('error'); setTestMessage(error instanceof Error ? error.message : 'Falha ao se comunicar com o servidor de teste.'); } }; const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); if (testStatus === 'success') { onConnect(email, user, host, port, secure); } else { alert('Por favor, teste a conexão com sucesso antes de adicionar a conta.'); } }; return (
{/* Campos do formulário... */}
setEmail(e.target.value)} required className="mt-1 block w-full input" placeholder="seunome@dominio.com" />
setUser(e.target.value)} required className="mt-1 block w-full input" placeholder="geralmente o mesmo que o e-mail" />
setPassword(e.target.value)} required className="mt-1 block w-full input" />
setHost(e.target.value)} required className="mt-1 block w-full input" placeholder="imap.dominio.com" />
setPort(parseInt(e.target.value))} required className="mt-1 block w-full input" />
setSecure(e.target.checked)} className="h-4 w-4 rounded border-slate-300 text-sky-600 focus:ring-sky-500" />
{testMessage && (
{testMessage}
)}
); }; export default AddImapAccountForm;