feat: Dashboard de Admin 2.0 - Persistencia y Actualizaciones en Tiempo Real

- Implementar persistencia de sesión en Dashboard mediante localStorage
- Añadir botón de desconexión (Logout)
- Implementar sistema de broadcast para que el Dashboard se actualice automáticamente ante cualquier cambio en el servidor
- Mejorar diseño táctico del dashboard con visor de estadísticas rápidas
This commit is contained in:
Resistencia Dev
2025-12-22 18:24:25 +01:00
parent 1548309753
commit 91da241423
2 changed files with 234 additions and 130 deletions

View File

@@ -83,6 +83,29 @@ const generateRoomName = () => {
return `${MISSION_NAMES[idx]} #${suffix}`;
};
const getAdminData = async () => {
const activeGamesData = Object.values(games).map(g => ({
id: g.state.roomId,
name: g.roomName,
status: g.state.phase,
currentPlayers: g.state.players.length,
maxPlayers: g.maxPlayers,
players: g.state.players.map(p => ({ id: p.id, name: p.name }))
}));
const history = await getGameHistory();
return {
activeGames: activeGamesData,
history: history
};
};
const broadcastAdminUpdate = async () => {
const data = await getAdminData();
io.to('admin-room').emit('admin_data', data);
};
io.on('connection', (socket) => {
console.log('Cliente conectado:', socket.id);
@@ -110,6 +133,7 @@ io.on('connection', (socket) => {
// LOG EN DB
logGameStart(roomId, roomName, hostName, maxPlayers);
broadcastAdminUpdate();
});
// B. UNIRSE A SALA
@@ -149,6 +173,7 @@ io.on('connection', (socket) => {
// ACTUALIZAR LOG EN DB
updateGamePlayers(roomId, game.state.players.map(p => p.name));
broadcastAdminUpdate();
});
// C. REFRESCAR LISTA
@@ -324,6 +349,7 @@ io.on('connection', (socket) => {
// LOG EN DB
logGameEnd(roomId, game.state.winner, false);
broadcastAdminUpdate();
}
});
@@ -356,6 +382,7 @@ io.on('connection', (socket) => {
// LOG EN DB COMO ABORTADA
logGameEnd(roomId, null, true);
broadcastAdminUpdate();
console.log(`[LEAVE_GAME] ${playerName} abandonó la partida ${roomId}. Partida eliminada.`);
}
@@ -421,22 +448,10 @@ io.on('connection', (socket) => {
// --- ADMIN COMMANDS ---
socket.on('admin_get_data', async () => {
console.log('[ADMIN] Petición de datos del dashboard');
const activeGamesData = Object.values(games).map(g => ({
id: g.state.roomId,
name: g.roomName,
status: g.state.phase,
currentPlayers: g.state.players.length,
maxPlayers: g.maxPlayers,
players: g.state.players.map(p => ({ id: p.id, name: p.name }))
}));
const history = await getGameHistory();
socket.emit('admin_data', {
activeGames: activeGamesData,
history: history
});
console.log('[ADMIN] Agente administrativo conectado');
socket.join('admin-room');
const data = await getAdminData();
socket.emit('admin_data', data);
});
socket.on('admin_close_game', async ({ roomId }) => {
@@ -456,6 +471,7 @@ io.on('connection', (socket) => {
// Log como abortada por admin
await logGameEnd(roomId, null, true);
socket.emit('admin_action_success');
broadcastAdminUpdate();
}
});
@@ -480,6 +496,7 @@ io.on('connection', (socket) => {
updateGamePlayers(roomId, game.state.players.map(p => p.name));
socket.emit('admin_action_success');
broadcastAdminUpdate();
}
}
});