import React, { useState } from 'react'; import { useNavigate } from 'react-router-dom'; import { useAuth } from '../../context/AuthContext'; import { useMockStore } from '../../data/mockStore'; import { StatCard } from '../../components/StatCard'; import { SpotlightCard } from '../../components/SpotlightCard'; import { Hammer, CheckSquare, Clock, AlertTriangle, Calendar, DollarSign, PauseCircle } from 'lucide-react'; import ProjectDetailsModal from '../../components/contractor/ProjectDetailsModal'; import FinancialSummaryModal from '../../components/contractor/FinancialSummaryModal'; import TaskDetailsModal from '../../components/contractor/TaskDetailsModal'; const ContractorDashboard = () => { const { user } = useAuth(); const { projects } = useMockStore(); // 1. Identify current contractor const myProjects = projects.filter(p => p.contractorId === user?.id || p.contractorId === 'con_001'); // 2. Aggregate Data const activeProjects = myProjects.filter(p => p.status === 'active').length; const onHoldProjects = myProjects.filter(p => p.status === 'on_hold').length; const completedProjects = myProjects.filter(p => p.status === 'completed').length; // Calculate total budget managed const totalBudget = myProjects.reduce((sum, p) => sum + (p.budget || 0), 0); const totalSpent = myProjects.reduce((sum, p) => sum + (p.spent || 0), 0); const budgetUtilization = totalBudget > 0 ? Math.round((totalSpent / totalBudget) * 100) : 0; // Pending invoice amounts const pendingInvoiceAmount = myProjects.reduce((sum, p) => sum + (p.invoices || []).filter(i => i.status === 'pending').reduce((s, i) => s + i.amount, 0), 0 ); // Upcoming Milestones (next 14 days from context date) const upcomingMilestones = myProjects.flatMap(p => (p.milestones || []).filter(m => { const dueDate = new Date(m.dueDate); const today = new Date('2026-02-18'); // Current context date const diffDays = (dueDate - today) / (1000 * 60 * 60 * 24); return diffDays >= -3 && diffDays <= 14 && m.status !== 'completed'; }).map(m => ({ ...m, projectAddress: p.address, projectId: p.id })) ).sort((a, b) => new Date(a.dueDate) - new Date(b.dueDate)); const navigate = useNavigate(); // Modal state const [selectedProject, setSelectedProject] = useState(null); const [isProjectModalOpen, setIsProjectModalOpen] = useState(false); const [isFinancialModalOpen, setIsFinancialModalOpen] = useState(false); const [selectedTask, setSelectedTask] = useState(null); const [isTaskModalOpen, setIsTaskModalOpen] = useState(false); // Financial data for modal const financialData = { total: totalBudget, spent: totalSpent, remaining: totalBudget - totalSpent, paid: totalSpent, pending: pendingInvoiceAmount, items: myProjects.map(p => ({ date: p.startDate, description: p.address, project: p.projectType, status: p.status === 'completed' ? 'paid' : 'pending', amount: p.budget })) }; const handleProjectClick = (project) => { setSelectedProject(project); setIsProjectModalOpen(true); }; const handleTaskClick = (task) => { setSelectedTask(task); setIsTaskModalOpen(true); }; return (
Managing {activeProjects} active builds with ${totalBudget.toLocaleString()} in volume.
{proj.projectType} • Started {new Date(proj.startDate).toLocaleDateString()}
{ms.projectAddress}
Due: {ms.dueDate}
{ms.status.replace('_', ' ')}No critical tasks due.
)}