Files
gridpilot.gg/apps/website/components/teams/JoinTeamButton.tsx
2026-01-06 19:36:03 +01:00

109 lines
2.4 KiB
TypeScript

'use client';
import Button from '@/components/ui/Button';
import { useEffectiveDriverId } from '@/hooks/useEffectiveDriverId';
import { useTeamMembership, useJoinTeam, useLeaveTeam } from '@/hooks/team';
import { useState } from 'react';
interface JoinTeamButtonProps {
teamId: string;
requiresApproval?: boolean;
onUpdate?: () => void;
}
export default function JoinTeamButton({
teamId,
requiresApproval = false,
onUpdate,
}: JoinTeamButtonProps) {
const currentDriverId = useEffectiveDriverId();
const [showConfirmation, setShowConfirmation] = useState(false);
// Use hooks for data fetching
const { data: membership, isLoading: loadingMembership } = useTeamMembership(teamId, currentDriverId || '');
// Use hooks for mutations
const joinTeamMutation = useJoinTeam({
onSuccess: () => {
onUpdate?.();
},
});
const leaveTeamMutation = useLeaveTeam({
onSuccess: () => {
onUpdate?.();
setShowConfirmation(false);
},
});
const handleJoin = () => {
if (!currentDriverId) {
alert('Please log in to join a team');
return;
}
joinTeamMutation.mutate({
teamId,
driverId: currentDriverId,
requiresApproval,
});
};
const handleLeave = () => {
if (!currentDriverId) {
alert('Please log in to leave a team');
return;
}
if (!confirm('Are you sure you want to leave this team?')) {
return;
}
leaveTeamMutation.mutate({
teamId,
driverId: currentDriverId,
});
};
// Loading state
if (loadingMembership) {
return (
<Button variant="primary" disabled>
Loading...
</Button>
);
}
// Already a member
if (membership && membership.isActive) {
if (membership.role === 'owner') {
return (
<Button variant="secondary" disabled>
Team Owner
</Button>
);
}
return (
<Button
variant="danger"
onClick={handleLeave}
disabled={leaveTeamMutation.isPending}
>
{leaveTeamMutation.isPending ? 'Leaving...' : 'Leave Team'}
</Button>
);
}
// Can join
return (
<Button
variant="primary"
onClick={handleJoin}
disabled={joinTeamMutation.isPending || !currentDriverId}
>
{joinTeamMutation.isPending
? 'Processing...'
: requiresApproval
? 'Request to Join'
: 'Join Team'}
</Button>
);
}