'use client';
import { useState, useEffect } from 'react';
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 {
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';
// Static mock data for prototype
const MOCK_SPONSOR_DATA = {
sponsorId: 'demo-sponsor-1',
sponsorName: 'Acme Racing Co.',
metrics: {
totalImpressions: 127450,
impressionsChange: 12.5,
uniqueViewers: 34200,
viewersChange: 8.3,
activeSponsors: 7,
totalInvestment: 4850,
avgEngagement: 4.2,
engagementChange: 0.8,
},
sponsorships: {
leagues: [
{ id: 'l1', name: 'GT3 Masters Championship', tier: 'main', drivers: 48, impressions: 45200, status: 'active' },
{ id: 'l2', name: 'Endurance Pro Series', tier: 'secondary', drivers: 72, impressions: 38400, status: 'active' },
],
teams: [
{ id: 't1', name: 'Velocity Racing', drivers: 4, impressions: 12300, status: 'active' },
{ id: 't2', name: 'Storm Motorsport', drivers: 3, impressions: 8900, status: 'active' },
],
drivers: [
{ id: 'd1', name: 'Max Velocity', team: 'Velocity Racing', impressions: 8200, status: 'active' },
{ id: 'd2', name: 'Sarah Storm', team: 'Storm Motorsport', impressions: 6100, status: 'active' },
],
races: [
{ id: 'r1', name: 'Spa 24 Hours', league: 'Endurance Pro', impressions: 15600, date: '2025-12-20', status: 'upcoming' },
],
platform: [
{ id: 'p1', name: 'Homepage Banner', placement: 'Header', impressions: 52000, status: 'active' },
],
},
recentActivity: [
{ id: 'a1', type: 'race', message: 'GT3 Masters Championship race completed', time: '2 hours ago', impressions: 1240 },
{ id: 'a2', type: 'driver', message: 'Max Velocity finished P1 at Monza', time: '5 hours ago', impressions: 890 },
{ id: 'a3', type: 'league', message: 'New driver joined Endurance Pro Series', time: '1 day ago', impressions: null },
{ id: 'a4', type: 'team', message: 'Velocity Racing won team championship', time: '2 days ago', impressions: 2100 },
],
upcomingRenewals: [
{ id: 'ren1', name: 'GT3 Masters Championship', type: 'league', renewDate: '2026-01-15', price: 1200 },
{ id: 'ren2', name: 'Homepage Banner', type: 'platform', renewDate: '2025-12-31', price: 500 },
],
};
// Metric Card Component
function MetricCard({
title,
value,
change,
icon: Icon,
suffix = '',
prefix = '',
delay = 0,
}: {
title: string;
value: number | string;
change?: number;
icon: typeof Eye;
suffix?: string;
prefix?: string;
delay?: number;
}) {
const shouldReduceMotion = useReducedMotion();
const isPositive = change && change > 0;
const isNegative = change && change < 0;
return (
{change !== undefined && (
{isPositive ?
: isNegative ?
: null}
{Math.abs(change)}%
)}
{prefix}{typeof value === 'number' ? value.toLocaleString() : value}{suffix}
{title}
);
}
// Sponsorship Category Card
function SponsorshipCategoryCard({
icon: Icon,
title,
count,
impressions,
color,
href
}: {
icon: typeof Trophy;
title: string;
count: number;
impressions: number;
color: string;
href: string;
}) {
return (
{impressions.toLocaleString()}
impressions
);
}
// Activity Item
function ActivityItem({ activity }: { activity: typeof MOCK_SPONSOR_DATA.recentActivity[0] }) {
const typeColors = {
race: 'bg-warning-amber',
league: 'bg-primary-blue',
team: 'bg-purple-400',
driver: 'bg-performance-green',
platform: 'bg-racing-red',
};
return (
{activity.message}
{activity.time}
{activity.impressions && (
<>
•
{activity.impressions.toLocaleString()} views
>
)}
);
}
// Renewal Alert
function RenewalAlert({ renewal }: { renewal: typeof MOCK_SPONSOR_DATA.upcomingRenewals[0] }) {
const typeIcons = {
league: Trophy,
team: Users,
driver: Car,
race: Flag,
platform: Megaphone,
};
const Icon = typeIcons[renewal.type as keyof typeof typeIcons] || Trophy;
return (
{renewal.name}
Renews {renewal.renewDate}
);
}
export default function SponsorDashboardPage() {
const shouldReduceMotion = useReducedMotion();
const [timeRange, setTimeRange] = useState<'7d' | '30d' | '90d' | 'all'>('30d');
const [loading, setLoading] = useState(true);
// Simulate loading
useEffect(() => {
const timer = setTimeout(() => setLoading(false), 500);
return () => clearTimeout(timer);
}, []);
const data = MOCK_SPONSOR_DATA;
// Calculate category totals
const categoryData = {
leagues: {
count: data.sponsorships.leagues.length,
impressions: data.sponsorships.leagues.reduce((sum, l) => sum + l.impressions, 0),
},
teams: {
count: data.sponsorships.teams.length,
impressions: data.sponsorships.teams.reduce((sum, t) => sum + t.impressions, 0),
},
drivers: {
count: data.sponsorships.drivers.length,
impressions: data.sponsorships.drivers.reduce((sum, d) => sum + d.impressions, 0),
},
races: {
count: data.sponsorships.races.length,
impressions: data.sponsorships.races.reduce((sum, r) => sum + r.impressions, 0),
},
platform: {
count: data.sponsorships.platform.length,
impressions: data.sponsorships.platform.reduce((sum, p) => sum + p.impressions, 0),
},
};
if (loading) {
return (
);
}
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 */}
{/* Leagues */}
{data.sponsorships.leagues.map((league) => (
{league.tier === 'main' ? 'Main' : 'Secondary'}
{league.name}
{league.drivers} drivers
{league.impressions.toLocaleString()}
impressions
))}
{/* Teams */}
{data.sponsorships.teams.map((team) => (
Team
{team.name}
{team.drivers} drivers
{team.impressions.toLocaleString()}
impressions
))}
{/* Drivers */}
{data.sponsorships.drivers.slice(0, 2).map((driver) => (
Driver
{driver.name}
{driver.team}
{driver.impressions.toLocaleString()}
impressions
))}
{/* Upcoming Events */}
Upcoming Sponsored Events
{data.sponsorships.races.length > 0 ? (
{data.sponsorships.races.map((race) => (
{race.name}
{race.league} • {race.date}
{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.metrics.activeSponsors}
Total Investment
${data.metrics.totalInvestment.toLocaleString()}
Cost per 1K Views
${(data.metrics.totalInvestment / data.metrics.totalImpressions * 1000).toFixed(2)}
Next Invoice
Jan 1, 2026
);
}