Files
hapi/web/src/main.tsx
T

92 lines
3.1 KiB
TypeScript

import React from 'react'
import ReactDOM from 'react-dom/client'
import { QueryClientProvider } from '@tanstack/react-query'
import { ReactQueryDevtools } from '@tanstack/react-query-devtools'
import { RouterProvider, createMemoryHistory } from '@tanstack/react-router'
import './index.css'
import { registerSW } from 'virtual:pwa-register'
import { initializeFontScale } from '@/hooks/useFontScale'
import { getTelegramWebApp, isTelegramEnvironment, loadTelegramSdk } from './hooks/useTelegram'
import { queryClient } from './lib/query-client'
import { createAppRouter } from './router'
import { I18nProvider } from './lib/i18n-context'
import { restoreSpaRedirect } from './lib/spaRedirect'
function getStartParam(): string | null {
const query = new URLSearchParams(window.location.search)
const fromQuery = query.get('startapp') || query.get('tgWebAppStartParam')
if (fromQuery) return fromQuery
return getTelegramWebApp()?.initDataUnsafe?.start_param ?? null
}
function getDeepLinkedSessionId(): string | null {
const startParam = getStartParam()
if (startParam?.startsWith('session_')) {
return startParam.slice('session_'.length)
}
return null
}
function getInitialPath(): string {
const sessionId = getDeepLinkedSessionId()
return sessionId ? `/sessions/${sessionId}` : '/sessions'
}
async function bootstrap() {
initializeFontScale()
// Only load Telegram SDK in Telegram environment (with 3s timeout)
const isTelegram = isTelegramEnvironment()
document.documentElement.dataset.telegramApp = isTelegram ? 'true' : 'false'
if (isTelegram) {
await loadTelegramSdk()
}
// Handle GitHub Pages 404 redirect for SPA routing
// When GitHub Pages can't find a path (e.g. /sessions/xxx), it serves 404.html
// which stores the path in sessionStorage and redirects to /
if (!isTelegram) {
restoreSpaRedirect()
}
const updateSW = registerSW({
onNeedRefresh() {
if (confirm('New version available! Reload to update?')) {
updateSW(true)
}
},
onOfflineReady() {
console.log('App ready for offline use')
},
onRegistered(registration) {
if (registration) {
setInterval(() => {
registration.update()
}, 60 * 60 * 1000)
}
},
onRegisterError(error) {
console.error('SW registration error:', error)
}
})
const history = isTelegram
? createMemoryHistory({ initialEntries: [getInitialPath()] })
: undefined
const router = createAppRouter(history)
ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<I18nProvider>
<QueryClientProvider client={queryClient}>
<RouterProvider router={router} />
{import.meta.env.DEV ? <ReactQueryDevtools initialIsOpen={false} /> : null}
</QueryClientProvider>
</I18nProvider>
</React.StrictMode>
)
}
bootstrap()