'use client'; import { useEffect, useState } from 'react'; import io from 'socket.io-client'; export default function HomePage() { let baseUrl = ""; if (typeof window !== "undefined") { baseUrl = `${window.location.protocol}//${window.location.hostname}`; } const backendUrl = `${baseUrl}:${process.env.NEXT_PUBLIC_API_BASE}`; const socket = io(`${backendUrl}`); const [time, setTime] = useState(new Date()); const [currentPlayer, setCurrentPlayer] = useState(null); const [gameStatus, setGameStatus] = useState<{ gameActive: boolean, players: any[] }>({ gameActive: false, players: [], }); useEffect(() => { socket.on('connect', () => { console.log('Connected to Socket.IO server'); }); socket.on('player_update', (data: { nextPlayer: string }) => { setCurrentPlayer(data.nextPlayer); fetchStatus(); }); return () => { socket.off('player_update'); }; }, []); // Idle clock stuff useEffect(() => { const interval = setInterval(() => setTime(new Date()), 1000); return () => clearInterval(interval); }, []); const timeString = time.toLocaleTimeString('en-US', { hour: 'numeric', minute: '2-digit', }); const dateString = time.toLocaleDateString('en-US', { month: 'long', day: 'numeric', year: 'numeric', }); const day = time.getDate(); const suffix = day % 10 === 1 && day !== 11 ? 'st' : day % 10 === 2 && day !== 12 ? 'nd' : day % 10 === 3 && day !== 13 ? 'rd' : 'th'; const formattedDate = `${time.toLocaleString('en-US', { month: 'long' })} ${day}${suffix}, ${time.getFullYear()}`; const advanceTurn = async () => { await fetch(`${baseUrl}/next`); // triggers backend to emit event }; const fetchStatus = async () => { try { const res = await fetch(`${backendUrl}/status`); const data = await res.json(); setGameStatus(data); } catch (err) { console.error("Failed to fetch status", err); } }; if (gameStatus.gameActive) { return (

Game Turn Tracker

{currentPlayer ? (

🎯 Current Player: {currentPlayer.name} ({currentPlayer.group})

) : (

Waiting for turn to start…

)}
); } else { return (
{timeString}
{formattedDate}
Go to {baseUrl} to start a game!
); } }