import React, { useState, useEffect } from 'react'; import apiService from '../services/apiService'; import type { UserManagementResponse, AgencyResponse } from '../services/apiService'; import { UserIcon } from './icons/UserIcon'; import { PlusIcon } from './icons/PlusIcon'; import { ChevronDownIcon } from './icons/ChevronDownIcon'; import type { UserRole } from '../types'; const ROLE_OPTIONS: { value: UserRole; label: string }[] = [ { value: 'super_admin', label: 'Super Admin' }, { value: 'oversight_admin', label: 'Oversight Admin' }, { value: 'agency_admin', label: 'Agency Admin' }, { value: 'basic_user', label: 'Basic User' }, ]; const formatDate = (iso: string) => { return new Date(iso).toLocaleDateString('en-US', { month: 'short', day: 'numeric', year: 'numeric' }); }; export const UserManagement: React.FC = () => { const [users, setUsers] = useState([]); const [agencies, setAgencies] = useState([]); const [isLoading, setIsLoading] = useState(true); const [error, setError] = useState(null); // New agency form const [newAgencyName, setNewAgencyName] = useState(''); const [isCreatingAgency, setIsCreatingAgency] = useState(false); useEffect(() => { loadData(); }, []); const loadData = async () => { setIsLoading(true); try { const [usersData, agenciesData] = await Promise.all([ apiService.getUsers(), apiService.getAgencies(), ]); setUsers(usersData); setAgencies(agenciesData); } catch (err) { console.error('Failed to load user management data:', err); setError('Failed to load data. You may not have permission.'); } finally { setIsLoading(false); } }; const handleRoleChange = async (userId: string, newRole: string) => { try { const updated = await apiService.updateUser(userId, { role: newRole }); setUsers(prev => prev.map(u => u.id === userId ? updated : u)); } catch (err) { console.error('Failed to update user role:', err); setError('Failed to update user role.'); } }; const handleAgencyChange = async (userId: string, agencyId: string | null) => { try { const updated = await apiService.updateUser(userId, { agency_id: agencyId }); setUsers(prev => prev.map(u => u.id === userId ? updated : u)); } catch (err) { console.error('Failed to update user agency:', err); setError('Failed to update user agency.'); } }; const handleCreateAgency = async (e: React.FormEvent) => { e.preventDefault(); if (!newAgencyName.trim()) return; setIsCreatingAgency(true); try { const newAgency = await apiService.createAgency(newAgencyName.trim()); setAgencies(prev => [...prev, newAgency].sort((a, b) => a.name.localeCompare(b.name))); setNewAgencyName(''); } catch (err) { console.error('Failed to create agency:', err); setError('Failed to create agency.'); } finally { setIsCreatingAgency(false); } }; if (isLoading) { return (

Loading user management...

); } return (

User Management

Manage user roles and agency assignments. Users are provisioned automatically via Azure AD.

{error && (
{error}
)} {/* Users Table */}

Users ({users.length})

{users.map((user, index) => ( ))} {users.length === 0 && ( )}
Name Email Role Agency Created
{user.name}
{user.email}
{formatDate(user.created_at)}
No users found.
{/* Agency Management */}

Agencies ({agencies.length})

setNewAgencyName(e.target.value)} placeholder="New agency name..." className="flex-grow p-2 border-2 border-grey-700 rounded-[10px] focus:ring-2 focus:ring-active-blue focus:border-active-blue transition text-black-title" />
{agencies.map(agency => (
{agency.name} {users.filter(u => u.agency_id === agency.id).length} user(s)
))} {agencies.length === 0 && (
No agencies created yet.
)}
); };