import { NextRequestWithAuth, withAuth } from "next-auth/middleware"; import { authOptions } from "@/config/authConfig"; import { NextFetchEvent, NextResponse } from "next/server"; import { PRIVATE_ROUTES } from "./routes"; const LANG_QUERY_PARAM = "lang"; const authMiddleware = withAuth({ pages: authOptions.pages, callbacks: { authorized: ({ req, token }) => { if (!Boolean(token)) { return Boolean(token) } // example // const abilities = token!.abilities as string[] // if (req.nextUrl.pathname.endsWith('/user') && 'abilities dont hv view/maintain user') { // return false // } return true } } }); export default async function middleware( req: NextRequestWithAuth, event: NextFetchEvent, ) { const langPref = req.nextUrl.searchParams.get(LANG_QUERY_PARAM); if (langPref) { // Redirect to same url without the lang query param + set cookies const newUrl = new URL(req.nextUrl); newUrl.searchParams.delete(LANG_QUERY_PARAM); const response = NextResponse.redirect(newUrl); response.cookies.set("i18next", langPref); return response; } // Matcher for using the auth middleware return PRIVATE_ROUTES.some((route) => req.nextUrl.pathname.startsWith(route)) ? await authMiddleware(req, event) // Let auth middleware handle response : NextResponse.next(); // Return normal response }