From d962d9c5eb7f74a3aa26c3692f721469ab2bfefa Mon Sep 17 00:00:00 2001 From: Vishesh 'ironeagle' Bangotra Date: Sat, 29 Nov 2025 02:29:31 +0530 Subject: [PATCH] - Created new Player.tsx component to handle username input, auto-connect, matchmaking, and logout. - Moved all login, session UI, mode selection, and matchmaking logic from TicTacToe.tsx into Player.tsx. - Added onMatchDataCallback prop support for Player component. - Cleaned up TicTacToe.tsx by removing duplicated login/matchmaking UI and connect logic. - Improved auto-connect on mount via Player.tsx. --- src/tictactoe/Player.tsx | 82 +++++++++++++++++++++++++++++++++++++ src/tictactoe/TicTacToe.tsx | 74 +++------------------------------ 2 files changed, 88 insertions(+), 68 deletions(-) create mode 100644 src/tictactoe/Player.tsx diff --git a/src/tictactoe/Player.tsx b/src/tictactoe/Player.tsx new file mode 100644 index 0000000..149b307 --- /dev/null +++ b/src/tictactoe/Player.tsx @@ -0,0 +1,82 @@ +import React, { useEffect, useState } from "react"; +import Leaderboard from "./Leaderboard"; +import { useNakama } from "./providers/NakamaProvider"; + +export default function Player({ + onMatchDataCallback, +}: { + onMatchDataCallback: (msg: any) => void; +}) { + const { + session, + matchId, + loginOrRegister, + logout, + onMatchData, + joinMatchmaker, + } = useNakama(); + + const [username, setUsername] = useState( + localStorage.getItem("username") ?? "" + ); + const [selectedMode, setSelectedMode] = useState("classic"); + + // ------------------------------------------ + // CONNECT + // ------------------------------------------ + async function handleConnect() { + await loginOrRegister(username); + + // Match data listener + onMatchData(onMatchDataCallback); + } + + // ------------------------------------------ + // MATCHMAKING + // ------------------------------------------ + async function startQueue(selectedMode: string) { + const ticket = await joinMatchmaker(selectedMode); + console.log("Queued:", ticket); + } + + useEffect(() => { + handleConnect(); + }, []); + + return ( +
+ {session && !matchId && ( + <> +

Hello, {session.username}

+ + {/* Game mode selection */} + + + + + {/* Join matchmaking */} + + + + {/*/!* List open matches *!/*/} + {/**/} + + + )} + {session && matchId && ( + <> +

Go {session.username}!

+ + )} +
+ ); +} diff --git a/src/tictactoe/TicTacToe.tsx b/src/tictactoe/TicTacToe.tsx index 7b2fefb..3ebd3e9 100644 --- a/src/tictactoe/TicTacToe.tsx +++ b/src/tictactoe/TicTacToe.tsx @@ -1,13 +1,11 @@ import { useState, useEffect } from "react"; import { useNakama } from "./providers/NakamaProvider"; import Board from "./Board"; -import Leaderboard from "./Leaderboard"; +import Player from "./Player"; // import { Match } from "@heroiclabs/nakama-js"; // import MatchList from "./MatchList"; export default function TicTacToe() { - const [username, setUsername] = useState(localStorage.getItem("username") ?? ""); - const [selectedMode, setSelectedMode] = useState("classic"); const [board, setBoard] = useState([ ["", "", ""], ["", "", ""], @@ -33,13 +31,11 @@ export default function TicTacToe() { setPlayers(state.players || []); } } + const { - loginOrRegister, - logout, - joinMatchmaker, onMatchData, sendMatchData, - listOpenMatches, + // listOpenMatches, matchId, session, } = useNakama(); @@ -67,20 +63,6 @@ export default function TicTacToe() { // }; // }, [listOpenMatches]); - // ------------------------------------------ - // CONNECT - // ------------------------------------------ - async function connect() { - await loginOrRegister(username); - - // Match data listener - onMatchData(onMatchDataCallback); - } - - useEffect(() => { - connect(); - }, []); - // ------------------------------------------ // SEND A MOVE // ------------------------------------------ @@ -90,57 +72,13 @@ export default function TicTacToe() { sendMatchData(matchId, 1, { row, col }); // OpMove=1 } - // ------------------------------------------ - // MATCHMAKING - // ------------------------------------------ - async function startQueue(selectedMode: string) { - const ticket = await joinMatchmaker(selectedMode); - console.log("Queued:", ticket); - } - return (

Tic Tac Toe Multiplayer

- {!session && ( - <> - 0} - onChange={(e) => setUsername(e.target.value)} - /> - - - )} - - {session && !matchId && ( - <> -

Hello, {session.username}

- - {/* Game mode selection */} - - - - - {/* Join matchmaking */} - - - - {/*/!* List open matches *!/*/} - {/**/} - - - )} + {matchId && (