import { useState, useEffect } from 'react'; interface UserDetail { id: string; name: string; startCost: number; endCost: number; deltaCost: number; raw: { start: any; end: any; }; } interface UserDetailCardProps { periodIndex: number; apiKey: string; userId: string; } export function UserDetailCard({ periodIndex, apiKey, userId }: UserDetailCardProps) { const [userDetail, setUserDetail] = useState(null); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(''); const [showRawData, setShowRawData] = useState(false); useEffect(() => { fetchUserDetail(); }, [periodIndex]); const fetchUserDetail = async () => { setIsLoading(true); setError(''); try { const response = await fetch(`/api/periods/${periodIndex}/me`, { headers: { 'X-API-Key': apiKey, }, }); if (!response.ok) { if (response.status === 404) { throw new Error('You are not found in this period'); } throw new Error(`Failed to fetch user details: ${response.status}`); } const data = await response.json(); setUserDetail(data); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to load user details'); } finally { setIsLoading(false); } }; const formatCurrency = (amount: number) => { return new Intl.NumberFormat('en-US', { style: 'currency', currency: 'USD', minimumFractionDigits: 2, maximumFractionDigits: 2, }).format(amount); }; const formatNumber = (num: number) => { return new Intl.NumberFormat('en-US').format(num); }; const calculateDelta = (endValue: number, startValue: number) => { const delta = endValue - startValue; return Math.max(0, delta); // Negative values treated as 0 }; if (isLoading) { return (
); } if (error) { return (

Your Usage Details

{error}

); } if (!userDetail) return null; const endUsage = userDetail.raw.end?.usage?.total; const startUsage = userDetail.raw.start?.usage?.total; return (

Your Usage Details

{/* Cost Overview */}
{formatCurrency(userDetail.startCost)}
Start Cost
{formatCurrency(userDetail.endCost)}
End Cost
{formatCurrency(userDetail.deltaCost)}
Period Cost
{/* Usage Metrics */} {endUsage && (
{formatNumber(calculateDelta(endUsage.requests || 0, startUsage?.requests || 0))}
Requests
{formatNumber(calculateDelta(endUsage.tokens || 0, startUsage?.tokens || 0))}
Total Tokens
{formatNumber(calculateDelta(endUsage.inputTokens || 0, startUsage?.inputTokens || 0))}
Input Tokens
{formatNumber(calculateDelta(endUsage.outputTokens || 0, startUsage?.outputTokens || 0))}
Output Tokens
{formatNumber(calculateDelta(endUsage.cacheCreateTokens || 0, startUsage?.cacheCreateTokens || 0))}
Cache Create
{formatNumber(calculateDelta(endUsage.cacheReadTokens || 0, startUsage?.cacheReadTokens || 0))}
Cache Read
)} {/* Raw Data */} {showRawData && (

Period Start Data

{userDetail.raw.start ? (
                {JSON.stringify(userDetail.raw.start, null, 2)}
              
) : (
No Start Data Available
This likely means you had no usage before the start of this period.
)}

Period End Data

              {JSON.stringify(userDetail.raw.end, null, 2)}
            
)}
); }