Skip to content

Commit 911760e

Browse files
committed
fix(web): update ui for super admin
1 parent ca8d4d4 commit 911760e

4 files changed

Lines changed: 80 additions & 18 deletions

File tree

apps/api/src/lib/auth/auth.middleware.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -392,14 +392,14 @@ export function requireRole(...roles: UserRole[]) {
392392
}
393393

394394
/**
395-
* Require admin role
395+
* Require admin role (includes SUPER_ADMIN)
396396
*/
397-
export const requireAdmin = requireRole("ADMIN");
397+
export const requireAdmin = requireRole("SUPER_ADMIN", "ADMIN");
398398

399399
/**
400-
* Require user or admin role
400+
* Require user or admin role (includes SUPER_ADMIN)
401401
*/
402-
export const requireUserOrAdmin = requireRole("USER", "ADMIN");
402+
export const requireUserOrAdmin = requireRole("SUPER_ADMIN", "ADMIN", "USER");
403403

404404
// ────────────────────────────────────────────────────────────────────────────
405405
// Scope-Based Access Control (for API keys)

apps/web/src/components/ui/header/user-menu.tsx

Lines changed: 39 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,10 @@ import {
88
ChevronDown,
99
Shield,
1010
LogIn,
11+
Star,
1112
} from "lucide-react";
1213
import { AnimatePresence, motion } from "motion/react";
14+
import { Badge } from "@/components/ui/badge";
1315

1416
function UserMenu() {
1517
const { user, isAuthenticated, logout } = useAuth();
@@ -43,8 +45,18 @@ function UserMenu() {
4345
className="h-10 px-1 rounded-[50px] flex items-center gap-2 justify-between hover:bg-white/10 transition-colors"
4446
>
4547
<div className="flex items-center gap-2">
46-
<div className="w-8 h-8 rounded-full bg-gradient-to-br from-purple-500 to-blue-500 flex items-center justify-center">
47-
{user?.role === "ADMIN" ? (
48+
<div
49+
className={`w-8 h-8 rounded-full flex items-center justify-center ${
50+
user?.role === "SUPER_ADMIN"
51+
? "bg-gradient-to-br from-amber-500 to-yellow-500"
52+
: user?.role === "ADMIN"
53+
? "bg-gradient-to-br from-purple-500 to-blue-500"
54+
: "bg-gradient-to-br from-blue-500 to-cyan-500"
55+
}`}
56+
>
57+
{user?.role === "SUPER_ADMIN" ? (
58+
<Star className="w-4 h-4 text-white fill-white" />
59+
) : user?.role === "ADMIN" ? (
4860
<Shield className="w-4 h-4 text-white" />
4961
) : (
5062
<User className="w-4 h-4 text-white" />
@@ -90,16 +102,34 @@ function UserMenu() {
90102
<p className="text-xs text-white/60 mt-0.5">{user.email}</p>
91103
)}
92104
<div className="mt-2">
93-
<span
94-
className={`inline-flex items-center gap-1 px-2 py-0.5 rounded-full text-xs font-medium ${
95-
user?.role === "ADMIN"
96-
? "bg-purple-500/20 text-purple-300"
97-
: "bg-blue-500/20 text-blue-300"
105+
<Badge
106+
variant={
107+
user?.role === "SUPER_ADMIN"
108+
? "default"
109+
: user?.role === "ADMIN"
110+
? "secondary"
111+
: "outline"
112+
}
113+
className={`inline-flex items-center gap-1 ${
114+
user?.role === "SUPER_ADMIN"
115+
? "bg-amber-500/20 text-amber-300 border-amber-500/30"
116+
: user?.role === "ADMIN"
117+
? "bg-purple-500/20 text-purple-300 border-purple-500/30"
118+
: "bg-blue-500/20 text-blue-300 border-blue-500/30"
98119
}`}
99120
>
121+
{user?.role === "SUPER_ADMIN" && (
122+
<Star className="w-3 h-3 fill-amber-300" />
123+
)}
100124
{user?.role === "ADMIN" && <Shield className="w-3 h-3" />}
101-
{user?.role === "ADMIN" ? "Admin" : "User"}
102-
</span>
125+
{user?.role === "SUPER_ADMIN"
126+
? "Super Admin"
127+
: user?.role === "ADMIN"
128+
? "Admin"
129+
: user?.role === "GUEST"
130+
? "Guest"
131+
: "User"}
132+
</Badge>
103133
</div>
104134
</div>
105135

apps/web/src/routes/settings/route.tsx

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,13 @@ import {
1212
Edit,
1313
Menu,
1414
Users,
15+
Star,
16+
Shield,
1517
} from "lucide-react";
1618
import { useAuth } from "@/hooks/useAuth";
1719
import { useEffect } from "react";
1820
import { Button } from "@/components/ui/button";
21+
import { Badge } from "@/components/ui/badge";
1922

2023
export const Route = createFileRoute("/settings")({
2124
component: RouteComponent,
@@ -30,7 +33,7 @@ export const Route = createFileRoute("/settings")({
3033
function RouteComponent() {
3134
const { user, isAuthenticated, isLoading } = useAuth();
3235
const navigate = useNavigate();
33-
const isAdmin = user?.role === "ADMIN";
36+
const isAdmin = user?.role === "ADMIN" || user?.role === "SUPER_ADMIN";
3437

3538
// Redirect unauthenticated users or guests
3639
useEffect(() => {
@@ -65,9 +68,37 @@ function RouteComponent() {
6568
</Button>
6669
</div>
6770
</div>
68-
<p className="text-sm text-white/60">
69-
{user?.role}{user?.email}
70-
</p>
71+
<div className="flex items-center gap-2 mb-2">
72+
<Badge
73+
variant={
74+
user?.role === "SUPER_ADMIN"
75+
? "default"
76+
: user?.role === "ADMIN"
77+
? "secondary"
78+
: "outline"
79+
}
80+
className={`inline-flex items-center gap-1 ${
81+
user?.role === "SUPER_ADMIN"
82+
? "bg-amber-500/20 text-amber-300 border-amber-500/30"
83+
: user?.role === "ADMIN"
84+
? "bg-purple-500/20 text-purple-300 border-purple-500/30"
85+
: "bg-blue-500/20 text-blue-300 border-blue-500/30"
86+
}`}
87+
>
88+
{user?.role === "SUPER_ADMIN" && (
89+
<Star className="w-3 h-3 fill-amber-300" />
90+
)}
91+
{user?.role === "ADMIN" && <Shield className="w-3 h-3" />}
92+
{user?.role === "SUPER_ADMIN"
93+
? "Super Admin"
94+
: user?.role === "ADMIN"
95+
? "Admin"
96+
: user?.role === "GUEST"
97+
? "Guest"
98+
: "User"}
99+
</Badge>
100+
</div>
101+
<p className="text-sm text-white/60">{user?.email}</p>
71102
</div>
72103

73104
{/* Settings Section */}

apps/web/src/routes/settings/users.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ export const Route = createFileRoute("/settings/users")({
2121

2222
function RouteComponent() {
2323
const { user: currentUser, isLoading: isAuthLoading } = useAuth();
24-
const isAdmin = currentUser?.role === "ADMIN";
24+
const isAdmin =
25+
currentUser?.role === "ADMIN" || currentUser?.role === "SUPER_ADMIN";
2526
const {
2627
data: usersData,
2728
isLoading: isLoadingUsers,

0 commit comments

Comments
 (0)