feat: reconexión de sesión + 6 nuevas categorías + corrección de bugs
- Añade sistema de reconexión tras refresh/cierre del navegador - Persistencia de sesión en localStorage (3h TTL) - Banner de reconexión en Home - Evento rejoin_room en backend - Nuevas categorías: Series TV, Marvel/DC, Disney, Memes, Pokémon, Mitología - Correcciones de bugs: - Fix: juego bloqueado al fallar robo (steal decision) - Fix: jugador duplicado al cambiar de equipo - Fix: rotación incorrecta de turno tras fallo - Config: soporte para Cloudflare tunnel (allowedHosts) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
import { useEffect, useCallback } from 'react'
|
||||
import { useGameStore } from '../stores/gameStore'
|
||||
import { useGameStore, saveSession, clearSession } from '../stores/gameStore'
|
||||
import { soundPlayer } from './useSound'
|
||||
import { useThemeStore } from '../stores/themeStore'
|
||||
import { useSoundStore } from '../stores/soundStore'
|
||||
@@ -58,6 +58,25 @@ export function useSocket() {
|
||||
setRoom(data.room)
|
||||
})
|
||||
|
||||
// Reconnection events
|
||||
socket.on('rejoin_success', (data: { room: GameRoom; player_name: string; team: 'A' | 'B' }) => {
|
||||
console.log('Rejoin successful:', data.player_name)
|
||||
setRoom(data.room)
|
||||
useGameStore.getState().setPlayerName(data.player_name)
|
||||
// Update saved session with possibly new team
|
||||
saveSession(data.room.code, data.player_name, data.team)
|
||||
})
|
||||
|
||||
socket.on('rejoin_failed', (data: { message: string }) => {
|
||||
console.log('Rejoin failed:', data.message)
|
||||
clearSession()
|
||||
})
|
||||
|
||||
socket.on('player_reconnected', (data: { player_name: string; team: string; room: GameRoom }) => {
|
||||
console.log('Player reconnected:', data.player_name)
|
||||
setRoom(data.room)
|
||||
})
|
||||
|
||||
// Game events
|
||||
socket.on('game_started', (data: { room: GameRoom }) => {
|
||||
setRoom(data.room)
|
||||
@@ -268,10 +287,19 @@ export function useSocket() {
|
||||
socketService.emit('timer_expired', {})
|
||||
}, [])
|
||||
|
||||
const rejoinRoom = useCallback((roomCode: string, playerName: string, team: 'A' | 'B') => {
|
||||
socketService.emit('rejoin_room', {
|
||||
room_code: roomCode,
|
||||
player_name: playerName,
|
||||
team,
|
||||
})
|
||||
}, [])
|
||||
|
||||
return {
|
||||
socket: socketService.connect(),
|
||||
createRoom,
|
||||
joinRoom,
|
||||
rejoinRoom,
|
||||
changeTeam,
|
||||
startGame,
|
||||
selectQuestion,
|
||||
|
||||
Reference in New Issue
Block a user