@@ -406,7 +413,7 @@ export default function MarketingPage() {
-
+
-
-
+
+
-
+
Note: L'export générera un fichier CSV avec les emails, noms,
prénoms et autres données de contact. Utilisez ce fichier pour vos campagnes
d'emailing avec votre outil préféré (Mailchimp, SendGrid, etc.).
diff --git a/app/admin/tickets/page.tsx b/app/admin/tickets/page.tsx
index fe9a031..b5534fe 100644
--- a/app/admin/tickets/page.tsx
+++ b/app/admin/tickets/page.tsx
@@ -1,17 +1,21 @@
"use client";
import TicketManagement from "@/components/admin/TicketManagement";
+import { Ticket } from "lucide-react";
export default function AdminTicketsPage() {
return (
-
-
- Gestion des tickets
-
-
- Consultez et gérez tous les tickets du jeu-concours
-
+
+
+
+
+
+
+
Gestion des Tickets
+
Consultez et gérez tous les tickets du jeu-concours
+
+
diff --git a/app/admin/tirages/page.tsx b/app/admin/tirages/page.tsx
index 18a36bb..1dcbd9e 100644
--- a/app/admin/tirages/page.tsx
+++ b/app/admin/tirages/page.tsx
@@ -71,6 +71,7 @@ export default function TiragesPage() {
const [drawResult, setDrawResult] = useState(null);
const [existingDraw, setExistingDraw] = useState(null);
const [hasExistingDraw, setHasExistingDraw] = useState(false);
+ const [isDrawing, setIsDrawing] = useState(false);
// Critères
const [minTickets, setMinTickets] = useState(1);
@@ -136,13 +137,13 @@ export default function TiragesPage() {
return;
}
- const confirmMessage = hasExistingDraw
- ? `⚠️ ATTENTION: Un tirage a déjà été effectué!\n\nÊtes-vous ABSOLUMENT SÛR de vouloir effectuer un nouveau tirage parmi ${participants.length} participants éligibles?\n\nCeci remplacera le tirage précédent!`
- : `Êtes-vous sûr de vouloir lancer le tirage au sort parmi ${participants.length} participants éligibles?\n\nCette action est irréversible!`;
-
- if (!confirm(confirmMessage)) return;
-
setLoading(true);
+ setIsDrawing(true);
+ setDrawResult(null);
+
+ // Animation de tirage (3 secondes)
+ await new Promise(resolve => setTimeout(resolve, 3000));
+
try {
const token = localStorage.getItem('auth_token') || localStorage.getItem('token');
const response = await fetch(`${API_BASE_URL}/draw/conduct`, {
@@ -172,10 +173,13 @@ export default function TiragesPage() {
setHasExistingDraw(true);
toast.success('🎉 Tirage au sort effectué avec succès!');
await checkExistingDraw();
+ // Scroll vers le haut pour voir le résultat
+ window.scrollTo({ top: 0, behavior: 'smooth' });
} catch (error: any) {
toast.error(error.message || 'Erreur lors du tirage');
} finally {
setLoading(false);
+ setIsDrawing(false);
}
};
@@ -317,12 +321,6 @@ ${report.draw.notifiedAt ? `📧 Gagnant notifié le: ${new Date(report.draw.not
const deleteDraw = async () => {
if (!existingDraw) return;
- const confirmMessage = `⚠️ ATTENTION: Cette action est IRRÉVERSIBLE!\n\nVoulez-vous vraiment annuler ce tirage au sort?\n\nGagnant: ${existingDraw.winner_name}\nEmail: ${existingDraw.winner_email}\nPrix: ${existingDraw.prize_name}`;
-
- if (!confirm(confirmMessage)) {
- return;
- }
-
setLoading(true);
try {
const token = localStorage.getItem('auth_token') || localStorage.getItem('token');
@@ -365,76 +363,176 @@ ${report.draw.notifiedAt ? `📧 Gagnant notifié le: ${new Date(report.draw.not
return (
- {/* En-tête avec titre du prix */}
-
-
- Tirage au Sort - {prizeName}
-
-
- Prix à gagner : {prizeValue}€ •
- Participants ayant joué au moins {minTickets} ticket{minTickets > 1 ? 's' : ''}
-
-
-
- {/* Alerte si un tirage existe déjà */}
- {hasExistingDraw && existingDraw && (
-
-
-
-
-
-
-
Tirage déjà effectué
+ {/* Animation de tirage en cours */}
+ {isDrawing && (
+
+
+
+
+
+
Tirage en cours...
+
Sélection aléatoire du gagnant parmi {participants.length} participants