remove core from pages

This commit is contained in:
2025-12-18 19:14:50 +01:00
parent 9814d9682c
commit 4a3087ae35
35 changed files with 552 additions and 354 deletions

View File

@@ -3,9 +3,8 @@
import { useState, useEffect } from 'react';
import { useParams } from 'next/navigation';
import Card from '@/components/ui/Card';
import type { LeagueScoringConfigDTO } from '@core/racing/application/dto/LeagueScoringConfigDTO';
import { useServices } from '@/lib/services/ServiceProvider';
import type { LeagueWithCapacityDTO } from '@/lib/types/generated/LeagueWithCapacityDTO';
import { LeagueDetailPageViewModel } from '@/lib/view-models/LeagueDetailPageViewModel';
type RulebookSection = 'scoring' | 'conduct' | 'protests' | 'penalties';
@@ -13,8 +12,7 @@ export default function LeagueRulebookPage() {
const params = useParams();
const leagueId = params.id as string;
const [league, setLeague] = useState<LeagueWithCapacityDTO | null>(null);
const [scoringConfig, setScoringConfig] = useState<LeagueScoringConfigDTO | null>(null);
const [viewModel, setViewModel] = useState<LeagueDetailPageViewModel | null>(null);
const [loading, setLoading] = useState(true);
const [activeSection, setActiveSection] = useState<RulebookSection>('scoring');
@@ -22,14 +20,13 @@ export default function LeagueRulebookPage() {
async function loadData() {
try {
const { leagueService } = useServices();
const viewModel = await leagueService.getLeagueDetailPageData(leagueId);
if (!viewModel) {
const data = await leagueService.getLeagueDetailPageData(leagueId);
if (!data) {
setLoading(false);
return;
}
setLeague(viewModel.league);
setScoringConfig(viewModel.scoringConfig);
setViewModel(data);
} catch (err) {
console.error('Failed to load scoring config:', err);
} finally {
@@ -48,7 +45,7 @@ export default function LeagueRulebookPage() {
);
}
if (!league || !scoringConfig) {
if (!viewModel || !viewModel.scoringConfig) {
return (
<Card>
<div className="text-center py-12 text-gray-400">Unable to load rulebook</div>
@@ -56,7 +53,7 @@ export default function LeagueRulebookPage() {
);
}
const primaryChampionship = scoringConfig.championships.find(c => c.type === 'driver') ?? scoringConfig.championships[0];
const primaryChampionship = viewModel.scoringConfig.championships.find(c => c.type === 'driver') ?? viewModel.scoringConfig.championships[0];
const positionPoints = primaryChampionship?.pointsPreview
.filter(p => p.sessionType === primaryChampionship.sessionTypes[0])
.map(p => ({ position: p.position, points: p.points }))
@@ -78,7 +75,7 @@ export default function LeagueRulebookPage() {
<p className="text-sm text-gray-400 mt-1">Official rules and regulations</p>
</div>
<div className="flex items-center gap-2 px-3 py-1.5 rounded-full bg-primary-blue/10 border border-primary-blue/20">
<span className="text-sm font-medium text-primary-blue">{scoringConfig.scoringPresetName || 'Custom Rules'}</span>
<span className="text-sm font-medium text-primary-blue">{viewModel.scoringConfig.scoringPresetName || 'Custom Rules'}</span>
</div>
</div>
@@ -106,11 +103,11 @@ export default function LeagueRulebookPage() {
<div className="grid grid-cols-2 md:grid-cols-4 gap-4">
<div className="bg-iron-gray rounded-lg p-4 border border-charcoal-outline">
<p className="text-xs text-gray-500 uppercase tracking-wider mb-1">Platform</p>
<p className="text-lg font-semibold text-white">{scoringConfig.gameName}</p>
<p className="text-lg font-semibold text-white">{viewModel.scoringConfig.gameName}</p>
</div>
<div className="bg-iron-gray rounded-lg p-4 border border-charcoal-outline">
<p className="text-xs text-gray-500 uppercase tracking-wider mb-1">Championships</p>
<p className="text-lg font-semibold text-white">{scoringConfig.championships.length}</p>
<p className="text-lg font-semibold text-white">{viewModel.scoringConfig.championships.length}</p>
</div>
<div className="bg-iron-gray rounded-lg p-4 border border-charcoal-outline">
<p className="text-xs text-gray-500 uppercase tracking-wider mb-1">Sessions Scored</p>
@@ -120,8 +117,8 @@ export default function LeagueRulebookPage() {
</div>
<div className="bg-iron-gray rounded-lg p-4 border border-charcoal-outline">
<p className="text-xs text-gray-500 uppercase tracking-wider mb-1">Drop Policy</p>
<p className="text-lg font-semibold text-white truncate" title={scoringConfig.dropPolicySummary}>
{scoringConfig.dropPolicySummary.includes('All') ? 'None' : 'Active'}
<p className="text-lg font-semibold text-white truncate" title={viewModel.scoringConfig.dropPolicySummary}>
{viewModel.scoringConfig.dropPolicySummary.includes('All') ? 'None' : 'Active'}
</p>
</div>
</div>
@@ -192,10 +189,10 @@ export default function LeagueRulebookPage() {
)}
{/* Drop Policy */}
{!scoringConfig.dropPolicySummary.includes('All results count') && (
{!viewModel.scoringConfig.dropPolicySummary.includes('All results count') && (
<Card>
<h2 className="text-lg font-semibold text-white mb-4">Drop Policy</h2>
<p className="text-sm text-gray-300">{scoringConfig.dropPolicySummary}</p>
<p className="text-sm text-gray-300">{viewModel.scoringConfig.dropPolicySummary}</p>
<p className="text-xs text-gray-500 mt-3">
Drop rules are applied automatically when calculating championship standings.
</p>