From f1df2be208bc44b6102046b2c19d9c2be658f626 Mon Sep 17 00:00:00 2001 From: iliya Date: Mon, 23 Feb 2026 12:04:13 +0200 Subject: [PATCH] fix: address CodeRabbit review feedback - MemberCard: add hover overlay to fix inline backgroundColor killing Tailwind hover effect (UX regression for role="button" element) - MemberLogsTab: guard against missing taskId and memberName to prevent unnecessary IPC call with empty string - MemberList: use hash-based getMemberColorByName() for stable fallback colors independent of array position - TeamAgentToolsInstaller: remove redundant `from || undefined` - TeamDataService test: assert createdBy: 'user' field --- src/main/services/team/TeamAgentToolsInstaller.ts | 2 +- src/renderer/components/team/members/MemberCard.tsx | 3 ++- src/renderer/components/team/members/MemberList.tsx | 6 +++--- src/renderer/components/team/members/MemberLogsTab.tsx | 6 +++++- src/shared/constants/memberColors.ts | 9 +++++++++ test/main/services/team/TeamDataService.test.ts | 2 +- 6 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/main/services/team/TeamAgentToolsInstaller.ts b/src/main/services/team/TeamAgentToolsInstaller.ts index 7e32207e..018540fe 100644 --- a/src/main/services/team/TeamAgentToolsInstaller.ts +++ b/src/main/services/team/TeamAgentToolsInstaller.ts @@ -282,7 +282,7 @@ function createTask(paths, flags) { description: String(description || subject), activeForm: activeForm ? String(activeForm) : undefined, owner, - createdBy: from || undefined, + createdBy: from, status, blocks: [], blockedBy: [], diff --git a/src/renderer/components/team/members/MemberCard.tsx b/src/renderer/components/team/members/MemberCard.tsx index 369a8589..963461bd 100644 --- a/src/renderer/components/team/members/MemberCard.tsx +++ b/src/renderer/components/team/members/MemberCard.tsx @@ -29,7 +29,7 @@ export const MemberCard = ({ return (
+
- {members.map((member, index) => ( + {members.map((member) => ( onMemberClick?.(member)} onSendMessage={() => onSendMessage?.(member)} diff --git a/src/renderer/components/team/members/MemberLogsTab.tsx b/src/renderer/components/team/members/MemberLogsTab.tsx index dce232d7..fd889a45 100644 --- a/src/renderer/components/team/members/MemberLogsTab.tsx +++ b/src/renderer/components/team/members/MemberLogsTab.tsx @@ -41,10 +41,14 @@ export const MemberLogsTab = ({ void (async () => { try { + if (taskId == null && !memberName) { + if (!cancelled) setLogs([]); + return; + } const result = taskId != null ? await api.teams.getLogsForTask(teamName, taskId) - : await api.teams.getMemberLogs(teamName, memberName ?? ''); + : await api.teams.getMemberLogs(teamName, memberName!); if (!cancelled) { setLogs(result); } diff --git a/src/shared/constants/memberColors.ts b/src/shared/constants/memberColors.ts index c86684a4..901672f0 100644 --- a/src/shared/constants/memberColors.ts +++ b/src/shared/constants/memberColors.ts @@ -8,3 +8,12 @@ export const MEMBER_COLOR_PALETTE = ['blue', 'green', 'yellow', 'cyan', 'magenta export function getMemberColor(index: number): string { return MEMBER_COLOR_PALETTE[index % MEMBER_COLOR_PALETTE.length]; } + +/** Derive a stable fallback color from a member name (position-independent). */ +export function getMemberColorByName(name: string): string { + let hash = 0; + for (let i = 0; i < name.length; i++) { + hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0; + } + return MEMBER_COLOR_PALETTE[Math.abs(hash) % MEMBER_COLOR_PALETTE.length]; +} diff --git a/test/main/services/team/TeamDataService.test.ts b/test/main/services/team/TeamDataService.test.ts index 16ff76af..daf62c0e 100644 --- a/test/main/services/team/TeamDataService.test.ts +++ b/test/main/services/team/TeamDataService.test.ts @@ -160,7 +160,7 @@ describe('TeamDataService', () => { expect(result.status).toBe('pending'); expect(createTaskMock).toHaveBeenCalledWith( 'my-team', - expect.objectContaining({ status: 'pending', owner: 'alice' }) + expect.objectContaining({ status: 'pending', owner: 'alice', createdBy: 'user' }) ); }); });