diff --git a/apps/hackathon/src/app/teams/[teamId]/members/page.tsx b/apps/hackathon/src/app/teams/[teamId]/members/page.tsx index 4987873..45d2ec9 100644 --- a/apps/hackathon/src/app/teams/[teamId]/members/page.tsx +++ b/apps/hackathon/src/app/teams/[teamId]/members/page.tsx @@ -23,7 +23,7 @@ const ManageMembersPage: FC = (): ReactElement => { const { session } = useAuthStore(); const [showInviteModal, setShowInviteModal] = useState(false); - const { data: teamData } = useTeamById(teamId || ''); + const { data: teamData, isLoading: isLoadingTeam } = useTeamById(teamId || ''); const { data: membersData, isLoading: isLoadingMembers } = useTeamMembers(teamId || ''); const { data: joinRequestsData } = useTeamJoinRequests(teamId || ''); @@ -42,6 +42,15 @@ const ManageMembersPage: FC = (): ReactElement => { mode: 'all', }); + // Show loading state while fetching team data + if (isLoadingTeam) { + return ( +
+

Loading...

+
+ ); + } + if (!isLeader) { return (
diff --git a/libs/service/src/hooks/teams/index.ts b/libs/service/src/hooks/teams/index.ts index 32b014e..b6a5e7c 100644 --- a/libs/service/src/hooks/teams/index.ts +++ b/libs/service/src/hooks/teams/index.ts @@ -312,9 +312,48 @@ export const useManageMember = (teamId: string) => { export const useRemoveMember = (teamId: string) => { const queryClient = useQueryClient(); + const { session } = useAuthStore(); return useMutation({ - mutationFn: (userId: string) => teamsApi.removeMember(teamId, userId), + mutationFn: async (userId: string) => { + if (!session?.user?.id) { + throw new Error('You must be logged in to remove a member'); + } + + // Verify the current user is the team leader + const { data: team, error: teamError } = await supabase + .from('teams') + .select('leader_id') + .eq('id', teamId) + .single(); + + if (teamError || !team) { + throw new Error('Team not found'); + } + + if (team.leader_id !== session.user.id) { + throw new Error('Only the team leader can remove members'); + } + + // Cannot remove the leader + if (userId === team.leader_id) { + throw new Error('Cannot remove the team leader'); + } + + // Delete the team member record + const { error: deleteError } = await supabase + .from('team_members') + .delete() + .eq('team_id', teamId) + .eq('user_id', userId); + + if (deleteError) { + console.error('Failed to remove member:', deleteError); + throw new Error(deleteError.message || 'Failed to remove member'); + } + + return { success: true }; + }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: teamKeys.members(teamId) }); queryClient.invalidateQueries({ queryKey: teamKeys.detail(teamId) });