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 (
);
}