diff --git a/apps/iris/src/components/util/permission-guard.tsx b/apps/iris/src/components/util/permission-guard.tsx
index 21183be0..6a00205d 100644
--- a/apps/iris/src/components/util/permission-guard.tsx
+++ b/apps/iris/src/components/util/permission-guard.tsx
@@ -1,10 +1,11 @@
import { Navigate } from '@tanstack/react-router';
import type { ReactNode } from 'react';
+import { useHasPermission } from '@/hooks/use-has-permission';
import { authClient } from '@/utils/authentication';
type PermissionGuardProps = {
children: ReactNode;
- permission: string;
+ permission: string | readonly string[];
};
export function PermissionGuard({
@@ -12,15 +13,14 @@ export function PermissionGuard({
permission,
}: PermissionGuardProps) {
const { data } = authClient.useSession();
-
const user = data?.user;
+ const hasPermission = useHasPermission(permission, user?.permissions);
+
if (!user) {
return
;
}
- if (
- !(user.permissions.includes(permission) || user.permissions.includes('*'))
- ) {
+ if (!hasPermission) {
return
;
}
diff --git a/apps/iris/src/hooks/use-has-permission.ts b/apps/iris/src/hooks/use-has-permission.ts
index 665f613e..5bd93350 100644
--- a/apps/iris/src/hooks/use-has-permission.ts
+++ b/apps/iris/src/hooks/use-has-permission.ts
@@ -1,5 +1,19 @@
+export const ADMIN_UI_PERMISSIONS = [
+ 'import:timetable',
+ 'substitution:create',
+ 'movedLesson:create',
+ 'announcements:create',
+ 'system-messages:manage',
+ 'doorlock:stats:read',
+ 'doorlock:devices:read',
+ 'doorlock:cards:read',
+ 'doorlock:logs:read',
+ 'users:read',
+ 'roles:read',
+] as const;
+
export function useHasPermission(
- permission: string,
+ permission: string | readonly string[],
permissions?: string[] | null
): boolean {
if (!permissions) {
@@ -8,5 +22,10 @@ export function useHasPermission(
if (permissions.includes('*')) {
return true;
}
+
+ if (typeof permission !== 'string') {
+ return permission.some((item) => permissions.includes(item));
+ }
+
return permissions.includes(permission);
}
diff --git a/apps/iris/src/routes/_private/admin/route.tsx b/apps/iris/src/routes/_private/admin/route.tsx
index 92d21e33..95232bc2 100644
--- a/apps/iris/src/routes/_private/admin/route.tsx
+++ b/apps/iris/src/routes/_private/admin/route.tsx
@@ -1,11 +1,11 @@
-import { createFileRoute, Outlet, useNavigate } from '@tanstack/react-router';
+import { createFileRoute, Outlet } from '@tanstack/react-router';
import { useEffect } from 'react';
import { useTranslation } from 'react-i18next';
import { AdminSidebar } from '@/components/admin/sidebar';
import { Navbar } from '@/components/navbar';
import { SidebarProvider, SidebarTrigger } from '@/components/ui/sidebar';
-import { canAccessAdminUi } from '@/utils/admin-access';
-import { authClient } from '@/utils/authentication';
+import { PermissionGuard } from '@/components/util/permission-guard';
+import { ADMIN_UI_PERMISSIONS } from '@/hooks/use-has-permission';
export const Route = createFileRoute('/_private/admin')({
component: AppLayoutComponent,
@@ -13,34 +13,25 @@ export const Route = createFileRoute('/_private/admin')({
function AppLayoutComponent() {
const { t } = useTranslation();
- const { data: session } = authClient.useSession();
- const navigate = useNavigate();
useEffect(() => {
document.title = t('PageTitles.adminPanel');
}, [t]);
- useEffect(() => {
- if (session?.user && !canAccessAdminUi(session.user.permissions)) {
- navigate({
- replace: true,
- to: '/',
- });
- }
- }, [session, navigate]);
-
return (
-
-
-
-
-
-
+
+
+
+
+
+
+
-
-
-
-
-
+
+
+
+
+
+
);
}
diff --git a/apps/iris/src/utils/admin-access.ts b/apps/iris/src/utils/admin-access.ts
deleted file mode 100644
index 3ce5f138..00000000
--- a/apps/iris/src/utils/admin-access.ts
+++ /dev/null
@@ -1,27 +0,0 @@
-const ADMIN_UI_PERMISSIONS = [
- 'import:timetable',
- 'substitution:create',
- 'movedLesson:create',
- 'announcements:create',
- 'system-messages:manage',
- 'doorlock:stats:read',
- 'doorlock:devices:read',
- 'doorlock:cards:read',
- 'doorlock:logs:read',
- 'users:read',
- 'roles:read',
-] as const;
-
-export function canAccessAdminUi(permissions?: string[] | null): boolean {
- if (!permissions) {
- return false;
- }
-
- if (permissions.includes('*')) {
- return true;
- }
-
- return ADMIN_UI_PERMISSIONS.some((permission) =>
- permissions.includes(permission)
- );
-}