'use client'; import { useState, useEffect } from 'react'; import { useRouter } from 'next/navigation'; import Button from '../ui/Button'; import Card from '../ui/Card'; import LeagueMembers from './LeagueMembers'; import { League } from '@gridpilot/racing/domain/entities/League'; import { getJoinRequests, approveJoinRequest, rejectJoinRequest, removeMember, updateMemberRole, getCurrentDriverId, type JoinRequest, type MembershipRole, } from '@gridpilot/racing/application'; import { getDriverRepository } from '@/lib/di-container'; import { Driver } from '@gridpilot/racing/domain/entities/Driver'; interface LeagueAdminProps { league: League; onLeagueUpdate?: () => void; } export default function LeagueAdmin({ league, onLeagueUpdate }: LeagueAdminProps) { const router = useRouter(); const currentDriverId = getCurrentDriverId(); const [joinRequests, setJoinRequests] = useState([]); const [requestDrivers, setRequestDrivers] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [activeTab, setActiveTab] = useState<'members' | 'requests' | 'races' | 'settings'>('members'); useEffect(() => { loadJoinRequests(); }, [league.id]); const loadJoinRequests = async () => { setLoading(true); try { const requests = getJoinRequests(league.id); setJoinRequests(requests); const driverRepo = getDriverRepository(); const drivers = await Promise.all( requests.map(r => driverRepo.findById(r.driverId)) ); setRequestDrivers(drivers.filter((d): d is Driver => d !== null)); } catch (err) { console.error('Failed to load join requests:', err); } finally { setLoading(false); } }; const handleApproveRequest = (requestId: string) => { try { approveJoinRequest(requestId); loadJoinRequests(); onLeagueUpdate?.(); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to approve request'); } }; const handleRejectRequest = (requestId: string) => { try { rejectJoinRequest(requestId); loadJoinRequests(); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to reject request'); } }; const handleRemoveMember = (driverId: string) => { if (!confirm('Are you sure you want to remove this member?')) { return; } try { removeMember(league.id, driverId, currentDriverId); onLeagueUpdate?.(); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to remove member'); } }; const handleUpdateRole = (driverId: string, newRole: MembershipRole) => { try { updateMemberRole(league.id, driverId, newRole, currentDriverId); onLeagueUpdate?.(); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to update role'); } }; const getDriverName = (driverId: string): string => { const driver = requestDrivers.find(d => d.id === driverId); return driver?.name || 'Unknown Driver'; }; return (
{error && (
{error}
)} {/* Admin Tabs */}
{/* Tab Content */} {activeTab === 'members' && (

Manage Members

)} {activeTab === 'requests' && (

Join Requests

{loading ? (
Loading requests...
) : joinRequests.length === 0 ? (
No pending join requests
) : (
{joinRequests.map((request) => (

{getDriverName(request.driverId)}

Requested {new Date(request.requestedAt).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric', })}

{request.message && (

“{request.message}”

)}
))}
)}
)} {activeTab === 'races' && (

Create New Race

Schedule a new race for this league

)} {activeTab === 'settings' && (

League Settings

{league.name}

{league.description}

Racing Settings

{league.settings.pointsSystem.toUpperCase()}

{league.settings.sessionDuration} minutes

{league.settings.qualifyingFormat}

League settings editing will be available in a future update

)}
); }