import React, { useState, useEffect } from 'react'; import { Link } from 'react-router-dom'; import { useAuth } from '../context/AuthContext'; import { getUserUsage, redeemCode, Q, quotaToDollar } from '../api'; import SpotlightCard from '../components/bits/SpotlightCard'; import CountUp from '../components/bits/CountUp'; import ShinyText from '../components/bits/ShinyText'; import toast from 'react-hot-toast'; export default function Dashboard() { const { user, refreshUser } = useAuth(); const [usage, setUsage] = useState(null); const [redeemInput, setRedeemInput] = useState(''); const [redeeming, setRedeeming] = useState(false); const loadUsage = async () => { try { const r = await getUserUsage(); if (r.data.success) setUsage(r.data.data); } catch (e) { /* interceptor */ } }; useEffect(() => { loadUsage(); }, []); const handleRedeem = async (e) => { e.preventDefault(); if (!redeemInput.trim()) return; setRedeeming(true); try { const res = await redeemCode(redeemInput.trim()); if (res.data.success) { toast.success('Code redeemed successfully!'); setRedeemInput(''); // Refresh both usage AND user data to update balance await Promise.all([loadUsage(), refreshUser()]); } } catch (err) { /* interceptor */ } setRedeeming(false); }; // Use usage data (fresh from API) for balance/used — NOT stale user object const quota = usage?.quota ?? user?.quota ?? 0; const usedQuota = usage?.used_quota ?? user?.used_quota ?? 0; const requestCount = usage?.request_count ?? user?.request_count ?? 0; const balanceDollars = quota / Q; return (
{/* Welcome */}

Welcome,

Manage your API usage, keys, and account

{/* Stats Cards */}

Balance

$

{quota.toLocaleString()} quota units

Used

$

{usedQuota.toLocaleString()} quota units

Total Requests

{/* Quick Actions */}
{/* Redeem Code */}

Redeem Code

setRedeemInput(e.target.value)} className="input flex-1" placeholder="Enter redemption code" />
{/* Quick Links */}

Quick Links

API Keys

Manage your keys

Packages

View plans

Pricing

Model prices

API Docs

Coming soon

); }