GameControl - Gestión de Salas Gaming

Solución al Error de Charts en Dashboard

❌ Problema Identificado

Error: Canvas is already in use. Chart with ID '0' must be destroyed before the canvas with ID 'ingresoChart' can be reused.

Causa: El dashboard se estaba inicializando múltiples veces, creando conflictos entre instancias de Chart.js que intentaban usar el mismo canvas.

✅ Soluciones Implementadas

1. Patrón Singleton para DashboardManager

class DashboardManager {
    constructor() {
        // Prevenir múltiples inicializaciones
        if (window.dashboardManagerInstance) {
            console.log('⚠️ DashboardManager ya está inicializado, retornando instancia existente');
            return window.dashboardManagerInstance;
        }
        
        // Marcar como instancia global
        window.dashboardManagerInstance = this;
        
        this.init();
    }
}

Beneficios:

2. Limpieza Automática de Gráficos

limpiarGraficos() {
    // Destruir gráficos existentes si existen
    if (this.charts.ingresos) {
        this.charts.ingresos.destroy();
        this.charts.ingresos = null;
    }
    if (this.charts.distribucion) {
        this.charts.distribucion.destroy();
        this.charts.distribucion = null;
    }
    
    // Limpiar el objeto de gráficos
    this.charts = {};
    
    console.log('🧹 Gráficos limpiados correctamente');
}

Beneficios:

3. Verificación de Canvas en Uso

crearGraficoIngresos() {
    const ctx = document.getElementById('ingresoChart');
    if (!ctx) {
        console.log('⚠️ Canvas ingresoChart no encontrado, omitiendo gráfico de ingresos');
        return;
    }

    // Verificar que el canvas no esté siendo usado por otro gráfico
    if (ctx.chart) {
        console.log('⚠️ Canvas ingresoChart ya tiene un gráfico, destruyendo el anterior...');
        ctx.chart.destroy();
        ctx.chart = null;
    }

    try {
        this.charts.ingresos = new Chart(ctx, { /* ... */ });
        
        // Marcar el canvas como usado por este gráfico
        ctx.chart = this.charts.ingresos;
        
        console.log('✅ Gráfico de ingresos creado correctamente');
    } catch (error) {
        console.error('❌ Error creando gráfico de ingresos:', error);
        this.charts.ingresos = null;
    }
}

Beneficios:

4. Prevención de Múltiples Inicializaciones

async init() {
    // Prevenir múltiples inicializaciones
    if (this.inicializado) {
        console.log('⚠️ DashboardManager ya está inicializado, omitiendo...');
        return;
    }
    
    try {
        // ... código de inicialización ...
        this.inicializado = true;
        console.log('✅ Dashboard Manager inicializado correctamente');
    } catch (error) {
        console.error('❌ Error inicializando Dashboard:', error);
    }
}

Beneficios:

5. Método Global de Acceso Seguro

// Método global para acceder al dashboard de forma segura
window.getDashboardManager = () => {
    if (window.dashboardManagerInstance) {
        return window.dashboardManagerInstance;
    }
    
    if (window.DashboardManager) {
        try {
            return new window.DashboardManager();
        } catch (error) {
            console.error('❌ Error creando nueva instancia de DashboardManager:', error);
            return null;
        }
    }
    
    return null;
};

Beneficios:

6. Mejora en la Inicialización del Index

// Usar el patrón singleton - solo crear si no existe
if (!window.dashboardManagerInstance) {
    window.dashboardManager = new window.DashboardManager();
    console.log('✅ Dashboard Manager inicializado correctamente');
} else {
    console.log('✅ Dashboard Manager ya existe, usando instancia existente');
    window.dashboardManager = window.dashboardManagerInstance;
}

Beneficios:

🔧 Archivos Modificados

js/dashboard.js

index.html

test_dashboard_charts_fixed.html (Nuevo)

🧪 Cómo Probar la Solución

  1. Abrir test_dashboard_charts_fixed.html
    • Ejecuta tests automáticos al cargar
    • Permite probar funcionalidades manualmente
  2. Verificar en Consola del Navegador
    • Deberían aparecer logs de inicialización exitosa
    • No deberían aparecer errores de “Canvas already in use”
  3. Probar Múltiples Inicializaciones
    • Usar botón “Test Múltiples Inicializaciones”
    • Verificar que solo se cree una instancia
  4. Probar Recreación de Gráficos
    • Usar botón “Test Recrear Gráfico”
    • Verificar que no haya conflictos de canvas

📊 Resultados Esperados

🚀 Próximos Pasos

  1. Probar en producción: Verificar que funcione en el entorno real
  2. Monitorear logs: Revisar consola para confirmar funcionamiento
  3. Integrar con otros módulos: Asegurar compatibilidad con salas, stock, etc.
  4. Optimizar rendimiento: Ajustar intervalos de actualización si es necesario

🔍 Troubleshooting

Si persisten problemas:

  1. Verificar consola: Buscar logs de error específicos
  2. Revisar orden de scripts: Asegurar que dashboard.js se cargue después de Chart.js
  3. Limpiar caché: Refrescar página con Ctrl+F5
  4. Verificar versiones: Confirmar compatibilidad de Chart.js

Estado: ✅ RESUELTO
Fecha: $(date)
Versión: Dashboard v2.0 (Con patrón singleton y manejo seguro de charts)