import React from 'react'; import { CreditCard, ShoppingBag, ArrowRight, Loader2, AlertCircle } from 'lucide-react'; import { useNavigate } from 'react-router-dom'; import { TenantWelcomeLayout, WelcomeStepCard, OnboardingCTAList, useOnboardingProgress, } from '..'; import { Alert, AlertDescription, AlertTitle } from '@/components/ui/alert'; import { Button } from '@/components/ui/button'; import { ADMIN_BILLING_PATH, ADMIN_WELCOME_SUMMARY_PATH } from '../../constants'; import { useTenantPackages } from '../hooks/useTenantPackages'; import { Package } from '../../api'; export default function WelcomePackagesPage() { const navigate = useNavigate(); const { markStep } = useOnboardingProgress(); const packagesState = useTenantPackages(); React.useEffect(() => { if (packagesState.status === 'success') { markStep({ packageSelected: Boolean(packagesState.activePackage), lastStep: 'packages', selectedPackage: packagesState.activePackage ? { id: packagesState.activePackage.package_id, name: packagesState.activePackage.package_name, priceText: packagesState.activePackage.price ? new Intl.NumberFormat('de-DE', { style: 'currency', currency: packagesState.activePackage.currency ?? 'EUR', minimumFractionDigits: 0, }).format(packagesState.activePackage.price) : null, isSubscription: false, } : null, }); } }, [packagesState, markStep]); const handleSelectPackage = React.useCallback( (pkg: Package) => { const priceText = typeof pkg.price === 'number' ? new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR', minimumFractionDigits: 0, }).format(pkg.price) : 'Auf Anfrage'; markStep({ packageSelected: true, lastStep: package-, selectedPackage: { id: pkg.id, name: pkg.name, priceText, isSubscription: Boolean(pkg.features?.subscription), }, }); navigate(ADMIN_WELCOME_SUMMARY_PATH, { state: { packageId: pkg.id } }); }, [markStep, navigate] ); return ( {packagesState.status === 'loading' && (
Pakete werden geladen …
)} {packagesState.status === 'error' && ( Fehler beim Laden {packagesState.message} )} {packagesState.status === 'success' && (
{packagesState.catalog.map((pkg) => { const isActive = packagesState.activePackage?.package_id === pkg.id; const purchased = packagesState.purchasedPackages.find((tenantPkg) => tenantPkg.package_id === pkg.id); const featureLabels = Object.entries(pkg.features ?? {}) .filter(([, enabled]) => Boolean(enabled)) .map(([key]) => key.replace(/_/g, ' ')); const isSubscription = Boolean(pkg.features?.subscription); const priceText = typeof pkg.price === 'number' ? new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR', minimumFractionDigits: 0, }).format(pkg.price) : 'Auf Anfrage'; return (

{isSubscription ? 'Abo' : 'Credit-Paket'}

{pkg.name}

{priceText}

{pkg.max_photos ? Bis zu Fotos inklusive – perfekt für lebendige Reportagen. : 'Sofort einsatzbereit für dein nächstes Event.'}

{pkg.max_guests && ( {${pkg.max_guests} Gäste} )} {pkg.gallery_days && ( {${pkg.gallery_days} Tage Galerie} )} {featureLabels.map((feature) => ( {feature} ))} {isActive && ( Aktives Paket )}
{purchased && (

Bereits gekauft am{' '} {purchased.purchased_at ? new Date(purchased.purchased_at).toLocaleDateString('de-DE') : 'unbekanntem Datum'}

)}
); })}
)}
navigate(ADMIN_WELCOME_SUMMARY_PATH), icon: ArrowRight, }, ]} />
); }