import React, { useEffect, useState } from "react"; import { motion, AnimatePresence } from "framer-motion"; import { useNakama } from "./providers/NakamaProvider"; export default function Player({ onMatchDataCallback, }: { onMatchDataCallback: (msg: any) => void; }) { const { session, matchId, loginOrRegister, logout, onMatchData, joinMatchmaker, exitMatchmaker, } = useNakama(); const [username, setUsername] = useState( localStorage.getItem("username") ?? "" ); const [selectedGame, setSelectedGame] = useState("tictactoe"); const [selectedMode, setSelectedMode] = useState("classic"); const [isQueueing, setIsQueueing] = useState(false); const isRegistered = localStorage.getItem("registered") === "yes"; // ------------------------------------------ // CONNECT // ------------------------------------------ async function handleConnect() { await loginOrRegister(username); // Match data listener onMatchData(onMatchDataCallback); } // ------------------------------------------ // MATCHMAKING // ------------------------------------------ async function startQueue( selectedGame: string, selectedMode: string ) { setIsQueueing(true); const gameMetadata = { game: selectedGame, mode: selectedMode, } try { const ticket = await joinMatchmaker(gameMetadata); console.log("Queued:", ticket); } catch (err) { console.error("Matchmaking failed:", err); setIsQueueing(false); } } async function cancelQueue( selectedGame: string, selectedMode: string ) { setIsQueueing(false); const gameMetadata = { game: selectedGame, mode: selectedMode, } await exitMatchmaker(gameMetadata) } useEffect(() => { handleConnect(); }, []); return (
{/* ---------------- LOGIN SCREEN ---------------- */} {!session && (

Welcome!

setUsername(e.target.value)} style={{ padding: "10px", width: "100%", borderRadius: "12px", background: "#222", color: "white", border: "1px solid #333", marginBottom: "12px", fontSize: "14px", }} /> Connect
)} {/* ---------------- LOBBY SCREEN ---------------- */} {session && !matchId && (

Hello, {session.username}

{!isQueueing && ( startQueue( selectedGame, selectedMode, )} style={{ padding: "10px 20px", borderRadius: "12px", background: "#3498db", color: "white", border: "none", marginRight: "10px", cursor: "pointer", fontWeight: 600, }} > Join Matchmaking )} {/* Queueing animation */} {isQueueing && (
Finding an opponent…
{/* Animated pulsing dots */} ● ● ● {/* Cancel button */}
)}
Logout
)} {/* ---------------- MATCH SCREEN ---------------- */} {session && matchId && (

Go, {session.username}

)}
); }