website cleanup

This commit is contained in:
2025-12-24 14:01:52 +01:00
parent a7aee42409
commit 9b683a59d3
65 changed files with 880 additions and 745 deletions

View File

@@ -34,7 +34,6 @@ export default function LeagueDetailPage() {
const currentDriverId = useEffectiveDriverId();
const membership = leagueMembershipService.getMembership(leagueId, currentDriverId);
const leagueMemberships = leagueMembershipService.getLeagueMembers(leagueId);
// Build metrics for SponsorInsightsCard
const leagueMetrics: SponsorMetric[] = useMemo(() => {

View File

@@ -5,26 +5,11 @@ import Card from '@/components/ui/Card';
import { useEffectiveDriverId } from '@/hooks/useEffectiveDriverId';
import { LeagueRoleUtility } from '@/lib/utilities/LeagueRoleUtility';
import { useServices } from '@/lib/services/ServiceProvider';
import { useParams, useRouter } from 'next/navigation';
import { useEffect, useState } from 'react';
import { useParams } from 'next/navigation';
export default function LeagueSchedulePage() {
const params = useParams();
const router = useRouter();
const leagueId = params.id as string;
const currentDriverId = useEffectiveDriverId();
const { leagueMembershipService } = useServices();
const [isAdmin, setIsAdmin] = useState(false);
const [showCreateForm, setShowCreateForm] = useState(false);
useEffect(() => {
async function checkAdmin() {
await leagueMembershipService.fetchLeagueMemberships(leagueId);
const membership = leagueMembershipService.getMembership(leagueId, currentDriverId);
setIsAdmin(membership ? LeagueRoleUtility.isLeagueAdminOrHigherRole(membership.role) : false);
}
checkAdmin();
}, [leagueId, currentDriverId, leagueMembershipService]);
return (
<div className="space-y-6">

View File

@@ -6,11 +6,10 @@ import Card from '@/components/ui/Card';
import { useEffectiveDriverId } from '@/hooks/useEffectiveDriverId';
import { LeagueRoleUtility } from '@/lib/utilities/LeagueRoleUtility';
import { useServices } from '@/lib/services/ServiceProvider';
import type { LeagueConfigFormModel } from '@/lib/types/LeagueConfigFormModel';
import { LeagueSettingsViewModel } from '@/lib/view-models/LeagueSettingsViewModel';
import { AlertTriangle, Settings, UserCog } from 'lucide-react';
import { AlertTriangle, Settings } from 'lucide-react';
import { useParams, useRouter } from 'next/navigation';
import { useEffect, useMemo, useState } from 'react';
import { useEffect, useState } from 'react';
export default function LeagueSettingsPage() {
const params = useParams();
@@ -25,7 +24,6 @@ export default function LeagueSettingsPage() {
useEffect(() => {
async function checkAdmin() {
const memberships = await leagueMembershipService.fetchLeagueMemberships(leagueId);
const membership = leagueMembershipService.getMembership(leagueId, currentDriverId);
setIsAdmin(membership ? LeagueRoleUtility.isLeagueAdminOrHigherRole(membership.role) : false);
}
@@ -52,7 +50,6 @@ export default function LeagueSettingsPage() {
}
}, [leagueId, isAdmin, leagueSettingsService]);
const ownerSummary = settings?.owner || null;
const handleTransferOwnership = async (newOwnerId: string) => {
try {

View File

@@ -5,7 +5,7 @@ import Card from '@/components/ui/Card';
import { useEffectiveDriverId } from '@/hooks/useEffectiveDriverId';
import { LeagueRoleUtility } from '@/lib/utilities/LeagueRoleUtility';
import { useServices } from '@/lib/services/ServiceProvider';
import { LeagueDetailViewModel } from '@/lib/view-models/LeagueDetailViewModel';
import { LeaguePageDetailViewModel } from '@/lib/view-models/LeaguePageDetailViewModel';
import { AlertTriangle, Building } from 'lucide-react';
import { useParams } from 'next/navigation';
import { useEffect, useState } from 'react';
@@ -16,14 +16,14 @@ export default function LeagueSponsorshipsPage() {
const currentDriverId = useEffectiveDriverId();
const { leagueService, leagueMembershipService } = useServices();
const [league, setLeague] = useState<LeagueDetailViewModel | null>(null);
const [league, setLeague] = useState<LeaguePageDetailViewModel | null>(null);
const [isAdmin, setIsAdmin] = useState(false);
const [loading, setLoading] = useState(true);
useEffect(() => {
async function loadData() {
try {
const [leagueDetail, memberships] = await Promise.all([
const [leagueDetail] = await Promise.all([
leagueService.getLeagueDetail(leagueId, currentDriverId),
leagueMembershipService.fetchLeagueMemberships(leagueId),
]);

View File

@@ -23,7 +23,6 @@ export default function LeagueStandingsPage() {
const [standings, setStandings] = useState<StandingEntryViewModel[]>([]);
const [drivers, setDrivers] = useState<DriverViewModel[]>([]);
const [memberships, setMemberships] = useState<LeagueMembership[]>([]);
const [viewModel, setViewModel] = useState<LeagueStandingsViewModel | null>(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState<string | null>(null);
const [isAdmin, setIsAdmin] = useState(false);
@@ -31,7 +30,6 @@ export default function LeagueStandingsPage() {
const loadData = useCallback(async () => {
try {
const vm = await leagueService.getLeagueStandings(leagueId, currentDriverId);
setViewModel(vm);
setStandings(vm.standings);
setDrivers(vm.drivers.map(d => new DriverViewModel(d)));
setMemberships(vm.memberships);

View File

@@ -14,9 +14,7 @@ import {
AlertCircle,
AlertTriangle,
Calendar,
CheckCircle,
ChevronRight,
Clock,
Flag,
Gavel,
MapPin,

View File

@@ -170,37 +170,6 @@ export default function ProtestReviewPage() {
}
}, [protestId, leagueId, isAdmin, router]);
// Build timeline from protest data
const timeline = useMemo((): TimelineEvent[] => {
if (!protest) return [];
const events: TimelineEvent[] = [
{
id: 'filed',
type: 'protest_filed',
timestamp: new Date(protest.submittedAt),
actor: protestingDriver,
content: protest.description,
metadata: {}
}
];
// Add decision event when status/decisions are available in view model
if (protest.status === 'upheld' || protest.status === 'dismissed') {
events.push({
id: 'decision',
type: 'decision',
timestamp: protest.reviewedAt ? new Date(protest.reviewedAt) : new Date(),
actor: null, // Would need to load steward driver
content: protest.decisionNotes || (protest.status === 'upheld' ? 'Protest upheld' : 'Protest dismissed'),
metadata: {
decision: protest.status
}
});
}
return events.sort((a, b) => a.timestamp.getTime() - b.timestamp.getTime());
}, [protest, protestingDriver]);
const handleSubmitDecision = async () => {
if (!decision || !stewardNotes.trim() || !protest) return;

View File

@@ -11,15 +11,10 @@ import {
Wallet,
DollarSign,
ArrowUpRight,
ArrowDownLeft,
Clock,
AlertTriangle,
CheckCircle,
XCircle,
Download,
CreditCard,
TrendingUp,
Calendar
TrendingUp
} from 'lucide-react';

View File

@@ -14,16 +14,10 @@ import {
Sparkles,
Flag,
Filter,
Gamepad2,
Flame,
Clock,
Zap,
Target,
Star,
TrendingUp,
Calendar,
Timer,
Car,
} from 'lucide-react';
import LeagueCard from '@/components/leagues/LeagueCard';
import Button from '@/components/ui/Button';