import { getOptionalSession } from '@documenso/auth/server/lib/utils/get-session'; import { SessionProvider } from '@documenso/lib/client-only/providers/session'; import { APP_I18N_OPTIONS, type SupportedLanguageCodes } from '@documenso/lib/constants/i18n'; import { createPublicEnv } from '@documenso/lib/utils/env'; import { extractLocaleData } from '@documenso/lib/utils/i18n'; import { TrpcProvider } from '@documenso/trpc/react'; import { getOrganisationSession } from '@documenso/trpc/server/organisation-router/get-organisation-session'; import { Toaster } from '@documenso/ui/primitives/toaster'; import { TooltipProvider } from '@documenso/ui/primitives/tooltip'; import { NuqsAdapter } from 'nuqs/adapters/react-router/v7'; import { data, isRouteErrorResponse, Links, Meta, Outlet, Scripts, ScrollRestoration, useLoaderData, useMatches, } from 'react-router'; import { PreventFlashOnWrongTheme, ThemeProvider, useTheme } from 'remix-themes'; import type { Route } from './+types/root'; import stylesheet from './app.css?url'; import { GenericErrorLayout } from './components/general/generic-error-layout'; import { langCookie } from './storage/lang-cookie.server'; import { themeSessionResolver } from './storage/theme-session.server'; import { appMetaTags } from './utils/meta'; import { nonce } from './utils/nonce'; export const links: Route.LinksFunction = () => [{ rel: 'stylesheet', href: stylesheet }]; export function meta() { return appMetaTags(); } /** * Don't revalidate (run the loader on sequential navigations) on the root layout * * Update values via providers. */ export const shouldRevalidate = () => false; export async function loader({ context, request }: Route.LoaderArgs) { const session = await getOptionalSession(request); const { getTheme } = await themeSessionResolver(request); const cookieHeader = request.headers.get('cookie') ?? ''; let lang: SupportedLanguageCodes = await langCookie.parse(cookieHeader); if (!APP_I18N_OPTIONS.supportedLangs.includes(lang)) { lang = extractLocaleData({ headers: request.headers }).lang; } const disableAnimations = cookieHeader.includes('__disable_animations=true'); let organisations = null; if (session.isAuthenticated) { organisations = await getOrganisationSession({ userId: session.user.id }); } return data( { lang, theme: getTheme(), disableAnimations, // Surface the per-request CSP nonce produced by `securityHeadersMiddleware` so all // SSR-rendered {/* Global license banner currently disabled. Need to wait until after a few releases. */} {/* {licenseStatus === '?' && (
This is an expired license instance of Documenso
)} */} {children}