import { useState, useEffect } from "react"; import { trpc } from "@/lib/trpc"; import DashboardLayout from "@/components/DashboardLayout"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { toast } from "sonner"; import { Mail, Eye, Save, RotateCcw } from "lucide-react"; export default function AdminEmailTemplates() { const [selectedType, setSelectedType] = useState("inscription"); const [formData, setFormData] = useState({ type: "inscription", name: "", logoUrl: "", primaryColor: "#2563eb", headerBgColor: "#2563eb", headerTextColor: "#ffffff", headerTitle: "Formation Manager Itinova", bodyContent: "", footerText: "", active: true, }); const { data: templates, refetch } = trpc.emailTemplates.list.useQuery(); const { data: currentTemplate } = trpc.emailTemplates.getByType.useQuery( { type: selectedType }, { enabled: !!selectedType } ); const upsertMutation = trpc.emailTemplates.upsert.useMutation({ onSuccess: () => { toast.success("Template enregistré avec succès"); refetch(); }, onError: (error) => { toast.error(`Erreur: ${error.message}`); }, }); const initMutation = trpc.emailTemplates.initializeDefaults.useMutation({ onSuccess: () => { toast.success("Templates par défaut initialisés"); refetch(); }, onError: (error) => { toast.error(`Erreur: ${error.message}`); }, }); // Charger le template sélectionné useEffect(() => { if (currentTemplate) { setFormData({ type: currentTemplate.type, name: currentTemplate.name, logoUrl: currentTemplate.logoUrl || "", primaryColor: currentTemplate.primaryColor, headerBgColor: currentTemplate.headerBgColor, headerTextColor: currentTemplate.headerTextColor, headerTitle: currentTemplate.headerTitle, bodyContent: currentTemplate.bodyContent || "", footerText: currentTemplate.footerText || "", active: currentTemplate.active, }); } }, [currentTemplate]); const handleSave = () => { upsertMutation.mutate({ ...formData, logoUrl: formData.logoUrl || null, bodyContent: formData.bodyContent || null, footerText: formData.footerText || null, }); }; const handleReset = () => { if (currentTemplate) { setFormData({ type: currentTemplate.type, name: currentTemplate.name, logoUrl: currentTemplate.logoUrl || "", primaryColor: currentTemplate.primaryColor, headerBgColor: currentTemplate.headerBgColor, headerTextColor: currentTemplate.headerTextColor, headerTitle: currentTemplate.headerTitle, bodyContent: currentTemplate.bodyContent || "", footerText: currentTemplate.footerText || "", active: currentTemplate.active, }); } }; const handleInitDefaults = () => { if (confirm("Initialiser les templates par défaut ? Cela ne modifiera pas les templates existants.")) { initMutation.mutate(); } }; // Générer la prévisualisation HTML const generatePreview = () => { return `
${formData.logoUrl ? `Logo` : ''}

${formData.headerTitle}

${formData.bodyContent ? formData.bodyContent.replace(/\n/g, '
') : `

Saisissez le contenu de votre email dans le champ "Corps du message" pour voir la prévisualisation ici...

`}
`.trim(); }; const templateTypes = [ { value: "inscription", label: "Confirmation d'inscription" }, { value: "teaser", label: "Email teaser" }, { value: "rappel", label: "Rappel J-7" }, { value: "reset_password", label: "Réinitialisation de mot de passe" }, ]; return (

Templates d'emails

Personnalisez l'apparence de vos emails automatiques

{(!templates || templates.length === 0) && ( Initialisation requise Aucun template trouvé. Initialisez les templates par défaut pour commencer. )}
{/* Éditeur */} Éditeur de template Modifiez les paramètres du template sélectionné
setFormData({ ...formData, name: e.target.value })} placeholder="Ex: Confirmation d'inscription" />
setFormData({ ...formData, logoUrl: e.target.value })} placeholder="https://exemple.com/logo.png" />
setFormData({ ...formData, headerBgColor: e.target.value })} className="w-16 h-10 p-1" /> setFormData({ ...formData, headerBgColor: e.target.value })} placeholder="#2563eb" />
setFormData({ ...formData, headerTextColor: e.target.value })} className="w-16 h-10 p-1" /> setFormData({ ...formData, headerTextColor: e.target.value })} placeholder="#ffffff" />
setFormData({ ...formData, primaryColor: e.target.value })} className="w-16 h-10 p-1" /> setFormData({ ...formData, primaryColor: e.target.value })} placeholder="#2563eb" />

Utilisée pour les boutons et les accents

setFormData({ ...formData, headerTitle: e.target.value })} placeholder="Formation Manager Itinova" />