import React from 'react'; import { clsx } from 'clsx'; import { Lock, Check } from 'lucide-react'; import { Card, CardContent, CardHeader, CardTitle, CardDescription } from '@/components/ui/Card'; import { Button, Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, } from '@/components/ui'; import { useSubscription } from '@/contexts/SubscriptionContext'; import { SubscriptionFeatureFlag, SUBSCRIPTION_PLANS, formatPrice } from '@/types/subscription'; import { useNavigate } from 'react-router-dom'; export interface PaywallProps { feature: SubscriptionFeatureFlag | SubscriptionFeatureFlag[]; title?: string; description?: string; children?: React.ReactNode; showUpgradeButton?: boolean; requiredPlan?: 'basic' | 'professional' | 'enterprise'; className?: string; } /** * Paywall component that blocks access to premium features */ export const Paywall = ({ feature, title, description, children, showUpgradeButton = true, requiredPlan, className, }: PaywallProps) => { const { canAccessFeature, subscription } = useSubscription(); const navigate = useNavigate(); const [showUpgradeDialog, setShowUpgradeDialog] = React.useState(false); const features = Array.isArray(feature) ? feature : [feature]; const hasAccess = features.every((f) => canAccessFeature(f)); if (hasAccess) { return <>{children}>; } const featureName = features.length === 1 ? features[0].replace(/_/g, ' ') : 'premium features'; const displayTitle = title || `Upgrade to Access ${featureName}`; const displayDescription = description || `This feature is available in our premium plans. Upgrade your subscription to unlock ${featureName}.`; // Determine minimum required plan const currentPlan = subscription?.plan || 'free'; const plans = ['free', 'basic', 'professional', 'enterprise'] as const; const currentPlanIndex = plans.indexOf(currentPlan); const nextPlan = requiredPlan || (currentPlanIndex < plans.length - 1 ? plans[currentPlanIndex + 1] : 'professional'); const handleUpgrade = () => { setShowUpgradeDialog(true); }; return ( <>
{displayDescription}
{showUpgradeButton && ( )}