'use client'; import { useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import Link from 'next/link'; import Card from '@/components/ui/Card'; import Button from '@/components/ui/Button'; import { Megaphone, Trophy, Users, Eye, Calendar, ExternalLink, Plus, ChevronRight, Check, Clock, XCircle } from 'lucide-react'; interface Sponsorship { id: string; leagueId: string; leagueName: string; tier: 'main' | 'secondary'; status: 'active' | 'pending' | 'expired'; startDate: Date; endDate: Date; price: number; impressions: number; drivers: number; } interface SponsorshipDetailApi { id: string; leagueId: string; leagueName: string; seasonId: string; seasonName: string; seasonStartDate?: string; seasonEndDate?: string; tier: 'main' | 'secondary'; status: string; pricing: { amount: number; currency: string; }; metrics: { drivers: number; races: number; completedRaces: number; impressions: number; }; createdAt: string; activatedAt?: string; } interface SponsorSponsorshipsResponse { sponsorId: string; sponsorName: string; sponsorships: SponsorshipDetailApi[]; summary: { totalSponsorships: number; activeSponsorships: number; totalInvestment: number; totalPlatformFees: number; currency: string; }; } function mapSponsorshipStatus(status: string): 'active' | 'pending' | 'expired' { switch (status) { case 'active': return 'active'; case 'pending': return 'pending'; default: return 'expired'; } } function mapApiToSponsorships(response: SponsorSponsorshipsResponse): Sponsorship[] { return response.sponsorships.map((s) => { const start = s.seasonStartDate ? new Date(s.seasonStartDate) : new Date(s.createdAt); const end = s.seasonEndDate ? new Date(s.seasonEndDate) : start; return { id: s.id, leagueId: s.leagueId, leagueName: s.leagueName, tier: s.tier, status: mapSponsorshipStatus(s.status), startDate: start, endDate: end, price: s.pricing.amount, impressions: s.metrics.impressions, drivers: s.metrics.drivers, }; }); } function SponsorshipCard({ sponsorship }: { sponsorship: Sponsorship }) { const router = useRouter(); const statusConfig = { active: { icon: Check, color: 'text-performance-green', bg: 'bg-performance-green/10', label: 'Active' }, pending: { icon: Clock, color: 'text-warning-amber', bg: 'bg-warning-amber/10', label: 'Pending' }, expired: { icon: XCircle, color: 'text-gray-400', bg: 'bg-gray-400/10', label: 'Expired' }, }; const tierConfig = { main: { color: 'text-primary-blue', bg: 'bg-primary-blue/10', border: 'border-primary-blue/30', label: 'Main Sponsor' }, secondary: { color: 'text-purple-400', bg: 'bg-purple-400/10', border: 'border-purple-400/30', label: 'Secondary' }, }; const status = statusConfig[sponsorship.status]; const tier = tierConfig[sponsorship.tier]; const StatusIcon = status.icon; return (
{tier.label}
{status.label}

{sponsorship.leagueName}

Impressions
{sponsorship.impressions.toLocaleString()}
Drivers
{sponsorship.drivers}
Period
{sponsorship.startDate.toLocaleDateString('en-US', { month: 'short', year: 'numeric' })} - {sponsorship.endDate.toLocaleDateString('en-US', { month: 'short', year: 'numeric' })}
Investment
${sponsorship.price}
{Math.ceil((sponsorship.endDate.getTime() - Date.now()) / (1000 * 60 * 60 * 24))} days remaining
); } export default function SponsorCampaignsPage() { const router = useRouter(); const [filter, setFilter] = useState<'all' | 'active' | 'pending' | 'expired'>('all'); const [sponsorships, setSponsorships] = useState([]); const [loading, setLoading] = useState(true); useEffect(() => { let isMounted = true; async function fetchSponsorships() { try { const response = await fetch('/api/sponsors/sponsorships'); if (!response.ok) { if (!isMounted) return; setSponsorships([]); return; } const json: SponsorSponsorshipsResponse = await response.json(); if (!isMounted) return; setSponsorships(mapApiToSponsorships(json)); } catch { if (!isMounted) return; setSponsorships([]); } finally { if (isMounted) { setLoading(false); } } } fetchSponsorships(); return () => { isMounted = false; }; }, []); const filteredSponsorships = filter === 'all' ? sponsorships : sponsorships.filter(s => s.status === filter); const stats = { total: sponsorships.length, active: sponsorships.filter(s => s.status === 'active').length, pending: sponsorships.filter(s => s.status === 'pending').length, totalInvestment: sponsorships.reduce((sum, s) => sum + s.price, 0), }; if (loading) { return (

Loading sponsorships…

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

My Sponsorships

Manage your league sponsorships

{/* Stats */}
{stats.total}
Total Sponsorships
{stats.active}
Active
{stats.pending}
Pending
${stats.totalInvestment.toLocaleString()}
Total Investment
{/* Filters */}
{(['all', 'active', 'pending', 'expired'] as const).map((f) => ( ))}
{/* Sponsorship List */} {filteredSponsorships.length === 0 ? (

No sponsorships found

Start sponsoring leagues to grow your brand visibility

) : (
{filteredSponsorships.map((sponsorship) => ( ))}
)} {/* Alpha Notice */}

Alpha Note: Sponsorship data shown here is demonstration-only. Real sponsorship management will be available when the system is fully implemented.

); }