# Issue ## 작업 유형 - [ ] Feat: 새로운 기능 추가 - [x] Fix: 버그 수정 - [ ] Docs: 문서 수정 - [ ] Refactor: 리팩토링 - [x] Design: UI/CSS 수정 - [ ] Chore: 설정, 패키지, 기타 작업 - [ ] Hotfix: 긴급 수정 ## 작업 내용 - 아바타/프로필 색상 생성 로직을 `shared`로 승격하고, 전 화면에서 **`userId` 기준으로 색상을 통일**한다. - 현재 중복·분산된 색상 함수(`getParticipantColor`, `getAvatarColor` 등)를 하나로 통합한다. ## 작업 배경 - 현재 아바타 색상 기준이 화면마다 제각각이라, **같은 사용자가 화면마다 다른 색**으로 보이고 식별성이 떨어진다. | 위치 | 현재 색상 기준 | |---|---| | 사이드바 (내 아바타) | `bg-orange-400` **고정** | | 헤더 (내 아바타) | `bg-orange-400` **고정** | | 설정 멤버목록 | 리스트 **index 순환** (순서 바뀌면 색도 변함) | | 스프린트 담당자 | **이름 첫 글자** 해시 (같은 초성이면 동일 색) | | 회의록 참석자 | **userId** 해시 | | task 매퍼 | **이름 전체** 해시 | - 해시 로직 자체가 **3벌로 중복**되어 있다: - `src/entities/meeting-note/model/meeting-note.mapper.ts` → `getParticipantColor` (6색) - `src/features/manage-sprint-tasks/lib/avatar-color.ts` → `getAvatarColor` (7색) - `src/entities/task/model/task.mapper.ts` → 사본 `getAvatarColor` - 색상 유틸은 특정 도메인에 종속될 이유가 없는데, 설정 멤버목록이 `@/entities/meeting-note`를 import하는 등 **부자연스러운 도메인 결합**이 생기고 있다. ## To Do - [ ] `src/shared/lib/avatar-color.ts` 생성 — `getAvatarColor(seed: string): string` (단일 팔레트로 통일) - [ ] 중복 함수 제거 후 shared로 통합 - [ ] `meeting-note.mapper.ts`의 `getParticipantColor` → shared 사용 - [ ] `manage-sprint-tasks/lib/avatar-color.ts` → shared 사용 - [ ] `task.mapper.ts`의 사본 → shared 사용 - [ ] 각 소비처의 **seed를 `userId`로 통일** - [ ] 사이드바 `WorkspaceSidebar.tsx` (고정 주황 → userId 해시) - [ ] 헤더 `WorkspaceHeader.tsx` (고정 주황 → userId 해시) - [ ] 설정 멤버목록 `MemberList.tsx` (import 출처를 shared로, 미사용 `AVATAR_COLORS`/`index`·주석 정리) - [ ] 스프린트 `TaskCard.tsx` / `TaskFormDialog.tsx` (이름 첫 글자 → userId) - [ ] 회의록 참석자 매핑 (userId 유지, import 출처만 shared로) - [ ] 팔레트 6색/7색 불일치 정리 (하나로 확정) - [ ] `tsc` / `eslint` 통과 및 죽은 코드 제거 ## 완료 기준 - [ ] 어느 화면에서든 **같은 사용자 = 같은 색**으로 표시된다. - [ ] 멤버 순서가 바뀌어도 색이 변하지 않는다. - [ ] 색상 생성 유틸이 `src/shared/lib/avatar-color.ts` **한 곳**에만 존재한다. - [ ] `getParticipantColor` / `getAvatarColor` 중복 정의가 모두 제거된다. - [ ] 타입 에러·린트 경고 없음. ## 참고 자료 - 통일 기준 함수: `src/entities/meeting-note/model/meeting-note.mapper.ts` → `getParticipantColor` - 중복 함수: `src/features/manage-sprint-tasks/lib/avatar-color.ts`, `src/entities/task/model/task.mapper.ts` - 소비처: `WorkspaceSidebar.tsx`, `WorkspaceHeader.tsx`, `MemberList.tsx`, `TaskCard.tsx`, `TaskFormDialog.tsx` - 시드는 이름/닉네임이 아닌 **`userId`** 권장 (닉네임·이름 변경에도 색 유지, 충돌 최소) ## 예상 브랜치명 ```txt fix/#70/unify-avatar-color ```
Issue
작업 유형
작업 내용
shared로 승격하고, 전 화면에서userId기준으로 색상을 통일한다.getParticipantColor,getAvatarColor등)를 하나로 통합한다.작업 배경
현재 아바타 색상 기준이 화면마다 제각각이라, 같은 사용자가 화면마다 다른 색으로 보이고 식별성이 떨어진다.
bg-orange-400고정bg-orange-400고정해시 로직 자체가 3벌로 중복되어 있다:
src/entities/meeting-note/model/meeting-note.mapper.ts→getParticipantColor(6색)src/features/manage-sprint-tasks/lib/avatar-color.ts→getAvatarColor(7색)src/entities/task/model/task.mapper.ts→ 사본getAvatarColor색상 유틸은 특정 도메인에 종속될 이유가 없는데, 설정 멤버목록이
@/entities/meeting-note를 import하는 등 부자연스러운 도메인 결합이 생기고 있다.To Do
src/shared/lib/avatar-color.ts생성 —getAvatarColor(seed: string): string(단일 팔레트로 통일)meeting-note.mapper.ts의getParticipantColor→ shared 사용manage-sprint-tasks/lib/avatar-color.ts→ shared 사용task.mapper.ts의 사본 → shared 사용userId로 통일WorkspaceSidebar.tsx(고정 주황 → userId 해시)WorkspaceHeader.tsx(고정 주황 → userId 해시)MemberList.tsx(import 출처를 shared로, 미사용AVATAR_COLORS/index·주석 정리)TaskCard.tsx/TaskFormDialog.tsx(이름 첫 글자 → userId)tsc/eslint통과 및 죽은 코드 제거완료 기준
src/shared/lib/avatar-color.ts한 곳에만 존재한다.getParticipantColor/getAvatarColor중복 정의가 모두 제거된다.참고 자료
src/entities/meeting-note/model/meeting-note.mapper.ts→getParticipantColorsrc/features/manage-sprint-tasks/lib/avatar-color.ts,src/entities/task/model/task.mapper.tsWorkspaceSidebar.tsx,WorkspaceHeader.tsx,MemberList.tsx,TaskCard.tsx,TaskFormDialog.tsxuserId권장 (닉네임·이름 변경에도 색 유지, 충돌 최소)예상 브랜치명