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:
@@ -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();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user