import { useRef } from 'react'; import { calculateQuote } from '../utils/quoteCalculator'; export default function QuoteSummary({ pricing, selections, onBack, onNew }) { const quoteRef = useRef(null); const quote = calculateQuote(pricing, selections); const operator = selections.operator && typeof selections.operator === 'object' ? selections.operator : pricing.operators.find((o) => o.id === selections.operator); const handleDownloadPDF = async () => { const html2canvas = (await import('html2canvas')).default; const { jsPDF } = await import('jspdf'); const element = quoteRef.current; if (!element) return; const canvas = await html2canvas(element, { scale: 2, backgroundColor: '#ffffff', logging: false, }); const imgData = canvas.toDataURL('image/png'); const pdf = new jsPDF('p', 'mm', 'a4'); const margin = 14; const pageWidth = pdf.internal.pageSize.getWidth(); const pageHeight = pdf.internal.pageSize.getHeight(); const imgWidth = pageWidth - 2 * margin; const imgHeight = (canvas.height * imgWidth) / canvas.width; let heightLeft = imgHeight; let position = margin; pdf.addImage(imgData, 'PNG', margin, position, imgWidth, imgHeight); heightLeft -= pageHeight - margin; while (heightLeft > 0) { position -= pageHeight - margin; pdf.addPage(); pdf.addImage(imgData, 'PNG', margin, position, imgWidth, imgHeight); heightLeft -= pageHeight - margin; } const modelName = operator?.tiltModel || operator?.model || 'Quote'; pdf.save('Gate_Quote_' + modelName + '.pdf'); }; return (

Quote Summary

Review your selection and itemized cost estimate

Gate Operator Quote

Quotation Date: {new Date().toLocaleDateString('en-CA')}

{pricing.currency.symbol} {quote.total.toLocaleString(pricing.currency.locale, { minimumFractionDigits: 2, maximumFractionDigits: 2, })}
Estimated Total
{operator && (
{operator.imageFile && !operator.tiltModel && ( {operator.name} { e.target.style.display = 'none'; }} /> )}
Selected Operator
{operator.tiltName || operator.name}
Model: {operator.tiltModel || operator.model}
{operator.tiltDescription && (
{operator.tiltDescription}
)}
)} {quote.items.length > 0 ? ( {quote.items.map((item, i) => ( ))}
Item Qty Unit Price Total
{item.name}
{item.category}
{item.qty} {pricing.currency.symbol} {item.unitPrice.toLocaleString(pricing.currency.locale, { minimumFractionDigits: 2, maximumFractionDigits: 2, })} {pricing.currency.symbol} {item.lineTotal.toLocaleString(pricing.currency.locale, { minimumFractionDigits: 2, maximumFractionDigits: 2, })}
) : (
No items selected. Please go back and make your selections.
)}
Total Cost {pricing.currency.symbol} {quote.subtotal.toLocaleString(pricing.currency.locale, { minimumFractionDigits: 2, maximumFractionDigits: 2, })}

This is a preliminary cost estimate. Final pricing may vary based on site-specific requirements.

Generated by Gate Operator Quotation System — {new Date().toLocaleDateString('en-CA')}

); }