fix: login suspense + migrate middleware to proxy

This commit is contained in:
SpecialX
2026-01-08 11:35:15 +08:00
parent f513cf5399
commit 15d9ea9cb8

45
src/proxy.ts Normal file
View File

@@ -0,0 +1,45 @@
import { NextResponse } from "next/server"
import type { NextAuthRequest } from "next-auth"
import { auth } from "./auth"
function roleHome(role: string) {
if (role === "admin") return "/admin/dashboard"
if (role === "student") return "/student/dashboard"
if (role === "parent") return "/parent/dashboard"
return "/teacher/dashboard"
}
export default auth((req: NextAuthRequest) => {
const { pathname } = req.nextUrl
const session = req.auth
if (!session?.user) {
const url = req.nextUrl.clone()
url.pathname = "/login"
url.searchParams.set("callbackUrl", pathname)
return NextResponse.redirect(url)
}
const role = String(session.user.role ?? "teacher")
if (pathname.startsWith("/admin/") && role !== "admin") {
return NextResponse.redirect(new URL(roleHome(role), req.url))
}
if (pathname.startsWith("/teacher/") && role !== "teacher") {
return NextResponse.redirect(new URL(roleHome(role), req.url))
}
if (pathname.startsWith("/student/") && role !== "student") {
return NextResponse.redirect(new URL(roleHome(role), req.url))
}
if (pathname.startsWith("/parent/") && role !== "parent") {
return NextResponse.redirect(new URL(roleHome(role), req.url))
}
return NextResponse.next()
})
export const config = {
matcher: ["/dashboard", "/admin/:path*", "/teacher/:path*", "/student/:path*", "/parent/:path*", "/settings/:path*", "/profile"],
}