Skip to content

feat/#24: MVP 선정 뷰 구현#25

Merged
yungu0010 merged 5 commits intodevelopfrom
feat/#24
Apr 22, 2026
Merged

feat/#24: MVP 선정 뷰 구현#25
yungu0010 merged 5 commits intodevelopfrom
feat/#24

Conversation

@yungu0010
Copy link
Copy Markdown
Member

Related Issue 🚀

Work Description ✏️

MvpPage 뷰 구현

  • 제출 시 CommentFormContext에 mvp 데이터 저장 후 /closing으로 이동
  • ContinueCommentPage nextPath 수정: /next/mvp (라우트 연결)
  • App.tsx에 /mvp 라우트 등록
  • ClosingPage 버그픽스: 존재하지 않는 header_img.png import 제거 (StepLayout 기본 배너 사용)
  • CLAUDE.md 업데이트: 페이지 플로우, 패키지 구조, 상태 관리 규칙 최신화

PR Point 📸

FieldSection 컴포넌트 미추출

  • padding: 24px 28px 12px 가 UserInfoPage, SprintCodePage, MvpPage에 반복됨. 별도 이슈로 리팩토링 예정.
  • StepLayout 수평 패딩: 현재 contentSection 좌우 패딩 20px. FieldSection 리팩토링 시 28px로 함께 조정 검토 필요.
    IconXCircle filled 미존재
  • MDS에 filled 변형 없어 stroke 버전으로 임시사용 중.
  • 디자이너에게 MDS 추가 요청 또는 직접 SVG 구현 필요함.

yungu0010 and others added 4 commits April 21, 2026 19:40
header_img.png가 assets에 없어 런타임 에러 발생
StepLayout은 bannerImage 미지정 시 header_title.svg를 기본값으로 사용하므로 prop 제거
- App.tsx: /mvp 라우트 추가 (MvpPage)
- ContinueCommentPage: nextPath "/next" → "/mvp" 연결
- CLAUDE.md: 패키지 구조에 MvpPage 추가
- 멤버 검색 input
  - 텍스트 입력 시 peerMembers 필터링 후 인라인 드롭다운 표시
  - 입력 중 IconXCircle 노출, 클릭 시 검색어 초기화
  - 드롭다운 항목 선택 시 MemberChip으로 표시, 재검색으로 변경 가능
- MVP 선정 이유 입력 필드 (InputField 재사용)
- 동료 선정 + 이유 모두 입력 시에만 제출 버튼 활성화
- FieldBox.Label(MDS) 사용으로 라벨/필수 표시/설명 문구 일관성 유지
- 제출 시 useCommentForm의 mvp 필드에 저장 후 /closing으로 이동
- 페이지 플로우를 구현 완료 상태로 업데이트 (step 1~7 전체)
- SubmissionContext → CommentFormContext로 전면 수정
- 프로젝트 구조 상단 트리를 현재 src 구조에 맞게 정리
- 페이지 추가 지침의 SubmissionContext 타입 확장 → CommentFormState로 수정

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 21, 2026

Warning

Rate limit exceeded

@yungu0010 has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 33 minutes and 11 seconds before requesting another review.

Your organization is not enrolled in usage-based pricing. Contact your admin to enable usage-based pricing to continue reviews beyond the rate limit, or try again in 33 minutes and 11 seconds.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 80d4e905-d2eb-4c4b-8a15-fec96670f64b

📥 Commits

Reviewing files that changed from the base of the PR and between 2d1304e and dbefe63.

📒 Files selected for processing (7)
  • src/components/peer-comment/PeerCommentStepTemplate.tsx
  • src/pages/ClosingPage.tsx
  • src/pages/MvpPage.css.ts
  • src/pages/MvpPage.tsx
  • src/pages/SprintCodePage.tsx
  • src/pages/SprintIntroPage.tsx
  • src/pages/UserInfoPage.tsx

Walkthrough

MVP 선정 페이지(MvpPage)와 해당 스타일 모듈을 추가하고, 앱 라우터에 /mvp 경로를 등록했습니다. ContinueCommentPage의 다음 경로를 /mvp로 변경하고 ClosingPage에서 배너 이미지를 제거했으며, 구조 및 상태 관리 변경사항을 CLAUDE.md에 반영했습니다.

Changes

Cohort / File(s) Summary
문서화
CLAUDE.md
페이지 흐름을 명확히 하여 UserInfoPage부터 ClosingPage까지 단계를 번호 매기고, 상태 관리를 SubmissionContext에서 CommentFormContext로 전환, 프로젝트 구조 업데이트.
MVP 선정 페이지
src/pages/MvpPage.tsx, src/pages/MvpPage.css.ts
동료 멤버 검색 및 선정 기능을 제공하는 새로운 MVP 선정 페이지 컴포넌트와 관련 스타일 추가. 검색, 선택 항목 표시, useCommentForm 훅을 통한 데이터 업데이트 포함.
라우팅 및 네비게이션
src/App.tsx, src/pages/ContinueCommentPage.tsx, src/pages/ClosingPage.tsx
/mvp 경로 추가, ContinueCommentPage의 다음 경로를 /mvp로 변경, ClosingPage에서 배너 이미지 제거.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Possibly related PRs

Suggested labels

💛 feat

Poem

🐰 MVP를 찾아 나선 여정,
동료를 검색하고 선택하니,
스텝 여섯에서 빛나는 마음,
폼에 담아 다음으로 나아가,
회고가 완성되는 순간! ✨

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed PR 제목은 'feat/#24: MVP 선정 뷰 구현'으로 주요 변경사항인 MVP 페이지 뷰 구현을 명확하고 간결하게 요약하고 있습니다.
Description check ✅ Passed PR 설명은 템플릿의 모든 필수 섹션(Related Issue, Work Description, PR Point)을 포함하고 있으며, 구현 내용과 주의사항을 상세하게 기술하고 있습니다.
Linked Issues check ✅ Passed PR의 모든 변경사항이 이슈 #24의 요구사항인 'MVP 선정 뷰 구현'을 완전히 충족합니다. 멤버 검색, 선택, 이유 입력, 상태 저장 및 네비게이션이 모두 구현되었습니다.
Out of Scope Changes check ✅ Passed 모든 변경사항이 이슈 #24의 범위 내입니다. MvpPage 구현, 라우트 연결, ClosingPage 버그픽스, 문서 업데이트는 모두 MVP 선정 뷰 구현과 직접적으로 관련된 작업입니다.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/#24

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 4

🧹 Nitpick comments (1)
src/pages/MvpPage.tsx (1)

32-36: 제출 이유 공백 처리 일관성.

isAllFilled 계산 시엔 reason.trim()으로 공백을 걸러내지만, 실제 저장 시에는 원본 reason을 그대로 comment_text에 넣고 있습니다. 검증과 저장 기준을 맞춰 앞뒤 공백을 trim()해서 저장하는 것을 권장합니다.

♻️ 제안
-    update({ mvp: { target_user_id: selectedMember.userId, comment_text: reason } });
+    update({ mvp: { target_user_id: selectedMember.userId, comment_text: reason.trim() } });
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/pages/MvpPage.tsx` around lines 32 - 36, The submission saves the raw
reason while validation uses reason.trim(), causing inconsistency; in
handleSubmit (which calls update and navigate and checks selectedMember), pass
the trimmed reason to update by setting comment_text to reason.trim() so stored
value matches the isAllFilled validation and leading/trailing whitespace is
removed consistently.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@CLAUDE.md`:
- Around line 15-21: The step numbering in the flow and implementation is
inconsistent: Update the step values so they match the documented 7-step flow —
either set MvpPage's props in MvpPage.tsx from currentStep={6} to
currentStep={5} and ClosingPage from step 7 to step 6, or insert the missing
intermediate page between ContinueCommentPage and MvpPage; specifically adjust
the MvpPage and ClosingPage step labels/props (and any related UI indicators) to
reflect the corrected sequence (ContinueCommentPage -> MvpPage (5/7) ->
ClosingPage (6/7) -> final step if applicable) so flow text and the component
prop currentStep/totalSteps remain consistent.

In `@src/pages/MvpPage.css.ts`:
- Line 76: The boxShadow currently hardcodes rgba(0, 0, 0, 0.4); update the
MvpPage styles to use the design token from `@sopt-makers/colors` instead (import
the appropriate black/alpha token and compose the boxShadow using that token)
and replace the literal in the boxShadow property; if a token cannot represent
the exact alpha value, add a short inline comment above the boxShadow explaining
why a hardcoded rgba is required and reference the missing token so reviewers
can follow up.

In `@src/pages/MvpPage.tsx`:
- Around line 112-116: The fragment renders MemberChip directly under a <ul>
which violates HTML semantics because list children must be <li>; in MvpPage's
selectedMember block wrap MemberChip in an <li> (e.g., move MemberChip into an
<li> element) or replace the <ul className={styles.chipList}> with a simpler
container (e.g., a <div> using styles.chipList) if you only ever render one
selected member; update the JSX around selectedMember and styles.chipList
accordingly so the DOM is semantically correct.
- Line 87: Move the inline styles applied to IconXCircle and IconUser into a
vanilla-extract stylesheet and apply them via className/wrapper: create or
update the related *.css.ts (e.g., add classes like iconSmall and iconGray) that
set width, height and color, import those classes into MvpPage.tsx, and replace
the inline style={{ width, height, color }} on IconXCircle and IconUser with the
appropriate className or wrap the icon in a span/div that uses the new class;
ensure you update all occurrences noted (around the IconXCircle at the shown
line and the IconUser usages at lines ~101-103) so no inline style remains.

---

Nitpick comments:
In `@src/pages/MvpPage.tsx`:
- Around line 32-36: The submission saves the raw reason while validation uses
reason.trim(), causing inconsistency; in handleSubmit (which calls update and
navigate and checks selectedMember), pass the trimmed reason to update by
setting comment_text to reason.trim() so stored value matches the isAllFilled
validation and leading/trailing whitespace is removed consistently.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: bd36ebb2-ad61-4b1d-8fa3-ec77fcba1f09

📥 Commits

Reviewing files that changed from the base of the PR and between e1925cf and 2d1304e.

📒 Files selected for processing (6)
  • CLAUDE.md
  • src/App.tsx
  • src/pages/ClosingPage.tsx
  • src/pages/ContinueCommentPage.tsx
  • src/pages/MvpPage.css.ts
  • src/pages/MvpPage.tsx
💤 Files with no reviewable changes (1)
  • src/pages/ClosingPage.tsx

Comment thread CLAUDE.md
Comment on lines +15 to 21
└─ UserInfoPage (사용자 정보 입력, step 1/7)
└─ StopCommentPage (step 2/7)
└─ StartCommentPage (step 3/7)
└─ ContinueCommentPage (step 4/7)
└─ MvpPage (step 6/7)
└─ ClosingPage (step 7/7)
```
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

스텝 번호가 5/7을 건너뜁니다.

ContinueCommentPage가 step 4/7인데 바로 MvpPage를 step 6/7로 표기하여 step 5/7이 누락되어 있습니다. 전체 7단계가 맞다면 MvpPage를 5/7로, ClosingPage를 6/7로 조정하거나, 중간에 빠진 페이지를 보완해야 플로우 문서와 실제 구현(MvpPage.tsxcurrentStep={6} totalSteps={7})이 일치합니다.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@CLAUDE.md` around lines 15 - 21, The step numbering in the flow and
implementation is inconsistent: Update the step values so they match the
documented 7-step flow — either set MvpPage's props in MvpPage.tsx from
currentStep={6} to currentStep={5} and ClosingPage from step 7 to step 6, or
insert the missing intermediate page between ContinueCommentPage and MvpPage;
specifically adjust the MvpPage and ClosingPage step labels/props (and any
related UI indicators) to reflect the corrected sequence (ContinueCommentPage ->
MvpPage (5/7) -> ClosingPage (6/7) -> final step if applicable) so flow text and
the component prop currentStep/totalSteps remain consistent.

Comment thread src/pages/MvpPage.css.ts Outdated
overflow: 'hidden',
listStyle: 'none',
padding: 0,
boxShadow: '0 4px 12px rgba(0, 0, 0, 0.4)',
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor

하드코딩된 색상 사용 지양.

boxShadowrgba(0, 0, 0, 0.4)@sopt-makers/colors를 사용하지 않은 하드코딩 값입니다. 디자인 시스템 토큰을 사용하거나, 불가피할 경우 주석으로 사유를 남겨주세요.

As per coding guidelines: "Use @sopt-makers/colors for all color values instead of hardcoding color values".

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/pages/MvpPage.css.ts` at line 76, The boxShadow currently hardcodes
rgba(0, 0, 0, 0.4); update the MvpPage styles to use the design token from
`@sopt-makers/colors` instead (import the appropriate black/alpha token and
compose the boxShadow using that token) and replace the literal in the boxShadow
property; if a token cannot represent the exact alpha value, add a short inline
comment above the boxShadow explaining why a hardcoded rgba is required and
reference the missing token so reviewers can follow up.

Comment thread src/pages/MvpPage.tsx Outdated
Comment thread src/pages/MvpPage.tsx
[스텝 번호 수정]
- 전체 스텝 수 7 → 6으로 변경

[하드코딩된 색상 제거]
- MvpPage dropdown에서 boxShadow rgba(0,0,0,0.4) 제거

[인라인 스타일 → vanilla-extract 이관]
- IconCircleFilled: style={{ width, height, color }} → styles.clearIcon 클래스 적용
- IconUser: style={{ width, height }} → styles.avatarIconSvg 클래스 적용

[HTML 구조 수정]
- 선택된 MVP 표시 영역: <ul> + MemberChip → <div className={styles.chipWrapper}>로 교체
  - MemberChip이 <li>를 렌더링하지 않아 <ul> 직계 자식 규칙 위반
  - MVP는 단일 선택이므로 리스트 구조 불필요

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@yungu0010 yungu0010 merged commit 38fc567 into develop Apr 22, 2026
1 check passed
@yungu0010 yungu0010 deleted the feat/#24 branch April 22, 2026 08:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: MVP 선정 뷰 구현

1 participant