'use client'; import { Calendar, Award, UserPlus, UserMinus, Shield, Flag, AlertTriangle } from 'lucide-react'; import { useLeagueRaces } from "@/lib/hooks/league/useLeagueRaces"; export type LeagueActivity = | { type: 'race_completed'; raceId: string; raceName: string; timestamp: Date } | { type: 'race_scheduled'; raceId: string; raceName: string; timestamp: Date } | { type: 'penalty_applied'; penaltyId: string; driverName: string; reason: string; points: number; timestamp: Date } | { type: 'member_joined'; driverId: string; driverName: string; timestamp: Date } | { type: 'member_left'; driverId: string; driverName: string; timestamp: Date } | { type: 'role_changed'; driverId: string; driverName: string; oldRole: string; newRole: string; timestamp: Date }; interface LeagueActivityFeedProps { leagueId: string; limit?: number; } function timeAgo(timestamp: Date): string { const diffMs = Date.now() - timestamp.getTime(); const diffMinutes = Math.floor(diffMs / 60000); if (diffMinutes < 1) return 'Just now'; if (diffMinutes < 60) return `${diffMinutes} min ago`; const diffHours = Math.floor(diffMinutes / 60); if (diffHours < 24) return `${diffHours}h ago`; const diffDays = Math.floor(diffHours / 24); if (diffDays === 1) return 'Yesterday'; if (diffDays < 7) return `${diffDays}d ago`; return timestamp.toLocaleDateString('en-US', { month: 'short', day: 'numeric' }); } export default function LeagueActivityFeed({ leagueId, limit = 10 }: LeagueActivityFeedProps) { const { data: raceList = [], isLoading } = useLeagueRaces(leagueId); const activities: LeagueActivity[] = []; if (!isLoading && raceList.length > 0) { const completedRaces = raceList .filter((r) => r.status === 'completed') .sort((a, b) => new Date(b.scheduledAt).getTime() - new Date(a.scheduledAt).getTime()) .slice(0, 5); const upcomingRaces = raceList .filter((r) => r.status === 'scheduled') .sort((a, b) => new Date(b.scheduledAt).getTime() - new Date(a.scheduledAt).getTime()) .slice(0, 3); for (const race of completedRaces) { activities.push({ type: 'race_completed', raceId: race.id, raceName: `${race.track} - ${race.car}`, timestamp: new Date(race.scheduledAt), }); } for (const race of upcomingRaces) { activities.push({ type: 'race_scheduled', raceId: race.id, raceName: `${race.track} - ${race.car}`, timestamp: new Date(new Date(race.scheduledAt).getTime() - 7 * 24 * 60 * 60 * 1000), // Simulate schedule announcement }); } // Sort all activities by timestamp activities.sort((a, b) => b.timestamp.getTime() - a.timestamp.getTime()); activities.splice(limit); // Limit results } if (isLoading) { return (
Loading activities...
); } if (activities.length === 0) { return (
No recent activity
); } return (
{activities.map((activity, index) => ( ))}
); } function ActivityItem({ activity }: { activity: LeagueActivity }) { const getIcon = () => { switch (activity.type) { case 'race_completed': return ; case 'race_scheduled': return ; case 'penalty_applied': return ; case 'member_joined': return ; case 'member_left': return ; case 'role_changed': return ; } }; const getContent = () => { switch (activity.type) { case 'race_completed': return ( <> Race Completed · {activity.raceName} ); case 'race_scheduled': return ( <> Race Scheduled · {activity.raceName} ); case 'penalty_applied': return ( <> {activity.driverName} received a {activity.points}-point penalty · {activity.reason} ); case 'member_joined': return ( <> {activity.driverName} joined the league ); case 'member_left': return ( <> {activity.driverName} left the league ); case 'role_changed': return ( <> {activity.driverName} promoted to {activity.newRole} ); } }; return (
{getIcon()}

{getContent()}

{timeAgo(activity.timestamp)}

); }