Skip to content

[Feat] 밋업 프로젝트 페이지 ui 구현 - #32

Merged
leemanjae02 merged 17 commits into
mainfrom
feat/meetup-project-page-31
Aug 9, 2026
Merged

[Feat] 밋업 프로젝트 페이지 ui 구현#32
leemanjae02 merged 17 commits into
mainfrom
feat/meetup-project-page-31

Conversation

@leemanjae02

@leemanjae02 leemanjae02 commented Aug 2, 2026

Copy link
Copy Markdown
Member

#️⃣ 연관된 이슈

Close #31

🚧 Work in Progress

  • 작업 진행 중

📌 주요 변경사항

  • 밋업 프로젝트 관리 페이지(/meetup)를 Figma 시안에 맞춰 신규 구현
  • 등록 폼은 RHF + Zod 기반 useMeetupProjectForm 훅으로 상태·검증 분리
  • 기수별 필터, 프로젝트 카드 목록/삭제, empty state까지 포함한 화면 완성
  • 페이지 필터·등록·취소·삭제 플로우에 대한 컴포넌트 테스트 추가

📝 작업 내용

  • 기존 MeetupProjectModal/ProjectThumbnailCard/SegmentedControl 컴포넌트를 조합해 목록 페이지 구성
  • 모달은 기존 controlled prop 구조를 유지하고, useMeetupProjectForm 훅에서 RHF watch/setValue로 값을 연결해 zod 스키마로 필수 필드 검증
  • 프로젝트 목록·기수 옵션은 mock 데이터(MeetupProjectsPage.mock.ts) 기반으로 구성, 실제 API 연동은 이번 범위에서 제외
  • /meetup 라우트를 src/routes.tssrc/routes/(main)/meetup.tsx에 등록
  • 카드 그리드 empty state 추가, 등록 시 도달 불가능했던 폴백 코드 정리
  • SegmentedControl 공통 컴포넌트에 전체 폭 밑줄을 추가해 Figma 탭 디자인에 맞춤(다른 화면에서 아직 사용하지 않아 영향 범위 없음)
  • .claude/references/domain/projects.md 주요 위치 문서를 실제 구현 경로로 갱신
  • 검증: pnpm exec tsc -b, pnpm lint, pnpm exec vitest run(178개 전부 통과), pnpm build 전부 통과

📸 스크린샷 (선택)

스크린샷 2026-08-03 오전 1 27 38 스크린샷 2026-08-03 오전 1 27 52

💬 리뷰 요구사항(선택)

  • Figma TopBar에는 "저장하기" 버튼이 있지만, 카드 추가/삭제가 각각 즉시 반영되는 플로우라 이번 화면에서는 제외했습니다. 필요하면 알려주세요.
  • 실제 admin-projects.md 기준 API 연동은 이번 PR 범위가 아니며, 기존 학회 소개/후기 페이지와 동일하게 mock 데이터로만 구현했습니다.

Summary by CodeRabbit

  • 새 기능

    • 모임 프로젝트 관리 화면을 추가했습니다.
    • 기수별 프로젝트 필터링과 프로젝트 카드 목록을 제공합니다.
    • 프로젝트 생성·저장·취소·삭제를 지원합니다.
    • 프로젝트 정보와 팀원을 입력하는 폼 및 필수 항목 검증을 제공합니다.
    • 프로젝트가 없을 때 빈 상태 화면을 표시합니다.
    • 모임 프로젝트 화면을 관련 경로에서 이용할 수 있습니다.
  • UI 개선

    • 세그먼트 탭 컨트롤의 전체 너비와 하단 구분선을 개선했습니다.
    • 프로젝트 썸네일 카드의 접근성을 향상했습니다.
    • 프로젝트 입력 모달의 화면 배치를 조정했습니다.
  • 테스트

    • 필터링, 저장, 취소, 팀원 관리, 삭제 및 폼 초기화 동작을 검증했습니다.

@github-actions github-actions Bot added the ✨ Feature 새로운 기능 label Aug 2, 2026
@coderabbitai

coderabbitai Bot commented Aug 2, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

밋업 프로젝트 페이지를 추가했습니다. 기수별 필터, 프로젝트 생성·삭제, 팀원 관리, 빈 상태를 구현했습니다. 폼 검증과 Blob URL 정리를 추가하고 /meetup 라우트에 연결했습니다.

Changes

밋업 프로젝트 페이지

Layer / File(s) Summary
폼 계약과 초기 데이터
.claude/references/domain/projects.md, src/hooks/projects/..., src/hooks/index.ts, src/pages/projects/MeetupProjectsPage.mock.ts
useMeetupProjectForm에 Zod 검증, React Hook Form 상태, 팀원·포스터 관리, 초기화와 제출 API를 추가했습니다. 중첩 배열 오류와 Blob URL 정리를 테스트했습니다. 기수·유형·파트 옵션과 mock 프로젝트 데이터를 정의했습니다.
프로젝트 목록과 모달 흐름
src/pages/projects/MeetupProjectsPage.tsx, src/pages/projects/MeetupProjectsPage.test.tsx, src/components/common/SegmentedControl/SegmentedControl.tsx, src/components/projects/ProjectThumbnailCard/ProjectThumbnailCard.tsx, src/components/projects/MeetupProjectModal/MeetupProjectModal.tsx
기수별 목록 필터, 프로젝트 추가·삭제, 모달 입력, 취소·저장, 팀원 관리, empty state를 연결했습니다. 주요 상호작용과 Blob URL 해제를 통합 테스트로 검증했습니다. 탭 영역, 모달 위치, 프로젝트 카드 접근성 레이블을 조정했습니다.
라우트 연결
src/routes.ts, src/routes/(main)/meetup.tsx
/meetup 경로를 MeetupProjectsPage에 연결했습니다.

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목이 밋업 프로젝트 페이지 UI 구현이라는 주요 변경 사항을 정확하고 간결하게 설명합니다.
Linked Issues check ✅ Passed 이슈 #31의 밋업 프로젝트 페이지 UI 구현 목표를 라우트, 목록, 필터, 모달, 삭제 및 테스트로 충족합니다.
Out of Scope Changes check ✅ Passed 훅, mock 데이터, 라우트, 컴포넌트 보정 및 테스트는 모두 밋업 프로젝트 UI 구현을 지원하며 명확한 범위 이탈이 없습니다.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/meetup-project-page-31

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.

@github-actions

github-actions Bot commented Aug 2, 2026

Copy link
Copy Markdown

CI 결과

항목 결과
TypeScript 🟢 통과
Prettier 🟢 통과
Generated 🟢 통과
ESLint 🟢 통과
Test 🟢 통과
Build 🟢 통과

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/hooks/projects/useMeetupProjectForm.ts`:
- Around line 114-117: Separate blob URL ownership between the form and
committed project cards: in src/hooks/projects/useMeetupProjectForm.ts lines
114-117, ensure resetForm only revokes URLs still owned by the form; in
src/pages/projects/MeetupProjectsPage.tsx lines 31-44, update handleSave to
assign a separately created URL to the saved card instead of persisting
values.posterUrl directly, so resetting the form cannot revoke the card
thumbnail URL.
- Around line 20-36: The meetupProjectFormResolver currently stores nested Zod
issue paths as dotted top-level keys, so React Hook Form cannot map deep field
errors correctly. Update its error reduction logic to build the errors object
according to each issue.path segment, creating nested objects or array entries
as needed, and preserve the existing first-error type/message behavior.
🪄 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: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 0033446b-37b4-4cba-829f-6c121f2383f0

📥 Commits

Reviewing files that changed from the base of the PR and between a43418a and e938830.

📒 Files selected for processing (10)
  • .claude/references/domain/projects.md
  • src/components/common/SegmentedControl/SegmentedControl.tsx
  • src/hooks/index.ts
  • src/hooks/projects/index.ts
  • src/hooks/projects/useMeetupProjectForm.ts
  • src/pages/projects/MeetupProjectsPage.mock.ts
  • src/pages/projects/MeetupProjectsPage.test.tsx
  • src/pages/projects/MeetupProjectsPage.tsx
  • src/routes.ts
  • src/routes/(main)/meetup.tsx

Comment thread src/hooks/projects/useMeetupProjectForm.ts
Comment on lines +114 to +117
function resetForm() {
revokeIfBlobUrl(values.posterUrl)
reset(createDefaultValues())
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🗄️ Data Integrity & Integration | 🔴 Critical | 🏗️ Heavy lift

저장된 포스터 blob URL이 다음 프로젝트 등록 시 취소됩니다. 두 파일이 blob URL 소유권을 공유하는 것이 근본 원인입니다: resetForm은 현재 폼 값의 posterUrl을 무조건 revokeObjectURL하고, 페이지는 그 동일한 blob URL을 저장된 카드의 imageUrl로 영속화하면서 저장 후 폼을 리셋하지 않습니다.

  • src/hooks/projects/useMeetupProjectForm.ts#L114-L117: resetForm이 revoke하기 전에 해당 URL이 이미 저장된 프로젝트에 사용 중인지 알 수 없습니다. blob URL 소유권을 폼과 커밋된 데이터 간에 분리하세요(예: 저장 시점에 별도 URL을 발급하거나, 폼이 커밋된 URL을 더 이상 추적하지 않도록 상태를 이전).
  • src/pages/projects/MeetupProjectsPage.tsx#L31-L44: handleSavevalues.posterUrl을 그대로 imageUrl에 저장하는 대신, 저장 시점에 폼과 독립적인 URL을 생성해 카드에 할당하세요.

재현 순서: 포스터를 올려 프로젝트를 저장 → "추가하기"를 다시 클릭(내부적으로 form.reset() 호출) → 방금 저장한 카드의 썸네일이 깨집니다. 이 시나리오를 커버하는 회귀 테스트 추가도 권장합니다.

📍 Affects 2 files
  • src/hooks/projects/useMeetupProjectForm.ts#L114-L117 (this comment)
  • src/pages/projects/MeetupProjectsPage.tsx#L31-L44
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/hooks/projects/useMeetupProjectForm.ts` around lines 114 - 117, Separate
blob URL ownership between the form and committed project cards: in
src/hooks/projects/useMeetupProjectForm.ts lines 114-117, ensure resetForm only
revokes URLs still owned by the form; in
src/pages/projects/MeetupProjectsPage.tsx lines 31-44, update handleSave to
assign a separately created URL to the saved card instead of persisting
values.posterUrl directly, so resetting the form cannot revoke the card
thumbnail URL.

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown

CI 결과

항목 결과
TypeScript 🟢 통과
Prettier 🟢 통과
Generated 🟢 통과
ESLint 🟢 통과
Test 🟢 통과
Build 🟢 통과

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/pages/projects/MeetupProjectsPage.tsx (1)

17-17: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

MeetupProjectsPageexport const로 선언하세요.

현재 선언은 컴포넌트 선언 규칙과 다릅니다.

수정 예시
-export function MeetupProjectsPage() {
+export const MeetupProjectsPage = () => {
   // ...
 }

As per coding guidelines, "컴포넌트 함수명은 PascalCase를 사용하고, 컴포넌트를 export const로 선언합니다."

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/pages/projects/MeetupProjectsPage.tsx` at line 17, Update the
MeetupProjectsPage component declaration to use an exported const while
preserving its PascalCase name and existing implementation.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/pages/projects/MeetupProjectsPage.tsx`:
- Line 42: MeetupProjectsPage의 저장된 poster Blob URL 정리를 페이지가 소유하도록 수정하세요.
form.resetAfterSave() 이후 생성·저장된 imageUrl을 추적하고, handleDelete에서 해당 카드의 URL을
URL.revokeObjectURL로 해제한 뒤 카드를 제거하며, 페이지 언마운트 시 남아 있는 모든 페이지 소유 URL도 해제하세요.
MeetupProjectsPage.test.tsx에 저장 후 삭제 흐름에서 URL.revokeObjectURL 호출을 검증하는 회귀 테스트를
추가하세요.

---

Outside diff comments:
In `@src/pages/projects/MeetupProjectsPage.tsx`:
- Line 17: Update the MeetupProjectsPage component declaration to use an
exported const while preserving its PascalCase name and existing implementation.
🪄 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: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 60935a01-6c30-4319-936f-4d51d6d40199

📥 Commits

Reviewing files that changed from the base of the PR and between e938830 and 169764c.

📒 Files selected for processing (3)
  • src/hooks/projects/useMeetupProjectForm.test.ts
  • src/hooks/projects/useMeetupProjectForm.ts
  • src/pages/projects/MeetupProjectsPage.tsx

Comment thread src/pages/projects/MeetupProjectsPage.tsx
@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown

CI 결과

항목 결과
TypeScript 🟢 통과
Prettier 🟢 통과
Generated 🟢 통과
ESLint 🟢 통과
Test 🟢 통과
Build 🟢 통과

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/pages/projects/MeetupProjectsPage.test.tsx`:
- Around line 142-149: Update the deletion test around the project card lookup
to stop using the `.border-line-neutral` style class. Add or use an accessible
role and name for the ProjectThumbnailCard, then locate the card through that
semantic query before hovering and clicking the existing “삭제하기” button.
🪄 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: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 986a2cc2-421b-40db-96d2-b35b67e3d660

📥 Commits

Reviewing files that changed from the base of the PR and between 169764c and 4a22714.

📒 Files selected for processing (2)
  • src/pages/projects/MeetupProjectsPage.test.tsx
  • src/pages/projects/MeetupProjectsPage.tsx

Comment thread src/pages/projects/MeetupProjectsPage.test.tsx Outdated
@github-actions

github-actions Bot commented Aug 4, 2026

Copy link
Copy Markdown

CI 결과

항목 결과
TypeScript 🟢 통과
Prettier 🟢 통과
Generated 🟢 통과
ESLint 🟢 통과
Test 🟢 통과
Build 🟢 통과

@github-actions

github-actions Bot commented Aug 4, 2026

Copy link
Copy Markdown

CI 결과

항목 결과
TypeScript 🟢 통과
Prettier 🟢 통과
Generated 🟢 통과
ESLint 🟢 통과
Test 🟢 통과
Build 🟢 통과

@KyeongJooni KyeongJooni left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

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

LGTM 💯

@github-actions

github-actions Bot commented Aug 9, 2026

Copy link
Copy Markdown

CI 결과

항목 결과
TypeScript 🟢 통과
Prettier 🟢 통과
Generated 🟢 통과
ESLint 🟢 통과
Test 🟢 통과
Build 🟢 통과

@leemanjae02
leemanjae02 merged commit a93bd20 into main Aug 9, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨ Feature 새로운 기능

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feat] #31 - 밋업 프로젝트 페이지 ui 구현

2 participants