import React, { useState } from 'react'; import { Order, FeeStructure, PromoCode, DEFAULT_FEE_STRUCTURE } from '../../types/business'; import { Card, CardHeader, CardBody, CardFooter } from '../ui/Card'; import { Button } from '../ui/Button'; import { Input } from '../ui/Input'; import { Badge } from '../ui/Badge'; import { Alert } from '../ui/Alert'; export interface OrderSummaryProps { order: Order; feeStructure?: FeeStructure; onPromoCodeApply?: (code: string) => Promise<{ success: boolean; promoCode?: PromoCode; error?: string }>; onPromoCodeRemove?: () => void; layout?: 'compact' | 'detailed'; showPromoCode?: boolean; className?: string; } const OrderSummary: React.FC = ({ order, feeStructure = DEFAULT_FEE_STRUCTURE, onPromoCodeApply, onPromoCodeRemove, layout = 'detailed', showPromoCode = true, className = '' }) => { const [promoCodeInput, setPromoCodeInput] = useState(''); const [isApplyingPromo, setIsApplyingPromo] = useState(false); const [promoError, setPromoError] = useState(null); const [showFeeBreakdown, setShowFeeBreakdown] = useState(false); // Format currency helper const formatCurrency = (amountInCents: number) => { return new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD' }).format(amountInCents / 100); }; // Handle promo code application const handleApplyPromo = async () => { if (!promoCodeInput.trim() || !onPromoCodeApply) return; setIsApplyingPromo(true); setPromoError(null); try { const result = await onPromoCodeApply(promoCodeInput.trim().toUpperCase()); if (result.success) { setPromoCodeInput(''); } else { setPromoError(result.error || 'Invalid promo code'); } } catch (error) { setPromoError('Failed to apply promo code. Please try again.'); } finally { setIsApplyingPromo(false); } }; // Handle promo code removal const handleRemovePromo = () => { onPromoCodeRemove?.(); setPromoError(null); }; // Fee breakdown calculation is handled by FeeBreakdown component if (layout === 'compact') { return ( {/* Order Items Summary */}
{order.items.map((item, index) => (
{item.quantity}x {item.ticketTypeName} {formatCurrency(item.subtotal)}
))}
{/* Promo Code */} {order.promoCode && (
Promo: {order.promoCode} -{formatCurrency(order.discount || 0)}
)} {/* Total */}
Total {formatCurrency(order.total)}
{/* Fee Breakdown Toggle */} {showFeeBreakdown && (
Subtotal {formatCurrency(order.subtotal)}
Platform fee {formatCurrency(order.platformFee)}
Processing fee {formatCurrency(order.processingFee)}
Tax {formatCurrency(order.tax)}
)}
); } return (

Order Summary

{/* Order Items */}
{order.items.map((item, index) => (
{item.ticketTypeName}
{formatCurrency(item.price)} × {item.quantity}
{formatCurrency(item.subtotal)}
))}
{/* Subtotal */}
Subtotal {formatCurrency(order.subtotal)}
{/* Promo Code Section */} {showPromoCode && (
{order.promoCode ? (
PROMO {order.promoCode}
-{formatCurrency(order.discount || 0)}
) : (
setPromoCodeInput(e.target.value.toUpperCase())} className="flex-1" onKeyDown={(e) => e.key === 'Enter' && handleApplyPromo()} />
{promoError && ( {promoError} )}
)}
)} {/* Fee Breakdown */}
{formatCurrency(order.platformFee + order.processingFee + order.tax)}
{showFeeBreakdown && (
Platform fee
{formatCurrency(order.platformFee)}
Processing fee
{formatCurrency(order.processingFee)}
Tax
{formatCurrency(order.tax)}
)}
Total {formatCurrency(order.total)}
); }; export default OrderSummary;