import { FormEvent, useCallback, useEffect, useState } from 'react'; import Layout from '../../components/Layout'; import { api } from '../../lib/api'; import { useRequireAuth } from '../../lib/auth-context'; interface MemberRow { role: string; createdAt: string; user: { id: string; email: string; name: string }; } const ROLES = ['ORG_ADMIN', 'MEMBER', 'VIEWER']; export default function MembersPage() { const { user, activeOrg, loading } = useRequireAuth(); const orgId = activeOrg?.org.id ?? null; const isAdmin = activeOrg?.role === 'ORG_ADMIN'; const [members, setMembers] = useState([]); const [email, setEmail] = useState(''); const [role, setRole] = useState('MEMBER'); const [error, setError] = useState(null); const reload = useCallback(() => { if (!orgId) { return; } api .get(`/api/orgs/${orgId}/members`) .then((rows) => { setMembers(rows); setError(null); }) .catch((err) => setError(err.message)); }, [orgId]); useEffect(reload, [reload]); const addMember = async (e: FormEvent) => { e.preventDefault(); try { await api.post(`/api/orgs/${orgId}/members`, { email, role }); setEmail(''); reload(); } catch (err: any) { setError(err.message); } }; const changeRole = async (userId: string, newRole: string) => { try { await api.patch(`/api/orgs/${orgId}/members/${userId}`, { role: newRole }); reload(); } catch (err: any) { setError(err.message); } }; const remove = async (userId: string) => { try { await api.delete(`/api/orgs/${orgId}/members/${userId}`); reload(); } catch (err: any) { setError(err.message); } }; if (loading || !user) { return null; } return (

Members

{error &&

{error}

} {isAdmin && (
setEmail(e.target.value)} required style={{ padding: '0.4rem', width: 280 }} />
)} {isAdmin && {members.map((m) => ( {isAdmin && ( )} ))}
Name Email Role Since}
{m.user.name} {m.user.email} {isAdmin && m.user.id !== user.id ? ( ) : ( m.role )} {new Date(m.createdAt).toLocaleDateString()} {m.user.id !== user.id && }
); }