import { useNavigate } from "react-router"; import { NavBar } from "../components/NavBar"; import { useAuth } from "../contexts/AuthContext"; import SessionExpiredPopup from "../components/SessionExpiredPopup"; import UnauthorizedAccess from "../components/UnauthorizedAccess"; import CollapsibleSection from "../components/admin/CollapsibleSection"; import InviteCodeManager from "../components/admin/InviteCodeManager"; import GameManager from "../components/admin/GameManager"; import UserDeletion from "../components/admin/UserDeletion"; import { useState } from "react"; interface GameFormData { gameInternalName: string; gameFormattedName: string; gameDescription: string; } interface InviteFormData { uses: string; code: string; } const Admin = () => { const { user, isLoading, logout } = useAuth(); const [showAddGame, setShowAddGame] = useState(false); const [showCreateInvite, setShowCreateInvite] = useState(false); const [showUserDeletion, setShowUserDeletion] = useState(false); const [isSubmitting, setIsSubmitting] = useState(false); const [isCreatingInvite, setIsCreatingInvite] = useState(false); const [createdInviteCode, setCreatedInviteCode] = useState(null); const navigate = useNavigate(); const handleLogout = async () => { try { await logout(); navigate("/"); } catch (error) { console.error("Logout failed:", error); alert("Network error during logout. Please try again."); } }; const handleGameSubmit = async (formData: GameFormData) => { setIsSubmitting(true); try { const response = await fetch(import.meta.env.VITE_API_URL + '/admin/createGame', { method: 'POST', headers: { 'Content-Type': 'application/json', }, credentials: 'include', body: JSON.stringify(formData), }); if (!response.ok) { const error = await response.json(); throw new Error(error.error || 'Failed to create game'); } alert('Game created successfully!'); setShowAddGame(false); } catch (error) { console.error('Failed to create game:', error); alert(error instanceof Error ? error.message : 'Failed to create game'); } finally { setIsSubmitting(false); } }; const handleInviteSubmit = async (inviteFormData: InviteFormData) => { const uses = parseInt(inviteFormData.uses); if (isNaN(uses) || uses <= 0) { alert('Please enter a valid number of uses'); return; } setIsCreatingInvite(true); try { const requestBody: { uses: number; code?: string } = { uses }; if (inviteFormData.code.trim()) { requestBody.code = inviteFormData.code.trim(); } const response = await fetch(import.meta.env.VITE_API_URL + '/admin/createInvite', { method: 'POST', headers: { 'Content-Type': 'application/json', }, credentials: 'include', body: JSON.stringify(requestBody), }); if (!response.ok) { const error = await response.json(); throw new Error(error.error || 'Failed to create invite code'); } const result = await response.json(); setCreatedInviteCode(result.inviteCode.code); } catch (error) { console.error('Failed to create invite code:', error); alert(error instanceof Error ? error.message : 'Failed to create invite code'); } finally { setIsCreatingInvite(false); } }; const handleUserDeleted = () => { // Optional: Add any additional logic after user deletion console.log('User deleted successfully'); }; if (isLoading) { return

Loading Admin Dashboard...

; } if (!user) { return ; } if (!user.isAdmin && user.id != 1) { return ; } return (
{/* Main Content */}

Admin Page

Welcome Mirage Webmaster! Here are a variety of settings and tools you can use to customize the experience

{/* Create Invite Code Section */} setShowCreateInvite(!showCreateInvite)} > {/* Add New Game Section */} setShowAddGame(!showAddGame)} > {/* User Deletion Section */} setShowUserDeletion(!showUserDeletion)} >
); }; export default Admin;