99 lines
2.4 KiB
TypeScript
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
|
|
}
|