'use client'; import { useState } from 'react'; import Button from '../ui/Button'; import { getMembership, type MembershipStatus } from '@/lib/leagueMembership'; import { useEffectiveDriverId } from '@/lib/currentDriver'; interface JoinLeagueButtonProps { leagueId: string; isInviteOnly?: boolean; onMembershipChange?: () => void; } export default function JoinLeagueButton({ leagueId, isInviteOnly = false, onMembershipChange, }: JoinLeagueButtonProps) { const currentDriverId = useEffectiveDriverId(); const membership = getMembership(leagueId, currentDriverId); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); const [showConfirmDialog, setShowConfirmDialog] = useState(false); const [dialogAction, setDialogAction] = useState<'join' | 'leave' | 'request'>('join'); const handleJoin = async () => { setLoading(true); setError(null); try { const membershipRepo = getLeagueMembershipRepository(); if (isInviteOnly) { const existing = await membershipRepo.getMembership(leagueId, currentDriverId); if (existing) { throw new Error('Already a member or have a pending request'); } throw new Error( 'Requesting to join invite-only leagues is not available in this alpha build.', ); } const useCase = getJoinLeagueUseCase(); await useCase.execute({ leagueId, driverId: currentDriverId }); onMembershipChange?.(); setShowConfirmDialog(false); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to join league'); } finally { setLoading(false); } }; const handleLeave = async () => { setLoading(true); setError(null); try { const membershipRepo = getLeagueMembershipRepository(); const existing = await membershipRepo.getMembership(leagueId, currentDriverId); if (!existing) { throw new Error('Not a member of this league'); } if (existing.role === 'owner') { throw new Error('League owner cannot leave the league'); } await membershipRepo.removeMembership(leagueId, currentDriverId); onMembershipChange?.(); setShowConfirmDialog(false); } catch (err) { setError(err instanceof Error ? err.message : 'Failed to leave league'); } finally { setLoading(false); } }; const openDialog = (action: 'join' | 'leave' | 'request') => { setDialogAction(action); setShowConfirmDialog(true); setError(null); }; const closeDialog = () => { setShowConfirmDialog(false); setError(null); }; const getButtonText = (): string => { if (!membership) { return isInviteOnly ? 'Request to Join' : 'Join League'; } if (membership.role === 'owner') { return 'League Owner'; } return 'Leave League'; }; const getButtonVariant = (): 'primary' | 'secondary' | 'danger' => { if (!membership) return 'primary'; if (membership.role === 'owner') return 'secondary'; return 'danger'; }; const isDisabled = membership?.role === 'owner' || loading; return ( <> {error && (

{error}

)} {/* Confirmation Dialog */} {showConfirmDialog && (

{dialogAction === 'leave' ? 'Leave League' : dialogAction === 'request' ? 'Request to Join' : 'Join League'}

{dialogAction === 'leave' ? 'Are you sure you want to leave this league? You can rejoin later.' : dialogAction === 'request' ? 'Your join request will be sent to the league admins for approval.' : 'Are you sure you want to join this league?'}

{error && (
{error}
)}
)} ); }