import { useRef, useEffect, useCallback } from 'react'; import { useNavigate } from 'react-router-dom'; import { Shield, Users, FileText, Flag, AlertCircle, RefreshCw } from 'lucide-react'; import { useUserRole } from '@/hooks/useUserRole'; import { useAuth } from '@/hooks/useAuth'; import { useIsMobile } from '@/hooks/use-mobile'; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs'; import { ModerationQueue, ModerationQueueRef } from '@/components/moderation/ModerationQueue'; import { ReportsQueue, ReportsQueueRef } from '@/components/moderation/ReportsQueue'; import { UserManagement } from '@/components/admin/UserManagement'; import { AdminHeader } from '@/components/layout/AdminHeader'; import { useModerationStats } from '@/hooks/useModerationStats'; import { useAdminSettings } from '@/hooks/useAdminSettings'; import { useDocumentTitle } from '@/hooks/useDocumentTitle'; export default function Admin() { useDocumentTitle('Admin Panel'); const isMobile = useIsMobile(); const { user, loading: authLoading } = useAuth(); const { isModerator, loading: roleLoading } = useUserRole(); const navigate = useNavigate(); const moderationQueueRef = useRef(null); const reportsQueueRef = useRef(null); // Get admin settings for polling configuration const { getAdminPanelRefreshMode, getAdminPanelPollInterval, isLoading: settingsLoading } = useAdminSettings(); const refreshMode = getAdminPanelRefreshMode(); const pollInterval = getAdminPanelPollInterval(); // Use stats hook with configurable polling const { stats, refresh: refreshStats, lastUpdated } = useModerationStats({ enabled: !!user && !authLoading && !roleLoading && isModerator(), pollingEnabled: refreshMode === 'auto', pollingInterval: pollInterval, }); const handleRefresh = useCallback(() => { moderationQueueRef.current?.refresh(); reportsQueueRef.current?.refresh(); refreshStats(); }, [refreshStats]); useEffect(() => { if (!authLoading && !roleLoading) { if (!user) { navigate('/auth'); return; } if (!isModerator()) { navigate('/'); return; } } }, [user, authLoading, roleLoading, navigate, isModerator]); if (authLoading || roleLoading) { return (

Loading admin panel...

); } if (!user || !isModerator()) { return null; } return ( <>
{/* Refresh status indicator */}
{refreshMode === 'auto' ? ( Auto-refresh: every {pollInterval / 1000}s ) : ( Manual refresh only )} {lastUpdated && ( • Last updated: {lastUpdated.toLocaleTimeString()} )}
{/* Stats cards */}
Pending Submissions
{stats.pendingSubmissions}
Open Reports
{stats.openReports}
Flagged Content
{stats.flaggedContent}
{/* Content Moderation Section */} Moderation Queue {isMobile ? 'Queue' : 'Moderation Queue'} Reports {/* User Management Section */} User Management
); }