import React, { useMemo } from 'react'; import { Calendar, UserPlus, UserMinus, Shield, Flag, AlertTriangle } from 'lucide-react'; import { useLeagueRaces } from "@/hooks/league/useLeagueRaces"; import { ActivityFeedItem } from '@/ui/ActivityFeedItem'; import { Icon } from '@/ui/Icon'; import { Text } from '@/ui/Text'; import { Stack } from '@/ui/Stack'; import { processLeagueActivities } from '@/lib/services/league/LeagueActivityService'; 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 function LeagueActivityFeed({ leagueId, limit = 10 }: LeagueActivityFeedProps) { const { data: raceList = [], isLoading } = useLeagueRaces(leagueId); const activities = useMemo(() => { if (isLoading || raceList.length === 0) return []; return processLeagueActivities(raceList, limit); }, [raceList, isLoading, limit]); 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 ( ); }