diff --git a/src/components/moderation/ModerationQueue.tsx b/src/components/moderation/ModerationQueue.tsx index f3767133..9e7b8363 100644 --- a/src/components/moderation/ModerationQueue.tsx +++ b/src/components/moderation/ModerationQueue.tsx @@ -23,6 +23,7 @@ import { ReassignDialog } from './ReassignDialog'; import { smartMergeArray } from '@/lib/smartStateUpdate'; import { useDebounce } from '@/hooks/useDebounce'; import { QueueItem } from './QueueItem'; +import { QueueSkeleton } from './QueueSkeleton'; interface ModerationItem { id: string; @@ -1678,11 +1679,7 @@ export const ModerationQueue = forwardRef((props, ref) => { const QueueContent = () => { if (isInitialLoad && loading) { - return ( -
-
-
- ); + return ; } if (items.length === 0) { diff --git a/src/components/moderation/QueueItemSkeleton.tsx b/src/components/moderation/QueueItemSkeleton.tsx new file mode 100644 index 00000000..40f81ac2 --- /dev/null +++ b/src/components/moderation/QueueItemSkeleton.tsx @@ -0,0 +1,42 @@ +import { Card, CardHeader, CardContent } from '@/components/ui/card'; +import { Skeleton } from '@/components/ui/skeleton'; + +export function QueueItemSkeleton() { + return ( + + +
+ {/* Left side: Entity type badge + title */} +
+ {/* Badge */} + {/* Title */} +
+ {/* Avatar */} + {/* Username */} + {/* Date */} +
+
+ + {/* Right side: Status badge */} + +
+
+ + + {/* Content area */} +
+ + + +
+ + {/* Action buttons */} +
+ + + +
+
+
+ ); +} diff --git a/src/components/moderation/QueueSkeleton.tsx b/src/components/moderation/QueueSkeleton.tsx new file mode 100644 index 00000000..a64b0b69 --- /dev/null +++ b/src/components/moderation/QueueSkeleton.tsx @@ -0,0 +1,15 @@ +import { QueueItemSkeleton } from './QueueItemSkeleton'; + +interface QueueSkeletonProps { + count?: number; +} + +export function QueueSkeleton({ count = 5 }: QueueSkeletonProps) { + return ( +
+ {Array.from({ length: count }).map((_, i) => ( + + ))} +
+ ); +} diff --git a/src/pages/AdminDashboard.tsx b/src/pages/AdminDashboard.tsx index f972cb6c..e1c75a1f 100644 --- a/src/pages/AdminDashboard.tsx +++ b/src/pages/AdminDashboard.tsx @@ -14,6 +14,8 @@ import { useModerationStats } from '@/hooks/useModerationStats'; import { useAdminSettings } from '@/hooks/useAdminSettings'; import { supabase } from '@/integrations/supabase/client'; import { Alert, AlertDescription } from '@/components/ui/alert'; +import { Skeleton } from '@/components/ui/skeleton'; +import { QueueSkeleton } from '@/components/moderation/QueueSkeleton'; export default function AdminDashboard() { const { user, loading: authLoading } = useAuth(); @@ -110,14 +112,37 @@ export default function AdminDashboard() { if (authLoading || roleLoading) { return ( -
-
-
-
-

Loading admin panel...

+ +
+
+

Admin Dashboard

+

Central hub for all moderation activity

+
+ + {/* Skeleton for stat cards */} +
+ {[1, 2, 3].map((i) => ( + + +
+
+ + +
+ +
+
+
+ ))} +
+ + {/* Skeleton for tabs */} +
+ +
-
+ ); } diff --git a/src/pages/AdminModeration.tsx b/src/pages/AdminModeration.tsx index 217f825a..a4853112 100644 --- a/src/pages/AdminModeration.tsx +++ b/src/pages/AdminModeration.tsx @@ -4,6 +4,7 @@ import { useUserRole } from '@/hooks/useUserRole'; import { useAuth } from '@/hooks/useAuth'; import { AdminLayout } from '@/components/layout/AdminLayout'; import { ModerationQueue, ModerationQueueRef } from '@/components/moderation/ModerationQueue'; +import { QueueSkeleton } from '@/components/moderation/QueueSkeleton'; import { useAdminSettings } from '@/hooks/useAdminSettings'; import { useModerationStats } from '@/hooks/useModerationStats'; @@ -47,14 +48,23 @@ export default function AdminModeration() { if (authLoading || roleLoading) { return ( -
-
-
-
-

Loading moderation queue...

+ +
+
+

Moderation Queue

+

+ Review and manage pending content submissions +

+ +
-
+ ); } diff --git a/src/pages/AdminReports.tsx b/src/pages/AdminReports.tsx index fac21b12..bfd313a2 100644 --- a/src/pages/AdminReports.tsx +++ b/src/pages/AdminReports.tsx @@ -4,6 +4,7 @@ import { useUserRole } from '@/hooks/useUserRole'; import { useAuth } from '@/hooks/useAuth'; import { AdminLayout } from '@/components/layout/AdminLayout'; import { ReportsQueue, ReportsQueueRef } from '@/components/moderation/ReportsQueue'; +import { QueueSkeleton } from '@/components/moderation/QueueSkeleton'; import { useAdminSettings } from '@/hooks/useAdminSettings'; import { useModerationStats } from '@/hooks/useModerationStats'; @@ -48,14 +49,23 @@ export default function AdminReports() { if (authLoading || roleLoading) { return ( -
-
-
-
-

Loading reports...

+ +
+
+

User Reports

+

+ Review and resolve user-submitted reports +

+ +
-
+ ); } diff --git a/src/pages/AdminSystemLog.tsx b/src/pages/AdminSystemLog.tsx index 75ea5a56..97b027ee 100644 --- a/src/pages/AdminSystemLog.tsx +++ b/src/pages/AdminSystemLog.tsx @@ -4,6 +4,8 @@ import { useAuth } from '@/hooks/useAuth'; import { useUserRole } from '@/hooks/useUserRole'; import { AdminLayout } from '@/components/layout/AdminLayout'; import { SystemActivityLog } from '@/components/admin/SystemActivityLog'; +import { Skeleton } from '@/components/ui/skeleton'; +import { Card, CardContent } from '@/components/ui/card'; export default function AdminSystemLog() { const { user, loading: authLoading } = useAuth(); @@ -26,14 +28,30 @@ export default function AdminSystemLog() { if (authLoading || roleLoading) { return ( -
-
-
-
-

Loading system log...

+ +
+
+

System Activity Log

+

+ Complete audit trail of all system changes and administrative actions +

+ + + + {[1, 2, 3, 4, 5].map((i) => ( +
+
+ + +
+ +
+ ))} +
+
-
+ ); } diff --git a/src/pages/AdminUsers.tsx b/src/pages/AdminUsers.tsx index e95969b5..bb2601b1 100644 --- a/src/pages/AdminUsers.tsx +++ b/src/pages/AdminUsers.tsx @@ -4,6 +4,8 @@ import { useUserRole } from '@/hooks/useUserRole'; import { useAuth } from '@/hooks/useAuth'; import { AdminLayout } from '@/components/layout/AdminLayout'; import { UserManagement } from '@/components/admin/UserManagement'; +import { Skeleton } from '@/components/ui/skeleton'; +import { Card, CardContent } from '@/components/ui/card'; export default function AdminUsers() { const { user, loading: authLoading } = useAuth(); @@ -26,14 +28,31 @@ export default function AdminUsers() { if (authLoading || roleLoading) { return ( -
-
-
-
-

Loading user management...

+ +
+
+

User Management

+

+ Manage user profiles, roles, and permissions +

+ + + + {[1, 2, 3, 4].map((i) => ( +
+ +
+ + +
+ +
+ ))} +
+
-
+ ); }