"use client"; import { motion } from "framer-motion"; import { HardDrive, FileText, Share2, Folder, Star, Trash2, Layers, type LucideIcon } from "lucide-react"; import { formatFileSize } from "@/lib/utils"; import { STORAGE_QUOTA_BYTES } from "@/lib/prefs"; interface StatsData { fileCount: number; folderCount: number; shareCount: number; storageUsed: number; favoriteCount?: number; trashCount?: number; versionCount?: number; } interface StatsCardsProps { stats: StatsData; } interface CardDef { key: keyof StatsData; label: string; icon: LucideIcon; format: (v: number) => string; tone: string; sub?: (s: StatsData) => string | undefined; } const cards: CardDef[] = [ { key: "storageUsed", label: "Stockage utilisé", icon: HardDrive, format: (v) => formatFileSize(v), tone: "text-blue-600 bg-blue-500/10 dark:text-blue-300", sub: (s) => `${Math.min(100, (s.storageUsed / STORAGE_QUOTA_BYTES) * 100).toFixed(1)} % de ${formatFileSize(STORAGE_QUOTA_BYTES)}`, }, { key: "fileCount", label: "Fichiers", icon: FileText, format: (v) => (v ?? 0).toLocaleString("fr-CA"), tone: "text-emerald-600 bg-emerald-500/10 dark:text-emerald-300", sub: (s) => (typeof s.versionCount === "number" ? `${s.versionCount.toLocaleString("fr-CA")} versions` : undefined) }, { key: "folderCount", label: "Dossiers", icon: Folder, format: (v) => (v ?? 0).toLocaleString("fr-CA"), tone: "text-amber-600 bg-amber-500/10 dark:text-amber-300" }, { key: "shareCount", label: "Liens actifs", icon: Share2, format: (v) => (v ?? 0).toLocaleString("fr-CA"), tone: "text-purple-600 bg-purple-500/10 dark:text-purple-300" }, { key: "favoriteCount", label: "Favoris", icon: Star, format: (v) => (v ?? 0).toLocaleString("fr-CA"), tone: "text-amber-600 bg-amber-500/10 dark:text-amber-300" }, { key: "trashCount", label: "Corbeille", icon: Trash2, format: (v) => (v ?? 0).toLocaleString("fr-CA"), tone: "text-rose-600 bg-rose-500/10 dark:text-rose-300" }, ]; export default function StatsCards({ stats }: StatsCardsProps) { const visible = cards.filter((c) => typeof stats[c.key] === "number"); return (
{visible.map((card, i) => { const value = stats[card.key] as number; const sub = card.sub?.(stats); const Icon = card.icon; return (

{card.format(value)}

{card.label}

{sub && (

{card.key === "fileCount" && } {sub}

)}
); })}
); }