From 915b96c21888a42d0ebb73ebf3bf88e8db5226b4 Mon Sep 17 00:00:00 2001 From: Nicolas Meienberger Date: Tue, 31 Mar 2026 21:19:16 +0200 Subject: [PATCH] refactor: split out root-loader data getter into a dedicated function --- app/routes/__root.tsx | 31 ++------------------ app/server/lib/functions/root-loader-data.ts | 21 +++++++++++++ 2 files changed, 24 insertions(+), 28 deletions(-) create mode 100644 app/server/lib/functions/root-loader-data.ts diff --git a/app/routes/__root.tsx b/app/routes/__root.tsx index bacde6d8..c2a1b1ba 100644 --- a/app/routes/__root.tsx +++ b/app/routes/__root.tsx @@ -6,40 +6,15 @@ import { ReactQueryDevtools } from "@tanstack/react-query-devtools"; import { Toaster } from "~/client/components/ui/sonner"; import { useServerEvents } from "~/client/hooks/use-server-events"; import { useEffect } from "react"; -import { ThemeProvider, THEME_COOKIE_NAME } from "~/client/components/theme-provider"; -import { createServerFn } from "@tanstack/react-start"; -import { getCookie, getRequestHeaders } from "@tanstack/react-start/server"; +import { ThemeProvider } from "~/client/components/theme-provider"; import { isAuthRoute } from "~/lib/auth-routes"; -import { auth } from "~/server/lib/auth"; -import type { DateFormatPreference, TimeFormatPreference } from "~/client/lib/datetime"; - -const fetchTheme = createServerFn({ method: "GET" }).handler(async () => { - const themeCookie = getCookie(THEME_COOKIE_NAME); - return (themeCookie === "light" ? "light" : "dark") as "light" | "dark"; -}); - -const fetchTimeConfig = createServerFn({ method: "GET" }).handler(async () => { - const headers = getRequestHeaders(); - const acceptLanguage = headers.get("accept-language"); - const session = await auth.api.getSession({ headers }); - - return { - locale: (acceptLanguage?.split(",")[0] || "en-US") as string, - timeZone: process.env.TZ || Intl.DateTimeFormat().resolvedOptions().timeZone || "UTC", - dateFormat: (session?.user.dateFormat ?? "MM/DD/YYYY") as DateFormatPreference, - timeFormat: (session?.user.timeFormat ?? "12h") as TimeFormatPreference, - now: Date.now(), - }; -}); +import { getRootLoaderData } from "~/server/lib/functions/root-loader-data"; export const Route = createRootRouteWithContext<{ queryClient: QueryClient }>()({ server: { middleware: [apiClientMiddleware], }, - loader: async () => { - const [theme, timeConfig] = await Promise.all([fetchTheme(), fetchTimeConfig()]); - return { theme, ...timeConfig }; - }, + loader: async () => getRootLoaderData(), head: () => ({ meta: [{ title: "Zerobyte - Open Source Backup Solution" }], links: [ diff --git a/app/server/lib/functions/root-loader-data.ts b/app/server/lib/functions/root-loader-data.ts new file mode 100644 index 00000000..00f7f599 --- /dev/null +++ b/app/server/lib/functions/root-loader-data.ts @@ -0,0 +1,21 @@ +import { createServerFn } from "@tanstack/react-start"; +import { getCookie, getRequestHeaders } from "@tanstack/react-start/server"; +import { THEME_COOKIE_NAME } from "~/client/components/theme-provider"; +import type { DateFormatPreference, TimeFormatPreference } from "~/client/lib/datetime"; +import { auth } from "~/server/lib/auth"; + +export const getRootLoaderData = createServerFn({ method: "GET" }).handler(async () => { + const themeCookie = getCookie(THEME_COOKIE_NAME); + const headers = getRequestHeaders(); + const acceptLanguage = headers.get("accept-language"); + const session = await auth.api.getSession({ headers }); + + return { + theme: (themeCookie === "light" ? "light" : "dark") as "light" | "dark", + locale: (acceptLanguage?.split(",")[0] || "en-US") as string, + timeZone: process.env.TZ || Intl.DateTimeFormat().resolvedOptions().timeZone || "UTC", + dateFormat: (session?.user.dateFormat ?? "MM/DD/YYYY") as DateFormatPreference, + timeFormat: (session?.user.timeFormat ?? "12h") as TimeFormatPreference, + now: Date.now(), + }; +});