Add React frontend and clean up legacy HTTP backend

This commit is contained in:
tim committed 2026-06-15 22:20:56 +02:00
1 parent b8e2d15e27
commit beaf142ee4
40 files changed
+8328 -437

No files matched your search

+69
View File
@@ -0,0 +1,69 @@
import { io } from 'socket.io-client';
import { useGameStore } from '../store/gameStore';
import type { GameInfo, GameStatusPayload, Hand, MyPlayer } from '../types';
export const socket = io({ autoConnect: false });
// Module-level state for the create→register chain and gid resolution on register_player
let _pendingGid: string | null = null;
let _createName: string | null = null;
export const emit = {
createGame: (name: string) => {
_createName = name;
socket.emit('create_game', name);
},
registerPlayer: (gid: string, name: string) => {
_pendingGid = gid;
socket.emit('register_player', gid, name);
},
leaveGame: () => socket.emit('leave_game'),
startGame: (gid: string) => socket.emit('start_game', gid),
reconnectToGame: (gid: string, token: string) => socket.emit('reconnect_to_game', gid, token),
gameStatus: () => socket.emit('game_status'),
playerCards: () => socket.emit('player_cards'),
addGuess: (guess: number) => socket.emit('add_guess', guess),
playCard: (cardKey: string) => socket.emit('play_card', cardKey),
};
export function setupSocketListeners() {
socket.on('get_games', ({ games }: { games: GameInfo[] }) => {
useGameStore.getState().setGames(games);
});
socket.on('create_game', ({ gid }: { gid: string }) => {
// Auto-chain: register into the just-created game using the stored name
if (_createName !== null) {
emit.registerPlayer(gid, _createName);
_createName = null;
}
});
socket.on(
'register_player',
({ player, token }: { player: { order: number; name: string }; token: string }) => {
const saved = localStorage.getItem('bridzik_player');
const gid = _pendingGid ?? (saved ? (JSON.parse(saved) as MyPlayer).gid : '');
_pendingGid = null;
const myPlayer: MyPlayer = { ...player, token, gid };
useGameStore.getState().setMyPlayer(myPlayer);
localStorage.setItem('bridzik_player', JSON.stringify(myPlayer));
}
);
socket.on('game_status', (payload: GameStatusPayload) => {
useGameStore.getState().setGameStatus(payload);
});
socket.on('player_cards', ({ cards }: { cards: Hand }) => {
useGameStore.getState().setHand(cards);
});
socket.on('player_connection', ({ order, connected }: { order: number; connected: boolean }) => {
useGameStore.getState().updatePlayerConnection(order, connected);
});
socket.on('error', ({ error }: { error: string }) => {
useGameStore.getState().setError(error);
});
}