import { buildMemberColorMap } from '@renderer/utils/memberHelpers'; import { MemberCard } from './MemberCard'; import type { TaskStatusCounts } from '@renderer/utils/pathNormalize'; import type { LeadActivityState, ResolvedTeamMember, TeamTaskWithKanban } from '@shared/types'; interface MemberListProps { members: ResolvedTeamMember[]; memberTaskCounts?: Map; taskMap?: Map; pendingRepliesByMember?: Record; isTeamAlive?: boolean; isTeamProvisioning?: boolean; leadActivity?: LeadActivityState; onMemberClick?: (member: ResolvedTeamMember) => void; onSendMessage?: (member: ResolvedTeamMember) => void; onAssignTask?: (member: ResolvedTeamMember) => void; onOpenTask?: (task: TeamTaskWithKanban) => void; } export const MemberList = ({ members, memberTaskCounts, taskMap, pendingRepliesByMember, isTeamAlive, isTeamProvisioning, leadActivity, onMemberClick, onSendMessage, onAssignTask, onOpenTask, }: MemberListProps): React.JSX.Element => { const activeMembers = members .filter((m) => !m.removedAt) .sort((a, b) => { if (a.agentType === 'team-lead') return -1; if (b.agentType === 'team-lead') return 1; return 0; }); const removedMembers = members.filter((m) => m.removedAt); const colorMap = buildMemberColorMap(members); if (members.length === 0) { return (
Solo team — lead only
); } const renderCard = (member: ResolvedTeamMember, isRemoved: boolean): React.JSX.Element => { const currentTask = member.currentTaskId && taskMap ? (taskMap.get(member.currentTaskId) ?? null) : null; const awaitingReply = Boolean(pendingRepliesByMember?.[member.name]); return ( onOpenTask?.(currentTask) : undefined} onClick={() => onMemberClick?.(member)} onSendMessage={() => onSendMessage?.(member)} onAssignTask={() => onAssignTask?.(member)} /> ); }; return (
{activeMembers.map((member) => renderCard(member, false))} {removedMembers.length > 0 && ( <>
Removed ({removedMembers.length})
{removedMembers.map((member) => renderCard(member, true))} )}
); };