import { useState, useEffect } from 'react'; import PageMeta from '../../components/common/PageMeta'; import { useToast } from '../../components/ui/toast/ToastContainer'; import { fetchCreditBalance, CreditBalance } from '../../services/api'; import { Card } from '../../components/ui/card'; import Badge from '../../components/ui/badge/Badge'; // Credit costs per operation (Phase 0: Credit-only system) const CREDIT_COSTS: Record = { clustering: { cost: 10, description: 'Per clustering request' }, idea_generation: { cost: 15, description: 'Per cluster → ideas request' }, content_generation: { cost: '1 per 100 words', description: 'Per 100 words generated' }, image_prompt_extraction: { cost: 2, description: 'Per content piece' }, image_generation: { cost: 5, description: 'Per image generated' }, linking: { cost: 8, description: 'Per content piece' }, optimization: { cost: '1 per 200 words', description: 'Per 200 words optimized' }, site_structure_generation: { cost: 50, description: 'Per site blueprint' }, site_page_generation: { cost: 20, description: 'Per page generated' }, }; export default function Credits() { const toast = useToast(); const [balance, setBalance] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { loadBalance(); }, []); const loadBalance = async () => { try { setLoading(true); const data = await fetchCreditBalance(); setBalance(data); } catch (error: any) { toast.error(`Failed to load credit balance: ${error.message}`); } finally { setLoading(false); } }; if (loading) { return (
Loading...
); } return (

Credit Balance

Manage your AI credits and usage

{balance && (

Current Balance

{(balance.credits ?? 0).toLocaleString()}

Available credits

Monthly Allocation

{(balance.plan_credits_per_month ?? 0).toLocaleString()}

Credits per month

Used This Month

{(balance.credits_used_this_month ?? 0).toLocaleString()}

Credits consumed

Remaining

{(balance.credits_remaining ?? 0).toLocaleString()}

Credits remaining

)} {/* Credit Costs Reference */}

Credit Costs per Operation

Understanding how credits are consumed for each operation type

{Object.entries(CREDIT_COSTS).map(([operation, info]) => (
{operation.replace(/_/g, ' ')}
{info.description}
{typeof info.cost === 'number' ? `${info.cost} credits` : info.cost}
))}
); }