/** * Insufficient Credits Modal * Shows when user doesn't have enough credits for an operation * Provides options to upgrade plan or buy credits */ import React from 'react'; import { Modal } from '../ui/modal'; import Button from '../ui/button/Button'; import { ZapIcon, TrendingUpIcon, CreditCardIcon } from '../../icons'; import { useNavigate } from 'react-router-dom'; interface InsufficientCreditsModalProps { isOpen: boolean; onClose: () => void; requiredCredits: number; availableCredits: number; operationType?: string; } export default function InsufficientCreditsModal({ isOpen, onClose, requiredCredits, availableCredits, operationType = 'this operation', }: InsufficientCreditsModalProps) { const navigate = useNavigate(); const shortfall = requiredCredits - availableCredits; const handleUpgradePlan = () => { onClose(); navigate('/account/billing/upgrade'); }; const handleBuyCredits = () => { onClose(); navigate('/account/billing/credits'); }; const handleViewUsage = () => { onClose(); navigate('/account/usage'); }; return (
{/* Warning Icon */}
{/* Title */}

Insufficient Credits

{/* Message */}

You don't have enough credits for {operationType}.

{/* Credit Stats */}
Required
{requiredCredits.toLocaleString()}
Available
{availableCredits.toLocaleString()}
Shortfall
{shortfall.toLocaleString()}
{/* Action Buttons */}
{/* Cancel Button */}
); } /** * Hook to manage insufficient credits modal state */ export function useInsufficientCreditsModal() { const [isOpen, setIsOpen] = React.useState(false); const [modalProps, setModalProps] = React.useState({ requiredCredits: 0, availableCredits: 0, operationType: 'this operation', }); const showInsufficientCreditsModal = (props: { requiredCredits: number; availableCredits: number; operationType?: string; }) => { setModalProps({ requiredCredits: props.requiredCredits, availableCredits: props.availableCredits, operationType: props.operationType || 'this operation', }); setIsOpen(true); }; const closeModal = () => setIsOpen(false); return { isOpen, modalProps, showInsufficientCreditsModal, closeModal, }; }