"use client"; import { useState } from "react"; import { Bug, X, Send, Camera, Loader2 } from "lucide-react"; import { Button } from "@/components/ui/button"; import { toast } from "sonner"; import html2canvas from "html2canvas"; interface BugReportData { subject: string; description: string; screenshot: string; // base64 url: string; userAgent: string; timestamp: string; } export function BugReporter() { const [isOpen, setIsOpen] = useState(false); const [isSubmitting, setIsSubmitting] = useState(false); const [formData, setFormData] = useState({ subject: "", description: "", }); const [screenshot, setScreenshot] = useState(null); const [isCapturing, setIsCapturing] = useState(false); const captureScreenshot = async () => { setIsCapturing(true); try { // Fermer temporairement le modal pour la capture setIsOpen(false); // Attendre un peu pour que le modal se ferme await new Promise(resolve => setTimeout(resolve, 300)); const canvas = await html2canvas(document.body, { useCORS: true, allowTaint: true, scale: 0.5, // Réduire la qualité pour éviter des fichiers trop lourds width: window.innerWidth, height: window.innerHeight, scrollX: 0, scrollY: 0, }); const base64 = canvas.toDataURL("image/jpeg", 0.7); setScreenshot(base64); // Rouvrir le modal setIsOpen(true); toast.success("Capture d'écran prise !"); } catch (error) { console.error("Erreur lors de la capture:", error); toast.error("Erreur lors de la capture d'écran"); setIsOpen(true); } finally { setIsCapturing(false); } }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!formData.subject.trim() || !formData.description.trim()) { toast.error("Veuillez remplir tous les champs"); return; } setIsSubmitting(true); try { const reportData: BugReportData = { subject: formData.subject, description: formData.description, screenshot: screenshot || "", url: window.location.href, userAgent: navigator.userAgent, timestamp: new Date().toISOString(), }; const response = await fetch("/api/bug-report", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify(reportData), }); if (!response.ok) { throw new Error("Erreur lors de l'envoi du rapport"); } toast.success("Rapport de bug envoyé avec succès !"); setIsOpen(false); setFormData({ subject: "", description: "" }); setScreenshot(null); } catch (error) { console.error("Erreur:", error); toast.error("Erreur lors de l'envoi du rapport"); } finally { setIsSubmitting(false); } }; const openModal = () => { setIsOpen(true); // Prendre automatiquement une capture dès l'ouverture setTimeout(() => captureScreenshot(), 100); }; return ( <> {/* Bouton flottant */} {/* Modal */} {isOpen && (
{/* Header */}

Signaler un problème

Aidez-nous à améliorer l'application

{/* Content */}
{/* Sujet */}
setFormData(prev => ({ ...prev, subject: e.target.value }))} className="w-full px-3 py-2 border rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-blue-500" placeholder="Ex: Erreur lors du chargement des contrats" maxLength={100} />
{/* Description */}