'use client'; import { useEffect, useState } from 'react'; import { useQuery } from '@tanstack/react-query'; import { motion, useReducedMotion, AnimatePresence } from 'framer-motion'; import Card from '@/components/ui/Card'; import Button from '@/components/ui/Button'; import StatusBadge from '@/components/ui/StatusBadge'; import InfoBanner from '@/components/ui/InfoBanner'; import MetricCard from '@/components/sponsors/MetricCard'; import SponsorshipCategoryCard from '@/components/sponsors/SponsorshipCategoryCard'; import ActivityItem from '@/components/sponsors/ActivityItem'; import RenewalAlert from '@/components/sponsors/RenewalAlert'; import { BarChart3, Eye, Users, Trophy, TrendingUp, Calendar, DollarSign, Target, ArrowUpRight, ArrowDownRight, ExternalLink, Loader2, Car, Flag, Megaphone, ChevronRight, Plus, Bell, Settings, CreditCard, FileText, RefreshCw } from 'lucide-react'; import Link from 'next/link'; import { useServices } from '@/lib/services/ServiceProvider'; import { SponsorDashboardViewModel } from '@/lib/view-models/SponsorDashboardViewModel'; export default function SponsorDashboardPage() { const shouldReduceMotion = useReducedMotion(); const { sponsorService, policyService } = useServices(); const [timeRange, setTimeRange] = useState<'7d' | '30d' | '90d' | 'all'>('30d'); const [loading, setLoading] = useState(true); const [data, setData] = useState(null); const [error, setError] = useState(null); const { data: policySnapshot, isLoading: policyLoading, isError: policyError, } = useQuery({ queryKey: ['policySnapshot'], queryFn: () => policyService.getSnapshot(), staleTime: 60_000, gcTime: 5 * 60_000, }); const sponsorPortalState = policySnapshot ? policyService.getCapabilityState(policySnapshot, 'sponsors.portal') : null; useEffect(() => { if (policyLoading) { return; } if (policyError || sponsorPortalState !== 'enabled') { setError( sponsorPortalState === 'coming_soon' ? 'Sponsor portal is coming soon.' : 'Sponsor portal is currently unavailable.', ); setLoading(false); return; } const loadDashboard = async () => { try { const dashboardData = await sponsorService.getSponsorDashboard('demo-sponsor-1'); if (dashboardData) { setData(dashboardData); } else { setError('Failed to load dashboard data'); } } catch (err) { console.error('Error loading dashboard:', err); setError('Failed to load dashboard data'); } finally { setLoading(false); } }; void loadDashboard(); }, [policyLoading, policyError, sponsorPortalState, sponsorService]); if (loading) { return (

Loading dashboard...

); } if (error || !data) { return (

{error || 'No dashboard data available'}

); } const categoryData = data.categoryData; if (loading) { return (

Loading dashboard...

); } return (
{/* Header */}

Sponsor Dashboard

Welcome back, {data.sponsorName}

{/* Time Range Selector */}
{(['7d', '30d', '90d', 'all'] as const).map((range) => ( ))}
{/* Quick Actions */}
{/* Key Metrics */}
{/* Sponsorship Categories */}

Your Sponsorships

{/* Main Content Grid */}
{/* Left Column - Sponsored Entities */}
{/* Top Performing Sponsorships */}

Top Performing

{/* Leagues */} {data.sponsorships.leagues.map((league) => (
{league.tier === 'main' ? 'Main' : 'Secondary'}
{league.entityName}
{league.details}
{league.formattedImpressions}
impressions
))} {/* Teams */} {data.sponsorships.teams.map((team) => (
Team
{team.entityName}
{team.details}
{team.formattedImpressions}
impressions
))} {/* Drivers */} {data.sponsorships.drivers.slice(0, 2).map((driver) => (
Driver
{driver.entityName}
{driver.details}
{driver.formattedImpressions}
impressions
))}
{/* Upcoming Events */}

Upcoming Sponsored Events

{data.sponsorships.races.length > 0 ? (
{data.sponsorships.races.map((race) => (

{race.entityName}

{race.details}

{race.status}
))}
) : (

No upcoming sponsored events

)}
{/* Right Column - Activity & Quick Actions */}
{/* Quick Actions */}

Quick Actions

{/* Renewal Alerts */} {data.upcomingRenewals.length > 0 && (

Upcoming Renewals

{data.upcomingRenewals.map((renewal) => ( ))}
)} {/* Recent Activity */}

Recent Activity

{data.recentActivity.map((activity) => ( ))}
{/* Investment Summary */}

Investment Summary

Active Sponsorships {data.activeSponsorships}
Total Investment {data.formattedTotalInvestment}
Cost per 1K Views {data.costPerThousandViews}
Next Invoice Jan 1, 2026
); }