Skip to content

Conversation

@yura0302
Copy link
Collaborator

@yura0302 yura0302 commented Nov 30, 2025

🔗 관련 이슈

Closes #134

✨ 변경사항

탐색하기 페이지 모바일 카드 col4Phone 스타일 변경 (vertical -> horizontal)

🎯 리뷰 포인트

📝 추가 정보

Summary by CodeRabbit

Release Notes

  • New Features

    • Added club bookmarking functionality on the explore page with saved preferences persistence.
    • Introduced multi-step review submission forms for activity reviews with enhanced field organization.
    • Added new icons for documents and bookmarks across the platform.
  • UI/UX Improvements

    • Enhanced responsive design with improved mobile and desktop layouts.
    • Updated club filtering and sorting options for better discoverability.
    • Improved form interface with clearer step navigation and field validation.

✏️ Tip: You can customize this high-level summary in your review settings.

@yura0302 yura0302 self-assigned this Nov 30, 2025
@vercel
Copy link

vercel bot commented Nov 30, 2025

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Preview Comments Updated (UTC)
moyeoit Ready Ready Preview Comment Nov 30, 2025 11:40am

@yura0302 yura0302 changed the base branch from main to develop November 30, 2025 11:40
@coderabbitai
Copy link

coderabbitai bot commented Nov 30, 2025

Caution

Review failed

Failed to post review comments

Walkthrough

Restructures review form submission from a dual-form (normal/premium) system to a unified multi-step architecture. Consolidates card subcomponents, adds subscription bookmarking and responsive layouts to club exploration. Updates routing, styling, and design tokens while maintaining core functionality.

Changes

Cohort / File(s) Summary
Review Form Architecture Refactor
src/components/pages/review/new/forms/\*
src/components/pages/review/new/shared/\*
Replaces six separate form hooks (usePaperNormalForm, PaperPremiumForm, InterviewNormalForm/Premium, ActivityNormalForm/Premium) with three new multi-step hooks (usePaperForm, useInterviewForm, useActivityForm). Adds step components (PaperStep1/2, InterviewStep1/2, ActivityStep1/2), ReviewFormHeader, StepNavigation, and DynamicQASection. Simplifies FormFactory to single kind parameter. Deletes ReviewCardTemplate and old form components.
Review Routing & Navigation
src/app/(root)/(routes)/review/new/page.tsx
src/app/(root)/(routes)/review/new/[kind]/page.tsx
src/app/(root)/(routes)/review/new/[kind]/[type]/page.tsx
Adds new /review/new index page with form kind selection UI. Converts /review/new/[kind] from server-rendered to client-rendered with auth gating and multi-step form. Deletes /review/new/[kind]/[type] page entirely. Updates AppPath.reviewNew() to accept optional kind only (removes type parameter).
Card Component Consolidation
src/components/molecules/card/Card.tsx
src/components/molecules/card/\{CardContent, CardDescription, CardFooter, CardHeader, CardTitle, CardImage, CardMeta, CardStats\}.tsx
Consolidates card subcomponents into main Card.tsx with integrated CardBookmark, CardImage, CardMeta, CardStats. Deletes six standalone subcomponent files. Adds CardOverlay for club cards and MobileCard for responsive layouts. Updates presets (col4Phone becomes 100% width with 5.5rem image).
Club Explore & Subscription
src/components/(pages)/club/explore/Explore.tsx
src/features/subscribe/mutations.ts
Adds subscription bookmarking (useToggleClubSubscription, useUserSubscribes), responsive media-query layout, CardOverlay integration. Updates mutation callbacks to include onMutateResult parameter. Replaces "모집중" with "마감순" sort option. Adds loading/error UI.
Typography & Design Tokens
src/styles/typography.css
src/styles/design-tokens.css
src/styles/globals.css
Adds caption and review-title typography utilities (typo-caption-1, typo-review-title, etc.). Introduces new CSS variables (--text-caption-1/2/3, --text-review-title). Changes body background from light-2 to white.
UI Component Updates
src/components/atoms/Button/button.tsx
src/components/atoms/Textarea/Textarea.tsx
src/components/atoms/sideBar/Sidebar.tsx
src/components/molecules/multiDropDown/MultiDropDown.tsx
src/components/molecules/tab/Tab.tsx
Button: adds asChild prop for polymorphic rendering. Textarea: removes disabled background class. Sidebar: updates checked state background color. MultiDropDown: updates token color names. Tab: replaces "recruit" with "deadline" and "모집중" with "마감순".
Asset Exports
src/assets/icons/index.ts
Exports new icon components: DocumentFileIcon, BookmarkFilledIcon, BookmarkEmptyIcon, BookmarkMobileFilledIcon, BookmarkMobileEmptyIcon.
Dependencies & Config
package.json
public/mockServiceWorker.js
.example.env
CLAUDE.md
Adds import-in-the-middle and require-in-the-middle deps. Removes turbopack from dev script. Updates MSW version and adds request interception timestamp tracking. Clears .example.env. Adds project documentation file.
Mutation & Hook Signature Updates
src/features/clubs/mutations.ts
src/features/like/mutations.ts
src/features/review/mutations.ts
Updates useToggleClubSubscription, useToggleLike, usePostBasicReview onSuccess/onError callbacks to include onMutateResult parameter.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Areas requiring extra attention:

  • Form routing and multi-step flow: New client-side routing in /review/new/[kind] with auth gating; verify step navigation, form state persistence, and redirect logic are correct.
  • Card component consolidation: Verify CardOverlay, MobileCard, and updated Card.tsx handle all previous use cases (sizing, images, metadata, bookmarking). Check presets (especially col4Phone) render correctly across devices.
  • Mutation callback signatures: Multiple mutations updated to pass onMutateResult; ensure all call sites providing onSuccess/onError callbacks are updated accordingly.
  • Explore component refactoring: New subscription integration, responsive layout, and CardOverlay usage; verify loading/error states and bookmark state synchronization.
  • Typography and design tokens: Ensure all new utilities and token names are properly applied in components and don't break existing styles.

Possibly related PRs

  • #26: Updates MultiDropDown and related atomic components (Popover, CheckItem, Button, Checkbox), overlapping with UI primitive changes in this PR.
  • #104: Modifies review form hook question ID mappings; this PR deletes and rewrites those same hooks entirely.
  • #53: Overlaps on mockServiceWorker.js, package.json dependencies, icons, card components, and club explore files.

Suggested labels

✨ Feature, 🎨 Style

Suggested reviewers

  • oaoong

Poem

🐰 From dual forms to steps so fine,
Cards consolidated in one design,
Bookmarks filled, subscriptions made,
Multi-step magic, neatly arrayed—
A hop through refactoring, done with flair! 📝✨

Pre-merge checks and finishing touches

❌ Failed checks (2 warnings)
Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning Beyond the mobile card implementation, the PR includes extensive refactoring of the review form system (consolidating Normal/Premium forms into step-based components), updating card presets, adding new design tokens, and modifying mutation signatures—changes that extend well beyond mobile card implementation scope. Separate the mobile card implementation (MobileCard, CardOverlay, col4Phone styling changes) into a focused PR, and move the form refactoring, design token updates, and mutation signature changes to dedicated PRs aligned with their specific objectives.
Docstring Coverage ⚠️ Warning Docstring coverage is 14.63% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed The PR title 'feat: 모바일카드 컴포넌트 구현' directly describes the main objective of implementing a mobile card component, aligning with the code changes that introduce MobileCard and CardOverlay components.
Description check ✅ Passed The PR description includes the linked issue number and a summary of changes, but the review focus points section is empty, which is a non-critical section as per template guidelines.
Linked Issues check ✅ Passed The PR implements MobileCard component and CardOverlay with subscription support, modifying card styling from vertical to horizontal on mobile (col4Phone), which addresses the mobile card component implementation requirement from issue #134.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feat/#134

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.

@gemini-code-assist
Copy link

Summary of Changes

Hello @yura0302, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!

이 PR은 사용자 경험을 크게 향상시키기 위한 주요 UI/UX 개선 사항과 개발 환경 업데이트를 포함합니다. 특히, 모바일 환경에서의 동아리 카드 표시를 최적화하고, 리뷰 작성 과정을 더욱 체계적이고 유연하게 만들었으며, 개발 생산성을 높이기 위한 AI 가이드 및 라이브러리 업데이트가 이루어졌습니다.

Highlights

  • 모바일 카드 컴포넌트 구현 및 탐색 페이지 개선: 탐색하기 페이지의 동아리 카드 표시 방식을 모바일 환경에 최적화하기 위해 새로운 모바일 카드 컴포넌트와 오버레이 로직이 구현되었습니다. 이제 모바일에서는 가로형 카드가, 데스크톱에서는 기존 세로형 카드가 표시됩니다. 또한, 동아리 구독(북마크) 기능이 카드에 추가되었습니다.
  • 리뷰 작성 플로우 다단계 폼으로 전면 개편: 기존의 단일 폼 방식에서 벗어나, 서류, 면접, 활동 후기 작성을 위한 다단계 폼(Step 1, Step 2)이 도입되었습니다. 각 후기 종류별로 전용 폼 컴포넌트와 훅이 분리되었으며, 공통 헤더 및 단계별 내비게이션 컴포넌트가 추가되어 사용자 경험이 개선되었습니다.
  • 동적 질문-답변(QA) 섹션 컴포넌트 추가: 리뷰 폼 내에서 사용자가 필요에 따라 질문-답변 항목을 동적으로 추가할 수 있는 DynamicQASection 컴포넌트가 새로 개발되었습니다. 이는 후기 작성의 유연성을 높여줍니다.
  • 개발 환경 및 도구 업데이트: Claude Code AI를 위한 상세한 가이드 파일(CLAUDE.md)이 추가되어 AI 개발 지원을 강화했습니다. 또한, package.json에서 next dev 스크립트의 --turbopack 옵션이 제거되고, import-in-the-middle, require-in-the-middle 등의 의존성이 추가되었습니다. MSW(Mock Service Worker) 버전도 업데이트되었습니다.
  • UI/UX 및 스타일 개선: 탐색하기 페이지의 동아리 정렬 옵션이 '모집중'에서 '마감순'으로 변경되었고, Textarea의 비활성화 상태 스타일, SideBar의 선택 상태 배경색, MultiDropDown의 텍스트 색상 등 다양한 UI 컴포넌트의 스타일과 동작이 개선되었습니다. 새로운 디자인 토큰 및 타이포그래피 유틸리티 클래스도 추가되었습니다.
Using Gemini Code Assist

The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.

Invoking Gemini

You can request assistance from Gemini at any point by creating a comment using either /gemini <command> or @gemini-code-assist <command>. Below is a summary of the supported commands on the current page.

Feature Command Description
Code Review /gemini review Performs a code review for the current pull request in its current state.
Pull Request Summary /gemini summary Provides a summary of the current pull request in its current state.
Comment @gemini-code-assist Responds in comments when explicitly tagged, both in pull request comments and review comments.
Help /gemini help Displays a list of available commands.

Customization

To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/ folder in the base of the repository. Detailed instructions can be found here.

Limitations & Feedback

Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments. If you're interested in giving your feedback about your experience with Gemini Code Assist for Github and other Google products, sign up here.

You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.

Footnotes

  1. Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution.

@coderabbitai
Copy link

coderabbitai bot commented Nov 30, 2025

Note

Docstrings generation - SUCCESS
Generated docstrings for this pull request at #136

@yura0302 yura0302 merged commit deb5923 into develop Nov 30, 2025
3 of 4 checks passed
coderabbitai bot added a commit that referenced this pull request Nov 30, 2025
Docstrings generation was requested by @yura0302.

* #135 (comment)

The following files were modified:

* `public/mockServiceWorker.js`
* `src/components/(pages)/club/explore/Explore.tsx`
* `src/components/molecules/card/Card.tsx`
* `src/components/molecules/card/CardOverlay.tsx`
* `src/components/molecules/card/MobileCard.tsx`
Copy link

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

Choose a reason for hiding this comment

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

Code Review

모바일 카드 컴포넌트를 구현하고 탐색 페이지에 적용하는 PR이네요. 카드 컴포넌트를 복합 컴포넌트(compound component)로 리팩터링하여 코드 구조를 개선한 점이 좋습니다. 북마크 기능 추가도 잘 구현되었습니다. 코드 일관성을 높이고 중복을 제거하기 위한 몇 가지 제안 사항을 리뷰에 남깁니다.

const toggleSubscription = useToggleClubSubscription()

const clubs = clubsData?.content || []
const subscribes = subscribesData?.data?.content || []

Choose a reason for hiding this comment

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

high

useExploreClubs에서 반환되는 clubsDataclubsData.content로 접근하는 반면, useUserSubscribes에서 반환되는 subscribesDatasubscribesData.data.content로 접근하고 있습니다. API 응답 데이터 구조에 일관성이 부족해 보입니다. 가능하다면 API 응답 형식을 { content: [...] } 또는 { data: { content: [...] } } 중 하나로 통일하여 클라이언트 측에서 데이터를 다루기 용이하게 만드는 것을 고려해보세요. 이는 코드의 예측 가능성을 높이고 잠재적인 버그를 줄일 수 있습니다.

}) {
const meta = [kind?.trim(), clubName?.trim(), clubYear?.trim(), part?.trim()]
.filter(Boolean)
.join(' · ')

Choose a reason for hiding this comment

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

medium

메타 정보의 구분자로 일반 공백( )을 사용하고 계십니다. 새로 추가된 MobileCard에서는 더 나은 가독성을 위해 thin space(\u2009)를 사용한 \u2009·\u2009를 구분자로 사용하고 있습니다. UI의 일관성을 위해 여기에서도 thin space를 사용하도록 수정하는 것이 좋겠습니다.

    .join('\u2009·\u2009')

onClick={handleClick}
>
<Card.Image
logoUrl={club.logoUrl || '/images/default.svg'}

Choose a reason for hiding this comment

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

medium

Card.Image 컴포넌트는 logoUrlnull이나 undefined일 경우 fallbackSrc prop을 사용하여 대체 이미지를 표시하도록 이미 구현되어 있습니다. 따라서 여기서 || '/images/default.svg'와 같이 fallback을 중복으로 처리할 필요가 없습니다. 코드를 간결하게 유지하기 위해 중복 로직을 제거하는 것이 좋습니다.

Suggested change
logoUrl={club.logoUrl || '/images/default.svg'}
logoUrl={club.logoUrl}

<Card.Content className="px-[6px]">
<Card.Title className="">{club.clubName}</Card.Title>
<Card.Description>{club.description}</Card.Description>
<Card.Meta part={club.categories.join(' · ')} />

Choose a reason for hiding this comment

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

medium

메타 정보의 구분자로 일반 공백( )을 사용하고 계십니다. MobileCard에서는 더 나은 가독성을 위해 thin space(\u2009)를 사용한 \u2009·\u2009를 구분자로 사용하고 있습니다. UI의 일관성을 위해 여기에서도 thin space를 사용하도록 수정하는 것이 좋겠습니다.

Suggested change
<Card.Meta part={club.categories.join(' · ')} />
<Card.Meta part={club.categories.join('\u2009·\u2009')} />

@yura0302 yura0302 deleted the feat/#134 branch December 9, 2025 00:57
yura0302 added a commit that referenced this pull request Dec 9, 2025
* Feat/#99 (#107)

* feat: 검색 부분 미비한 로직 추가

* fix: 이미지 수정

* Feat/#79 (#96)

* fix: 히어로 이미지 수정

* feat: 프리미엄 후기 구현

* feat: 세부페이지 구현

* fix: 에러해결

---------

Co-authored-by: yura <[email protected]>

* feat: 좋아요 API 명세 추가

---------

Co-authored-by: oaoong <[email protected]>
Co-authored-by: yura <[email protected]>

* style: 디자인토큰, 타이포그래피 수정 (#112)

* style: 디자인토큰, 타이포그래피 수정

* fix: onsuccess 콜백에 mutaiton 인자 추가

---------

Co-authored-by: yura <[email protected]>

* fix : 디자인 토큰, 타이포그래피 수정  (#113)

* style: 디자인토큰, 타이포그래피 수정

* fix: onsuccess 콜백에 mutaiton 인자 추가

* fix: mutation파일에 onmutationresult 추가

---------

Co-authored-by: yura <[email protected]>

* style: 배경 기본 색상 변경

* fix: tab filter 마감순 추가 (#129)

Co-authored-by: yura <[email protected]>

* fix: 탐색하기 레이아웃 수정  (#131)

* style: 탐색하기 사이드바, 히어로 이미지 수정

* style: 탐색하기 레이아웃 수정

---------

Co-authored-by: yura <[email protected]>

* feat: 리뷰 작성 레이아웃 (#132)

* feat: 리뷰 작성 연결 페이지 재정의

* feat: 리뷰 UI 개발사항 반영

* fix: formatting

* feat: QnA 컴포넌트 추가

* feat: 모바일카드 컴포넌트 구현  (#135)

* refactor: card 컴포넌트 수정

* feat: 북마크 추가

* refactor: card 컴포넌트 수정

* feat: 모바일 카드 구현

* feat: 탐색하기 리팩토링 (#137)

* feat: drawer 구현

* feat: 탐색 반응형 구현

* build: next 버전 패치

* build: lock파일 삭제 및 재설치

---------

Co-authored-by: oaoong <[email protected]>
Co-authored-by: yura <[email protected]>
This was referenced Dec 9, 2025
yura0302 added a commit that referenced this pull request Dec 13, 2025
* Feat/#99 (#107)

* feat: 검색 부분 미비한 로직 추가

* fix: 이미지 수정

* Feat/#79 (#96)

* fix: 히어로 이미지 수정

* feat: 프리미엄 후기 구현

* feat: 세부페이지 구현

* fix: 에러해결

---------

Co-authored-by: yura <[email protected]>

* feat: 좋아요 API 명세 추가

---------

Co-authored-by: oaoong <[email protected]>
Co-authored-by: yura <[email protected]>

* style: 디자인토큰, 타이포그래피 수정 (#112)

* style: 디자인토큰, 타이포그래피 수정

* fix: onsuccess 콜백에 mutaiton 인자 추가

---------

Co-authored-by: yura <[email protected]>

* fix : 디자인 토큰, 타이포그래피 수정  (#113)

* style: 디자인토큰, 타이포그래피 수정

* fix: onsuccess 콜백에 mutaiton 인자 추가

* fix: mutation파일에 onmutationresult 추가

---------

Co-authored-by: yura <[email protected]>

* style: 배경 기본 색상 변경

* fix: tab filter 마감순 추가 (#129)

Co-authored-by: yura <[email protected]>

* fix: 탐색하기 레이아웃 수정  (#131)

* style: 탐색하기 사이드바, 히어로 이미지 수정

* style: 탐색하기 레이아웃 수정

---------

Co-authored-by: yura <[email protected]>

* feat: 리뷰 작성 레이아웃 (#132)

* feat: 리뷰 작성 연결 페이지 재정의

* feat: 리뷰 UI 개발사항 반영

* fix: formatting

* feat: QnA 컴포넌트 추가

* feat: 모바일카드 컴포넌트 구현  (#135)

* refactor: card 컴포넌트 수정

* feat: 북마크 추가

* refactor: card 컴포넌트 수정

* feat: 모바일 카드 구현

* feat: 탐색하기 리팩토링 (#137)

* feat: drawer 구현

* feat: 탐색 반응형 구현

* build: next 버전 패치 (#139)

* build: next 버전 업데이트 (#143)

* build: 빌드수정

---------

Co-authored-by: oaoong <[email protected]>
Co-authored-by: yura <[email protected]>
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.

모바일 카드 컴포넌트 구현

1 participant