import { useState, useEffect } from "react"; import { useNavigate } from "react-router-dom"; import Layout from "@/components/Layout"; import { Button } from "@/components/ui/button"; import { useAuth } from "@/contexts/AuthContext"; import { aethexToast } from "@/lib/aethex-toast"; import { supabase } from "@/lib/supabase"; import { Card, CardContent, CardDescription, CardHeader, CardTitle, } from "@/components/ui/card"; import { Badge } from "@/components/ui/badge"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { Input } from "@/components/ui/input"; import LoadingScreen from "@/components/LoadingScreen"; import { FileText, ArrowLeft, Search, Download, Eye, Calendar, DollarSign, CheckCircle, Clock, AlertCircle, FileSignature, History, Filter, } from "lucide-react"; const API_BASE = import.meta.env.VITE_API_BASE || ""; interface Contract { id: string; title: string; description: string; status: "draft" | "active" | "completed" | "expired" | "cancelled"; total_value: number; start_date: string; end_date: string; signed_date?: string; milestones: any[]; documents: { name: string; url: string; type: string }[]; amendments: { date: string; description: string; signed: boolean }[]; created_at: string; } export default function ClientContracts() { const navigate = useNavigate(); const { user, loading: authLoading } = useAuth(); const [contracts, setContracts] = useState([]); const [loading, setLoading] = useState(true); const [searchQuery, setSearchQuery] = useState(""); const [statusFilter, setStatusFilter] = useState("all"); const [selectedContract, setSelectedContract] = useState(null); useEffect(() => { if (!authLoading && user) { loadContracts(); } }, [user, authLoading]); const loadContracts = async () => { try { setLoading(true); const { data: { session } } = await supabase.auth.getSession(); const token = session?.access_token; if (!token) throw new Error("No auth token"); const res = await fetch(`${API_BASE}/api/corp/contracts`, { headers: { Authorization: `Bearer ${token}` }, }); if (res.ok) { const data = await res.json(); setContracts(Array.isArray(data) ? data : data.contracts || []); } } catch (error) { console.error("Failed to load contracts", error); aethexToast({ message: "Failed to load contracts", type: "error" }); } finally { setLoading(false); } }; if (authLoading || loading) { return ; } const filteredContracts = contracts.filter((c) => { const matchesSearch = c.title.toLowerCase().includes(searchQuery.toLowerCase()) || c.description?.toLowerCase().includes(searchQuery.toLowerCase()); const matchesStatus = statusFilter === "all" || c.status === statusFilter; return matchesSearch && matchesStatus; }); const getStatusColor = (status: string) => { switch (status) { case "active": return "bg-green-500/20 border-green-500/30 text-green-300"; case "completed": return "bg-blue-500/20 border-blue-500/30 text-blue-300"; case "draft": return "bg-yellow-500/20 border-yellow-500/30 text-yellow-300"; case "expired": return "bg-gray-500/20 border-gray-500/30 text-gray-300"; case "cancelled": return "bg-red-500/20 border-red-500/30 text-red-300"; default: return ""; } }; const getStatusIcon = (status: string) => { switch (status) { case "active": return ; case "completed": return ; case "draft": return ; case "expired": return ; case "cancelled": return ; default: return null; } }; const stats = { total: contracts.length, active: contracts.filter(c => c.status === "active").length, completed: contracts.filter(c => c.status === "completed").length, totalValue: contracts.reduce((acc, c) => acc + (c.total_value || 0), 0), }; return (

Contracts

Manage your service agreements

Contract management coming soon

{/* Filters */}
setSearchQuery(e.target.value)} className="pl-10 bg-slate-800/50 border-slate-700" />
All Active Completed Draft
{/* Contract List or Detail View */} {selectedContract ? (
{selectedContract.title} {selectedContract.description}
{/* Contract Overview */}

Status

{getStatusIcon(selectedContract.status)} {selectedContract.status}

Total Value

${selectedContract.total_value?.toLocaleString()}

Start Date

{new Date(selectedContract.start_date).toLocaleDateString()}

End Date

{new Date(selectedContract.end_date).toLocaleDateString()}

{/* Milestones */} {selectedContract.milestones?.length > 0 && (

Milestones

{selectedContract.milestones.map((milestone: any, idx: number) => (
{milestone.status === "completed" ? ( ) : ( )}

{milestone.title}

Due: {new Date(milestone.due_date).toLocaleDateString()}

${milestone.amount?.toLocaleString()}

{milestone.status}
))}
)} {/* Documents */}

Documents

{selectedContract.documents?.length > 0 ? ( selectedContract.documents.map((doc, idx) => (

{doc.name}

{doc.type}

)) ) : (

No documents attached

)}
{/* Amendment History */} {selectedContract.amendments?.length > 0 && (

Amendment History

{selectedContract.amendments.map((amendment, idx) => (

{amendment.description}

{new Date(amendment.date).toLocaleDateString()}

{amendment.signed ? "Signed" : "Pending"}
))}
)} {/* Actions */}
{selectedContract.status === "draft" && ( )}
) : (
{filteredContracts.length === 0 ? (

{searchQuery || statusFilter !== "all" ? "No contracts match your filters" : "No contracts yet"}

) : ( filteredContracts.map((contract) => ( setSelectedContract(contract)} >

{contract.title}

{getStatusIcon(contract.status)} {contract.status}

{contract.description}

{new Date(contract.start_date).toLocaleDateString()} - {new Date(contract.end_date).toLocaleDateString()} {contract.milestones?.filter((m: any) => m.status === "completed").length || 0} / {contract.milestones?.length || 0} milestones

${contract.total_value?.toLocaleString()}

)) )}
)}
); }