import { clerkMiddleware, createRouteMatcher } from "@clerk/nextjs/server";
import { NextRequest, NextResponse } from "next/server";
const isProtectedRoute = createRouteMatcher([
"/dashboard(.*)",
"/admin(.*)",
"/profile(.*)",
]);
const isPublicRoute = createRouteMatcher([
"/sign-in",
"/sign-up",
"/",
"/api/clerk/webhook",
]);
const isOnboardingRoute = createRouteMatcher(["/onboarding"]);
export default clerkMiddleware(async (auth, req: NextRequest) => {
const { userId, sessionClaims, redirectToSignIn } = await auth();
if (!userId && !isPublicRoute(req))
return redirectToSignIn({ returnBackUrl: req.url });
if (
userId &&
!sessionClaims?.metadata?.onboardingComplete &&
!isOnboardingRoute(req)
) {
const onboardingUrl = new URL("/onboarding", req.url);
return NextResponse.redirect(onboardingUrl);
}
if (userId && !isPublicRoute(req)) return NextResponse.next();
return NextResponse.next();
});
export const config = {
matcher: [
// Skip Next.js internals and all static files, unless found in search params
"/((?!_next|[^?]*\\.(?:html?|css|js(?!on)|jpe?g|webp|png|gif|svg|ttf|woff2?|ico|csv|docx?|xlsx?|zip|webmanifest)).*)",
// Always run for API routes
"/(api|trpc)(.*)",
],
};