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

@@ -4,11 +4,12 @@ import { useState, useRef, useEffect } from 'react';
import Link from 'next/link';
import Image from 'next/image';
import { Star } from 'lucide-react';
import type { DriverDTO } from '@core/racing/application/dto/DriverDTO';
import type { LeagueDriverSeasonStatsDTO } from '@core/racing/application/dto/LeagueDriverSeasonStatsDTO';
import type { LeagueMembership, MembershipRole } from '@/lib/leagueMembership';
import { getLeagueRoleDisplay } from '@/lib/leagueRoles';
import type { DriverDTO } from '@/lib/types/generated/DriverDTO';
import type { LeagueMembership } from '@/lib/types/LeagueMembership';
import type { MembershipRoleDTO } from '@/lib/types/generated/MembershipRoleDTO';
import { LeagueRoleDisplay } from '@/lib/display-objects/LeagueRoleDisplay';
import CountryFlag from '@/components/ui/CountryFlag';
import { useServices } from '@/lib/services/ServiceProvider';
// Position background colors
const getPositionBgColor = (position: number): string => {
@@ -21,14 +22,25 @@ const getPositionBgColor = (position: number): string => {
};
interface StandingsTableProps {
standings: LeagueDriverSeasonStatsDTO[];
standings: Array<{
leagueId: string;
driverId: string;
position: number;
totalPoints: number;
racesFinished: number;
racesStarted: number;
avgFinish: number | null;
penaltyPoints: number;
bonusPoints: number;
teamName?: string;
}>;
drivers: DriverDTO[];
leagueId: string;
memberships?: LeagueMembership[];
currentDriverId?: string;
isAdmin?: boolean;
onRemoveMember?: (driverId: string) => void;
onUpdateRole?: (driverId: string, role: MembershipRole) => void;
onUpdateRole?: (driverId: string, role: MembershipRoleDTO['value']) => void;
}
export default function StandingsTable({
@@ -41,6 +53,7 @@ export default function StandingsTable({
onRemoveMember,
onUpdateRole
}: StandingsTableProps) {
const { mediaService } = useServices();
const [hoveredRow, setHoveredRow] = useState<string | null>(null);
const [activeMenu, setActiveMenu] = useState<{ driverId: string; type: 'member' | 'points' } | null>(null);
const menuRef = useRef<HTMLDivElement>(null);
@@ -78,12 +91,14 @@ export default function StandingsTable({
return driverId === currentDriverId;
};
type MembershipRole = MembershipRoleDTO['value'];
const handleRoleChange = (driverId: string, newRole: MembershipRole) => {
if (!onUpdateRole) return;
const membership = getMembership(driverId);
if (!membership) return;
const confirmationMessages: Record<MembershipRole, string> = {
const confirmationMessages: Record<string, string> = {
owner: 'Cannot promote to owner',
admin: 'Promote this member to Admin? They will have full management permissions.',
steward: 'Assign Steward role? They will be able to manage protests and penalties.',
@@ -96,7 +111,7 @@ export default function StandingsTable({
}
if (newRole !== membership.role && confirm(confirmationMessages[newRole])) {
onUpdateRole(driverId, newRole);
onUpdateRole(driverId, newRole as MembershipRoleDTO['value']);
setActiveMenu(null);
}
};
@@ -266,9 +281,10 @@ export default function StandingsTable({
{standings.map((row) => {
const driver = getDriver(row.driverId);
const membership = getMembership(row.driverId);
const roleDisplay = membership ? getLeagueRoleDisplay(membership.role) : null;
const roleDisplay = membership ? LeagueRoleDisplay.getLeagueRoleDisplay(membership.role) : null;
const canModify = canModifyMember(row.driverId);
const driverStatsData = getDriverStats(row.driverId);
// TODO: Hook up real driver stats once API provides it
const driverStatsData: null = null;
const isRowHovered = hoveredRow === row.driverId;
const isMemberMenuOpen = activeMenu?.driverId === row.driverId && activeMenu?.type === 'member';
const isPointsMenuOpen = activeMenu?.driverId === row.driverId && activeMenu?.type === 'points';
@@ -307,7 +323,7 @@ export default function StandingsTable({
<div className="w-10 h-10 rounded-full bg-primary-blue/20 overflow-hidden flex items-center justify-center shrink-0">
{driver && (
<Image
src={getImageService().getDriverAvatar(driver.id)}
src={mediaService.getDriverAvatar(driver.id)}
alt={driver.name}
width={40}
height={40}
@@ -344,12 +360,7 @@ export default function StandingsTable({
)}
</div>
<div className="text-xs flex items-center gap-1">
{driverStatsData && (
<span className="inline-flex items-center gap-1 text-amber-300">
<Star className="h-3 w-3" />
<span className="tabular-nums font-medium">{driverStatsData.rating}</span>
</span>
)}
{/* Rating intentionally omitted until API provides driver stats */}
</div>
</div>
@@ -435,4 +446,4 @@ export default function StandingsTable({
`}</style>
</div>
);
}
}