import React, {useEffect, useState} from 'react'; import {ActivityIndicator, ScrollView, StyleSheet, Text, TextInput, View} from 'react-native'; import Screen from '../layout/Screen'; import Card from '../UI/Card'; import {Button, ButtonTray} from '../UI/Button'; import useGameHook from '../../hooks/useGameHook'; import {getSession, setPendingAdmin, setSessionTeam, setSessionUser} from '../../hooks/SessionStore'; const TeamScreen = ({navigation}) => { const session = getSession(); const isAdmin = session.isAcceptedAdmin; const isBusiness = Boolean(session.isBusiness); const {getLobby, getSubgroup, getTeam, createTeam, joinTeamByCode, getTeamMembers, leaveTeam, getUser, updateUser, updateTeam, getAdminWaitlist} = useGameHook(); const [activeTid, setActiveTid] = useState(session.currentTid); const [teamCode, setTeamCode] = useState(''); const [team, setTeam] = useState(null); const [members, setMembers] = useState([]); const [memberNames, setMemberNames] = useState({}); const [loading, setLoading] = useState(true); const [teamsDisabled, setTeamsDisabled] = useState(false); const [onAdminWaitlist, setOnAdminWaitlist] = useState(false); const [editingName, setEditingName] = useState(false); const [teamNameDraft, setTeamNameDraft] = useState(''); const loadTeamData = async (tid) => { const t = await getTeam(tid); setTeam(t); const ms = await getTeamMembers(tid); setMembers(ms || []); const names = {}; for (const m of (ms || [])) { const u = await getUser(m.Uid); if (u) names[m.Uid] = u.username; } setMemberNames(names); }; useEffect(() => { const load = async () => { if (!session.currentGid) { setLoading(false); return; } const group = await getLobby(session.currentGid); let teamsAreEnabled = Boolean(group?.TeamsEnabled); if (isBusiness && session.currentSGid) { const subgroup = await getSubgroup(session.currentSGid); if (subgroup) teamsAreEnabled = Boolean(subgroup.TeamsEnabled); } if (session.isPendingAdmin && !session.isAcceptedAdmin) { const freshUser = await getUser(session.currentUid); if (freshUser?.IsAcceptedAdmin) { setPendingAdmin(false); setSessionUser(freshUser); setSessionTeam(freshUser.TGid ?? null); navigation.reset({index: 0, routes: [{name: 'Admin'}]}); return; } const waitlist = await getAdminWaitlist(session.currentGid, session.currentUid); if (waitlist.length > 0) { setOnAdminWaitlist(true); setLoading(false); return; } setPendingAdmin(false); } if (!teamsAreEnabled) { setTeamsDisabled(true); setLoading(false); return; } setTeamsDisabled(false); if (!activeTid) { const waitlist = await getAdminWaitlist(session.currentGid, session.currentUid); if (waitlist.length > 0) { setOnAdminWaitlist(true); setLoading(false); return; } } if (activeTid) await loadTeamData(activeTid); setLoading(false); }; load(); }, [activeTid]); useEffect(() => { if (!onAdminWaitlist && !session.isPendingAdmin) return; let stopped = false; const refreshWaitlistStatus = async () => { const currentSession = getSession(); if (!currentSession.currentUid || !currentSession.currentGid) return; const freshUser = await getUser(currentSession.currentUid); if (stopped) return; if (freshUser?.IsAcceptedAdmin) { setPendingAdmin(false); setSessionUser(freshUser); setSessionTeam(freshUser.TGid ?? null); navigation.reset({index: 0, routes: [{name: 'Admin'}]}); return; } const waitlist = await getAdminWaitlist(currentSession.currentGid, currentSession.currentUid); if (stopped) return; const isStillWaiting = waitlist.length > 0; setOnAdminWaitlist(isStillWaiting); if (!isStillWaiting) { setPendingAdmin(false); } }; refreshWaitlistStatus(); const intervalId = setInterval(refreshWaitlistStatus, 5000); return () => { stopped = true; clearInterval(intervalId); }; }, [onAdminWaitlist, session.isPendingAdmin]); const handleJoinTeam = async () => { if (!teamCode.trim()) return; // Force uppercase just in case a lowercase code is pasted const code = teamCode.trim().toUpperCase(); const result = await joinTeamByCode({ JoinCode: code, Uid: session.currentUid, ExpectedSGid: session.currentSGid, }); if (!result) return; // If the server indicates this code matched the admin join code if (result.adminWaitlist) { setPendingAdmin(true); setOnAdminWaitlist(true); return; } setSessionTeam(result.Tid); setActiveTid(result.Tid); }; const handleCreateTeam = async () => { if (!session.currentGid) return; const result = await createTeam({Gid: session.currentGid, SGid: session.currentSGid, TeamName: 'My Team'}); if (!result) return; const membership = await joinTeamByCode({Tid: result.Tid, Uid: session.currentUid}); if (membership) { setSessionTeam(result.Tid); setActiveTid(result.Tid); } }; const handleLeaveTeam = async () => { const myMembership = members.find((m) => m.Uid === session.currentUid); if (!myMembership) return; await leaveTeam(myMembership.id); await updateUser(session.currentUid, {TGid: null}); setSessionTeam(null); setActiveTid(null); setTeam(null); setMembers([]); setMemberNames({}); }; const handleKickMember = async (member) => { await leaveTeam(member.id); await loadTeamData(activeTid); }; const handleRenameTeam = async () => { const trimmed = teamNameDraft.trim(); if (!trimmed || !activeTid) return; const result = await updateTeam(activeTid, {TeamName: trimmed}); if (result) { setTeam(result); setEditingName(false); } }; // Check if current user is the team leader const myMembership = members.find((m) => m.Uid === session.currentUid); const isCurrentUserLeader = Boolean(myMembership?.IsLeader); // View ----------------------- if (loading) { return ( ); } if (teamsDisabled) { return ( Teams Disabled The admin has not enabled teams for this game. ); } // Waiting for admin approval if (onAdminWaitlist) { return ( Waiting to be approved for Admin Team ); } // Not in a team if (!activeTid || !team) { // Disable team actions until the user has joined a game const notInGame = !session.currentGid; return ( {notInGame && ( Join a game first to manage teams. )} setTeamCode(text.toUpperCase())} autoCapitalize="characters" editable={!notInGame} />