Files
2026-06-22 09:44:35 +02:00

99 lines
2.4 KiB
TypeScript

import { useEffect, useState } from 'react'
import {
HeadContent,
Outlet,
Scripts,
createRootRoute,
} from '@tanstack/react-router'
import { QueryClient, QueryClientProvider } from '@tanstack/react-query'
import { MantineProvider, Box } from '@pikku/mantine/core'
import { PikkuProvider, createPikku } from '@pikku/react'
import { useLocale, getLocale } from '@/i18n/config'
import '@mantine/core/styles.css'
import { PikkuFetch } from '@project/functions-sdk/pikku/pikku-fetch.gen'
import { PikkuRPC } from '@project/functions-sdk/pikku/pikku-rpc.gen'
import { theme } from '../theme'
import '../theme.css'
import '../i18n/config'
import { readInitialDirection } from '../direction'
declare global {
interface Window {
__E2E_API_URL?: string
}
}
export const Route = createRootRoute({
head: () => ({
meta: [
{ charSet: 'utf-8' },
{ name: 'viewport', content: 'width=device-width, initial-scale=1' },
{ title: 'Seminarhof Drawehn' },
],
}),
component: RootDocument,
})
function RootDocument() {
useLocale()
const [queryClient] = useState(
() =>
new QueryClient({
defaultOptions: {
queries: {
staleTime: 10_000,
retry: 1,
refetchOnWindowFocus: false,
},
mutations: { retry: 0 },
},
}),
)
const runtimeApiUrl =
typeof window !== 'undefined' ? window.__E2E_API_URL : undefined
const [pikku] = useState(() =>
createPikku(PikkuFetch, PikkuRPC, {
transformDate: true,
serverUrl: runtimeApiUrl ?? import.meta.env.VITE_API_URL ?? '/api',
credentials: 'include',
}),
)
return (
<html
lang={(getLocale() ?? 'de').slice(0, 2)}
dir={readInitialDirection()}
data-app-hydrated="false"
>
<head>
<HeadContent />
</head>
<body>
<HydrationReady />
<QueryClientProvider client={queryClient}>
<MantineProvider theme={theme}>
<PikkuProvider pikku={pikku}>
<Box
mih="100vh"
bg="var(--mantine-color-body)"
c="var(--mantine-color-text)"
>
<Outlet />
</Box>
</PikkuProvider>
</MantineProvider>
</QueryClientProvider>
<Scripts />
</body>
</html>
)
}
function HydrationReady() {
useEffect(() => {
window.document.documentElement.dataset.appHydrated = 'true'
}, [])
return null
}