add features

This commit is contained in:
Aidan Haas 2025-07-07 17:28:52 -04:00
parent 6b531bb32f
commit 2f4cdc25ce
4 changed files with 51 additions and 10 deletions

4
README.md Normal file
View File

@ -0,0 +1,4 @@
# Pool Tracker
Simple web app the keeps track of who's turn it is in pool.
Add the players with the homepage, and view who's turn it is on the `/live` page

View File

@ -2,7 +2,7 @@ import eventlet
eventlet.monkey_patch() eventlet.monkey_patch()
from flask import Flask, jsonify from flask import Flask, jsonify, request
from flask_cors import CORS from flask_cors import CORS
from flask_socketio import SocketIO from flask_socketio import SocketIO
@ -12,11 +12,40 @@ socketio = SocketIO(app, cors_allowed_origins="*")
game_state = { game_state = {
"gameActive": True, "gameActive": False,
"players": ["Alice", "Bob", "Charlie"], "players": [],
"playerTurn": 0 "playerTurn": 0
} }
@app.route("/add", methods=["POST"])
def add_player():
data = request.get_json()
if not data:
return jsonify({"error": "No JSON body received"}), 400
name = data.get("name")
group = data.get("group")
if not name or group not in ["stripes", "solids"]:
return jsonify({"error": "Invalid data"}), 400
game_state["players"].append({"name": name, "group": group})
# emit socket update
socketio.emit("player_update", {"players": game_state["players"]})
return jsonify({"message": f"Player {name} added to {group} group"})
@app.route("/reset", methods=["GET"])
def reset():
game_state = {
"gameActive": False,
"players": [""],
"playerTurn": 0
}
return jsonify(game_state)
@app.route("/status", methods=["GET"]) @app.route("/status", methods=["GET"])
def status(): def status():
return jsonify(game_state) return jsonify(game_state)

View File

@ -36,7 +36,7 @@ export default function HomePage() {
<div className="mb-4"> <div className="mb-4">
{currentPlayer ? ( {currentPlayer ? (
<p className="text-lg"> <p className="text-lg">
🎯 Current Player: <strong>{currentPlayer}</strong> 🎯 Current Player: <strong>{currentPlayer.name} ({currentPlayer.group})</strong>
</p> </p>
) : ( ) : (
<p className="text-gray-500">Waiting for turn to start</p> <p className="text-gray-500">Waiting for turn to start</p>

View File

@ -33,6 +33,14 @@ const addPlayer = async () => {
}; };
const [selectedGroup, setSelectedGroup] = useState<"stripes" | "solids">("stripes"); const [selectedGroup, setSelectedGroup] = useState<"stripes" | "solids">("stripes");
const advanceTurn = async () => {
await fetch('http://localhost:8080/next'); // triggers backend to emit event
};
const resetGame = async () => {
await fetch('http://localhost:8080/reset'); // triggers backend to emit event
};
return ( return (
<div className="grid grid-rows-[20px_1fr_20px] items-center justify-items-center min-h-screen p-8 pb-20 gap-16 sm:p-20 font-[family-name:var(--font-geist-sans)]"> <div className="grid grid-rows-[20px_1fr_20px] items-center justify-items-center min-h-screen p-8 pb-20 gap-16 sm:p-20 font-[family-name:var(--font-geist-sans)]">
<main className="flex flex-col gap-[32px] row-start-2 items-center sm:items-start"> <main className="flex flex-col gap-[32px] row-start-2 items-center sm:items-start">
@ -85,14 +93,14 @@ const addPlayer = async () => {
/> />
Start Game Start Game
</a> </a>
<a <button
className="rounded-full border border-solid border-black/[.08] dark:border-white/[.145] transition-colors flex items-center justify-center hover:bg-[#f2f2f2] dark:hover:bg-[#1a1a1a] hover:border-transparent font-medium text-sm sm:text-base h-10 sm:h-12 px-4 sm:px-5 w-full sm:w-auto md:w-[158px]" className="rounded-full border border-solid border-black/[.08] dark:border-white/[.145] transition-colors flex items-center justify-center hover:bg-[#f2f2f2] dark:hover:bg-[#1a1a1a] hover:border-transparent font-medium text-sm sm:text-base h-10 sm:h-12 px-4 sm:px-5 w-full sm:w-auto md:w-[158px]"
href="https://nextjs.org/docs?utm_source=create-next-app&utm_medium=appdir-template-tw&utm_campaign=create-next-app" onClick={resetGame}
target="_blank"
rel="noopener noreferrer"
> >
Reset Game Reset Game</button>
</a> <button
onClick={advanceTurn}
className="rounded-full border border-solid border-transparent transition-colors flex items-center justify-center bg-foreground text-background gap-2 hover:bg-[#383838] dark:hover:bg-[#ccc] font-medium text-sm sm:text-base h-10 sm:h-12 px-4 sm:px-5 sm:w-auto">Next Turn</button>
</div> </div>
</main> </main>
</div> </div>