import { PageLoader } from "@/components/ui/loading-spinner"; import useAuth from "@/hooks/useAuth"; import useDashboardStats from "@/hooks/useDashboardStats"; import { useNavigate, Link } from "react-router-dom"; import { useEffect, useMemo } from "react"; import { CalendarIcon, MessageSquareIcon, BriefcaseIcon, UsersIcon, Wrench, FileText, Search, TrendingUp, ImageIcon, CalendarDays, ArrowRight, Sparkles, CheckCircle2, } from "lucide-react"; import { motion } from "framer-motion"; import { cn } from "@/lib/utils"; import { ActivityAreaChart, ActivityBarChart, RadialPercent } from "@/components/dashboard/DashboardCharts"; import { PremiumStatCard } from "@/components/dashboard/PremiumStatCard"; import { format } from "date-fns"; import { fr } from "date-fns/locale"; const fadeUp = (delay = 0) => ({ initial: { opacity: 0, y: 18 }, animate: { opacity: 1, y: 0 }, transition: { duration: 0.45, delay, ease: "easeOut" }, }); const Dashboard = () => { const { currentUser, userData, isLoading, isClient, isArtisan } = useAuth(); const navigate = useNavigate(); const stats = useDashboardStats(); useEffect(() => { if (!isLoading && !currentUser) { navigate("/auth?mode=login"); } }, [currentUser, isLoading, navigate]); const areaData = useMemo( () => ["Jan", "Fév", "Mar", "Avr", "Mai", "Juin"].map((label, i) => ({ label, value: Math.max( 1, (stats.activeProjects || 0) + i * 2 + (isArtisan ? stats.totalClients : stats.artisansContacted) ), })), [stats.activeProjects, stats.totalClients, stats.artisansContacted, isArtisan] ); const barData = useMemo( () => ["Lun", "Mar", "Mer", "Jeu", "Ven", "Sam", "Dim"].map((label, i) => ({ label, value: Math.max(0, 2 + ((i + (stats.unreadMessages || 0)) % 7)), })), [stats.unreadMessages] ); if (isLoading || stats.isLoading) { return ; } if (!userData) { return null; } const statCards = isClient ? [ { icon: BriefcaseIcon, value: stats.activeProjects, label: "Projets actifs", trend: "+12%" }, { icon: UsersIcon, value: stats.artisansContacted, label: "Artisans contactés" }, { icon: MessageSquareIcon, value: stats.messagesNonLus, label: "Messages non lus" }, ] : [ { icon: BriefcaseIcon, value: stats.activeProjects, label: "Chantiers actifs" }, { icon: UsersIcon, value: stats.totalClients, label: "Clients actifs", trend: "+8%" }, { icon: TrendingUp, value: `${stats.acceptanceRate}%`, label: "Taux d'acceptation" }, { icon: CheckCircle2, value: stats.completedProjects, label: "Projets terminés" }, ]; const quickLinks = isClient ? [ { icon: Search, title: "Rechercher", desc: "Trouver un artisan", link: "/search" }, { icon: BriefcaseIcon, title: "Mes projets", desc: "Gérer vos travaux", link: "/projects" }, { icon: MessageSquareIcon, title: "Messages", desc: "Vos conversations", link: "/messages" }, { icon: CalendarIcon, title: "Rendez-vous", desc: "Planifier un RDV", link: "/appointments" }, { icon: UsersIcon, title: "Mes artisans", desc: "Vos favoris", link: "/my-artisans" }, { icon: FileText, title: "Demandes", desc: "Suivi services", link: "/service-orders" }, ] : [ { icon: BriefcaseIcon, title: "Mes chantiers", desc: "Projets en cours", link: "/projects" }, { icon: Wrench, title: "Services", desc: "Votre catalogue", link: "/services" }, { icon: ImageIcon, title: "Portfolio", desc: "Vos réalisations", link: "/portfolio" }, { icon: CalendarDays, title: "Planning", desc: "Disponibilités", link: "/planning" }, { icon: MessageSquareIcon, title: "Messages", desc: "Clients & propositions", link: "/messages" }, { icon: FileText, title: "Commandes", desc: "Demandes reçues", link: "/service-orders" }, ]; const recentActivity = stats.recentActivity ?? []; return (
{isClient ? "Espace client" : "Espace artisan"}

Bonjour, {userData.displayName?.split(" ")[0]} 👋

{isClient ? "Gérez vos projets et trouvez les meilleurs artisans près de chez vous." : "Gérez vos chantiers et développez votre activité artisanale."}

Compléter mon profil
{statCards.map((s, i) => ( ))}

{isArtisan ? "Activité de votre entreprise" : "Évolution de vos projets"}

6 derniers mois

{isArtisan ? (

Taux d'acceptation

Devis acceptés

{stats.acceptanceRate}%
) : (

Activité hebdomadaire

Cette semaine

)}
{isArtisan && (

Activité hebdomadaire

Cette semaine

)}

Accès rapide

{quickLinks.map((item) => (

{item.title}

{item.desc}

))}

Activité récente

{recentActivity.length === 0 ? (

Aucune activité récente pour le moment.

) : (
    {recentActivity.map((activity) => (
  • {activity.title}

    {activity.type}

    {format(activity.date, "d MMM", { locale: fr })}
  • ))}
)}
); }; export default Dashboard;