import './assets/styles/index.scss' import './services/monaco' import { ResizeObserver } from '@juggle/resize-observer' import { ComposeContextProvider } from 'foxact/compose-context-provider' import React from 'react' import { createRoot } from 'react-dom/client' import { RouterProvider } from 'react-router' import { MihomoWebSocket } from 'tauri-plugin-mihomo-api' import { BaseErrorBoundary } from './components/base' import { router } from './pages/_routers' import { AppDataProvider } from './providers/app-data-provider' import { WindowProvider } from './providers/window' import { FALLBACK_LANGUAGE, initializeLanguage } from './services/i18n' import { preloadAppData, resolveThemeMode, getPreloadConfig, } from './services/preload' import { LoadingCacheProvider, ThemeModeProvider, UpdateStateProvider, } from './services/states' import { disableWebViewShortcuts } from './utils/disable-webview-shortcuts' if (!window.ResizeObserver) { window.ResizeObserver = ResizeObserver } const mainElementId = 'root' const container = document.getElementById(mainElementId) if (!container) { throw new Error(`No container '${mainElementId}' found to render application`) } disableWebViewShortcuts() const initializeApp = (initialThemeMode: 'light' | 'dark') => { const contexts = [ , , , ] const root = createRoot(container) root.render( , ) } const bootstrap = async () => { const { initialThemeMode } = await preloadAppData() initializeApp(initialThemeMode) } bootstrap().catch((error) => { console.error( '[main.tsx] App bootstrap failed, falling back to default language:', error, ) initializeLanguage(FALLBACK_LANGUAGE) .catch((fallbackError) => { console.error( '[main.tsx] Fallback language initialization failed:', fallbackError, ) }) .finally(() => { initializeApp(resolveThemeMode(getPreloadConfig())) }) }) // Error handling window.addEventListener('error', (event) => { console.error('[main.tsx] Global error:', event.error) }) window.addEventListener('unhandledrejection', (event) => { console.error('[main.tsx] Unhandled promise rejection:', event.reason) }) // Page close/refresh events window.addEventListener('beforeunload', () => { // Clean up all WebSocket instances to prevent memory leaks MihomoWebSocket.cleanupAll() }) // Page loaded event window.addEventListener('DOMContentLoaded', () => { // Clean up all WebSocket instances to prevent memory leaks MihomoWebSocket.cleanupAll() })