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 { 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 LoadingScreen from "@/components/LoadingScreen"; import { FileText, DollarSign, TrendingUp, Users, Calendar, CheckCircle, AlertCircle, BarChart3, Clock, ArrowRight, MessageSquare, Phone, } from "lucide-react"; const API_BASE = import.meta.env.VITE_API_BASE || ""; export default function ClientHub() { const navigate = useNavigate(); const { user, loading: authLoading } = useAuth(); const [activeTab, setActiveTab] = useState("overview"); const [opportunities, setOpportunities] = useState([]); const [contracts, setContracts] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { if (!authLoading && user) { loadDashboardData(); } }, [user, authLoading]); const loadDashboardData = async () => { try { setLoading(true); const token = (await (window as any).supabaseClient.auth.getSession()).data?.session?.access_token; if (!token) throw new Error("No auth token"); // Load opportunities const oppRes = await fetch(`${API_BASE}/api/nexus/client/opportunities`, { headers: { Authorization: `Bearer ${token}` }, }); if (oppRes.ok) { const data = await oppRes.json(); setOpportunities(data.opportunities || []); } // Load contracts const contractRes = await fetch(`${API_BASE}/api/nexus/client/contracts`, { headers: { Authorization: `Bearer ${token}` }, }); if (contractRes.ok) { const data = await contractRes.json(); setContracts(data.contracts || []); } } catch (error: any) { console.error("Failed to load hub data", error); } finally { setLoading(false); } }; if (authLoading || loading) { return ; } if (!user) { return (

Client Hub

Enterprise collaboration & hiring

); } const openOpportunities = opportunities.filter((o: any) => o.status === "open"); const totalSpent = contracts.reduce((sum: number, c: any) => sum + (c.total_amount || 0), 0); const activeContracts = contracts.filter((c: any) => c.status === "active"); const pendingApplications = openOpportunities.reduce((sum: number, o: any) => sum + (o.application_count || 0), 0); return (
{/* Header */}

Client Hub

Enterprise hiring & project management

{/* Quick Stats */}

Open Opportunities

{openOpportunities.length}

Applications

{pendingApplications}

Active Contracts

{activeContracts.length}

Total Spent

${totalSpent.toLocaleString('en-US', { maximumFractionDigits: 0 })}

{/* Tabs */} Overview Opportunities Contracts Support {/* Overview Tab */} {/* Account Manager Card */} Your AeThex Team
{/* Account Manager */}

Account Manager

AC

Account Manager

account@aethex.dev

{/* Solutions Architect */}

Solutions Architect

SA

Solutions Architect

architect@aethex.dev

{/* Recent Activity */}
{/* Recent Opportunities */} Recent Opportunities Latest job postings {openOpportunities.length === 0 ? (

No opportunities posted yet

) : (
{openOpportunities.slice(0, 3).map((opp: any) => (

{opp.title}

{opp.status}

{opp.application_count} applications

))}
)}
{/* Recent Contracts */} Active Contracts Your current projects {contracts.length === 0 ? (

No active contracts

) : (
{contracts.slice(0, 3).map((contract: any) => (

{contract.title}

{contract.status}

${contract.total_amount?.toLocaleString()}

))}
)}
{/* Opportunities Tab */}
Your Opportunities Job postings and projects
{opportunities.length === 0 ? (

No opportunities posted yet

) : (
{opportunities.map((opp: any) => (

{opp.title}

{opp.description?.substring(0, 100)}...

{opp.status}
${opp.budget_min?.toLocaleString()} - ${opp.budget_max?.toLocaleString()} {opp.application_count} applications
))}
)}
{/* Contracts Tab */} Contracts & Invoices Payment history and status {contracts.length === 0 ? (

No contracts yet

) : (
{contracts.map((contract: any) => (

{contract.title}

Contract Type: {contract.contract_type}

{contract.status}

Total Amount

${contract.total_amount?.toLocaleString()}

Your Cost

${(contract.total_amount - (contract.aethex_commission_amount || 0))?.toLocaleString()}

Creator Payout

${contract.creator_payout_amount?.toLocaleString()}

))}
)}
{/* Support Tab */} Support & Resources {/* Request New SOW */} Request New Scope

Need a new Statement of Work (SOW) or to modify an existing contract? Contact your account manager.

); }