import { useState } from 'react'; import { TransportQRData } from '../../lib/transport/types'; interface QRCodeDisplayProps { qrData: TransportQRData; size?: number; showDetails?: boolean; } // Simple QR code matrix generator (basic implementation) function generateQRMatrix(data: string, size: number = 21): boolean[][] { // This is a simplified representation - in production you'd use a library like 'qrcode' const matrix: boolean[][] = Array(size) .fill(null) .map(() => Array(size).fill(false)); // Add finder patterns (corners) const addFinderPattern = (row: number, col: number) => { for (let r = 0; r < 7; r++) { for (let c = 0; c < 7; c++) { if (r === 0 || r === 6 || c === 0 || c === 6 || (r >= 2 && r <= 4 && c >= 2 && c <= 4)) { if (row + r < size && col + c < size) { matrix[row + r][col + c] = true; } } } } }; addFinderPattern(0, 0); addFinderPattern(0, size - 7); addFinderPattern(size - 7, 0); // Add some data-based pattern const hash = data.split('').reduce((acc, char) => acc + char.charCodeAt(0), 0); for (let i = 8; i < size - 8; i++) { for (let j = 8; j < size - 8; j++) { matrix[i][j] = ((i * j + hash) % 3) === 0; } } return matrix; } export default function QRCodeDisplay({ qrData, size = 200, showDetails = true }: QRCodeDisplayProps) { const [copied, setCopied] = useState(false); const [downloading, setDownloading] = useState(false); const qrString = JSON.stringify(qrData); const matrix = generateQRMatrix(qrString); const cellSize = size / matrix.length; const handleCopyLink = async () => { try { await navigator.clipboard.writeText(qrData.quickLookupUrl); setCopied(true); setTimeout(() => setCopied(false), 2000); } catch (err) { console.error('Failed to copy:', err); } }; const handleDownload = () => { setDownloading(true); // Create SVG for download const svgContent = ` `; const blob = new Blob([svgContent], { type: 'image/svg+xml' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `qr-${qrData.plantId || qrData.batchId || 'code'}.svg`; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); setDownloading(false); }; const formatDate = (dateString: string) => { return new Date(dateString).toLocaleDateString('en-US', { year: 'numeric', month: 'short', day: 'numeric', }); }; return (
Scan to verify authenticity
{qrData.blockchainAddress}