import { CalendarCheck, Link2, Sparkles, Images, TrendingUp, TrendingDown } from "lucide-react"; import { useQuery } from "@tanstack/react-query"; import { Link } from "wouter"; import { cn } from "@/lib/utils"; interface StatsResponse { scheduledPosts: number; scheduledPostsChange?: string; scheduledPostsTrending?: "up" | "down"; connectedPages: number; aiTextsGenerated: number; aiTextsChange?: string; aiTextsTrending?: "up" | "down"; mediaStored: number; } export default function StatsCards() { const { data: stats, isLoading } = useQuery({ queryKey: ["/api/stats"], }); const statCards = [ { icon: CalendarCheck, tone: "bg-primary/10 text-primary", value: stats?.scheduledPosts ?? 0, label: "Publications planifiées", change: stats?.scheduledPostsChange, trending: stats?.scheduledPostsTrending, changeLabel: "vs mois dernier", href: "/calendar", }, { icon: Link2, tone: "bg-info/10 text-info", value: stats?.connectedPages ?? 0, label: "Comptes connectés", info: "Facebook · Instagram · TikTok", href: "/pages", }, { icon: Sparkles, tone: "bg-brand-accent/15 text-brand-accent", value: stats?.aiTextsGenerated ?? 0, label: "Textes générés par l'IA", change: stats?.aiTextsChange, trending: stats?.aiTextsTrending, changeLabel: "vs hier", }, { icon: Images, tone: "bg-success/10 text-success", value: stats?.mediaStored ?? 0, label: "Médias stockés", info: "Images · Vidéos", href: "/media", }, ]; if (isLoading) { return (
{[1, 2, 3, 4].map((i) => (
))}
); } return (
{statCards.map((stat, index) => { const Icon = stat.icon; const TrendIcon = stat.trending === "up" ? TrendingUp : TrendingDown; const body = ( <>

{stat.value}

{stat.label}

{stat.change ? (
{stat.change} {stat.changeLabel}
) : stat.info ? (

{stat.info}

) : null} ); const cls = "block rounded-xl border bg-card p-4 shadow-soft sm:p-5"; return stat.href ? ( {body} ) : (
{body}
); })}
); }