"use client"; import { useState, useEffect, useCallback } from "react"; import { useSession } from "next-auth/react"; import { useRouter } from "next/navigation"; import Link from "next/link"; export default function TeamPage({ params }) { const { status, data: session } = useSession(); const [team, setTeam] = useState(null); const [teamMembers, setTeamMembers] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(""); const router = useRouter(); const { teamId } = params; const fetchTeamData = useCallback(async () => { try { if (!teamId || isNaN(parseInt(teamId, 10))) { throw new Error("Invalid team ID"); } const response = await fetch(`/api/teams/${teamId}`, { method: "GET", headers: { "Content-Type": "application/json", }, credentials: "include", }); if (!response.ok) { const text = await response.text(); let errorMessage; try { const errorData = JSON.parse(text); errorMessage = errorData.error || "Failed to fetch team data"; } catch (unused) { errorMessage = `Failed to fetch team data: ${ response.status } ${text.slice(0, 100)}`; } throw new Error(errorMessage); } const data = await response.json(); if (!data.team) { throw new Error("Team not found"); } setTeam(data.team); setTeamMembers(data.members || []); setError(""); } catch (err) { console.error("Team page error:", err); setError(err.message); // If we get a 401 error, redirect to login if (err.message.includes("401")) { router.push("/login"); } } finally { setLoading(false); } }, [teamId, router]); useEffect(() => { if (status === "authenticated" && teamId) { fetchTeamData(); const interval = setInterval(fetchTeamData, 5000); // Refresh every 5 seconds return () => clearInterval(interval); } else if (status === "unauthenticated") { router.push("/login"); } }, [teamId, status, fetchTeamData, router]); const handleLeaveTeam = async () => { try { setLoading(true); const response = await fetch(`/api/teams/${teamId}/leave`, { method: "POST", headers: { "Content-Type": "application/json", }, credentials: "include", }); if (!response.ok) { const errorData = await response.json(); throw new Error(errorData.error || "Failed to leave team"); } // Redirect to team selection after leaving router.push("/team-selection"); } catch (err) { console.error("Leave team error:", err); setError(err.message); } finally { setLoading(false); } }; const handleStartHunt = async () => { try { if (session?.user?.role !== "admin") { setError("Only admins can start a hunt"); return; } setLoading(true); const response = await fetch(`/api/teams/${teamId}/start-hunt`, { method: "POST", headers: { "Content-Type": "application/json", }, credentials: "include", }); if (!response.ok) { const errorData = await response.json(); throw new Error(errorData.error || "Failed to start hunt"); } // You could redirect to a hunt page or refresh the current page // For now, just refresh the team data await fetchTeamData(); } catch (err) { console.error("Start hunt error:", err); setError(err.message); } finally { setLoading(false); } }; const handleAddUser = () => { // Navigate to add user page or open a modal router.push(`/team/${teamId}/add-user`); }; if (status === "loading" || loading) { return