Step 1: Install the SDK
Copy
pnpm add @wacht/tanstack-router @wacht/types
Step 2: Set Environment Variables
Create a.env file:
Copy
# .env
VITE_WACHT_PUBLIC_KEY=your_public_key_here
Step 3: Configure the Provider
Copy
// src/routes/__root.tsx
import { createRouter } from '@tanstack/react-router'
import { DeploymentProvider } from '@wacht/tanstack-router'
const router = createRouter()
export const Route = router.wrap(({ children }) => {
return (
<DeploymentProvider publicKey={import.meta.env.VITE_WACHT_PUBLIC_KEY}>
{children}
</DeploymentProvider>
)
})
Step 4: Create Authentication Routes
Copy
// src/routes/signin.tsx
import { createFileRoute } from '@tanstack/react-router'
import { SignInForm } from '@wacht/tanstack-router'
export const Route = createFileRoute('/signin')({
component: SignIn
})
function SignIn() {
return (
<div className="auth-page">
<h1>Sign In</h1>
<SignInForm />
</div>
)
}
Copy
// src/routes/signup.tsx
import { createFileRoute } from '@tanstack/react-router'
import { SignUpForm } from '@wacht/tanstack-router'
export const Route = createFileRoute('/signup')({
component: SignUp
})
function SignUp() {
return (
<div className="auth-page">
<h1>Sign Up</h1>
<SignUpForm />
</div>
)
}
Step 5: Protect Routes
Copy
// src/routes/dashboard.tsx
import { createFileRoute } from '@tanstack/react-router'
import { useSession } from '@wacht/tanstack-router'
import { Navigate } from '@tanstack/react-router'
export const Route = createFileRoute('/dashboard')({
component: Dashboard,
beforeLoad: ({ context, navigate }) => {
if (!context.session) {
throw navigate({ to: '/signin' })
}
}
})
function Dashboard() {
const { session } = useSession({ from: '/dashboard' })
return (
<div>
<h1>Dashboard</h1>
<p>Welcome, {session.user.first_name}!</p>
</div>
)
}
Step 6: Add User Menu
Copy
// src/routes/__root.tsx
import { UserButton, SignedIn } from '@wacht/tanstack-router'
export const Route = router.wrap(({ children }) => {
return (
<DeploymentProvider publicKey={import.meta.env.VITE_WACHT_PUBLIC_KEY}>
<div className="layout">
<header className="navbar">
<h1>My App</h1>
<SignedIn>
<UserButton />
</SignedIn>
</header>
<main>{children}</main>
</div>
</DeploymentProvider>
)
})
Complete Example
Here’s a complete working example:Copy
// src/routes/__root.tsx
import { createRouter } from '@tanstack/react-router'
import { Outlet, useRouter } from '@tanstack/react-router'
import { DeploymentProvider, SignedIn, SignedOut, UserButton } from '@wacht/tanstack-router'
import { TanStackRouterDevtools } from '@tanstack/router-devtools'
const router = createRouter()
export const Route = router.wrap(({ children }) => {
return (
<DeploymentProvider publicKey={import.meta.env.VITE_WACHT_PUBLIC_KEY}>
<div className="min-h-screen bg-gray-50">
<header className="bg-white shadow">
<div className="mx-auto max-w-7xl px-4 py-4 flex justify-between items-center">
<h1 className="text-xl font-bold">My App</h1>
<div className="flex items-center gap-4">
<SignedIn>
<UserButton />
</SignedIn>
<SignedOut>
<a href="/signin" className="text-blue-600 hover:text-blue-800">
Sign In
</a>
</SignedOut>
</div>
</div>
</header>
<main className="mx-auto max-w-7xl px-4 py-8">
<Outlet />
</main>
</div>
<TanStackRouterDevtools />
</DeploymentProvider>
)
})
Copy
// src/routes/index.tsx
import { createFileRoute } from '@tanstack/react-router'
import { SignedIn, SignedOut } from '@wacht/tanstack-router'
import { Link } from '@tanstack/react-router'
export const Route = createFileRoute('/')({
component: Home
})
function Home() {
return (
<div>
<h1 className="text-3xl font-bold mb-4">Welcome</h1>
<SignedOut>
<div className="space-y-4">
<p>Get started by creating an account or signing in.</p>
<div className="flex gap-4">
<Link
to="/signup"
className="px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700"
>
Sign Up
</Link>
<Link
to="/signin"
className="px-4 py-2 border border-blue-600 text-blue-600 rounded hover:bg-blue-50"
>
Sign In
</Link>
</div>
</div>
</SignedOut>
<SignedIn>
<div>
<p>Welcome back!</p>
<Link to="/dashboard" className="text-blue-600 hover:text-blue-800">
Go to Dashboard
</Link>
</div>
</SignedIn>
</div>
)
}
Next Steps
- Setup Guide - Detailed configuration options
- Components Reference - Available components
- Hooks Reference - Available hooks
