This commit is contained in:
2025-12-16 11:52:26 +01:00
parent ce82b7822b
commit 9a891ac8b3
586 changed files with 1320 additions and 1563 deletions

View File

@@ -3,7 +3,7 @@
import { useState } from 'react';
import Card from '../ui/Card';
import Button from '../ui/Button';
import { Race } from '@gridpilot/racing/domain/entities/Race';
import { Race } from '@core/racing/domain/entities/Race';
interface CompanionInstructionsProps {
race: Race;

View File

@@ -4,7 +4,7 @@ import { useState, useEffect } from 'react';
import { useRouter } from 'next/navigation';
import { useEffectiveDriverId } from '@/lib/currentDriver';
import { getSendNotificationUseCase, getRaceRepository, getLeagueRepository } from '@/lib/di-container';
import type { NotificationUrgency } from '@gridpilot/notifications/application';
import type { NotificationUrgency } from '@core/notifications/application';
import {
Bell,
AlertTriangle,

View File

@@ -4,7 +4,7 @@ import { useState, FormEvent } from 'react';
import { useRouter } from 'next/navigation';
import Input from '../ui/Input';
import Button from '../ui/Button';
import { Driver } from '@gridpilot/racing';
import { Driver } from '@core/racing';
import { getDriverRepository } from '../../lib/di-container';
interface FormErrors {

View File

@@ -1,7 +1,7 @@
import Card from '@/components/ui/Card';
import RankBadge from '@/components/drivers/RankBadge';
import DriverIdentity from '@/components/drivers/DriverIdentity';
import type { DriverDTO } from '@gridpilot/racing/application/dto/DriverDTO';
import type { DriverDTO } from '@core/racing/application/dto/DriverDTO';
export interface DriverCardProps {
id: string;

View File

@@ -1,6 +1,6 @@
import Link from 'next/link';
import Image from 'next/image';
import type { DriverDTO } from '@gridpilot/racing/application/dto/DriverDTO';
import type { DriverDTO } from '@core/racing/application/dto/DriverDTO';
import { getImageService } from '@/lib/di-container';
export interface DriverIdentityProps {

View File

@@ -1,6 +1,6 @@
'use client';
import type { DriverDTO } from '@gridpilot/racing/application/dto/DriverDTO';
import type { DriverDTO } from '@core/racing/application/dto/DriverDTO';
import Card from '../ui/Card';
import ProfileHeader from '../profile/ProfileHeader';
import ProfileStats from './ProfileStats';
@@ -11,8 +11,8 @@ import { useEffect, useState } from 'react';
import { getLeagueRankings, getGetDriverTeamUseCase, getGetProfileOverviewUseCase } from '@/lib/di-container';
import { DriverTeamPresenter } from '@/lib/presenters/DriverTeamPresenter';
import { getPrimaryLeagueIdForDriver } from '@/lib/leagueMembership';
import type { ProfileOverviewViewModel } from '@gridpilot/racing/application/presenters/IProfileOverviewPresenter';
import type { DriverTeamViewModel } from '@gridpilot/racing/application/presenters/IDriverTeamPresenter';
import type { ProfileOverviewViewModel } from '@core/racing/application/presenters/IProfileOverviewPresenter';
import type { DriverTeamViewModel } from '@core/racing/application/presenters/IDriverTeamPresenter';
interface DriverProfileProps {
driver: DriverDTO;

View File

@@ -5,9 +5,9 @@ import Card from '../ui/Card';
import Button from '../ui/Button';
import RaceResultCard from '../races/RaceResultCard';
import { getRaceRepository, getLeagueRepository, getResultRepository } from '@/lib/di-container';
import { Race } from '@gridpilot/racing/domain/entities/Race';
import { Result } from '@gridpilot/racing/domain/entities/Result';
import { League } from '@gridpilot/racing/domain/entities/League';
import { Race } from '@core/racing/domain/entities/Race';
import { Result } from '@core/racing/domain/entities/Result';
import { League } from '@core/racing/domain/entities/League';
interface RaceHistoryProps {
driverId: string;

View File

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

View File

@@ -5,7 +5,7 @@ import RankBadge from './RankBadge';
import { getLeagueRankings, getGetProfileOverviewUseCase } from '@/lib/di-container';
import { useState, useEffect } from 'react';
import { getPrimaryLeagueIdForDriver } from '@/lib/leagueMembership';
import type { ProfileOverviewViewModel } from '@gridpilot/racing/application/presenters/IProfileOverviewPresenter';
import type { ProfileOverviewViewModel } from '@core/racing/application/presenters/IProfileOverviewPresenter';
interface ProfileStatsProps {
driverId?: string;

View File

@@ -2,7 +2,7 @@ import { useState, useEffect } from 'react';
import Card from '@/components/ui/Card';
import Button from '@/components/ui/Button';
import Image from 'next/image';
import type { FeedItemDTO } from '@gridpilot/social/application/dto/FeedItemDTO';
import type { FeedItemDTO } from '@core/social/application/dto/FeedItemDTO';
import { getDriverRepository, getImageService } from '@/lib/di-container';
function timeAgo(timestamp: Date | string): string {

View File

@@ -1,7 +1,7 @@
import Card from '@/components/ui/Card';
import type { FeedItemDTO } from '@gridpilot/social/application/dto/FeedItemDTO';
import type { Race } from '@gridpilot/racing/domain/entities/Race';
import type { RaceWithResultsDTO } from '@gridpilot/testing-support';
import type { FeedItemDTO } from '@core/social/application/dto/FeedItemDTO';
import type { Race } from '@core/racing/domain/entities/Race';
import type { RaceWithResultsDTO } from '@core/testing-support';
import FeedList from '@/components/feed/FeedList';
import UpcomingRacesSidebar from '@/components/races/UpcomingRacesSidebar';
import LatestResultsSidebar from '@/components/races/LatestResultsSidebar';

View File

@@ -1,6 +1,6 @@
import FeedEmptyState from '@/components/feed/FeedEmptyState';
import FeedItemCard from '@/components/feed/FeedItemCard';
import type { FeedItemDTO } from '@gridpilot/social/application/dto/FeedItemDTO';
import type { FeedItemDTO } from '@core/social/application/dto/FeedItemDTO';
interface FeedListProps {
items: FeedItemDTO[];

View File

@@ -1,5 +1,5 @@
import Card from '@/components/ui/Card';
import type { LeagueScoringChampionshipDTO } from '@gridpilot/racing/application/dto/LeagueScoringConfigDTO';
import type { LeagueScoringChampionshipDTO } from '@core/racing/application/dto/LeagueScoringConfigDTO';
interface ChampionshipCardProps {
championship: LeagueScoringChampionshipDTO;

View File

@@ -4,7 +4,7 @@ import { useState, FormEvent } from 'react';
import { useRouter } from 'next/navigation';
import Input from '../ui/Input';
import Button from '../ui/Button';
import { League } from '@gridpilot/racing/domain/entities/League';
import { League } from '@core/racing/domain/entities/League';
import { getLeagueRepository, getDriverRepository } from '../../lib/di-container';
interface FormErrors {

View File

@@ -32,8 +32,8 @@ import {
createLeagueFromConfig,
applyScoringPresetToConfig,
} from '@/lib/leagueWizardService';
import type { LeagueScoringPresetDTO } from '@gridpilot/racing/application/ports/LeagueScoringPresetProvider';
import type { LeagueConfigFormModel } from '@gridpilot/racing/application';
import type { LeagueScoringPresetDTO } from '@core/racing/application/ports/LeagueScoringPresetProvider';
import type { LeagueConfigFormModel } from '@core/racing/application';
import { LeagueBasicsSection } from './LeagueBasicsSection';
import { LeagueVisibilitySection } from './LeagueVisibilitySection';
import { LeagueStructureSection } from './LeagueStructureSection';

View File

@@ -1,11 +1,11 @@
'use client';
import { Calendar, Award, UserPlus, UserMinus, Shield, Flag, AlertTriangle } from 'lucide-react';
import { Race, Penalty } from '@gridpilot/racing';
import type { LeagueMembership } from '@gridpilot/racing/domain/entities/LeagueMembership';
import { Race, Penalty } from '@core/racing';
import type { LeagueMembership } from '@core/racing/domain/entities/LeagueMembership';
import { getDriverRepository, getPenaltyRepository, getRaceRepository } from '@/lib/di-container';
import { useEffect, useState } from 'react';
import type { Driver } from '@gridpilot/racing';
import type { Driver } from '@core/racing';
export type LeagueActivity =
| { type: 'race_completed'; raceId: string; raceName: string; timestamp: Date }

View File

@@ -21,7 +21,7 @@ import {
type LeagueAdminProtestsViewModel,
type LeagueSeasonSummaryViewModel,
} from '@/lib/presenters/LeagueAdminPresenter';
import type { LeagueConfigFormModel } from '@gridpilot/racing/application';
import type { LeagueConfigFormModel } from '@core/racing/application';
import type { LeagueSummaryViewModel } from '@/lib/presenters/LeagueAdminPresenter';
import { LeagueBasicsSection } from './LeagueBasicsSection';
import { LeagueStructureSection } from './LeagueStructureSection';

View File

@@ -3,7 +3,7 @@
import React from 'react';
import { FileText, Gamepad2, AlertCircle, Check } from 'lucide-react';
import Input from '@/components/ui/Input';
import type { LeagueConfigFormModel } from '@gridpilot/racing/application';
import type { LeagueConfigFormModel } from '@core/racing/application';
interface LeagueBasicsSectionProps {
form: LeagueConfigFormModel;

View File

@@ -12,7 +12,7 @@ import {
ChevronRight,
Sparkles,
} from 'lucide-react';
import type { LeagueSummaryViewModel } from '@gridpilot/racing/application/presenters/IAllLeaguesWithCapacityAndScoringPresenter';
import type { LeagueSummaryViewModel } from '@core/racing/application/presenters/IAllLeaguesWithCapacityAndScoringPresenter';
import { getLeagueCoverClasses } from '@/lib/leagueCovers';
import { getImageService } from '@/lib/di-container';

View File

@@ -3,7 +3,7 @@
import React, { useState, useRef, useEffect } from 'react';
import { TrendingDown, Check, HelpCircle, X, Zap } from 'lucide-react';
import { createPortal } from 'react-dom';
import type { LeagueConfigFormModel } from '@gridpilot/racing/application';
import type { LeagueConfigFormModel } from '@core/racing/application';
// ============================================================================
// INFO FLYOUT (duplicated for self-contained component)

View File

@@ -11,8 +11,8 @@ import {
getAllDriverRankings,
getImageService,
} from '@/lib/di-container';
import type { DriverDTO } from '@gridpilot/racing/application/dto/DriverDTO';
import { EntityMappers } from '@gridpilot/racing/application/mappers/EntityMappers';
import type { DriverDTO } from '@core/racing/application/dto/DriverDTO';
import { EntityMappers } from '@core/racing/application/mappers/EntityMappers';
import DriverSummaryPill from '@/components/profile/DriverSummaryPill';
// Main sponsor info for "by XYZ" display

View File

@@ -2,8 +2,8 @@
import { useState, useEffect, useCallback } from 'react';
import DriverIdentity from '@/components/drivers/DriverIdentity';
import type { DriverDTO } from '@gridpilot/racing/application/dto/DriverDTO';
import { EntityMappers } from '@gridpilot/racing/application/mappers/EntityMappers';
import type { DriverDTO } from '@core/racing/application/dto/DriverDTO';
import { EntityMappers } from '@core/racing/application/mappers/EntityMappers';
import { getDriverRepository, getDriverStats } from '@/lib/di-container';
import {
getLeagueMembers,

View File

@@ -21,8 +21,8 @@ import {
Globe,
Medal,
} from 'lucide-react';
import type { LeagueConfigFormModel } from '@gridpilot/racing/application';
import type { LeagueScoringPresetDTO } from '@gridpilot/racing/application/ports/LeagueScoringPresetProvider';
import type { LeagueConfigFormModel } from '@core/racing/application';
import type { LeagueScoringPresetDTO } from '@core/racing/application/ports/LeagueScoringPresetProvider';
interface LeagueReviewSummaryProps {
form: LeagueConfigFormModel;

View File

@@ -3,8 +3,8 @@
import React, { useState, useRef, useEffect } from 'react';
import { Trophy, Award, Check, Zap, Settings, Globe, Medal, Plus, Minus, RotateCcw, HelpCircle, X } from 'lucide-react';
import { createPortal } from 'react-dom';
import type { LeagueScoringPresetDTO } from '@gridpilot/racing/application/ports/LeagueScoringPresetProvider';
import type { LeagueConfigFormModel } from '@gridpilot/racing/application';
import type { LeagueScoringPresetDTO } from '@core/racing/application/ports/LeagueScoringPresetProvider';
import type { LeagueConfigFormModel } from '@core/racing/application';
// ============================================================================
// INFO FLYOUT COMPONENT

View File

@@ -1,6 +1,6 @@
'use client';
import type { LeagueScoringConfigDTO } from '@gridpilot/racing/application/dto/LeagueScoringConfigDTO';
import type { LeagueScoringConfigDTO } from '@core/racing/application/dto/LeagueScoringConfigDTO';
import { Trophy, Clock, Target, Zap, Info } from 'lucide-react';
interface LeagueScoringTabProps {

View File

@@ -2,8 +2,8 @@
import React from 'react';
import { Scale, Users, Clock, Bell, Shield, Vote, UserCheck, AlertTriangle } from 'lucide-react';
import type { LeagueConfigFormModel, LeagueStewardingFormDTO } from '@gridpilot/racing/application';
import type { StewardingDecisionMode } from '@gridpilot/racing/domain/entities/League';
import type { LeagueConfigFormModel, LeagueStewardingFormDTO } from '@core/racing/application';
import type { StewardingDecisionMode } from '@core/racing/domain/entities/League';
interface LeagueStewardingSectionProps {
form: LeagueConfigFormModel;

View File

@@ -4,8 +4,8 @@ import { User, Users2, Info, Check, HelpCircle, X } from 'lucide-react';
import { useState, useRef, useEffect, useMemo } from 'react';
import { createPortal } from 'react-dom';
import Input from '@/components/ui/Input';
import type { LeagueConfigFormModel } from '@gridpilot/racing/application';
import { GameConstraints } from '@gridpilot/racing/domain/value-objects/GameConstraints';
import type { LeagueConfigFormModel } from '@core/racing/application';
import { GameConstraints } from '@core/racing/domain/value-objects/GameConstraints';
// ============================================================================
// INFO FLYOUT COMPONENT

View File

@@ -22,8 +22,8 @@ import {
import type {
LeagueConfigFormModel,
LeagueSchedulePreviewDTO,
} from '@gridpilot/racing/application';
import type { Weekday } from '@gridpilot/racing/domain/types/Weekday';
} from '@core/racing/application';
import type { Weekday } from '@core/racing/domain/types/Weekday';
import Input from '@/components/ui/Input';
import RangeField from '@/components/ui/RangeField';

View File

@@ -3,7 +3,7 @@
import { Trophy, Users, Check, HelpCircle, X } from 'lucide-react';
import { useState, useRef, useEffect } from 'react';
import { createPortal } from 'react-dom';
import type { LeagueConfigFormModel } from '@gridpilot/racing/application';
import type { LeagueConfigFormModel } from '@core/racing/application';
// Minimum drivers for ranked leagues
const MIN_RANKED_DRIVERS = 10;

View File

@@ -1,8 +1,8 @@
'use client';
import { Calendar, Users, Trophy, Gamepad2, Eye, Hash, Award } from 'lucide-react';
import type { LeagueConfigFormModel } from '@gridpilot/racing/application';
import type { League } from '@gridpilot/racing/domain/entities/League';
import type { LeagueConfigFormModel } from '@core/racing/application';
import type { League } from '@core/racing/domain/entities/League';
interface ReadonlyLeagueInfoProps {
league: League;

View File

@@ -4,8 +4,8 @@ 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 '@gridpilot/racing/application/dto/DriverDTO';
import type { LeagueDriverSeasonStatsDTO } from '@gridpilot/racing/application/dto/LeagueDriverSeasonStatsDTO';
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 { getDriverStats } from '@/lib/di-container';

View File

@@ -2,7 +2,7 @@
import { useState, useEffect } from 'react';
import { useRouter } from 'next/navigation';
import type { Notification, NotificationAction } from '@gridpilot/notifications/application';
import type { Notification, NotificationAction } from '@core/notifications/application';
import {
Bell,
AlertTriangle,

View File

@@ -8,7 +8,7 @@ import {
getNotificationRepository,
getMarkNotificationReadUseCase,
} from '@/lib/di-container';
import type { Notification } from '@gridpilot/notifications/application';
import type { Notification } from '@core/notifications/application';
import {
Bell,
AlertTriangle,

View File

@@ -6,7 +6,7 @@ import {
getNotificationRepository,
getMarkNotificationReadUseCase,
} from '@/lib/di-container';
import type { Notification } from '@gridpilot/notifications/application';
import type { Notification } from '@core/notifications/application';
import ToastNotification from './ToastNotification';
import ModalNotification from './ModalNotification';

View File

@@ -2,7 +2,7 @@
import { useState, useEffect } from 'react';
import { useRouter } from 'next/navigation';
import type { Notification } from '@gridpilot/notifications/application';
import type { Notification } from '@core/notifications/application';
import {
Bell,
AlertTriangle,

View File

@@ -2,7 +2,7 @@
import Image from 'next/image';
import Link from 'next/link';
import type { DriverDTO } from '@gridpilot/racing/application/dto/DriverDTO';
import type { DriverDTO } from '@core/racing/application/dto/DriverDTO';
import DriverRating from '@/components/profile/DriverRatingPill';
import { getImageService } from '@/lib/di-container';

View File

@@ -1,7 +1,7 @@
'use client';
import Image from 'next/image';
import type { DriverDTO } from '@gridpilot/racing/application/dto/DriverDTO';
import type { DriverDTO } from '@core/racing/application/dto/DriverDTO';
import Button from '../ui/Button';
import { getImageService } from '@/lib/di-container';
import DriverRatingPill from '@/components/profile/DriverRatingPill';

View File

@@ -12,8 +12,8 @@ import {
getImageService,
} from '@/lib/di-container';
import { useEffectiveDriverId } from '@/lib/currentDriver';
import type { DriverDTO } from '@gridpilot/racing/application/dto/DriverDTO';
import { EntityMappers } from '@gridpilot/racing/application/mappers/EntityMappers';
import type { DriverDTO } from '@core/racing/application/dto/DriverDTO';
import { EntityMappers } from '@core/racing/application/mappers/EntityMappers';
import DriverSummaryPill from '@/components/profile/DriverSummaryPill';
// Hook to detect sponsor mode

View File

@@ -4,7 +4,7 @@ import { useState } from 'react';
import Modal from '@/components/ui/Modal';
import Button from '@/components/ui/Button';
import { getFileProtestUseCase } from '@/lib/di-container';
import type { ProtestIncident } from '@gridpilot/racing/domain/entities/Protest';
import type { ProtestIncident } from '@core/racing/domain/entities/Protest';
import {
AlertTriangle,
Video,

View File

@@ -1,5 +1,5 @@
import Card from '@/components/ui/Card';
import type { RaceWithResultsDTO } from '@gridpilot/testing-support';
import type { RaceWithResultsDTO } from '@core/testing-support';
interface LatestResultsSidebarProps {
results: RaceWithResultsDTO[];

View File

@@ -1,6 +1,6 @@
'use client';
import { Race } from '@gridpilot/racing/domain/entities/Race';
import { Race } from '@core/racing/domain/entities/Race';
import { Clock, PlayCircle, CheckCircle2, XCircle, Zap, Car, Trophy } from 'lucide-react';
interface RaceCardProps {

View File

@@ -2,9 +2,9 @@
import Link from 'next/link';
import { ChevronRight } from 'lucide-react';
import { Race } from '@gridpilot/racing/domain/entities/Race';
import { Result } from '@gridpilot/racing/domain/entities/Result';
import { League } from '@gridpilot/racing/domain/entities/League';
import { Race } from '@core/racing/domain/entities/Race';
import { Result } from '@core/racing/domain/entities/Result';
import { League } from '@core/racing/domain/entities/League';
interface RaceResultCardProps {
race: Race;

View File

@@ -1,4 +1,4 @@
import type { Race } from '@gridpilot/racing/domain/entities/Race';
import type { Race } from '@core/racing/domain/entities/Race';
import Card from '@/components/ui/Card';
import Button from '@/components/ui/Button';

View File

@@ -4,7 +4,7 @@ import { useState, useEffect } from 'react';
import Card from '@/components/ui/Card';
import Button from '@/components/ui/Button';
import Input from '@/components/ui/Input';
import type { DriverDTO } from '@gridpilot/racing/application/dto/DriverDTO';
import type { DriverDTO } from '@core/racing/application/dto/DriverDTO';
import {
loadTeamAdminViewModel,
approveTeamJoinRequestAndReload,

View File

@@ -7,7 +7,7 @@ import {
getTeamRosterViewModel,
type TeamRosterViewModel,
} from '@/lib/presenters/TeamRosterPresenter';
import type { TeamRole } from '@gridpilot/racing/domain/types/TeamMembership';
import type { TeamRole } from '@core/racing/domain/types/TeamMembership';
interface TeamMembershipSummary {
driverId: string;