import React from 'react'; import { useParams, useNavigate, Link } from 'react-router-dom'; import { useAuth } from '../../context/AuthContext'; import { useMockStore } from '../../data/mockStore'; import { scopedProjectForSub } from '../../data/selectors'; import { ArrowLeft, MapPin, CalendarDays, CheckSquare, DollarSign, ChevronRight, Flag, Wallet, Lock } from 'lucide-react'; // --- helpers --- const fmtUSD = (n) => Number(n || 0).toLocaleString('en-US', { style: 'currency', currency: 'USD', maximumFractionDigits: 0 }); const statusTone = (s) => { if (!s) return 'bg-zinc-100 text-zinc-500 dark:bg-white/10 dark:text-zinc-400'; const lower = s.toLowerCase().replace(/[ _]/g, ''); if (lower === 'completed' || lower === 'complete' || lower === 'done') return 'bg-emerald-100 text-emerald-700 dark:bg-emerald-500/15 dark:text-emerald-400'; if (lower === 'inprogress' || lower === 'active') return 'bg-blue-100 text-blue-700 dark:bg-blue-500/15 dark:text-blue-400'; if (lower === 'onhold' || lower === 'pending') return 'bg-amber-100 text-amber-700 dark:bg-amber-500/15 dark:text-amber-400'; if (lower === 'cancelled' || lower === 'canceled') return 'bg-zinc-100 text-zinc-500 dark:bg-white/10 dark:text-zinc-400'; return 'bg-zinc-100 text-zinc-600 dark:bg-white/10 dark:text-zinc-300'; }; // --- main component --- const SubcontractorProjectDetailPage = () => { const { projectId } = useParams(); const navigate = useNavigate(); const { user } = useAuth(); const { projects, subcontractorTasks } = useMockStore(); const project = projects.find((p) => p.id === projectId); const scoped = scopedProjectForSub(project, user?.id, subcontractorTasks); // Access guard const hasAccess = scoped && !( scoped.myTasks.length === 0 && !(project?.subcontractorIds || []).includes(user?.id) ); if (!hasAccess) { return (
This project either doesn't exist or you haven't been assigned to it.
{scoped.customerName}
)}No milestones on record.
) : ( scoped.milestones.map((m) => ({m.name}
{m.dueDate && (Due: {m.dueDate}
)}No tasks assigned to you on this project.
) : ( scoped.myTasks.map((t) => ( )) )}{value}