diff --git a/src/renderer/components/team/activity/ActivityItem.tsx b/src/renderer/components/team/activity/ActivityItem.tsx index 95f4e7ce..7c35ed10 100644 --- a/src/renderer/components/team/activity/ActivityItem.tsx +++ b/src/renderer/components/team/activity/ActivityItem.tsx @@ -91,6 +91,21 @@ export function getCrossTeamSentTarget( return recipient.teamName; } +export function getCrossTeamSentMemberName(value: string | undefined): string | null { + return parseQualifiedRecipient(value)?.memberName ?? null; +} + +function CrossTeamTeamBadge({ teamName }: { teamName: string }): React.JSX.Element { + return ( + + {teamName} + + ); +} + interface ActivityItemProps { message: InboxMessage; teamName: string; @@ -319,6 +334,10 @@ export const ActivityItem = ({ () => getCrossTeamSentTarget(message.to, teamName, localMemberNames), [message.to, teamName, localMemberNames] ); + const crossTeamSentMemberName = useMemo( + () => getCrossTeamSentMemberName(message.to), + [message.to] + ); const isCrossTeam = message.source === CROSS_TEAM_SOURCE || parsedCrossTeamPrefix !== null; const isCrossTeamSent = message.source === CROSS_TEAM_SENT_SOURCE || @@ -344,6 +363,10 @@ export const ActivityItem = ({ if (dot <= 0) return message.to; return message.to.substring(0, dot); }, [crossTeamSentTarget, isCrossTeamSent, message.to, qualifiedRecipient]); + const senderName = crossTeamOrigin ? crossTeamOrigin.memberName : message.from; + const senderColor = crossTeamOrigin ? undefined : (memberColor ?? message.color); + const senderHideAvatar = + message.from === 'user' || message.from === 'system' || crossTeamOrigin?.memberName === 'user'; // Strip agent-only blocks + normalize escape sequences (before linkification) const strippedText = useMemo(() => { @@ -477,15 +500,13 @@ export const ActivityItem = ({ ) : null} {/* Sender avatar + name badge */} + {crossTeamOrigin ? : null} {/* Role */} @@ -517,26 +538,6 @@ export const ActivityItem = ({ ) : null} - {/* Cross-team origin badge */} - {isCrossTeam && crossTeamOrigin ? ( - - from {crossTeamOrigin.teamName} - - ) : null} - - {/* Cross-team sent badge */} - {isCrossTeamSent && crossTeamTarget ? ( - - to {crossTeamTarget} - - ) : null} - {/* Rate limit warning badge */} {rateLimited ? ( @@ -559,15 +560,19 @@ export const ActivityItem = ({ - + {crossTeamTarget ? : null} + {crossTeamSentMemberName || !crossTeamTarget ? ( + + ) : null} ) : null} diff --git a/test/renderer/components/team/activity/ActivityItem.test.ts b/test/renderer/components/team/activity/ActivityItem.test.ts index 6f20ad17..9920636e 100644 --- a/test/renderer/components/team/activity/ActivityItem.test.ts +++ b/test/renderer/components/team/activity/ActivityItem.test.ts @@ -1,6 +1,7 @@ import { describe, expect, it } from 'vitest'; import { + getCrossTeamSentMemberName, getCrossTeamSentTarget, getSystemMessageLabel, isQualifiedExternalRecipient, @@ -37,5 +38,7 @@ describe('ActivityItem legacy system message fallback', () => { expect(getCrossTeamSentTarget('team-best.user', 'my-team', new Set(['ops.bot']))).toBe( 'team-best' ); + expect(getCrossTeamSentMemberName('team-best.user')).toBe('user'); + expect(getCrossTeamSentMemberName('cross-team:team-best')).toBeNull(); }); });