'use client';
import { useMemo } from 'react';
import { ArrowDownIcon, ArrowUpIcon, MenuIcon } from 'lucide-react';
import { Line, LineChart, ResponsiveContainer, XAxis } from 'recharts';
import { Badge } from '@kit/ui/badge';
import { Card, CardContent, CardHeader, CardTitle } from '@kit/ui/card';
import {
Table,
TableBody,
TableCell,
TableHead,
TableHeader,
TableRow,
} from '@kit/ui/table';
export default function DashboardDemo() {
const mrr = useMemo(() => generateDemoData(), []);
const visitors = useMemo(() => generateDemoData(), []);
const returningVisitors = useMemo(() => generateDemoData(), []);
const churn = useMemo(() => generateDemoData(), []);
const netRevenue = useMemo(() => generateDemoData(), []);
const fees = useMemo(() => generateDemoData(), []);
const newCustomers = useMemo(() => generateDemoData(), []);
const tickets = useMemo(() => generateDemoData(), []);
const activeUsers = useMemo(() => generateDemoData(), []);
return (
Monthly Recurring Revenue
{`$${mrr[1]}`}
20%
Revenue
{`$${netRevenue[1]}`}
12%
Fees
{`$${fees[1]}`}
9%
New Customers
{`${newCustomers[1]}`}
-25%
Visitors
{visitors[1]}
-4.3%
Returning Visitors
{returningVisitors[1]}
10%
Churn
{churn[1]}%
-10%
Support Tickets
{tickets[1]}
-30%
Active Users
{activeUsers[1]}
10%
Customers
);
}
function generateDemoData() {
const today = new Date();
const formatter = new Intl.DateTimeFormat('en-us', {
month: 'long',
year: '2-digit',
});
const data: { value: string; name: string }[] = [];
for (let n = 8; n > 0; n -= 1) {
const date = new Date(today.getFullYear(), today.getMonth() - n, 1);
data.push({
name: formatter.format(date),
value: (Math.random() * 10).toFixed(1),
});
}
return [data, data[data.length - 1].value] as [typeof data, string];
}
function Chart(
props: React.PropsWithChildren<{ data: { value: string; name: string }[] }>,
) {
return (
);
}
function CustomersTable() {
return (
Customer
Plan
MRR
Logins
Status
Pippin Oddo
Pro
$100.2
920
Healthy
Väinö Pánfilo
Basic
$40.6
300
Possible Churn
Giorgos Quinten
Pro
$2004.3
1000
Healthy
Adhelm Otis
Basic
$0
10
Churned
);
}
function BadgeWithTrend(props: React.PropsWithChildren<{ trend: string }>) {
const className = useMemo(() => {
switch (props.trend) {
case 'up':
return 'text-green-500';
case 'down':
return 'text-destructive';
case 'stale':
return 'text-orange-500';
}
}, [props.trend]);
return (
{props.children}
);
}
function Figure(props: React.PropsWithChildren) {
return {props.children}
;
}
function Trend(
props: React.PropsWithChildren<{
trend: 'up' | 'down' | 'stale';
}>,
) {
const Icon = useMemo(() => {
switch (props.trend) {
case 'up':
return ;
case 'down':
return ;
case 'stale':
return ;
}
}, [props.trend]);
return (
{Icon}
{props.children}
);
}