import React, { useRef } from 'react'; import { useAdmin, CATEGORY_LABELS, TAB_ENDPOINTS } from '../context/AdminContext'; import { TemplatesProvider } from '../context/TemplatesContext'; import { ObjectiveMappingsProvider } from '../context/ObjectiveMappingsContext'; import Sidebar from './Sidebar'; import ClientUsersPanel from './admin/ClientUsersPanel'; import SessionsPanel from './admin/SessionsPanel'; import TemplatesPanel from './admin/TemplatesPanel'; import ObjectiveMappingPanel from './admin/ObjectiveMappingPanel'; import CampaignsPanel from './admin/CampaignsPanel'; import IntelligencePanel from './admin/IntelligencePanel'; import ModifiersPanel from './admin/ModifiersPanel'; import ClientManagementPanel from './admin/ClientManagementPanel'; import ClientActivityPanel from './admin/ClientActivityPanel'; import ClientDocumentsPanel from './admin/ClientDocumentsPanel'; import DocumentsPanel from './admin/DocumentsPanel'; export default function Dashboard() { const { user, userRole, isAuthenticated, activeCategory, activeTab, tabs, collapsed, setActiveCategory, setActiveTab, setCollapsed, data, loading, error, } = useAdmin(); const tabBarRef = useRef(null); return (
{/* Sidebar */} setCollapsed(c => !c)} /> {/* Main area */}
{/* Header with category title + tabs */}

{CATEGORY_LABELS[activeCategory] || activeCategory}

{user?.displayName && {user.displayName}} {userRole && Role: {userRole}}
{/* Horizontal tabs (within the current category) */} {tabs.length > 1 && (
{tabs.map(tab => ( ))}
)}
{/* Content area */}
{/* Loading state β€” full spinner only on initial load */} {loading && !data && (

Loading...

)} {/* Refreshing indicator β€” subtle, panels stay mounted */} {loading && data && (
Refreshing…
)} {/* Error state */} {error && !loading && (
Error: {error}
)} {/* Data-driven panels β€” stay mounted during refresh */} {(data || (error && activeTab === 'templates') || activeTab === 'objectives' || activeTab === 'modifiers' || activeTab === 'performance' || activeTab === 'insights' || activeTab === 'analysis' || activeTab === 'pending' || activeTab === 'allClients' || activeTab === 'clientActivity' || activeTab === 'clientDocuments' || activeTab === 'documents') && (
{activeTab === 'overview' && data && } {activeTab === 'sessions' && data && } {activeTab === 'clientUsers' && data && } {activeTab === 'templates' && ( )} {activeTab === 'objectives' && ( )} {activeTab === 'modifiers' && } {activeTab === 'campaigns' && data && } {(activeTab === 'performance' || activeTab === 'insights' || activeTab === 'analysis') && ( )} {(activeTab === 'pending' || activeTab === 'allClients') && ( )} {activeTab === 'clientActivity' && } {activeTab === 'clientDocuments' && } {activeTab === 'documents' && }
)} {/* Placeholder for tabs without API endpoints */} {!loading && !error && !data && !TAB_ENDPOINTS[activeTab] && activeTab !== 'pending' && activeTab !== 'allClients' && activeTab !== 'clientActivity' && activeTab !== 'clientDocuments' && activeTab !== 'performance' && activeTab !== 'insights' && activeTab !== 'analysis' && activeTab !== 'documents' && (
🚧

{activeTab.charAt(0).toUpperCase() + activeTab.slice(1)}

This section is under development.

)} {/* Fallback */} {!loading && !error && !data && activeTab !== 'templates' && activeTab !== 'modifiers' && activeTab !== 'pending' && activeTab !== 'allClients' && activeTab !== 'clientActivity' && activeTab !== 'clientDocuments' && activeTab !== 'performance' && activeTab !== 'insights' && activeTab !== 'analysis' && activeTab !== 'documents' && TAB_ENDPOINTS[activeTab] && (

No data loaded. Check the browser console for logs.

)}
); } // ─── Overview Panel (lightweight, stays local) ─────────────── function OverviewPanel({ data }) { return (

Server Time: {new Date(data.serverTimeUtc).toLocaleString()}

); } function StatCard({ label, value }) { return (
{value ?? 'β€”'}
{label}
); }