This commit is contained in:
2025-12-04 23:31:55 +01:00
parent 9fa21a488a
commit fb509607c1
96 changed files with 5839 additions and 1609 deletions

View File

@@ -1,15 +1,15 @@
'use client';
import { useState } from 'react';
import { useState, useEffect } from 'react';
import Button from '@/components/ui/Button';
import {
getCurrentDriverId,
getTeamMembership,
getDriverTeam,
joinTeam,
requestToJoinTeam,
leaveTeam,
} from '@/lib/racingLegacyFacade';
getJoinTeamUseCase,
getLeaveTeamUseCase,
getGetDriverTeamQuery,
getTeamMembershipRepository,
} from '@/lib/di-container';
import { useEffectiveDriverId } from '@/lib/currentDriver';
import type { TeamMembership } from '@gridpilot/racing';
interface JoinTeamButtonProps {
teamId: string;
@@ -23,18 +23,50 @@ export default function JoinTeamButton({
onUpdate,
}: JoinTeamButtonProps) {
const [loading, setLoading] = useState(false);
const currentDriverId = getCurrentDriverId();
const membership = getTeamMembership(teamId, currentDriverId);
const currentTeam = getDriverTeam(currentDriverId);
const currentDriverId = useEffectiveDriverId();
const [membership, setMembership] = useState<TeamMembership | null>(null);
const [currentTeamName, setCurrentTeamName] = useState<string | null>(null);
const [currentTeamId, setCurrentTeamId] = useState<string | null>(null);
useEffect(() => {
const load = async () => {
const membershipRepo = getTeamMembershipRepository();
const m = await membershipRepo.getMembership(teamId, currentDriverId);
setMembership(m);
const driverTeamQuery = getGetDriverTeamQuery();
const driverTeam = await driverTeamQuery.execute({ driverId: currentDriverId });
if (driverTeam) {
setCurrentTeamId(driverTeam.team.id);
setCurrentTeamName(driverTeam.team.name);
} else {
setCurrentTeamId(null);
setCurrentTeamName(null);
}
};
void load();
}, [teamId, currentDriverId]);
const handleJoin = async () => {
setLoading(true);
try {
if (requiresApproval) {
requestToJoinTeam(teamId, currentDriverId);
const membershipRepo = getTeamMembershipRepository();
const existing = await membershipRepo.getMembership(teamId, currentDriverId);
if (existing) {
throw new Error('Already a member or have a pending request');
}
await membershipRepo.saveJoinRequest({
id: `team-request-${Date.now()}`,
teamId,
driverId: currentDriverId,
requestedAt: new Date(),
});
alert('Join request sent! Wait for team approval.');
} else {
joinTeam(teamId, currentDriverId);
const useCase = getJoinTeamUseCase();
await useCase.execute({ teamId, driverId: currentDriverId });
alert('Successfully joined team!');
}
onUpdate?.();
@@ -52,7 +84,8 @@ export default function JoinTeamButton({
setLoading(true);
try {
leaveTeam(teamId, currentDriverId);
const useCase = getLeaveTeamUseCase();
await useCase.execute({ teamId, driverId: currentDriverId });
alert('Successfully left team');
onUpdate?.();
} catch (error) {
@@ -84,10 +117,10 @@ export default function JoinTeamButton({
}
// Already on another team
if (currentTeam && currentTeam.team.id !== teamId) {
if (currentTeamId && currentTeamId !== teamId) {
return (
<Button variant="secondary" disabled>
Already on {currentTeam.team.name}
Already on {currentTeamName}
</Button>
);
}