'use client' import { useState, useEffect } from 'react' import type { TeamMember } from '../../hooks/useTeam' interface Props { member: TeamMember | null open: boolean onClose: () => void onUpdateRole: (memberId: string, role: 'MANAGER' | 'AGENT') => Promise onDeactivate: (memberId: string) => Promise onReactivate: (memberId: string) => Promise onRemove: (memberId: string) => Promise } const ROLE_OPTIONS = [ { value: 'MANAGER' as const, label: 'Manager', description: 'Full ops — no billing' }, { value: 'AGENT' as const, label: 'Agent', description: 'Reservations & check-ins' }, ] type ActionState = 'idle' | 'saving' | 'deactivating' | 'reactivating' | 'removing' type ConfirmAction = 'deactivate' | 'reactivate' | 'remove' | null export default function EditMemberModal({ member, open, onClose, onUpdateRole, onDeactivate, onReactivate, onRemove, }: Props) { const [role, setRole] = useState<'MANAGER' | 'AGENT'>('AGENT') const [actionState, setActionState] = useState('idle') const [confirm, setConfirm] = useState(null) const [error, setError] = useState(null) useEffect(() => { if (member && open) { setRole(member.role === 'OWNER' ? 'MANAGER' : (member.role as 'MANAGER' | 'AGENT')) setActionState('idle') setConfirm(null) setError(null) } }, [member, open]) if (!open || !member) return null const isPending = member.invitationStatus === 'pending' const isActive = member.isActive const handleSave = async () => { if (role === member.role) { onClose(); return } setActionState('saving') setError(null) try { await onUpdateRole(member.id, role) onClose() } catch (err: any) { setError(err.message) setActionState('idle') } } const handleDeactivate = async () => { setActionState('deactivating') setError(null) try { await onDeactivate(member.id) onClose() } catch (err: any) { setError(err.message) setActionState('idle') } setConfirm(null) } const handleReactivate = async () => { setActionState('reactivating') setError(null) try { await onReactivate(member.id) onClose() } catch (err: any) { setError(err.message) setActionState('idle') } setConfirm(null) } const handleRemove = async () => { setActionState('removing') setError(null) try { await onRemove(member.id) onClose() } catch (err: any) { setError(err.message) setActionState('idle') } setConfirm(null) } const busy = actionState !== 'idle' const initials = (member.firstName[0] ?? '') + (member.lastName[0] ?? '') return (
{ if (e.target === e.currentTarget && !busy) onClose() }} >
{/* Member header */}
{initials}

{member.firstName} {member.lastName}

{member.email}

{isPending && ( Pending invite )} {!isPending && !isActive && ( Deactivated )}
{/* Confirm overlay */} {confirm && (

{confirm === 'deactivate' && 'Deactivate this member?'} {confirm === 'remove' && 'Permanently remove this member?'} {confirm === 'reactivate' && 'Reactivate this member?'}

{confirm === 'deactivate' && "They'll immediately lose dashboard access. You can reactivate anytime."} {confirm === 'remove' && "This will delete the employee record and revoke their Clerk access. This cannot be undone."} {confirm === 'reactivate' && "They'll regain dashboard access with their current role."}

)} {/* Role selector (hidden for pending invites — role locked until accepted) */} {!isPending && isActive && (
{ROLE_OPTIONS.map((option) => ( ))}
)} {/* Error */} {error && (

{error}

)} {/* Footer actions */}
{/* Danger zone */}
{isActive && !isPending && ( )} {!isActive && ( )}
{isActive && !isPending && ( )}
) }