import { useState, useEffect } from 'react'; import { Trash2, Shield, User, CheckCircle, Info } from 'lucide-react'; import Card from '../ui/Card'; import Tag from '../ui/Tag'; import * as db from '../../lib/db'; import { pb } from '../../lib/pb'; import { useApp } from '../../store/AppContext'; // Users are provisioned automatically on first Azure (Entra ID) login — admins // no longer create them by hand. This panel lets an admin review the roster, // switch a member between user/admin, and remove members. The admin role is // also re-synced from the ENTRA_ADMIN_EMAILS allow-list on every login (see // pb_hooks/team_members.pb.js), so a manual change here can be overridden on // the member's next sign-in if their e-mail is on/off that list. const TeamManager = () => { const { state } = useApp(); const [users, setUsers] = useState([]); const [message, setMessage] = useState(''); const loadUsers = async () => { const members = await db.getTeamMembers(); setUsers(members); }; useEffect(() => { loadUsers(); }, []); const flash = (msg) => { setMessage(msg); setTimeout(() => setMessage(''), 3000); }; const handleRoleChange = async (user, role) => { if (role === user.role) return; await db.updateTeamMember(user.id, { role }); await loadUsers(); flash(`${user.name} is now ${role}.`); }; const handleDelete = async (id) => { if (id === state.currentUser?.id) { alert("You cannot delete yourself."); return; } if (confirm("Are you sure you want to delete this user?")) { await db.deleteTeamMember(id); // Also remove from leaderboard. try { const entry = await pb.collection('leaderboard').getFirstListItem(`user_id="${id}"`); await pb.collection('leaderboard').delete(entry.id); } catch { /* no leaderboard entry, nothing to do */ } await loadUsers(); flash('User deleted.'); } }; return (
{message && (
{message}
)}

Team members are created automatically when they first sign in with their Microsoft account. Admins are granted via the ENTRA_ADMIN_EMAILS{' '} allow-list and re-synced on each login.

{users.length === 0 && (
No team members yet — they appear here after their first sign-in.
)} {users.map(user => (
{user.role === 'admin' ? : }

{user.name} {user.id === state.currentUser?.id && You}

{user.email}

))}
); }; export default TeamManager;