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 && (