add features
This commit is contained in:
parent
6b531bb32f
commit
2f4cdc25ce
4
README.md
Normal file
4
README.md
Normal 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
|
@ -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)
|
||||||
|
@ -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>
|
||||||
|
@ -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>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user