import React, { useEffect, useState } from 'react';
import { AuthProvider, AuthGuard, useAuth } from './AdminAuth';
import AdminLayout from './AdminLayout';
import { BarChart, Bar, LineChart, Line, XAxis, YAxis, Tooltip, ResponsiveContainer } from 'recharts';
interface Stats {
total_sneakers: number;
total_products: number;
active_feeds: number;
clicks_today: number;
revenue_month: number;
last_sync_at: string | null;
}
function StatCard({ label, value, icon, sub }: { label: string; value: string | number; icon: string; sub?: string }) {
return (
{label}
{icon}
{value}
{sub &&
{sub}
}
);
}
function DashboardContent() {
const { token } = useAuth();
const [stats, setStats] = useState(null);
const [timeseries, setTimeseries] = useState([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
const headers = { Authorization: `Bearer ${token}` };
Promise.all([
fetch('/api/admin/stats', { headers }).then(r => r.json()),
fetch('/api/admin/analytics?type=timeseries&days=30', { headers }).then(r => r.json()),
]).then(([s, ts]) => {
setStats(s);
setTimeseries(ts.data || []);
}).catch(() => {}).finally(() => setLoading(false));
}, [token]);
if (loading) {
return (
Laden...
);
}
const formatSync = (iso: string | null) => {
if (!iso) return 'Nooit';
const d = new Date(iso);
const mins = Math.floor((Date.now() - d.getTime()) / 60000);
if (mins < 1) return 'Zojuist';
if (mins < 60) return `${mins} min geleden`;
if (mins < 1440) return `${Math.floor(mins / 60)} uur geleden`;
return `${Math.floor(mins / 1440)} dagen geleden`;
};
return (
{timeseries.length === 0 ? (
📊
Nog geen analytics data
Data verschijnt hier zodra er clicks en conversies binnenkomen
) : (
Clicks (30 dagen)
v.slice(5)} />
Revenue (30 dagen)
v.slice(5)} />
)}
);
}
export default function Dashboard() {
return (
);
}