import { FC, ReactElement, useState } from 'react'; import { Button } from '@imphnen-frontend-service/ui/atoms'; import { Link, useParams, useNavigate } from 'react-router'; import { useTeamById, useTeamMembers, useInviteMember, useTeamJoinRequests, useRespondToJoinRequest, ETeamMemberRole, useAuthStore } from '@imphnen-frontend-service/service'; import { toast } from 'sonner'; const MAX_TEAM_MEMBERS = 5; const TeamDashboardPage: FC = (): ReactElement => { const { teamId } = useParams<{ teamId: string }>(); const navigate = useNavigate(); const { session } = useAuthStore(); const [showInviteModal, setShowInviteModal] = useState(false); const [showJoinRequestsModal, setShowJoinRequestsModal] = useState(false); const [inviteEmail, setInviteEmail] = useState(''); const { data: teamData, isLoading: isLoadingTeam } = useTeamById(teamId || ''); const { data: membersData, isLoading: isLoadingMembers } = useTeamMembers(teamId || ''); const { data: joinRequestsData } = useTeamJoinRequests(teamId || '', !!teamId); const { mutateAsync: inviteMember, isPending: isInviting } = useInviteMember(teamId || ''); const { mutateAsync: respondToJoinRequest, isPending: isResponding } = useRespondToJoinRequest(teamId || ''); const team = teamData?.data; const members = membersData?.data || []; const joinRequests = joinRequestsData?.data || []; const pendingJoinRequests = joinRequests.filter((req: any) => req.status === 'pending'); const currentUserId = session?.user?.id; const isLeader = currentUserId === team?.leader_id; const canInvite = isLeader && members.length < MAX_TEAM_MEMBERS; console.log('Leader check:', { currentUserId, leaderId: team?.leader_id, isLeader }); const handleInviteMember = async (e: React.FormEvent) => { e.preventDefault(); if (!inviteEmail.trim() || isInviting) return; try { await inviteMember({ email: inviteEmail.trim() }); toast.success('Invitation sent successfully!'); setInviteEmail(''); setShowInviteModal(false); } catch (error) { console.error('Failed to invite member:', error); toast.error('Failed to send invitation'); } }; const handleRespondToJoinRequest = async (requestId: string, action: 'approve' | 'reject') => { try { await respondToJoinRequest({ requestId, action }); toast.success(action === 'approve' ? 'Request approved!' : 'Request rejected'); } catch (error) { console.error('Failed to respond to join request:', error); toast.error('Failed to process request'); } }; if (isLoadingTeam || isLoadingMembers) { return (
📍 {team.city}
{team.description}
Maximum team size reached ({MAX_TEAM_MEMBERS} members)
)}Your team has successfully submitted a project
{team.leader.fullname}
{team.leader.email}
{member.user.fullname}
{member.role === ETeamMemberRole.LEADER ? 'Leader' : 'Member'}
Send an invitation to join your team. The invited member will see the invitation on their dashboard after logging in.
Important: The email you enter must match the GitHub email address the member uses to sign in.
No pending join requests
When users request to join your team, they'll appear here
{request.user?.fullname || 'Unknown User'}
{request.user?.email}
{request.message && (Message: {request.message}
Requested {new Date(request.created_at).toLocaleDateString()}
Team is full ({MAX_TEAM_MEMBERS}/{MAX_TEAM_MEMBERS} members). Remove a member before accepting new requests.