+
+
Admin Dashboard
+
+ Central hub for all moderation activity
+
+
- {/* Security Warning for Suspicious Versions */}
- {suspiciousVersionsCount > 0 && (
-
-
-
- Security Alert: {suspiciousVersionsCount} entity version{suspiciousVersionsCount !== 1 ? 's' : ''} detected without user attribution.
- This may indicate submission flow bypass. Check admin audit logs for details.
-
-
- )}
+ {/* Security Warning for Suspicious Versions */}
+ {suspiciousVersionsCount > 0 && (
+
+
+
+ Security Alert: {suspiciousVersionsCount} entity version{suspiciousVersionsCount !== 1 ? 's' : ''} detected without user attribution.
+ This may indicate submission flow bypass. Check admin audit logs for details.
+
+
+ )}
-
- {statCards.map((card) => {
- const Icon = card.icon;
- const colorClasses = {
- amber: {
- card: 'hover:border-amber-500/50',
- bg: 'bg-amber-500/10',
- icon: 'text-amber-600 dark:text-amber-400',
- },
- red: {
- card: 'hover:border-red-500/50',
- bg: 'bg-red-500/10',
- icon: 'text-red-600 dark:text-red-400',
- },
- orange: {
- card: 'hover:border-orange-500/50',
- bg: 'bg-orange-500/10',
- icon: 'text-orange-600 dark:text-orange-400',
- },
- };
- const colors = colorClasses[card.color as keyof typeof colorClasses];
-
- return (
-
handleStatCardClick(card.type)}
- >
-
-
-
-
+
+ {statCards.map((card) => {
+ const Icon = card.icon;
+ const colorClasses = {
+ amber: {
+ card: 'hover:border-amber-500/50',
+ bg: 'bg-amber-500/10',
+ icon: 'text-amber-600 dark:text-amber-400',
+ },
+ red: {
+ card: 'hover:border-red-500/50',
+ bg: 'bg-red-500/10',
+ icon: 'text-red-600 dark:text-red-400',
+ },
+ orange: {
+ card: 'hover:border-orange-500/50',
+ bg: 'bg-orange-500/10',
+ icon: 'text-orange-600 dark:text-orange-400',
+ },
+ };
+ const colors = colorClasses[card.color as keyof typeof colorClasses];
+
+ return (
+
handleStatCardClick(card.type)}
+ >
+
+
-
-
-
{card.value}
-
-
- );
- })}
+
{card.value}
+
+
+ );
+ })}
+
+
+
+
+
+
+ Moderation Queue
+ Queue
+ {stats.pendingSubmissions > 0 && (
+
+ {stats.pendingSubmissions}
+
+ )}
+
+
+
+ Reports
+ Reports
+ {stats.openReports > 0 && (
+
+ {stats.openReports}
+
+ )}
+
+
+
+ Recent Activity
+ Activity
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
- Moderation Queue
- Queue
- {stats.pendingSubmissions > 0 && (
-
- {stats.pendingSubmissions}
-
- )}
-
-
-
- Reports
- Reports
- {stats.openReports > 0 && (
-
- {stats.openReports}
-
- )}
-
-
-
- Recent Activity
- Activity
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
);
}
diff --git a/src/pages/AdminModeration.tsx b/src/pages/AdminModeration.tsx
index 5dea1bbf..72e581ff 100644
--- a/src/pages/AdminModeration.tsx
+++ b/src/pages/AdminModeration.tsx
@@ -1,6 +1,6 @@
import { useRef, useCallback } from 'react';
import { useAdminGuard } from '@/hooks/useAdminGuard';
-import { MFARequiredAlert } from '@/components/auth/MFARequiredAlert';
+import { MFAGuard } from '@/components/auth/MFAGuard';
import { AdminLayout } from '@/components/layout/AdminLayout';
import { ModerationQueue, ModerationQueueRef } from '@/components/moderation/ModerationQueue';
import { QueueSkeleton } from '@/components/moderation/QueueSkeleton';
@@ -56,14 +56,6 @@ export default function AdminModeration() {
if (!isAuthorized) {
return null;
}
-
- if (needsMFA) {
- return (
-
-
-
- );
- }
return (
-
-
-
Moderation Queue
-
- Review and manage pending content submissions
-
-
+
+
+
+
Moderation Queue
+
+ Review and manage pending content submissions
+
+
-
-
+
+
+
);
}
diff --git a/src/pages/AdminReports.tsx b/src/pages/AdminReports.tsx
index 4aa2dbaa..2f42b103 100644
--- a/src/pages/AdminReports.tsx
+++ b/src/pages/AdminReports.tsx
@@ -1,6 +1,6 @@
import { useRef, useCallback } from 'react';
import { useAdminGuard } from '@/hooks/useAdminGuard';
-import { MFARequiredAlert } from '@/components/auth/MFARequiredAlert';
+import { MFAGuard } from '@/components/auth/MFAGuard';
import { AdminLayout } from '@/components/layout/AdminLayout';
import { ReportsQueue, ReportsQueueRef } from '@/components/moderation/ReportsQueue';
import { QueueSkeleton } from '@/components/moderation/QueueSkeleton';
@@ -57,14 +57,6 @@ export default function AdminReports() {
if (!isAuthorized) {
return null;
}
-
- if (needsMFA) {
- return (
-
-
-
- );
- }
return (
-
-
-
User Reports
-
- Review and resolve user-submitted reports
-
-
+
+
+
+
User Reports
+
+ Review and resolve user-submitted reports
+
+
-
-
+
+
+
);
}
diff --git a/src/pages/AdminUsers.tsx b/src/pages/AdminUsers.tsx
index d5bc9cc6..76c7b1e2 100644
--- a/src/pages/AdminUsers.tsx
+++ b/src/pages/AdminUsers.tsx
@@ -1,5 +1,5 @@
import { useAdminGuard } from '@/hooks/useAdminGuard';
-import { MFARequiredAlert } from '@/components/auth/MFARequiredAlert';
+import { MFAGuard } from '@/components/auth/MFAGuard';
import { AdminLayout } from '@/components/layout/AdminLayout';
import { UserManagement } from '@/components/admin/UserManagement';
import { Skeleton } from '@/components/ui/skeleton';
@@ -43,27 +43,21 @@ export default function AdminUsers() {
if (!isAuthorized) {
return null;
}
-
- if (needsMFA) {
- return (
-
-
-
- );
- }
return (
-
-
-
User Management
-
- Manage user profiles, roles, and permissions
-
-
+
+
+
+
User Management
+
+ Manage user profiles, roles, and permissions
+
+
-
-
+
+
+
);
}