diff --git a/dripzone-app/src/app/admin/error.tsx b/dripzone-app/src/app/admin/error.tsx new file mode 100644 index 0000000..ae69163 --- /dev/null +++ b/dripzone-app/src/app/admin/error.tsx @@ -0,0 +1,100 @@ +'use client'; + +import React, { useEffect } from 'react'; +import Link from 'next/link'; +import { AlertTriangle, RefreshCw, ArrowLeft, LayoutDashboard, Sparkles } from 'lucide-react'; + +export default function AdminError({ + error, + reset, +}: { + error: Error & { digest?: string }; + reset: () => void; +}) { + useEffect(() => { + console.error('[AdminError Boundary]:', error); + + // Si es un ChunkLoadError por un despliegue reciente en Coolify, recargar automáticamente + const isChunkError = + error.message?.includes('Loading chunk') || + error.message?.includes('ChunkLoadError') || + error.message?.includes('Failed to fetch dynamically imported module'); + + if (isChunkError) { + const lastReload = sessionStorage.getItem('dripzone_admin_error_reload'); + const now = Date.now(); + if (!lastReload || now - parseInt(lastReload, 10) > 10000) { + sessionStorage.setItem('dripzone_admin_error_reload', now.toString()); + window.location.reload(); + } + } + }, [error]); + + const handleHardReload = () => { + try { + sessionStorage.removeItem('dripzone_admin_error_reload'); + // Forzar recarga sin caché + window.location.href = window.location.pathname + '?v=' + Date.now(); + } catch (_) { + window.location.reload(); + } + }; + + return ( +
+ Se ha actualizado el sistema en producción o hubo una desconexión temporal de módulos. + Haz clic en recargar para actualizar tu navegador con la última versión del catálogo. +
++ {error.message} +
+