website cleanup

This commit is contained in:
2025-12-24 21:44:58 +01:00
parent 9b683a59d3
commit d78854a4c6
277 changed files with 6141 additions and 2693 deletions

View File

@@ -1,10 +1,9 @@
'use client';
import { Calendar, Award, UserPlus, UserMinus, Shield, Flag, AlertTriangle } from 'lucide-react';
import { Race, Penalty } from '@core/racing';
import type { LeagueMembership } from '@core/racing/domain/entities/LeagueMembership';
import { useEffect, useState } from 'react';
import type { Driver } from '@core/racing';
import { useServices } from '@/lib/services/ServiceProvider';
import type { RaceListItemViewModel } from '@/lib/view-models/RaceListItemViewModel';
export type LeagueActivity =
| { type: 'race_completed'; raceId: string; raceName: string; timestamp: Date }
@@ -33,65 +32,42 @@ function timeAgo(timestamp: Date): string {
}
export default function LeagueActivityFeed({ leagueId, limit = 10 }: LeagueActivityFeedProps) {
const { raceService, driverService } = useServices();
const [activities, setActivities] = useState<LeagueActivity[]>([]);
const [loading, setLoading] = useState(true);
useEffect(() => {
async function loadActivities() {
try {
const raceRepo = getRaceRepository();
const penaltyRepo = getPenaltyRepository();
const driverRepo = getDriverRepository();
const raceList = await raceService.findByLeagueId(leagueId);
const races = await raceRepo.findByLeagueId(leagueId);
const drivers = await driverRepo.findAll();
const driversMap = new Map(drivers.map(d => [d.id, d]));
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);
const activityList: LeagueActivity[] = [];
// Add completed races
const completedRaces = races.filter(r => r.status === 'completed')
.sort((a, b) => b.scheduledAt.getTime() - a.scheduledAt.getTime())
.slice(0, 5);
for (const race of completedRaces) {
activityList.push({
type: 'race_completed',
raceId: race.id,
raceName: `${race.track} - ${race.car}`,
timestamp: race.scheduledAt,
timestamp: new Date(race.scheduledAt),
});
// Add penalties from this race
const racePenalties = await penaltyRepo.findByRaceId(race.id);
const appliedPenalties = racePenalties.filter(p => p.status === 'applied' && p.type === 'points_deduction');
for (const penalty of appliedPenalties) {
const driver = driversMap.get(penalty.driverId);
if (driver && penalty.value) {
activityList.push({
type: 'penalty_applied',
penaltyId: penalty.id,
driverName: driver.name,
reason: penalty.reason,
points: penalty.value,
timestamp: penalty.appliedAt || penalty.issuedAt,
});
}
}
}
// Add scheduled races
const upcomingRaces = races.filter(r => r.status === 'scheduled')
.sort((a, b) => b.scheduledAt.getTime() - a.scheduledAt.getTime())
.slice(0, 3);
for (const race of upcomingRaces) {
activityList.push({
type: 'race_scheduled',
raceId: race.id,
raceName: `${race.track} - ${race.car}`,
timestamp: new Date(race.scheduledAt.getTime() - 7 * 24 * 60 * 60 * 1000), // Simulate schedule announcement
timestamp: new Date(new Date(race.scheduledAt).getTime() - 7 * 24 * 60 * 60 * 1000), // Simulate schedule announcement
});
}
@@ -107,7 +83,7 @@ export default function LeagueActivityFeed({ leagueId, limit = 10 }: LeagueActiv
}
loadActivities();
}, [leagueId, limit]);
}, [leagueId, limit, raceService, driverService]);
if (loading) {
return (
@@ -217,4 +193,4 @@ function ActivityItem({ activity }: { activity: LeagueActivity }) {
</div>
</div>
);
}
}