'use client'; import { useState } from 'react'; import { useMutation, useQueryClient } from '@tanstack/react-query'; import { mailAccountsApi, MailAccount, MailAccountCreate } from '@/lib/api'; import { X, Loader2, CheckCircle, XCircle } from 'lucide-react'; import { ProviderWizard } from './ProviderWizard'; interface AddMailAccountModalProps { account?: MailAccount | null; onClose: () => void; } type WizardStep = 'provider' | 'form'; export function AddMailAccountModal({ account, onClose }: AddMailAccountModalProps) { const queryClient = useQueryClient(); const [testStatus, setTestStatus] = useState<'idle' | 'testing' | 'success' | 'error'>('idle'); const [testMessage, setTestMessage] = useState(''); const [autoDetecting, setAutoDetecting] = useState(false); const [wizardStep, setWizardStep] = useState(account ? 'form' : 'provider'); const [formData, setFormData] = useState({ name: account?.name || '', protocol: account?.protocol || 'pop3', host: account?.host || '', port: account?.port || 995, username: account?.username || '', password: '', use_ssl: account?.use_ssl ?? true, check_interval_minutes: account?.check_interval_minutes || 5, max_emails_per_check: account?.max_emails_per_check || 100, }); const createMutation = useMutation({ mutationFn: (data: MailAccountCreate) => account ? mailAccountsApi.update(account.id, data) : mailAccountsApi.create(data), onSuccess: () => { queryClient.invalidateQueries({ queryKey: ['mail-accounts'] }); onClose(); }, }); const handleChange = (e: React.ChangeEvent) => { const { name, value, type } = e.target; setFormData((prev) => ({ ...prev, [name]: type === 'checkbox' ? (e.target as HTMLInputElement).checked : type === 'number' ? Number(value) : value, })); }; const handleProviderSelect = (config: { name: string; protocol: string; host: string; port: number; use_ssl: boolean }) => { setFormData((prev) => ({ ...prev, name: config.name, protocol: config.protocol, host: config.host, port: config.port, use_ssl: config.use_ssl, })); setWizardStep('form'); }; const handleAutoDetect = async () => { if (!formData.username) { alert('Please enter an email address first'); return; } setAutoDetecting(true); try { const settings = await mailAccountsApi.autoDetect(formData.username); setFormData((prev) => ({ ...prev, protocol: settings.protocol || prev.protocol, host: settings.host || prev.host, port: settings.port || prev.port, use_ssl: settings.use_ssl ?? prev.use_ssl, })); alert('Settings auto-detected successfully!'); } catch { alert('Failed to auto-detect settings. Please enter manually.'); } finally { setAutoDetecting(false); } }; const handleTestConnection = async () => { if (!formData.username || !formData.password || !formData.host) { alert('Please fill in username, password, and host'); return; } setTestStatus('testing'); setTestMessage(''); try { await mailAccountsApi.test({ protocol: formData.protocol, host: formData.host, port: formData.port, username: formData.username, password: formData.password, use_ssl: formData.use_ssl, }); setTestStatus('success'); setTestMessage('Connection successful!'); } catch (error) { setTestStatus('error'); const errorMessage = error instanceof Error && 'response' in error ? (error as { response?: { data?: { detail?: string } } }).response?.data?.detail : null; setTestMessage(errorMessage || 'Connection failed'); } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); try { await createMutation.mutateAsync(formData); } catch (error) { const errorMessage = error instanceof Error && 'response' in error ? (error as { response?: { data?: { detail?: string } } }).response?.data?.detail : null; alert(errorMessage || 'Failed to save account'); } }; return (

{account ? 'Edit Mail Account' : 'Add Mail Account'}

{wizardStep === 'provider' && !account ? ( setWizardStep('form')} /> ) : (
{!account && ( )}

Delivery: Emails will be delivered to your Gmail account. Configure your Gmail API credentials in Settings for direct injection (recommended), or they will be forwarded via SMTP.

{testStatus !== 'idle' && (
{testStatus === 'testing' && } {testStatus === 'success' && } {testStatus === 'error' && } {testStatus === 'testing' ? 'Testing connection...' : testMessage}
)}
)}
{wizardStep === 'form' && (
)}
); }