/*
Copyright (C) 2023-2026 QuantumNous
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, either version 3 of the
License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see .
For commercial licensing, please contact support@quantumnous.com
*/
import { QueryClientProvider } from '@tanstack/react-query'
import { RouterProvider, createRouter } from '@tanstack/react-router'
import { StrictMode } from 'react'
import ReactDOM from 'react-dom/client'
import { installBuildMetadata } from '@/lib/build-metadata'
import { applyFaviconToDom } from '@/lib/dom-utils'
import '@/lib/dayjs'
import { initializeFrontendCache } from '@/lib/frontend-cache'
import { createAppQueryClient } from '@/lib/query-client'
import { readCachedStatus, statusQueryOptions } from '@/lib/status-query'
import { DirectionProvider } from './context/direction-provider'
import { FontProvider } from './context/font-provider'
import { ThemeProvider } from './context/theme-provider'
import './i18n/config'
// Generated Routes
import { routeTree } from './routeTree.gen'
// Styles
import './styles/index.css'
// Ensure VChart theme is initialized before any chart mounts (prevents white default theme flash)
// VChart theme is driven by our ThemeProvider (html.light/html.dark) via per-chart `theme` prop.
initializeFrontendCache()
installBuildMetadata()
const queryClient = createAppQueryClient(() => {
void router.navigate({ to: '/500' })
})
// Create a new router instance
const router = createRouter({
routeTree,
context: { queryClient },
defaultPreload: 'intent',
defaultPreloadStaleTime: 0,
})
// Register the router instance for type safety
declare module '@tanstack/react-router' {
interface Register {
router: typeof router
}
}
// Render the app
const rootElement = document.querySelector('#root')
if (!rootElement) {
throw new Error('Root element not found')
}
// Set document.title and favicon from cached status, then refresh from network
;(function initSystemBranding() {
try {
if (typeof window === 'undefined' || typeof document === 'undefined') return
const apply = (name: string) => {
document.title = name
const metaTitle = document.querySelector(
'meta[name="title"]'
) as HTMLMetaElement | null
if (metaTitle) metaTitle.setAttribute('content', name)
}
// Cache-first
const cached = readCachedStatus()
if (cached?.system_name) apply(cached.system_name as string)
if (cached?.logo) applyFaviconToDom(cached.logo as string)
// Background refresh through the shared cache. This primes ['status']
// before React mounts, so the root guard and every status consumer reuse
// this one request instead of firing their own. `fetchStatus` owns the
// localStorage write and the system-config store sync.
queryClient
.ensureQueryData(statusQueryOptions)
.then((s) => {
if (s?.system_name) apply(s.system_name as string)
if (s?.logo) applyFaviconToDom(s.logo as string)
})
.catch(() => {
/* empty */
})
} catch {
/* empty */
}
})()
if (!rootElement.innerHTML) {
const root = ReactDOM.createRoot(rootElement)
root.render(
)
}