'use client'; import { useEffect, useRef, useCallback, useState } from 'react'; import { Download, Copy, Share2, RotateCcw, Check, Link2, Image as ImageIcon, } from 'lucide-react'; import type { QRCustomization, ContentType } from '../lib/types'; import { renderQRToCanvas, generateSVG, generateShareUrl } from '../lib/qr-renderer'; interface QRPreviewProps { content: string; customization: QRCustomization; contentType: ContentType; onReset: () => void; } export default function QRPreview({ content, customization, contentType, onReset, }: QRPreviewProps) { const canvasRef = useRef(null); const [copied, setCopied] = useState(null); const [isRendering, setIsRendering] = useState(false); // Render QR code to canvas useEffect(() => { const canvas = canvasRef.current; if (!canvas) return; const timeout = setTimeout(async () => { setIsRendering(true); await renderQRToCanvas(canvas, content, customization); setIsRendering(false); }, 100); return () => clearTimeout(timeout); }, [content, customization]); const showCopied = useCallback((type: string) => { setCopied(type); setTimeout(() => setCopied(null), 2000); }, []); const downloadPNG = useCallback(() => { const canvas = canvasRef.current; if (!canvas || !content) return; const link = document.createElement('a'); link.download = `qrcode-${Date.now()}.png`; link.href = canvas.toDataURL('image/png'); link.click(); }, [content]); const downloadSVG = useCallback(() => { if (!content) return; const svg = generateSVG(content, customization); const blob = new Blob([svg], { type: 'image/svg+xml' }); const url = URL.createObjectURL(blob); const link = document.createElement('a'); link.download = `qrcode-${Date.now()}.svg`; link.href = url; link.click(); URL.revokeObjectURL(url); }, [content, customization]); const copyImage = useCallback(async () => { const canvas = canvasRef.current; if (!canvas || !content) return; try { const blob = await new Promise((resolve) => canvas.toBlob((b) => resolve(b!), 'image/png') ); await navigator.clipboard.write([ new ClipboardItem({ 'image/png': blob }), ]); showCopied('image'); } catch { // Fallback: copy data URL const dataUrl = canvas.toDataURL('image/png'); await navigator.clipboard.writeText(dataUrl); showCopied('image'); } }, [content, showCopied]); const copyUrl = useCallback(async () => { if (!content) return; const url = generateShareUrl(contentType, content, customization); await navigator.clipboard.writeText(url); showCopied('url'); }, [content, contentType, customization, showCopied]); const copyDataUrl = useCallback(async () => { const canvas = canvasRef.current; if (!canvas || !content) return; const dataUrl = canvas.toDataURL('image/png'); await navigator.clipboard.writeText(dataUrl); showCopied('dataurl'); }, [content, showCopied]); const shareQR = useCallback(async () => { if (!content) return; const url = generateShareUrl(contentType, content, customization); if (navigator.share) { try { const canvas = canvasRef.current; if (canvas) { const blob = await new Promise((resolve) => canvas.toBlob((b) => resolve(b!), 'image/png') ); const file = new File([blob], 'qrcode.png', { type: 'image/png' }); await navigator.share({ title: 'QR Code', text: 'Voici mon QR Code', url, files: [file], }); return; } } catch { // try without file } try { await navigator.share({ title: 'QR Code', text: 'Voici mon QR Code', url, }); return; } catch { // fallback } } await navigator.clipboard.writeText(url); showCopied('share'); }, [content, contentType, customization, showCopied]); const hasContent = !!content; return (
{/* Preview area */}
{!hasContent && (

Entrez du contenu pour générer un QR Code

)}
{/* Action buttons */}
); }