import { Badge } from '@renderer/components/ui/badge'; import { Tooltip, TooltipContent, TooltipTrigger } from '@renderer/components/ui/tooltip'; import { getTeamColorSet } from '@renderer/constants/teamColors'; import { formatAgentRole } from '@renderer/utils/formatAgentRole'; import { agentAvatarUrl, getMemberDotClass, getPresenceLabel } from '@renderer/utils/memberHelpers'; import { GitBranch, Loader2, MessageSquare, Plus } from 'lucide-react'; import type { TaskStatusCounts } from '@renderer/utils/pathNormalize'; import type { LeadActivityState, ResolvedTeamMember, TeamTaskWithKanban } from '@shared/types'; interface MemberCardProps { member: ResolvedTeamMember; memberColor: string; taskCounts?: TaskStatusCounts | null; isTeamAlive?: boolean; isTeamProvisioning?: boolean; leadActivity?: LeadActivityState; currentTask?: TeamTaskWithKanban | null; isAwaitingReply?: boolean; isRemoved?: boolean; onOpenTask?: () => void; onClick?: () => void; onSendMessage?: () => void; onAssignTask?: () => void; } export const MemberCard = ({ member, memberColor, taskCounts, isTeamAlive, isTeamProvisioning, leadActivity, currentTask, isAwaitingReply, isRemoved, onOpenTask, onClick, onSendMessage, onAssignTask, }: MemberCardProps): React.JSX.Element => { // NOTE: lead context display disabled — usage formula is inaccurate // const teamName = useStore((s) => s.selectedTeamName); // const leadContext = useStore((s) => // member.agentType === 'team-lead' && teamName ? s.leadContextByTeam[teamName] : undefined // ); const dotClass = getMemberDotClass(member, isTeamAlive, isTeamProvisioning, leadActivity); const presenceLabel = getPresenceLabel(member, isTeamAlive, isTeamProvisioning, leadActivity); const colors = getTeamColorSet(memberColor); const pending = taskCounts?.pending ?? 0; const inProgress = taskCounts?.inProgress ?? 0; const completed = taskCounts?.completed ?? 0; const totalTasks = pending + inProgress + completed; const progressPercent = totalTasks > 0 ? Math.round((completed / totalTasks) * 100) : 0; return (
{ if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onClick?.(); } }} >
{member.name}
{member.name} {member.gitBranch ? ( {member.gitBranch} ) : null} {currentTask ? ( <> working on ) : null} {!currentTask && isAwaitingReply ? ( <> awaiting reply ) : null}
{(() => { const roleLabel = formatAgentRole(member.role) ?? formatAgentRole(member.agentType); return roleLabel ? ( {roleLabel} ) : null; })()} {presenceLabel === 'connecting' && !isRemoved ? ( ) : ( {isRemoved ? 'removed' : presenceLabel} )}
0 ? `${completed}/${totalTasks} completed` : undefined} > {member.taskCount} {member.taskCount === 1 ? 'task' : 'tasks'} {totalTasks > 0 && (
)} {/* NOTE: lead context bar disabled — usage formula is inaccurate */}
{!isRemoved && (
Send message Assign task
)}
); };