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 => { 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; })()} {isRemoved ? 'removed' : presenceLabel}
0 ? `${completed}/${totalTasks} completed` : undefined} > {member.taskCount} {member.taskCount === 1 ? 'task' : 'tasks'} {totalTasks > 0 && (
)}
{!isRemoved && (
Send message Assign task
)}
); };