Add React frontend and clean up legacy HTTP backend
This commit is contained in:
1 parent
b8e2d15e27
commit
beaf142ee4
40 files changed
+8328
-437
No files matched your search
@@ -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);
|
||||
});
|
||||
}
|
||||
Reference in new issue
Block a user