import { CARD_BG, CARD_BORDER_STYLE, CARD_ICON_MUTED } from '@renderer/constants/cssVariables'; import { getTeamColorSet, getThemedBadge } from '@renderer/constants/teamColors'; import { useTheme } from '@renderer/hooks/useTheme'; import { formatAgentRole } from '@renderer/utils/formatAgentRole'; import { agentAvatarUrl, buildMemberColorMap } from '@renderer/utils/memberHelpers'; import { nameColorSet } from '@renderer/utils/projectColor'; import { formatDistanceToNowStrict } from 'date-fns'; import { Users } from 'lucide-react'; import type { ResolvedTeamMember } from '@shared/types'; export interface PendingCrossTeamReply { teamName: string; sentAtMs: number; } interface PendingRepliesBlockProps { members: ResolvedTeamMember[]; pendingRepliesByMember: Record; pendingCrossTeamReplies?: PendingCrossTeamReply[]; onMemberClick?: (member: ResolvedTeamMember) => void; } export const PendingRepliesBlock = ({ members, pendingRepliesByMember, pendingCrossTeamReplies = [], onMemberClick, }: PendingRepliesBlockProps): React.JSX.Element | null => { const { isLight } = useTheme(); const colorMap = buildMemberColorMap(members); const memberPending = Object.entries(pendingRepliesByMember) .map(([name, sentAtMs]) => ({ kind: 'member' as const, member: members.find((m) => m.name === name) ?? null, name, sentAtMs, })) .filter( (p): p is { kind: 'member'; member: ResolvedTeamMember; name: string; sentAtMs: number } => !!p.member ); const teamPending = pendingCrossTeamReplies.map((entry) => ({ kind: 'team' as const, teamName: entry.teamName, sentAtMs: entry.sentAtMs, })); const pending = [...memberPending, ...teamPending].sort((a, b) => b.sentAtMs - a.sentAtMs); if (pending.length === 0) return null; return (

Awaiting replies

{pending.map((entry) => { const since = formatDistanceToNowStrict(entry.sentAtMs, { addSuffix: true }); if (entry.kind === 'member') { const { member } = entry; const colors = getTeamColorSet(colorMap.get(member.name) ?? ''); const roleLabel = formatAgentRole( member.role ?? (member.agentType !== 'general-purpose' ? member.agentType : undefined) ); return (
{onMemberClick ? ( ) : ( {member.name} )} {roleLabel ? ( {roleLabel} ) : null} awaiting reply {since}
); } const colors = nameColorSet(entry.teamName, isLight); return (
{entry.teamName} external team awaiting reply {since}
); })}
); };