import { ActivityFeedItem } from '@/components/feed/ActivityFeedItem'; import { useLeagueRaces } from "@/hooks/league/useLeagueRaces"; import { LeagueActivityService } from '@/lib/services/league/LeagueActivityService'; import { RelativeTimeDisplay } from '@/lib/display-objects/RelativeTimeDisplay'; import { Icon } from '@/ui/Icon'; import { Text } from '@/ui/Text'; import { Stack } from '@/ui/Stack'; import { AlertTriangle, Calendar, Flag, Shield, UserMinus, UserPlus } from 'lucide-react'; import { useMemo } from 'react'; 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; } export function LeagueActivityFeed({ leagueId, limit = 10 }: LeagueActivityFeedProps) { const { data: raceList = [], isLoading } = useLeagueRaces(leagueId); const activities = useMemo(() => { if (isLoading || !Array.isArray(raceList) || raceList.length === 0) return []; const service = new LeagueActivityService(); const result = service.processLeagueActivities(raceList, limit); return result.isOk() ? result.unwrap() : []; }, [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 ( ); }