Skip to content

LC-3021 멘토 마이페이지 v2.1#2424

Merged
dusvlf111 merged 497 commits into
mainfrom
LC-3021-멘토-마이페이지-v2.1
Jul 10, 2026

Hidden character warning

The head ref may contain hidden characters: "LC-3021-\uba58\ud1a0-\ub9c8\uc774\ud398\uc774\uc9c0-v2.1"
Merged

LC-3021 멘토 마이페이지 v2.1#2424
dusvlf111 merged 497 commits into
mainfrom
LC-3021-멘토-마이페이지-v2.1

Conversation

@dusvlf111

@dusvlf111 dusvlf111 commented Jul 5, 2026

Copy link
Copy Markdown
Collaborator

연관 작업

yeji424 and others added 30 commits May 28, 2026 18:20
# Conflicts:
#	.gitignore
#	apps/mentor/tailwind.config.js
#	apps/web/src/context/Providers.tsx
#	apps/web/tailwind.config.js
#	packages/ui/package.json
#	packages/ui/src/index.ts
#	packages/ui/tsconfig.json
#	packages/ui/vitest.config.ts
#	packages/ui/vitest.setup.ts
#	pnpm-lock.yaml
- msw devDependency 추가 및 public/mockServiceWorker.js 생성
- src/mocks/browser.ts(setupWorker), handlers/index.ts(핸들러 집합)
- main.tsx: VITE_ENABLE_MSW==='true' 시 동적 import 후 worker.start (프로덕션 번들 미포함)
- .env.example, vite-env.d.ts에 VITE_ENABLE_MSW 안내/타입 추가

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- feedbackSchema.ts: FeedbackAdminVo/FeedbackDetailAdminVo/FeedbackSlotVo + enums(FeedbackStatus/FeedbackAttendanceStatus/FeedbackSlotStatus), 응답 스키마, 필터 파라미터 타입
- feedback.ts: useAdminFeedbackListQuery/useAdminFeedbackDetailQuery/useMentorFeedbackSlotsQuery (UseQueryResult 일관, 빈 필터 생략 직렬화)
- 스키마 파싱·파라미터 직렬화 테스트

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- adminFeedback.ts: GET /admin/feedback(필터 반영)·/admin/feedback/{id}·/admin/feedback/slot/{mentorId} 핸들러 (MSW v2 http/HttpResponse, axios 엔벨로프 {data})
- seed/feedback.ts: 쥬디·제이슨 멘토, 면접준비 2기/자소서 27기 챌린지, 17:00-17:30 등 슬롯·예약·신청시각 세트
- handlers/index.ts에 등록
- setupServer 기반 핸들러 응답 스키마 통과·필터 동작 테스트

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
FeedbackOperationPage에 LIVE 피드백 탭(lazy)을 추가하고
예약 관리/멘토 스케줄 서브탭 컨테이너 LiveFeedbackTab을 구현한다.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ReservationManagement 컨테이너에 프로그램/멘토/멘티/예약·신청 날짜 필터와
리스트·캘린더 뷰 토글을 연결한다. 필터 폼을 AdminFeedbackListParams 로
매핑하는 buildListParams 유틸과 멘티 이름 클라이언트 필터를 추가한다.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
ReservationListView 로 날짜·시간/프로그램/멘토/멘티/신청 시간/상세 컬럼을
표시하고 날짜·시간·멘티·신청 시간 클라이언트 정렬을 연결한다. 보기 클릭은
selectedFeedbackId 상태만 세팅한다(상세 모달은 Push 3). 날짜 포맷 유틸과
정렬 유틸을 추가한다.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
useAdminFeedbackDetailQuery 로 프로그램·일시·멘토·멘티·사전질문·미팅URL·출석상태를
표시하는 읽기 전용 모달. feedbackId null 이면 미렌더. 필드 매핑 테스트 포함.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
주간(월~일) 30분 슬롯 그리드(weekly-calendar)에 예약을 멘토별 색상 블록으로 배치.
주 단위 이동/오늘 이동 지원. ReservationManagement 의 캘린더 토글·상세 모달 연결
(selectedFeedbackId 복원, 캘린더/모달 lazy import).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
멘토 목록 조회 후 멘토마다 slot/{mentorId} 를 useQueries 로 병렬 호출(N+1 허용)해
주간 시간대 그리드에 합산 표시. OPEN/RESERVED 상태 구분(채움/점선) + 멘토별 색상.
mentorFeedbackSlotsQueryOptions 팩토리 추출로 단일 훅과 병렬 호출이 로직 공유.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
멘토 LiveFeedbackReservationModal의 멘티정보 카드 레이아웃(이름 헤더+정보 그리드,
사전 Q&A 섹션, 예약 정보 패널)을 어드민 단건 모달에 맞춰 재현.
어드민에 없는 필드(희망 직군/산업/기업)는 보유 필드(멘토·이메일·연락처·출석)로 대체.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
멘토 ReservationListModal과 동일하게 예약을 '예약 목록'(RESERVED)/
'예약 변경 내역'(COMPLETED·CANCELED) 두 섹션으로 나눠 보여주는 모달 추가.
행 보기 → 예약 현황 모달, 모달 내부 행 보기 → 단건 상세 카드.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
예약 현황 목록 모달을 제거하고, 목록 상단 드롭다운으로
예약 목록(RESERVED)/예약 변경 내역(COMPLETED·CANCELED)을 전환하도록 변경.
행 '보기'는 단건 상세(피드백 카드) 모달을 띄운다.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- 드롭다운 제거, 각 행 상세 우측에 '예약 변경 내역' 토글 버튼 추가
- 클릭 시 행 아래로 해당 예약의 이전 예약일(다른 날로 옮기기 전 일시) 인라인 표시
- GET /admin/feedback/{id}/history MSW 목 엔드포인트·시드 추가 (이전 예약일)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
멘토 4명·챌린지 4개·예약 14건(상태·시간대·주차 다양)·슬롯·예약 이동 내역 확장.
캘린더 기본 주(현재 주)와 다음 주 모두에 데이터가 보이도록 분포.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- list VO 에 rescheduleCount(optional, BE 미제공시 0) 추가 → MSW 핸들러가 변경 내역 길이로 주입
- 행의 '예약 변경 내역' 버튼에 'N 회' 표시, 펼침 토글 유지
- 이동 내역 없으면(0회) 버튼 대신 '-' 표시

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
변경 파일 기준 prettier→eslint→tsc 실행, 모노레포 기존 노이즈와
'변경 파일 새 에러 0' 판정 기준 반영. CLAUDE.md 스킬 인덱스 갱신.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- 생성 파일 public/mockServiceWorker.js 를 .prettierignore 로 제외
- package.json trailing newline 복원

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- 예약 상세 meetingUrl 에 sanitizeUrl 적용 (javascript: 등 스킴 차단, XSS 방지)
- 예약 상세 모달·변경 내역 패널에 isError UI 추가 (무한 로딩 방지)
- 멘토 스케줄 그리드 slotSpan 올림(Math.ceil)으로 블록 잘림 방지
- ViewToggle·LiveFeedbackTab 버튼에 type=button (form submit 오동작 방지)
- main.tsx MSW worker.start 실패해도 앱 렌더되도록 try/catch 격리

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
dusvlf111 and others added 16 commits July 3, 2026 00:36
LIVE_FEEDBACK 미션에도 written-mission-submit/review 바가 생성돼 라이브
기간·일정오픈 바와 중복 노출되고, 일정오픈 영역에 서면 바가 섞여 보였다.
라이브는 useLiveFeedbackData가 전담하므로 LIVE_FEEDBACK 미션은 서면 바
(제출/검수/피드백)를 하나도 만들지 않도록 가드를 확장한다.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
날짜 이동(< 범위 >)을 정중앙에 두고 '오늘'을 우측에 항상 표시. 좌측에
우측 '오늘' 블록과 동일 폭의 invisible 미러를 두어 날짜를 정중앙에 고정.
'오늘'은 오늘이 이미 보이면 비활성(흐림)만 하고 자리는 유지 → 밀림 없음.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
하나의 pill로 합쳐 오늘 버튼이 중앙 정렬을 흔들던 문제. 좌우 이동+날짜
범위는 캘린더 기준 하단 중앙(absolute left-1/2)에 고정하고, '오늘'은 우측
별도 버튼으로 분리해 오늘이 화면 밖일 때만 생겼다 사라지게 한다.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
absolute라 세로 스크롤 시 캘린더와 함께 움직이던 문제. fixed로 뷰포트
하단에 고정하되, 캘린더 컨테이너의 화면 좌표를 측정해 좌우이동 pill은
가로 중앙, '오늘'은 우측 끝에 배치(resize 시 재측정).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- 좌우이동/오늘 두 플로팅 버튼을 py 기준 대신 h-10으로 통일해 높이 일치.
- 기간바 영역 하단 여백 축소: bodyMinHeight 바닥 버퍼(+8) 제거, 바 그리드
  패딩 py-3 → pt-3 pb-1.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- ResizeObserver 미지원 환경(jsdom) 가드 추가 → 렌더 테스트 크래시 해결.
- '오늘' 버튼에 whitespace-nowrap + 아이콘 shrink-0 → 텍스트 세로 줄바꿈 방지.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
ROW_H 56→44로 minHeight의 행별 여백 제거, 그리드 pt-3→pt-1로 상단부터
쌓기. 같은 챌린지의 같은 날 겹치는 미션(localRow>0)엔 marginTop 6px.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
모달 상단 카운트 칩/왼쪽 멘티 리스트/하단 배지가 서로 다른 상태·색을
쓰던 문제. 공유 badgeStatusToUi로 축약상태→4상태 환산 후 전부
getLiveFeedbackBadgeVisual(캘린더 팔레트: 진행예정=indigo/중=blue/완료=
neutral/미진행=red)로 통일. 상단 카운트도 2상태→4상태 정집계, 하단 배지는
선택 바 기준으로 왼쪽 리스트와 일치시킴.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
챌린지 상세의 미션 클릭 시 challengeOptionType으로 분기: LIVE_FEEDBACK은
피드백 현황과 동일한 LiveFeedbackReservationModal을 열고(해당 챌린지의
라이브 세션은 useLiveFeedbackList의 title 매칭으로 확보), WRITTEN_FEEDBACK은
기존 서면 모달 유지. 디자인/기존 구조 변경 없이 라우팅만 추가.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- 라이브 미션엔 서면 집계 기반 상태 배지(deriveMissionStatus)를 숨김
  (제출/피드백 의미가 달라 이상하게 표기되던 문제).
- 옵션 타입 칩을 색으로 구분: 라이브=red, 서면=neutral.
- 라이브 미션에 열 세션이 없으면 '피드백 작성' 버튼을 비활성('예약 없음')
  디자인으로 처리해 빈 모달을 열지 않음.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
라이브 미션에서 '제출 0/0 · 피드백 완료 0/0'(서면 출석 집계라 무의미)을
'예약 N명'(라이브 세션 수)으로 교체. 서면 미션은 기존 제출/피드백 집계 유지.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
useLiveFeedbackList가 mapLiveStatus(RESERVED→undefined, 시간판정 없음)를
써서 피드백현황/챌린지상세 모달의 상태가 서면 폴백('진행 전')·시간무시
('진행 예정')로 갈리고 종료 세션도 진행예정으로 오표기됐다. 캘린더용
resolveSessionStatus(시간+출석 기반 4상태)를 export해 공유·재사용하도록
통일 → 왼쪽 리스트/상단 카운트/하단 배지/캘린더가 모두 일치.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
liveMenteeCount/handleClickFeedback의 `?? liveRounds[0]` 폴백 때문에
회차(th)가 안 맞는 라이브 미션에도 같은 세션이 중복으로 붙어 모든 미션이
'예약 N명'으로 동일하게 떴다. th 정확 매칭만 하도록 폴백 제거 → 실제 세션이
있는 미션에만 표기되고, 나머지는 예약 0명(비활성).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- useChallengeDetail: 라운드 탐색을 findLiveRound로 추출(중복 제거).
- MenteeList: 미사용 LIST_BADGE_COLOR.urgent 제거(imminent 강조 폐지 잔재).
- TODO 메모: (1) th/title 매칭 한계(BE에 challengeId/missionId 부재),
  (2) computeProgressWindow 미배선(진행 기간 바), (3) now 스냅샷으로 상태
  자동 전환 안 됨.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
# Conflicts:
#	apps/web/jest.config.js
#	apps/web/src/app/(user)/challenge/[applicationId]/[programId]/page.tsx
#	apps/web/src/domain/challenge/my-challenge/mission/submit/regular/MissionSubmitRegularSection.tsx
#	apps/web/src/domain/challenge/my-challenge/mission/submit/ui/MissionPreQuestionInputSection.tsx
#	apps/web/src/domain/challenge/my-challenge/recommended-program/RecommendedProgramSection.tsx
@dusvlf111 dusvlf111 self-assigned this Jul 5, 2026
@github-actions github-actions Bot changed the title Lc 3021 멘토 마이페이지 v2.1 LC-3021 멘토 마이페이지 v2.1 Jul 5, 2026

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

이번 풀러리퀘스트는 어드민 및 멘토 애플리케이션 전반에 걸쳐 "LIVE 피드백" 기능을 도입하기 위한 대규모 변경사항을 포함하고 있습니다. 개발 및 테스트를 위한 MSW(Mock Service Worker) 도입, 라이브 피드백 예약 및 멘토 슬롯 관리를 위한 Zod 스키마와 React Query 훅 추가, 그리고 주간 캘린더 그리드 및 상세 모달 등의 다양한 UI 컴포넌트 구현이 이루어졌습니다. 코드 리뷰 피드백에서는 MentorScheduleView에서 useQueries 반환 배열을 useMemo 의존성에 직접 사용해 발생하는 불필요한 재연산 최적화, Safari 등 특정 브라우저에서의 날짜 파싱 오류를 방지하기 위한 dayjs 대체 사용, 그리고 모달 스크롤 시 InfoTooltip이 트리거를 따라가지 못하고 화면에 고정되는 배치 버그 수정을 제안했습니다.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

Comment thread apps/mentor/src/pages/feedback/ui/MenteeList.tsx
Comment thread apps/mentor/src/pages/feedback/ui/InfoTooltip.tsx
dusvlf111 and others added 10 commits July 6, 2026 01:07
- '취소' 상태 신설: 멘티 예약 후 경험정리 미제출·예약취소를 '미진행'과 분리.
  미진행(멘토 미입장)=solid 빨강+흰글자 / 취소=연빨강 으로 색 구분.
- 피드백 내역 버그 수정:
  · 라이브 행 멘티 제출(제출/미제출)을 attendanceStatus 로 도출(기존 하드코딩 null).
  · 멘토 노쇼 시 '불참' 표시 — BE가 노쇼를 ABSENT 아닌 PENDING으로 두는 문제를
    세션 종료+미출석 판정으로 보정(상태 컬럼 '미진행'과 동일 규칙).
- 태그 컬러 SSOT 리팩터: liveFeedbackStatus.VISUALS 를 5상태별 {label, badgeClass,
  cardBadgeClass, tone} 단일 소스로 확장. LiveFeedbackCard 로컬맵·useMergedFeedbackRows
  UI_TO_ROW·중복 색 토큰 제거 → 캘린더/모달/내역/예약 태그가 한 곳(VISUALS)만 참조.
  캘린더 카드 진행예정/진행중 보라 불일치를 indigo/blue 로 통일.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- '현황' → '내역' 라벨 통일 (탭 3종·제목·설명)
- 피드백 아이콘 3종(서면/라이브/일정오픈) SSOT 컴포넌트로 통일 + color prop
  (표·태그필터·캘린더 인라인 SVG 제거, 선택 시 currentColor 유지)
- 피드백 내역 상단 스탯 카드 4개 제거(FeedbackSummary)
- 상태 배지: 테두리 제거 + 라운드 네모(rounded-[4px]), 미진행·취소 색 통일(연빨강)
- 서면 상태값 색을 라이브에 정렬(라벨은 서면 어휘 '진행 전/진행 중/완료' 유지)
- 서면 피드백 진행기간 미션 종료일 +1일 00:00:00 ~ +3일 23:59:59 로 수정

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- feedbackScheduleRules.PROGRESS_OFFSET_DAYS 를 라이브 기준 +2~+4 로 원복.
  서면 +1~+3 요구는 서면 전용 경로(writtenFeedback.ts/buildMissionRangeMap)에만 적용해야 하는데,
  라이브 공용 규칙까지 바꾸고 존재하지 않는 BE 파일(LiveFeedbackMissionVo.java) 산식을 조작한 것을 정정.
- BE 근거 주석을 실제 소스(MentorFeedback*NotificationTasklet: endDate.plusDays(4))로 교체.
- writtenFeedbackStatus 배지 토큰 주석 border 제거 반영(bg+text).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
충돌 해결: apps/admin/src/api/review/review.ts
- LC-3021이 useGetAdminBlogReviewList 에서 keyword/isVisible 를 제거(회귀),
  main 은 유지 + getAdminBlogReviewList fetcher 추출 → main 버전 채택
  (블로그 후기 검색/필터 복원, 추가 회귀 없음. admin typecheck 베이스라인 동일)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@dusvlf111 dusvlf111 merged commit 80da4fe into main Jul 10, 2026
7 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants