import { useEffect, useState } from "react"; import DashboardLayout from "@/components/DashboardLayout"; import { trpc } from "@/lib/trpc"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Label } from "@/components/ui/label"; import { Input } from "@/components/ui/input"; import { Button } from "@/components/ui/button"; import { toast } from "sonner"; import { Switch } from "@/components/ui/switch"; import { Alert, AlertDescription } from "@/components/ui/alert"; import { AlertCircle, CheckCircle2, Mail, Send, Server } from "lucide-react"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; export default function AdminEmailConfig() { const utils = trpc.useUtils(); const { data: config, isLoading, refetch } = trpc.emailConfig.get.useQuery(); const upsertMutation = trpc.emailConfig.upsert.useMutation(); const testEmailMutation = trpc.emailConfig.testEmail.useMutation(); const [formData, setFormData] = useState({ provider: "resend" as "resend" | "smtp", apiKey: "", fromEmail: "", fromName: "Formation Manager Itinova", mode: "simulation" as "simulation" | "production", domainVerified: false, smtpHost: "", smtpPort: 587, smtpSecure: "tls" as "none" | "tls" | "ssl", smtpUser: "", smtpPassword: "", }); const [testEmail, setTestEmail] = useState(""); // Charger la configuration existante useEffect(() => { if (config) { setFormData({ provider: config.provider as "resend" | "smtp", apiKey: config.apiKey || "", fromEmail: config.fromEmail, fromName: config.fromName, mode: config.mode, domainVerified: config.domainVerified, smtpHost: config.smtpHost || "", smtpPort: config.smtpPort || 587, smtpSecure: (config.smtpSecure as "none" | "tls" | "ssl") || "tls", smtpUser: config.smtpUser || "", smtpPassword: config.smtpPassword || "", }); } }, [config]); const handleSubmit = (e: React.FormEvent) => { e.preventDefault(); upsertMutation.mutate(formData, { onSuccess: async () => { toast.success("Configuration enregistrée avec succès"); // Invalider le cache et forcer le rechargement await utils.emailConfig.get.invalidate(); await refetch(); }, onError: (error) => { toast.error(`Erreur: ${error.message}`); }, }); }; const handleTestEmail = () => { if (!testEmail) { toast.error("Veuillez saisir une adresse email"); return; } testEmailMutation.mutate( { toEmail: testEmail }, { onSuccess: (data) => { if (data.success) { toast.success(data.message || "Email de test envoyé avec succès"); } else { toast.error(data.message || "Échec de l'envoi de l'email de test"); } }, onError: (error) => { toast.error(`Erreur: ${error.message}`); }, } ); }; if (isLoading) { return (

Chargement...

); } return (

Configuration des emails

Configurez l'envoi d'emails via Resend et basculez entre mode simulation et production

{/* Statut actuel */} Statut actuel

Mode d'envoi

{formData.mode === "simulation" ? "Les emails sont simulés et envoyés comme notifications" : formData.provider === "smtp" ? "Les emails sont envoyés via SMTP Direct" : "Les emails sont envoyés via Resend"}

{formData.mode === "production" ? "Production" : "Simulation"}
{formData.provider === "resend" && formData.apiKey && ( Clé API Resend configurée )} {formData.provider === "smtp" && formData.smtpHost && formData.smtpUser && ( Configuration SMTP active ({formData.smtpHost}:{formData.smtpPort}) )} {formData.provider === "resend" && !formData.apiKey && ( Aucune clé API Resend configurée. Les emails seront simulés. )} {formData.provider === "smtp" && (!formData.smtpHost || !formData.smtpUser) && ( Configuration SMTP incomplète. Les emails seront simulés. )}
{/* Formulaire de configuration */} Configuration de l'envoi d'emails Choisissez votre méthode d'envoi : Resend (API) ou SMTP direct
{/* Sélecteur de provider */}

{formData.provider === "resend" ? "Service d'envoi d'emails via API (recommandé)" : "Connexion directe à un serveur SMTP (Gmail, Outlook, etc.)"}

{/* Configuration Resend */} {formData.provider === "resend" && ( <>
setFormData({ ...formData, apiKey: e.target.value })} />

Obtenez votre clé API sur{" "} resend.com/api-keys

setFormData({ ...formData, fromEmail: e.target.value })} required />

L'adresse email doit être vérifiée dans votre compte Resend

)} {/* Configuration SMTP */} {formData.provider === "smtp" && ( <>
setFormData({ ...formData, smtpHost: e.target.value })} required />
setFormData({ ...formData, smtpPort: parseInt(e.target.value) || 587 })} required />
setFormData({ ...formData, smtpUser: e.target.value })} required />
setFormData({ ...formData, smtpPassword: e.target.value })} required />

Pour Gmail, utilisez un{" "} mot de passe d'application

setFormData({ ...formData, fromEmail: e.target.value })} required />
)}
setFormData({ ...formData, fromName: e.target.value })} required />

Activer l'envoi réel d'emails (désactiver pour simuler)

setFormData({ ...formData, mode: checked ? "production" : "simulation" }) } />
{/* Test d'envoi */} Test d'envoi Envoyez un email de test pour vérifier votre configuration
setTestEmail(e.target.value)} />
{formData.mode === "simulation" && ( Mode simulation actif. L'email de test sera simulé et envoyé comme notification au propriétaire. )}
{/* Documentation */} Guide de configuration

1. Créer un compte Resend

Inscrivez-vous gratuitement sur{" "} resend.com {" "} (100 emails/jour gratuits)

2. Vérifier votre domaine

Ajoutez et vérifiez votre domaine dans les paramètres Resend pour pouvoir envoyer des emails

3. Obtenir la clé API

Générez une clé API dans la section "API Keys" de votre compte Resend

4. Configurer et tester

Saisissez vos informations ci-dessus, enregistrez, puis testez l'envoi avant de passer en mode production

); }