Ah, I was able to get this set up.
In main.tsx:
import { ConvexAuthProvider } from "@convex-dev/auth/react";
import { RouterProvider, createRouter } from "@tanstack/react-router";
import { ConvexReactClient, useConvexAuth } from "convex/react";
import { StrictMode } from "react";
import { createRoot } from "react-dom/client";
import { routeTree } from "./routeTree.gen";
const convex = new ConvexReactClient(import.meta.env.VITE_CONVEX_URL);
const router = createRouter({
routeTree,
context: {
auth: undefined!,
},
});
declare module "@tanstack/react-router" {
interface Register {
router: typeof router;
}
}
const InnerApp = () => {
const auth = useConvexAuth();
return <RouterProvider router={router} context={{ auth }} />;
};
const rootElement = document.getElementById("root")!;
if (!rootElement.innerHTML) {
const root = createRoot(rootElement);
root.render(
<StrictMode>
<ConvexAuthProvider client={convex}>
<InnerApp />
</ConvexAuthProvider>
</StrictMode>,
);
}
In routes/__root.tsx:
import {
Outlet,
createRootRouteWithContext,
} from "@tanstack/react-router";
import { TanStackRouterDevtools } from "@tanstack/router-devtools";
import type { ConvexAuthState } from "convex/react";
import { RouterProvider } from "react-aria-components";
interface RouterContext {
auth: ConvexAuthState;
}
export const Route = createRootRouteWithContext<RouterContext>()({
component: Root,
});
function Root() {
return (
<>
<Outlet />
<TanStackRouterDevtools />
</>
);
}
On routes/settings.tsx:
import { createFileRoute, redirect } from "@tanstack/react-router";
export const Route = createFileRoute("/settings")({
beforeLoad: ({ context }) => {
if (!context.auth.isAuthenticated) {
throw redirect({
to: "/signin",
});
}
},
component: SettingsRoute,
});
function SettingsRoute() {
}