diff --git a/src/components/OffsetOrder.tsx b/src/components/OffsetOrder.tsx index 2d8005e..30b6111 100644 --- a/src/components/OffsetOrder.tsx +++ b/src/components/OffsetOrder.tsx @@ -1,5 +1,5 @@ import React, { useState, useEffect } from 'react'; -import { Check, AlertCircle, ArrowLeft, Loader2, Globe2, TreePine, Waves, Factory, Wind } from 'lucide-react'; +import { Check, AlertCircle, ArrowLeft, Loader2, Globe2, TreePine, Waves, Factory, Wind, X } from 'lucide-react'; import { createOffsetOrder, getPortfolios } from '../api/wrenClient'; import type { CurrencyCode, OffsetOrder as OffsetOrderType, Portfolio, OffsetProject } from '../types'; import { currencies, formatCurrency, getCurrencyByCode } from '../utils/currencies'; @@ -54,6 +54,9 @@ export function OffsetOrder({ tons, monetaryAmount, onBack, calculatorType }: Pr company: '', message: `I would like to offset ${tons.toFixed(2)} tons of CO2 from my yacht's ${calculatorType} emissions.` }); + + // lightbox state + const [selectedProject, setSelectedProject] = useState(null); useEffect(() => { if (!config.wrenApiKey) { @@ -64,6 +67,19 @@ export function OffsetOrder({ tons, monetaryAmount, onBack, calculatorType }: Pr fetchPortfolio(); }, []); +// handle Escape key to close lightbox +useEffect(() => { + const onKey = (e: KeyboardEvent) => { + if (e.key === 'Escape') setSelectedProject(null); + }; + if (selectedProject) { + document.addEventListener('keydown', onKey); + } + return () => { + document.removeEventListener('keydown', onKey); + }; +}, [selectedProject]); + const fetchPortfolio = async () => { try { const allPortfolios = await getPortfolios(); @@ -308,7 +324,11 @@ export function OffsetOrder({ tons, monetaryAmount, onBack, calculatorType }: Pr {portfolio.projects && portfolio.projects.length > 0 && (
{portfolio.projects.map((project) => ( -
+
setSelectedProject(project)} + className="cursor-pointer bg-gray-50 rounded-lg p-4 hover:shadow-md transition-shadow" +>
@@ -345,6 +365,46 @@ export function OffsetOrder({ tons, monetaryAmount, onBack, calculatorType }: Pr
)} + {/* lightbox modal */} + {selectedProject && ( +
setSelectedProject(null)} + > +
e.stopPropagation()} + > + +

+ {selectedProject.name} +

+ {selectedProject.imageUrl && ( + {selectedProject.name} + )} +

+ {selectedProject.description} +

+
+ Type: + {selectedProject.type} +
+
+ Price per ton: + ${selectedProject.pricePerTon.toFixed(2)} +
+
+
+ )}
Portfolio Price per Ton: