T
TanStack16mo ago
ambitious-aqua

Clerk auth

I seem to have circular dependency issue with Clerk and Tanstack router. Clerk depends on router and I also need to pass auth context to the router. What is the solution to this problem?
3 Replies
plain-purple
plain-purple16mo ago
why does clerk depend on router?
ambitious-aqua
ambitious-aquaOP16mo ago
Here is their example with react router:
import { Link, Outlet, useNavigate } from 'react-router-dom'
import { ClerkProvider, SignedIn, SignedOut, UserButton } from '@clerk/clerk-react'

const PUBLISHABLE_KEY = import.meta.env.VITE_CLERK_PUBLISHABLE_KEY

if (!PUBLISHABLE_KEY) {
throw new Error("Missing Publishable Key")
}

export default function RootLayout() {
const navigate = useNavigate();

return (
<ClerkProvider
routerPush={(to) => navigate(to)}
routerReplace={(to) => navigate(to, { replace: true })}
publishableKey={PUBLISHABLE_KEY}
>
<header className="header">
<div>
<div>
<p>Clerk + React + React Router App</p>
</div>
<SignedIn>
<UserButton afterSignOutUrl='/sign-in' />
</SignedIn>
<SignedOut>
<Link to="/sign-in">Sign In</Link>
</SignedOut>
</div>
</header>
<main>
<Outlet />
</main>
</ClerkProvider>
)
}
import { Link, Outlet, useNavigate } from 'react-router-dom'
import { ClerkProvider, SignedIn, SignedOut, UserButton } from '@clerk/clerk-react'

const PUBLISHABLE_KEY = import.meta.env.VITE_CLERK_PUBLISHABLE_KEY

if (!PUBLISHABLE_KEY) {
throw new Error("Missing Publishable Key")
}

export default function RootLayout() {
const navigate = useNavigate();

return (
<ClerkProvider
routerPush={(to) => navigate(to)}
routerReplace={(to) => navigate(to, { replace: true })}
publishableKey={PUBLISHABLE_KEY}
>
<header className="header">
<div>
<div>
<p>Clerk + React + React Router App</p>
</div>
<SignedIn>
<UserButton afterSignOutUrl='/sign-in' />
</SignedIn>
<SignedOut>
<Link to="/sign-in">Sign In</Link>
</SignedOut>
</div>
</header>
<main>
<Outlet />
</main>
</ClerkProvider>
)
}
I guess it is an option to pass on the client side routing in clerk, but wonder if there is a more elegant solution Or I can do all data loading only inside components, though I guess it will be a greater hit for UX
inland-turquoise
inland-turquoise16mo ago
what do you mean by " pass on the client side routing"?

Did you find this page helpful?