diff --git a/app/contexts/express.ts b/app/contexts/express.ts new file mode 100644 index 0000000..c668695 --- /dev/null +++ b/app/contexts/express.ts @@ -0,0 +1,3 @@ +import { createContext } from "react-router"; + +export const expressValueContext = createContext(); diff --git a/app/root.tsx b/app/root.tsx index 1359d94..5ad269c 100644 --- a/app/root.tsx +++ b/app/root.tsx @@ -9,11 +9,13 @@ import { import type { Route } from "./+types/root"; import "./app.css"; -import { rootAuthLoader } from "@clerk/react-router/server"; +import { clerkMiddleware, rootAuthLoader } from "@clerk/react-router/server"; import { Navbar } from "~/components/navbar"; import { ClerkProvider } from "@clerk/react-router"; import { Toaster } from "~/components/ui/sonner"; +export const middleware: Route.MiddlewareFunction[] = [clerkMiddleware()]; + export async function loader(args: Route.LoaderArgs) { return rootAuthLoader(args); } diff --git a/app/routes/home.tsx b/app/routes/home.tsx index 9cf2890..d0622ac 100644 --- a/app/routes/home.tsx +++ b/app/routes/home.tsx @@ -4,6 +4,7 @@ import { toast } from "sonner"; import type { Route } from "./+types/home"; import { Welcome } from "../welcome/welcome"; +import { expressValueContext } from "~/contexts/express"; export function meta() { return [ @@ -17,7 +18,7 @@ export function meta() { export async function loader({ context }: Route.LoaderArgs) { return { - message: context.VALUE_FROM_EXPRESS, + message: context.get(expressValueContext) || "No message from Express", }; } diff --git a/react-router.config.ts b/react-router.config.ts index 6ff16f9..f286789 100644 --- a/react-router.config.ts +++ b/react-router.config.ts @@ -4,4 +4,7 @@ export default { // Config options... // Server-side render by default, to enable SPA mode set this to `false` ssr: true, + future: { + v8_middleware: true, + }, } satisfies Config; diff --git a/server/app.ts b/server/app.ts index 2543284..9a60fc7 100644 --- a/server/app.ts +++ b/server/app.ts @@ -2,16 +2,11 @@ import { createRequestHandler } from "@react-router/express"; import { drizzle } from "drizzle-orm/postgres-js"; import express from "express"; import postgres from "postgres"; -import "react-router"; +import { RouterContextProvider } from "react-router"; import { DatabaseContext } from "~/database/context"; import * as schema from "~/database/schema"; - -declare module "react-router" { - interface AppLoadContext { - VALUE_FROM_EXPRESS: string; - } -} +import { expressValueContext } from "~/contexts/express"; export const app = express(); @@ -25,9 +20,9 @@ app.use( createRequestHandler({ build: () => import("virtual:react-router/server-build"), getLoadContext() { - return { - VALUE_FROM_EXPRESS: "Hello from Express", - }; + const context = new RouterContextProvider(); + context.set(expressValueContext, "Hello from Express"); + return context; }, }), );