import { useEffect, useRef, useState } from 'react'; import QRCode from 'qrcode'; import { BaseModal } from './base/BaseModal'; import { Button } from './ui/button'; import { Copy, Check, Share2 } from 'lucide-react'; interface ShareModalProps { isOpen: boolean; onClose: () => void; campaignTitle: string; depositUrl: string; } export default function ShareModal({ isOpen, onClose, campaignTitle, depositUrl }: ShareModalProps) { const canvasRef = useRef(null); const [copied, setCopied] = useState(false); const [qrCodeError, setQrCodeError] = useState(null); const [qrCodeLoading, setQrCodeLoading] = useState(false); const [qrCodeDataUrl, setQrCodeDataUrl] = useState(null); useEffect(() => { if (isOpen && depositUrl) { setQrCodeLoading(true); setQrCodeError(null); setQrCodeDataUrl(null); // Essayer d'abord de générer en tant que Data URL QRCode.toDataURL(depositUrl, { width: 300, margin: 2, color: { dark: '#000000', light: '#FFFFFF' }, errorCorrectionLevel: 'M' }).then((dataUrl) => { console.log('QR code généré avec succès (DataURL) pour:', depositUrl); setQrCodeDataUrl(dataUrl); setQrCodeLoading(false); }).catch((err) => { console.error('Erreur lors de la génération du QR code (DataURL):', err); // Fallback: essayer avec le canvas if (canvasRef.current) { const canvas = canvasRef.current; const ctx = canvas.getContext('2d'); if (ctx) { ctx.clearRect(0, 0, canvas.width, canvas.height); } QRCode.toCanvas(canvas, depositUrl, { width: 300, margin: 2, color: { dark: '#000000', light: '#FFFFFF' }, errorCorrectionLevel: 'M' }).then(() => { console.log('QR code généré avec succès (Canvas) pour:', depositUrl); setQrCodeLoading(false); }).catch((canvasErr) => { console.error('Erreur lors de la génération du QR code (Canvas):', canvasErr); setQrCodeError('Erreur lors de la génération du QR code'); setQrCodeLoading(false); }); } else { setQrCodeError('Erreur lors de la génération du QR code'); setQrCodeLoading(false); } }); } }, [isOpen, depositUrl]); const handleCopyLink = async () => { try { await navigator.clipboard.writeText(depositUrl); setCopied(true); setTimeout(() => setCopied(false), 2000); } catch (err) { console.error('Erreur lors de la copie:', err); } }; const retryQrCode = () => { if (depositUrl) { setQrCodeLoading(true); setQrCodeError(null); setQrCodeDataUrl(null); QRCode.toDataURL(depositUrl, { width: 300, margin: 2, color: { dark: '#000000', light: '#FFFFFF' }, errorCorrectionLevel: 'M' }).then((dataUrl) => { setQrCodeDataUrl(dataUrl); setQrCodeLoading(false); }).catch((err) => { console.error('Erreur lors de la génération du QR code:', err); setQrCodeError('Erreur lors de la génération du QR code'); setQrCodeLoading(false); }); } }; return ( Partager le lien de dépôt } description={`Pour partager le lien de dépôt public de propositions pour la campagne "${campaignTitle}"`} maxWidth="sm:max-w-[600px]" maxHeight="max-h-[90vh]" >
{/* Lien de dépôt */}

Lien de dépôt public

{depositUrl}
{/* QR Code */}

QR Code

{qrCodeLoading && (
Génération du QR code...
)} {qrCodeError && (
{qrCodeError}
)} {qrCodeDataUrl && !qrCodeLoading && !qrCodeError && ( QR Code pour le lien de dépôt )}

Scannez ce QR code pour accéder directement au formulaire de dépôt

{/* Instructions */}

Comment partager ?

  • • Copiez le lien ci-dessus pour le partager par email, SMS ou message
  • • Imprimez ou affichez le QR code pour un accès rapide
  • • Partagez l'image du QR code sur les réseaux sociaux
); }