import React from 'react'; import { clsx } from 'clsx'; import { AlertTriangle, TrendingUp } from 'lucide-react'; import { Alert, Button } from '@/components/ui'; import { useSubscription } from '@/contexts/SubscriptionContext'; import { useNavigate } from 'react-router-dom'; export interface LimitWarningProps { limitType: 'organizations' | 'users' | 'storage' | 'apiCalls'; current: number; threshold?: number; // Percentage (0-100) at which to show warning showUpgradeButton?: boolean; className?: string; } /** * Component that shows a warning when approaching subscription limits */ export const LimitWarning = ({ limitType, current, threshold = 80, showUpgradeButton = true, className, }: LimitWarningProps) => { const { subscription, getRemainingLimit, isWithinLimits } = useSubscription(); const navigate = useNavigate(); if (!subscription) return null; const limit = subscription.limits[limitType]; if (limit === undefined || limit === -1) return null; // Unlimited const remaining = getRemainingLimit(limitType, current); const percentage = (current / limit) * 100; const isNearLimit = percentage >= threshold; const isAtLimit = !isWithinLimits(limitType, current); if (!isNearLimit && !isAtLimit) return null; const limitLabels = { organizations: 'organizations', users: 'team members', storage: 'storage', apiCalls: 'API calls', }; const label = limitLabels[limitType]; if (isAtLimit) { return ( Limit Reached You've reached your {label} limit ({limit}). Upgrade your plan to continue. {showUpgradeButton && ( navigate('/billing')}> Upgrade Plan )} ); } return ( Approaching Limit You're using {current} of {limit} {label} ({Math.round(percentage)}%). {remaining}{' '} remaining. {showUpgradeButton && ( navigate('/billing')}> Upgrade )} ); };
You've reached your {label} limit ({limit}). Upgrade your plan to continue.
You're using {current} of {limit} {label} ({Math.round(percentage)}%). {remaining}{' '} remaining.