import React, { useMemo, useState } from "react"; import { useTranslation } from 'react-i18next'; import { Check, Package as PackageIcon, Loader2 } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { useCheckoutWizard } from "../WizardContext"; import type { CheckoutPackage } from "../types"; const currencyFormatter = new Intl.NumberFormat("de-DE", { style: "currency", currency: "EUR", minimumFractionDigits: 2, }); function PackageSummary({ pkg }: { pkg: CheckoutPackage }) { const isFree = pkg.price === 0; return ( {pkg.name} {pkg.description}
{pkg.price === 0 ? "Kostenlos" : currencyFormatter.format(pkg.price)} {pkg.type === "reseller" ? "Reseller" : "Endkunde"}
{Array.isArray(pkg.features) && pkg.features.length > 0 && ( )}
); } function PackageOption({ pkg, isActive, onSelect }: { pkg: CheckoutPackage; isActive: boolean; onSelect: () => void }) { const isFree = pkg.price === 0; return ( ); } export const PackageStep: React.FC = () => { const { t } = useTranslation('marketing'); const { selectedPackage, packageOptions, setSelectedPackage, resetPaymentState, nextStep } = useCheckoutWizard(); const [isLoading, setIsLoading] = useState(false); // Early return if no package is selected if (!selectedPackage) { return (

{t('checkout.package_step.no_package_selected')}

); } const comparablePackages = useMemo(() => { // Filter by type and sort: free packages first, then by price ascending return packageOptions .filter((pkg: CheckoutPackage) => pkg.type === selectedPackage.type) .sort((a: CheckoutPackage, b: CheckoutPackage) => { // Free packages first if (a.price === 0 && b.price > 0) return -1; if (a.price > 0 && b.price === 0) return 1; // Then sort by price ascending return a.price - b.price; }); }, [packageOptions, selectedPackage]); const handlePackageChange = (pkg: CheckoutPackage) => { if (pkg.id === selectedPackage.id) { return; } setSelectedPackage(pkg); resetPaymentState(); }; const handleNextStep = async () => { setIsLoading(true); // Kleine Verzögerung für bessere UX setTimeout(() => { nextStep(); setIsLoading(false); }, 300); }; return (
); };