This commit is contained in:
2025-12-04 17:07:59 +01:00
parent 60a3c82cd9
commit 88c6befc7c
33 changed files with 602 additions and 261 deletions

View File

@@ -0,0 +1 @@
export { default } from '../leagues/ScheduleRaceForm';

View File

@@ -1,13 +1,13 @@
'use client';
import { DriverDTO } from '@gridpilot/racing/application/mappers/EntityMappers';
import type { DriverDTO } from '@gridpilot/racing/application/dto/DriverDTO';
import Card from '../ui/Card';
import ProfileHeader from '../profile/ProfileHeader';
import ProfileStats from './ProfileStats';
import CareerHighlights from './CareerHighlights';
import DriverRankings from './DriverRankings';
import PerformanceMetrics from './PerformanceMetrics';
import { getDriverTeam } from '@gridpilot/racing/application';
import { getDriverTeam } from '@/lib/racingLegacyFacade';
import { getDriverStats, getLeagueRankings } from '@/lib/di-container';
interface DriverProfileProps {

View File

@@ -1,7 +1,7 @@
'use client';
import { useState } from 'react';
import { DriverDTO } from '@gridpilot/racing/application/mappers/EntityMappers';
import type { DriverDTO } from '@gridpilot/racing/application/dto/DriverDTO';
import Card from '../ui/Card';
import Button from '../ui/Button';
import Input from '../ui/Input';

View File

@@ -1,5 +1,6 @@
import Card from '@/components/ui/Card';
import Button from '@/components/ui/Button';
import Image from 'next/image';
import type { FeedItem } from '@gridpilot/social/domain/entities/FeedItem';
import { friends } from '@gridpilot/testing-support';
@@ -39,9 +40,11 @@ export default function FeedItemCard({ item }: FeedItemCardProps) {
<div className="flex-shrink-0">
{actor ? (
<div className="w-10 h-10 rounded-full overflow-hidden bg-charcoal-outline">
<img
<Image
src={actor.avatarUrl}
alt={actor.name}
width={40}
height={40}
className="w-full h-full object-cover"
/>
</div>

View File

@@ -9,7 +9,7 @@ import {
requestToJoin,
getCurrentDriverId,
type MembershipStatus,
} from '@gridpilot/racing/application';
} from '@/lib/racingLegacyFacade';
interface JoinLeagueButtonProps {
leagueId: string;

View File

@@ -1,6 +1,6 @@
'use client';
import { useState, useEffect } from 'react';
import { useState, useEffect, useCallback } from 'react';
import { useRouter } from 'next/navigation';
import Button from '../ui/Button';
import Card from '../ui/Card';
@@ -15,7 +15,7 @@ import {
getCurrentDriverId,
type JoinRequest,
type MembershipRole,
} from '@gridpilot/racing/application';
} from '@/lib/racingLegacyFacade';
import { getDriverRepository } from '@/lib/di-container';
import { Driver } from '@gridpilot/racing/domain/entities/Driver';
@@ -33,11 +33,7 @@ export default function LeagueAdmin({ league, onLeagueUpdate }: LeagueAdminProps
const [error, setError] = useState<string | null>(null);
const [activeTab, setActiveTab] = useState<'members' | 'requests' | 'races' | 'settings'>('members');
useEffect(() => {
loadJoinRequests();
}, [league.id]);
const loadJoinRequests = async () => {
const loadJoinRequests = useCallback(async () => {
setLoading(true);
try {
const requests = getJoinRequests(league.id);
@@ -53,7 +49,11 @@ export default function LeagueAdmin({ league, onLeagueUpdate }: LeagueAdminProps
} finally {
setLoading(false);
}
};
}, [league.id]);
useEffect(() => {
loadJoinRequests();
}, [loadJoinRequests]);
const handleApproveRequest = (requestId: string) => {
try {

View File

@@ -1,6 +1,6 @@
'use client';
import { useState, useEffect } from 'react';
import { useState, useEffect, useCallback } from 'react';
import { Driver } from '@gridpilot/racing/domain/entities/Driver';
import { getDriverRepository, getDriverStats } from '@/lib/di-container';
import {
@@ -8,7 +8,7 @@ import {
getCurrentDriverId,
type LeagueMembership,
type MembershipRole,
} from '@gridpilot/racing/application';
} from '@/lib/racingLegacyFacade';
interface LeagueMembersProps {
leagueId: string;
@@ -29,11 +29,7 @@ export default function LeagueMembers({
const [sortBy, setSortBy] = useState<'role' | 'name' | 'date' | 'rating' | 'points' | 'wins'>('rating');
const currentDriverId = getCurrentDriverId();
useEffect(() => {
loadMembers();
}, [leagueId]);
const loadMembers = async () => {
const loadMembers = useCallback(async () => {
setLoading(true);
try {
const membershipData = getLeagueMembers(leagueId);
@@ -49,7 +45,11 @@ export default function LeagueMembers({
} finally {
setLoading(false);
}
};
}, [leagueId]);
useEffect(() => {
loadMembers();
}, [loadMembers]);
const getDriverName = (driverId: string): string => {
const driver = drivers.find(d => d.id === driverId);

View File

@@ -9,7 +9,7 @@ import {
isRegistered,
registerForRace,
withdrawFromRace,
} from '@gridpilot/racing/application';
} from '@/lib/racingLegacyFacade';
interface LeagueScheduleProps {
leagueId: string;

View File

@@ -1,6 +1,6 @@
'use client';
import { getMembership, getCurrentDriverId, type MembershipRole } from '@gridpilot/racing/application';
import { getMembership, getCurrentDriverId, type MembershipRole } from '@/lib/racingLegacyFacade';
interface MembershipStatusProps {
leagueId: string;

View File

@@ -1,8 +1,8 @@
'use client';
import { DriverDTO } from '@gridpilot/racing/application/mappers/EntityMappers';
import type { DriverDTO } from '@gridpilot/racing/application/dto/DriverDTO';
import Button from '../ui/Button';
import { getDriverTeam } from '@gridpilot/racing/application';
import { getDriverTeam } from '@/lib/racingLegacyFacade';
interface ProfileHeaderProps {
driver: DriverDTO;

View File

@@ -4,7 +4,7 @@ import { useState } from 'react';
import { useRouter } from 'next/navigation';
import Button from '@/components/ui/Button';
import Input from '@/components/ui/Input';
import { createTeam, getCurrentDriverId } from '@gridpilot/racing/application';
import { createTeam, getCurrentDriverId } from '@/lib/racingLegacyFacade';
interface CreateTeamFormProps {
onCancel?: () => void;
@@ -56,14 +56,13 @@ export default function CreateTeamForm({ onCancel, onSuccess }: CreateTeamFormPr
setSubmitting(true);
try {
const currentDriverId = getCurrentDriverId();
const team = createTeam(
formData.name,
formData.tag.toUpperCase(),
formData.description,
currentDriverId,
[] // Empty leagues array for now
);
getCurrentDriverId(); // ensure identity initialized
const team = createTeam({
name: formData.name,
tag: formData.tag.toUpperCase(),
description: formData.description,
leagues: [],
});
if (onSuccess) {
onSuccess(team.id);

View File

@@ -9,7 +9,7 @@ import {
joinTeam,
requestToJoinTeam,
leaveTeam,
} from '@gridpilot/racing/application';
} from '@/lib/racingLegacyFacade';
interface JoinTeamButtonProps {
teamId: string;

View File

@@ -5,7 +5,8 @@ import Card from '@/components/ui/Card';
import Button from '@/components/ui/Button';
import Input from '@/components/ui/Input';
import { getDriverRepository } from '@/lib/di-container';
import { EntityMappers, DriverDTO } from '@gridpilot/racing/application/mappers/EntityMappers';
import { EntityMappers } from '@gridpilot/racing/application/mappers/EntityMappers';
import type { DriverDTO } from '@gridpilot/racing/application/dto/DriverDTO';
import {
Team,
TeamJoinRequest,
@@ -13,7 +14,7 @@ import {
approveTeamJoinRequest,
rejectTeamJoinRequest,
updateTeam,
} from '@gridpilot/racing/application';
} from '@/lib/racingLegacyFacade';
interface TeamAdminProps {
team: Team;

View File

@@ -3,8 +3,9 @@
import { useState, useEffect } from 'react';
import Card from '@/components/ui/Card';
import { getDriverRepository, getDriverStats } from '@/lib/di-container';
import { EntityMappers, DriverDTO } from '@gridpilot/racing/application/mappers/EntityMappers';
import { TeamMembership, TeamRole } from '@gridpilot/racing/application';
import { EntityMappers } from '@gridpilot/racing/application/mappers/EntityMappers';
import type { DriverDTO } from '@gridpilot/racing/application/dto/DriverDTO';
import { TeamMembership, TeamRole } from '@/lib/racingLegacyFacade';
interface TeamRosterProps {
teamId: string;

View File

@@ -3,8 +3,9 @@
import { useState, useEffect } from 'react';
import Card from '@/components/ui/Card';
import { getStandingRepository, getLeagueRepository } from '@/lib/di-container';
import { EntityMappers, LeagueDTO } from '@gridpilot/racing/application/mappers/EntityMappers';
import { getTeamMembers } from '@gridpilot/racing/application';
import { EntityMappers } from '@gridpilot/racing/application/mappers/EntityMappers';
import type { LeagueDTO } from '@gridpilot/racing/application/dto/LeagueDTO';
import { getTeamMembers } from '@/lib/racingLegacyFacade';
interface TeamStandingsProps {
teamId: string;