import { StrictMode } from 'react'; import { createRoot } from 'react-dom/client'; import { BrowserRouter } from 'react-router-dom'; import App from './App.tsx'; import { AuthProvider } from './context/AuthContext'; import { PreviewProvider } from './context/PreviewContext'; import { PermisosProvider } from './context/PermisosContext'; import { UIFeedbackProvider } from './context/UIFeedbackContext'; import { InstitucionActivaProvider } from './context/InstitucionActivaContext'; import { VistaProvider } from './context/VistaContext'; import { ErrorBoundary } from './components/ErrorBoundary'; import { iniciarRastreoInteracciones } from './lib/ultimaInteraccion'; import './index.css'; import './i18n'; // Se aplica antes del primer render porque el toggle de tema vive en Layout // (solo montado tras iniciar sesion): sin esto, /login y cualquier pantalla // previa al login siempre arrancan en un tema fijo, ignorando la // preferencia guardada por el usuario en una sesion anterior. Default // pedido por el jefe: OSCURO por defecto (cambio de decision -- antes era // claro) -- el claro queda a eleccion explicita del usuario (localStorage // guarda 'light' solo cuando lo elige). // Safari en modo privado (o con "Prevent Cross-Site Tracking" agresivo) // puede lanzar una excepcion SINCRONA al leer localStorage, no solo // devolver null -- esto corre ANTES de montar React/ErrorBoundary, asi // que sin este try/catch un Safari asi deja la pantalla en blanco desde // el arranque, sin ningun error visible para el usuario ni para nosotros. try { document.documentElement.setAttribute('data-theme', localStorage.getItem('nexora_theme') === 'light' ? 'light' : 'dark'); document.documentElement.setAttribute('data-vista', localStorage.getItem('nexora_vista') === 'cuadricula' ? 'cuadricula' : 'lista'); } catch { document.documentElement.setAttribute('data-theme', 'dark'); document.documentElement.setAttribute('data-vista', 'lista'); } iniciarRastreoInteracciones(); // Libera el flag de "ya intente recargar por un chunk roto" (ver // ErrorBoundary.tsx) unos segundos despues de que la app carga bien -- // si de verdad se quedo arriba (no volvio a crashear apenas arranco), un // fallo de chunk FUTURO y distinto (otro deploy, otra ruta) merece su // propio intento de recarga automatica, no quedar bloqueado para siempre // por el resto de esta pestaƱa. setTimeout(() => { try { sessionStorage.removeItem('nexora_reload_chunk_error'); } catch { /* Safari privado: no hay flag que limpiar */ } }, 8000); createRoot(document.getElementById('root')!).render( );