mirror of
https://github.com/th30d4y/OpenLearnX.git
synced 2026-05-26 11:25:49 +00:00
50 lines
2.2 KiB
TypeScript
50 lines
2.2 KiB
TypeScript
"use client"
|
|
|
|
import { useMemo } from "react"
|
|
import { usePathname } from "next/navigation"
|
|
import { ShieldAlert } from "lucide-react"
|
|
import { useAuth } from "@/context/auth-context"
|
|
|
|
const BLOCKED_STATUSES = new Set(["suspended", "restricted", "banned"])
|
|
|
|
export function AccountStatusGuard() {
|
|
const pathname = usePathname()
|
|
const { user, isLoadingAuth, logout } = useAuth()
|
|
|
|
const status = useMemo(() => String((user as any)?.status || "active").toLowerCase().trim(), [user])
|
|
|
|
const skipGuard = pathname.startsWith("/auth/") || pathname === "/admin/login"
|
|
if (skipGuard || isLoadingAuth || !user) return null
|
|
if (!BLOCKED_STATUSES.has(status)) return null
|
|
|
|
const title = status === "banned" ? "Account Banned" : "Account Suspended"
|
|
const message =
|
|
status === "banned"
|
|
? "Your account is banned. You cannot use OpenLearnX with this account. Contact admin for support."
|
|
: "Your account is suspended. Contact admin to restore access."
|
|
|
|
return (
|
|
<div className="fixed inset-0 z-[9999] flex items-center justify-center bg-white p-4 dark:bg-slate-950">
|
|
<div className="w-full max-w-xl rounded-2xl border-2 border-red-200 bg-white p-7 text-center shadow-xl dark:border-red-900 dark:bg-slate-900">
|
|
<div className="mx-auto mb-4 flex h-14 w-14 items-center justify-center rounded-full bg-red-100 text-red-700 dark:bg-red-950 dark:text-red-300">
|
|
<ShieldAlert className="h-7 w-7" />
|
|
</div>
|
|
<h2 className="text-2xl font-semibold text-gray-900 dark:text-white">{title}</h2>
|
|
<p className="mt-2 inline-flex rounded-full bg-red-100 px-3 py-1 text-xs font-semibold uppercase tracking-wide text-red-700 dark:bg-red-950 dark:text-red-200">
|
|
Status: {status}
|
|
</p>
|
|
<p className="mt-3 text-sm text-gray-700 dark:text-gray-300">{message}</p>
|
|
<p className="mt-2 text-sm font-medium text-red-700 dark:text-red-300">Contact admin.</p>
|
|
<div className="mt-5">
|
|
<button
|
|
onClick={() => logout()}
|
|
className="rounded-md bg-red-600 px-4 py-2 text-sm font-medium text-white hover:bg-red-700"
|
|
>
|
|
Logout
|
|
</button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
)
|
|
}
|