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 = ` ${matrix .map((row, i) => row .map((cell, j) => cell ? `` : '' ) .join('') ) .join('')} `; 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 (
{/* Header */}

Traceability QR Code

Scan to verify authenticity

{/* QR Code */}
{matrix.map((row, i) => row.map((cell, j) => cell ? ( ) : null ) )}
{/* Action buttons */}
{/* Details */} {showDetails && (
{qrData.plantId && (
Plant ID {qrData.plantId.slice(0, 12)}...
)} {qrData.batchId && (
Batch ID {qrData.batchId.slice(0, 12)}...
)}
Last Event {qrData.lastEventType.replace(/_/g, ' ')}
Last Updated {formatDate(qrData.lastEventTimestamp)}
Current Custodian {qrData.currentCustodian}
Verification Code {qrData.verificationCode}
)} {/* Blockchain info */}
🔗 Blockchain Verified

{qrData.blockchainAddress}

); }