diff --git a/frontend/App.tsx b/frontend/App.tsx index 5d1234c..ebd95dc 100755 --- a/frontend/App.tsx +++ b/frontend/App.tsx @@ -20,8 +20,11 @@ import { Auditing } from './components/Auditing'; import { Login } from './components/Login'; import { WIPReviewer } from './components/WIPReviewer'; import { KnowledgeBase } from './components/KnowledgeBase'; +import { UserManagement } from './components/UserManagement'; +import { AgencyFilterBar } from './components/AgencyFilterBar'; +import { UserProvider, useUser } from './contexts/UserContext'; -type View = 'Home' | 'Analytics' | 'Campaigns' | 'WIP Reviewer' | 'CopyGenAI' | 'Settings' | 'Profile' | 'Auditing' | 'Knowledge Base'; +type View = 'Home' | 'Analytics' | 'Campaigns' | 'WIP Reviewer' | 'CopyGenAI' | 'Settings' | 'Profile' | 'Auditing' | 'Knowledge Base' | 'User Management'; export interface DropdownOptions { campaigns: string[]; @@ -36,6 +39,43 @@ const App: React.FC = () => { const isAuthenticated = useIsAuthenticated(); const { instance: msalInstance, inProgress } = useMsal(); + // Initialize API service with MSAL instance BEFORE rendering UserProvider + useEffect(() => { + if (msalInstance) { + apiService.setMsalInstance(msalInstance); + } + }, [msalInstance]); + + // Show loading spinner during MSAL authentication interactions + if (inProgress !== InteractionStatus.None) { + return ( +
Authenticating...
+Authenticating...
+Loading user profile...
| + )} | Campaign Name | Proofs | Status | Created By | Owning Agency | Last Modified | -Actions | + {!readOnly &&Actions | }+ )} | {campaign.name} | {campaign.proofs} | @@ -488,6 +495,7 @@ const CampaignList: React.FC<{ onClick={(e) => e.stopPropagation()} className={getStatusSelectClasses(campaign.status)} aria-label={`Change status for ${campaign.name}`} + disabled={readOnly} > @@ -498,6 +506,7 @@ const CampaignList: React.FC<{ | {campaign.agencyLead} | {campaign.agency} | {formatDate(campaign.lastModified)} | + {!readOnly && (+ )} ); })} @@ -1714,6 +1724,7 @@ interface CampaignsProps { onResolveSubmit: (resolveData: Omit |
|---|