/// /// import "./assets/styles/index.scss"; import "./utils/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"; import { isIgnoredMonacoWorkerError, patchMonacoWorkerConsole, } from "./utils/monaco-worker-ignore"; 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())); }); }); patchMonacoWorkerConsole(); // Error handling window.addEventListener("error", (event) => { if (isIgnoredMonacoWorkerError(event.error ?? event.message)) { event.preventDefault(); return; } console.error("[main.tsx] Global error:", event.error); }); window.addEventListener("unhandledrejection", (event) => { if (isIgnoredMonacoWorkerError(event.reason)) { event.preventDefault(); return; } 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(); });