mirror of
https://github.com/clash-verge-rev/clash-verge-rev.git
synced 2026-04-13 05:20:28 +08:00
* chore(deps): update dependency typescript to v6 * chore: remove deprecated config --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Slinetrac <realakayuki@gmail.com>
106 lines
3.0 KiB
TypeScript
106 lines
3.0 KiB
TypeScript
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 = [
|
|
<ThemeModeProvider key="theme" initialState={initialThemeMode} />,
|
|
<LoadingCacheProvider key="loading" />,
|
|
<UpdateStateProvider key="update" />,
|
|
]
|
|
|
|
const root = createRoot(container)
|
|
root.render(
|
|
<React.StrictMode>
|
|
<ComposeContextProvider contexts={contexts}>
|
|
<BaseErrorBoundary>
|
|
<WindowProvider>
|
|
<AppDataProvider>
|
|
<RouterProvider router={router} />
|
|
</AppDataProvider>
|
|
</WindowProvider>
|
|
</BaseErrorBoundary>
|
|
</ComposeContextProvider>
|
|
</React.StrictMode>,
|
|
)
|
|
}
|
|
|
|
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()
|
|
})
|