Files
routstr-core/ui/components/revenue-by-model-table.tsx
T
Cursor Agentanddb2002dominic ceb843ef15 feat: Add admin logs and usage dashboards
This commit introduces new admin dashboard pages for viewing system logs and usage statistics. It includes backend API endpoints for fetching log data, usage metrics, error details, and revenue by model. The frontend has been updated with new UI components and pages to display this information. Additionally, important log messages used for analytics have been marked to prevent accidental modification.

Co-authored-by: db2002dominic <db2002dominic@gmail.com>
2025-11-22 02:18:39 +00:00

96 lines
3.3 KiB
TypeScript

'use client';
import {
Table,
TableBody,
TableCell,
TableHead,
TableHeader,
TableRow,
} from '@/components/ui/table';
import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card';
import { ModelRevenueData } from '@/lib/api/services/admin';
interface RevenueByModelTableProps {
models: ModelRevenueData[];
totalRevenue: number;
}
export function RevenueByModelTable({
models,
totalRevenue,
}: RevenueByModelTableProps) {
return (
<Card>
<CardHeader>
<CardTitle>Revenue by Model</CardTitle>
<p className='text-sm text-muted-foreground'>
Total Revenue:{' '}
{totalRevenue.toLocaleString(undefined, {
maximumFractionDigits: 2,
})}{' '}
sats
</p>
</CardHeader>
<CardContent>
<Table>
<TableHeader>
<TableRow>
<TableHead>Model</TableHead>
<TableHead className='text-right'>Requests</TableHead>
<TableHead className='text-right'>Successful</TableHead>
<TableHead className='text-right'>Failed</TableHead>
<TableHead className='text-right'>Revenue (sats)</TableHead>
<TableHead className='text-right'>Refunds (sats)</TableHead>
<TableHead className='text-right'>Net Revenue (sats)</TableHead>
<TableHead className='text-right'>Avg/Request</TableHead>
</TableRow>
</TableHeader>
<TableBody>
{models.length === 0 ? (
<TableRow>
<TableCell colSpan={8} className='text-center text-muted-foreground'>
No model data available
</TableCell>
</TableRow>
) : (
models.map((model) => (
<TableRow key={model.model}>
<TableCell className='font-medium'>{model.model}</TableCell>
<TableCell className='text-right'>{model.requests}</TableCell>
<TableCell className='text-right text-green-600'>
{model.successful}
</TableCell>
<TableCell className='text-right text-red-600'>
{model.failed}
</TableCell>
<TableCell className='text-right'>
{model.revenue_sats.toLocaleString(undefined, {
maximumFractionDigits: 2,
})}
</TableCell>
<TableCell className='text-right text-red-500'>
{model.refunds_sats.toLocaleString(undefined, {
maximumFractionDigits: 2,
})}
</TableCell>
<TableCell className='text-right font-semibold'>
{model.net_revenue_sats.toLocaleString(undefined, {
maximumFractionDigits: 2,
})}
</TableCell>
<TableCell className='text-right text-muted-foreground'>
{model.avg_revenue_per_request.toLocaleString(undefined, {
maximumFractionDigits: 3,
})}
</TableCell>
</TableRow>
))
)}
</TableBody>
</Table>
</CardContent>
</Card>
);
}