import { useState } from "react"; import DashboardLayout from "@/components/DashboardLayout"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Switch } from "@/components/ui/switch"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { trpc } from "@/lib/trpc"; import { Bell, Edit, Plus, Trash2 } from "lucide-react"; import { toast } from "sonner"; // Types de templates disponibles pour les rappels const TEMPLATE_TYPES = [ { value: "rappel", label: "Rappel J-7", joursAvant: 7 }, { value: "rappelJ1", label: "Rappel J-1", joursAvant: 1 }, ]; export default function AdminRappels() { const [isCreateOpen, setIsCreateOpen] = useState(false); const [isEditOpen, setIsEditOpen] = useState(false); const [editingRappel, setEditingRappel] = useState(null); const [formData, setFormData] = useState({ nom: "", templateType: "", joursAvant: 7, heureEnvoi: "09:00", actif: true, }); const { data: rappels, refetch } = trpc.rappels.list.useQuery(); const createMutation = trpc.rappels.create.useMutation({ onSuccess: () => { toast.success("Rappel créé avec succès"); refetch(); setIsCreateOpen(false); resetForm(); }, onError: (error) => { toast.error(`Erreur: ${error.message}`); }, }); const updateMutation = trpc.rappels.update.useMutation({ onSuccess: () => { toast.success("Rappel modifié avec succès"); refetch(); setIsEditOpen(false); setEditingRappel(null); resetForm(); }, onError: (error) => { toast.error(`Erreur: ${error.message}`); }, }); const deleteMutation = trpc.rappels.delete.useMutation({ onSuccess: () => { toast.success("Rappel supprimé avec succès"); refetch(); }, onError: (error) => { toast.error(`Erreur: ${error.message}`); }, }); const toggleActifMutation = trpc.rappels.toggleActif.useMutation({ onSuccess: () => { toast.success("Statut modifié avec succès"); refetch(); }, onError: (error) => { toast.error(`Erreur: ${error.message}`); }, }); const resetForm = () => { setFormData({ nom: "", templateType: "", joursAvant: 7, heureEnvoi: "09:00", actif: true, }); }; const handleCreate = () => { if (!formData.nom || !formData.templateType) { toast.error("Veuillez remplir tous les champs obligatoires"); return; } createMutation.mutate(formData); }; const handleEdit = (rappel: any) => { setEditingRappel(rappel); setFormData({ nom: rappel.nom, templateType: rappel.templateType, joursAvant: rappel.joursAvant, heureEnvoi: rappel.heureEnvoi, actif: rappel.actif, }); setIsEditOpen(true); }; const handleUpdate = () => { if (!editingRappel) return; if (!formData.nom || !formData.templateType) { toast.error("Veuillez remplir tous les champs obligatoires"); return; } updateMutation.mutate({ id: editingRappel.id, ...formData, }); }; const handleDelete = (id: number) => { if (confirm("Êtes-vous sûr de vouloir supprimer ce rappel ?")) { deleteMutation.mutate({ id }); } }; const handleToggleActif = (id: number, actif: boolean) => { toggleActifMutation.mutate({ id, actif: !actif }); }; const handleTemplateTypeChange = (value: string) => { const template = TEMPLATE_TYPES.find(t => t.value === value); setFormData({ ...formData, templateType: value, joursAvant: template?.joursAvant || 7, nom: template?.label || "", }); }; const getTemplateName = (type: string) => { return TEMPLATE_TYPES.find(t => t.value === type)?.label || type; }; return (

Rappels automatiques

Configurez les rappels envoyés automatiquement avant les séquences

Liste des rappels configurés Les rappels actifs seront envoyés automatiquement aux apprenants inscrits Nom Type Délai Heure Statut Actions {rappels && rappels.length > 0 ? ( rappels.map((rappel) => ( {rappel.nom} {getTemplateName(rappel.templateType)} J-{rappel.joursAvant} {rappel.heureEnvoi}
)) ) : ( Aucun rappel configuré )}
{/* Dialog de création */} Créer un nouveau rappel Configurez un rappel automatique à envoyer avant les séquences

Le template d'email correspondant sera utilisé pour l'envoi

setFormData({ ...formData, nom: e.target.value })} placeholder="Ex: Rappel automatique J-7" />
setFormData({ ...formData, joursAvant: parseInt(e.target.value) || 0 }) } placeholder="Ex: 7" />

Le rappel sera envoyé ce nombre de jours avant le début de la séquence

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

L'heure à laquelle le rappel sera envoyé chaque jour

setFormData({ ...formData, actif: checked })} />
{/* Dialog de modification */} Modifier le rappel Modifiez la configuration du rappel automatique
setFormData({ ...formData, nom: e.target.value })} placeholder="Ex: Rappel automatique J-7" />
setFormData({ ...formData, joursAvant: parseInt(e.target.value) || 0 }) } placeholder="Ex: 7" />
setFormData({ ...formData, heureEnvoi: e.target.value })} />
setFormData({ ...formData, actif: checked })} />
); }