import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Badge } from "@/components/ui/badge"; import { ArrowUpRight, Calendar, DollarSign, Users, Clock, } from "lucide-react"; import useDashboardStats from "@/hooks/useDashboardStats"; import { formatDistanceToNow } from "date-fns"; import { fr } from "date-fns/locale"; import { useEffect, useState } from "react"; import { getArtisanApplications } from "@/services/projectService"; import { collection, query, where, orderBy, getDocs } from "firebase/firestore"; import { db } from "@/lib/firebase"; import useAuth from "@/hooks/useAuth"; export default function ArtisanStats() { const { totalQuotes, acceptanceRate, totalProjects, completedProjects, totalAppointments, pendingAppointments, totalRevenue, pendingRevenue, recentActivity, isLoading } = useDashboardStats(); const { userData, currentUser } = useAuth(); const [recentQuotes, setRecentQuotes] = useState([]); const [recentAppointments, setRecentAppointments] = useState([]); const [recentPayments, setRecentPayments] = useState([]); const [loadingTabs, setLoadingTabs] = useState(true); const [errorTabs, setErrorTabs] = useState(null); // Calculs pour l'affichage const acceptedQuotes = Math.round(totalQuotes * (acceptanceRate / 100)); const pendingQuotes = totalQuotes - acceptedQuotes - 2; // Supposons 2 rejetés const rejectedQuotes = 2; const inProgressProjects = totalProjects - completedProjects; const completedAppointments = totalAppointments - pendingAppointments; useEffect(() => { async function fetchTabData() { if (!currentUser) return; setLoadingTabs(true); setErrorTabs(null); try { // 1. Devis récents const quotes = await getArtisanApplications(currentUser.uid); setRecentQuotes(quotes.slice(0, 5)); // 2. Rendez-vous à venir (sans orderBy pour éviter l'index) const appointmentsQuery = query( collection(db, "appointments"), where("artisanId", "==", currentUser.uid), where("status", "in", ["pending", "confirmed"]) ); const appointmentsSnap = await getDocs(appointmentsQuery); const appointments = []; appointmentsSnap.forEach(doc => { const data = doc.data(); appointments.push({ id: doc.id, ...data }); }); // Tri côté client par startTime croissant appointments.sort((a, b) => { const dateA = a.startTime?.toDate?.() || new Date(a.startTime); const dateB = b.startTime?.toDate?.() || new Date(b.startTime); return dateA - dateB; }); setRecentAppointments(appointments.slice(0, 5)); // 3. Revenus récents (sans orderBy pour éviter l'index) const paymentsQuery = query( collection(db, "payments"), where("artisanId", "==", currentUser.uid) ); const paymentsSnap = await getDocs(paymentsQuery); const payments = []; paymentsSnap.forEach(doc => { const data = doc.data(); payments.push({ id: doc.id, ...data }); }); // Tri côté client par createdAt décroissant payments.sort((a, b) => { const dateA = a.createdAt?.toDate?.() || new Date(a.createdAt); const dateB = b.createdAt?.toDate?.() || new Date(b.createdAt); return dateB - dateA; }); setRecentPayments(payments.slice(0, 5)); } catch (err) { setErrorTabs("Erreur lors du chargement des données. Veuillez réessayer ou vérifier votre connexion."); } finally { setLoadingTabs(false); } } fetchTabData(); }, [currentUser]); if (isLoading) { return
Chargement des statistiques...
; } return (

Statistiques

Devis
{totalQuotes}

{pendingQuotes} en attente

{acceptedQuotes} acceptés {rejectedQuotes} refusés
Projets
{totalProjects}

{inProgressProjects} en cours

{completedProjects} terminés
Rendez-vous
{totalAppointments}

{pendingAppointments} à venir

{completedAppointments} terminés
Revenus
{totalRevenue.toLocaleString('fr-FR')} €

{pendingRevenue.toLocaleString('fr-FR')} € en attente

{(pendingRevenue + totalRevenue).toLocaleString('fr-FR')} € potentiels
Vue d'ensemble Devis Rendez-vous Revenus Activité récente {recentActivity && recentActivity.length > 0 ? (
{recentActivity.map((activity, index) => (

{activity.title}

{formatDistanceToNow(activity.date, { addSuffix: true, locale: fr })}

))}
) : (

Aucune activité récente à afficher.

)}
Devis récents {loadingTabs ? (

Chargement...

) : errorTabs ? (

{errorTabs}

) : recentQuotes.length === 0 ? (

Aucun devis récent à afficher.

) : (
    {recentQuotes.map((quote) => (
  • Projet : {quote.projectId}
    Statut : {quote.status}
    {quote.createdAt?.toLocaleString?.('fr-FR') || ''}
  • ))}
)}
Rendez-vous à venir {loadingTabs ? (

Chargement...

) : errorTabs ? (

{errorTabs}

) : recentAppointments.length === 0 ? (

Aucun rendez-vous à venir à afficher.

) : (
    {recentAppointments.map((appt) => (
  • Client : {appt.clientName || appt.clientId}
    Date : {appt.startTime?.toDate?.().toLocaleString?.('fr-FR') || ''}
    Statut : {appt.status}
  • ))}
)}
Revenus récents {loadingTabs ? (

Chargement...

) : errorTabs ? (

{errorTabs}

) : recentPayments.length === 0 ? (

Aucun revenu récent à afficher.

) : (
    {recentPayments.map((pay) => (
  • Montant : {pay.amount} €
    Statut : {pay.status}
    {pay.createdAt?.toDate?.().toLocaleString?.('fr-FR') || ''}
  • ))}
)}
); }