diff --git a/app/admin/messages/page.tsx b/app/admin/messages/page.tsx new file mode 100644 index 0000000..012c1a6 --- /dev/null +++ b/app/admin/messages/page.tsx @@ -0,0 +1,24 @@ +export default async function MessagesPage() { + const res = await fetch("http://localhost:1337/api/messages"); + const { data } = await res.json(); + + return ( +
+

📬 Messages reçus

+ {data.length === 0 ? ( +

Aucun message reçu.

+ ) : ( + + )} +
+ ); + } + \ No newline at end of file diff --git a/app/components/ContactForm.tsx b/app/components/ContactForm.tsx new file mode 100644 index 0000000..a768349 --- /dev/null +++ b/app/components/ContactForm.tsx @@ -0,0 +1,102 @@ +"use client"; + +import { useState } from "react"; +import { sendMessage } from "../utils/sendMessage"; + +export default function ContactForm() { + const [name, setName] = useState(""); + const [email, setEmail] = useState(""); + const [message, setMessage] = useState(""); + const [status, setStatus] = useState(""); + const [isSuccess, setIsSuccess] = useState(null); + const [isLoading, setIsLoading] = useState(false); // ✅ Nouvel état pour désactiver le bouton + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + + if (!name.trim() || !email.trim() || !message.trim()) { + setStatus("❌ Tous les champs sont obligatoires."); + setIsSuccess(false); + return; + } + + if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) { + setStatus("❌ Email invalide."); + setIsSuccess(false); + return; + } + + setStatus("⏳ Envoi en cours..."); + setIsSuccess(null); + setIsLoading(true); // ✅ Désactive le bouton pendant l'envoi + + try { + await sendMessage(name, email, message); + setStatus("✅ Message envoyé avec succès !"); + setIsSuccess(true); + setName(""); + setEmail(""); + setMessage(""); + } catch (error) { + setStatus("❌ Erreur lors de l'envoi du message."); + setIsSuccess(false); + } finally { + setIsLoading(false); // ✅ Réactive le bouton après l'envoi + } + }; + + return ( +
+

đź“© Contactez-moi

+ + setName(e.target.value)} + className="w-full p-3 border border-gray-300 rounded mb-3 focus:outline-none focus:ring-2 focus:ring-blue-400" + required + /> + + setEmail(e.target.value)} + className="w-full p-3 border border-gray-300 rounded mb-3 focus:outline-none focus:ring-2 focus:ring-blue-400" + required + /> + +