Skip to content

Conversation

@yura0302
Copy link
Collaborator

@yura0302 yura0302 commented Dec 9, 2025

🔗 관련 이슈

Closes #

✨ 변경사항

🎯 리뷰 포인트

📝 추가 정보

Summary by CodeRabbit

  • New Features

    • Simplified review submission flow with streamlined form selection.
    • Added bookmark functionality to club cards for easy saving.
    • Introduced mobile-optimized drawer and filter components for better responsive experience.
  • UI/UX Improvements

    • Enhanced card design with improved metadata display.
    • Updated typography and design tokens for consistency.
    • Refined header spacing and styling.
  • Dependencies

    • Updated core framework packages to latest versions.
    • Added new UI component libraries for enhanced functionality.

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

yura0302 and others added 13 commits August 30, 2025 02:41
* 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: 디자인토큰, 타이포그래피 수정

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

---------

Co-authored-by: yura <[email protected]>
* style: 디자인토큰, 타이포그래피 수정

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

* fix: mutation파일에 onmutationresult 추가

---------

Co-authored-by: yura <[email protected]>
style: 배경 기본 색상 변경
* style: 탐색하기 사이드바, 히어로 이미지 수정

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

---------

Co-authored-by: yura <[email protected]>
* feat: 리뷰 작성 연결 페이지 재정의

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

* fix: formatting

* feat: QnA 컴포넌트 추가
* refactor: card 컴포넌트 수정

* feat: 북마크 추가

* refactor: card 컴포넌트 수정

* feat: 모바일 카드 구현
* feat: drawer 구현

* feat: 탐색 반응형 구현
@yura0302 yura0302 self-assigned this Dec 9, 2025
@vercel
Copy link

vercel bot commented Dec 9, 2025

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

Project Deployment Preview Comments Updated (UTC)
moyeoit Ready Ready Preview Comment Dec 9, 2025 3:40am

@coderabbitai
Copy link

coderabbitai bot commented Dec 9, 2025

Caution

Review failed

The pull request is closed.

Walkthrough

This PR transitions the review form submission system from type-based (normal/premium) to kind-based (paper/interview/activity) architecture, introduces responsive mobile components (MobileCard, CardOverlay, MobileFilterBar, MobileTab), restructures the Card component system with new subcomponents, updates core dependencies, and modernizes design tokens and typography across the application.

Changes

Cohort / File(s) Summary
Configuration & Documentation
.example.env, CLAUDE.md
Removed example environment file; added comprehensive project documentation covering development commands, architecture, conventions, tech stack, and workflows.
Dependencies & Build Configuration
package.json
Bumped Next.js (15.4.4 → 15.4.8), React & React-DOM (19.1.0 → 19.1.2), eslint-config-next; removed Turbopack from dev script; added vaul, import-in-the-middle, require-in-the-middle packages.
MSW & API Interception
public/mockServiceWorker.js
Updated MSW to v2.12.2; added requestInterceptedAt timestamp tracking through request lifecycle; removed MOCK_DEACTIVATE handler; extended handleRequest and getResponse signatures to propagate intercepted timestamp.
Review Form Pages
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
Removed type-parameterized route; added entry page with category selection; restructured [kind] page to dynamically load form kinds; deleted [kind]/[type] page.
Review Form Factories & Utilities
src/components/pages/review/new/forms/FormFactory.tsx, src/shared/configs/appPath.ts
Refactored FormFactory from kind+type to kind-only logic; updated isValidFormCombination to isValidFormKind; added per-kind title/description utilities; simplified AppPath.reviewNew signature.
Old Form Components (Deleted)
src/components/pages/review/new/forms/*NormalForm.tsx, src/components/pages/review/new/forms/*PremiumForm.tsx
Removed 6 form component files: PaperNormalForm, PaperPremiumForm, InterviewNormalForm, InterviewPremiumForm, ActivityNormalForm, ActivityPremiumForm.
Old Form Hooks (Deleted)
src/components/pages/review/new/forms/hooks/use*Form.ts
Removed 6 legacy form hook files with old schema and submission logic for normal/premium variants.
New Activity Form Components
src/components/pages/review/new/forms/activity/*
Added ActivityStep1, ActivityStep2, ActivityForm, useActivityForm with multi-step validation and QA section support.
New Interview Form Components
src/components/pages/review/new/forms/interview/*
Added InterviewStep1, InterviewStep2, InterviewForm, useInterviewForm with multi-step flow and dynamic Q&A handling.
New Paper Form Components
src/components/pages/review/new/forms/paper/*
Added PaperStep1, PaperStep2, PaperForm, usePaperForm with multi-step validation and QA integration.
Review Form Shared Components
src/components/pages/review/new/shared/*
Added ReviewFormHeader (club/generation/job selection), StepNavigation (previous/next button group), and index barrel; deleted ReviewCardTemplate.
Card Component Restructuring
src/components/molecules/card/Card.tsx, src/components/molecules/card/index.ts, src/components/molecules/card/presets.ts
Introduced new Card subcomponents (CardImage, CardMeta, CardStats, CardBookmark) as exports from main Card; refactored CSS variable handling; updated col4Phone preset sizing.
Card Component Deletions
src/components/molecules/card/Card[Content|Description|Footer|Header|Image|Meta|Stats|Title].tsx
Deleted 8 standalone card component files; functionality consolidated into Card.tsx exports.
Mobile Card Components
src/components/molecules/card/MobileCard.tsx, src/components/molecules/card/CardOverlay.tsx
Added MobileCard (horizontal mobile layout) and CardOverlay (responsive wrapper rendering Card or MobileCard based on screen size).
Drawer Component
src/components/molecules/drawer/drawer.tsx, src/components/molecules/drawer/index.ts
Introduced complete Drawer component system built on Vaul primitives with Portal, Overlay, Content, Header, Footer, Title, Description.
Filter & Tab Components
src/components/molecules/filterBar/MobileFilterBar.tsx, src/components/molecules/tab/MobileTab.tsx, src/components/molecules/tab/TabOverlay.tsx
Added MobileFilterBar (horizontal scrollable filter tabs), MobileTab (drawer-based mobile sorting), TabOverlay (responsive Tab/MobileTab wrapper).
MultiDropdown Mobile
src/components/molecules/multiDropDown/MobileMultiDropdown.tsx, src/components/molecules/multiDropDown/MultiDropDown.tsx
Added MobileMultiDropdown with drawer-based multi-select and complex "all" option logic; updated MultiDropDown styling and variant handling.
Button & Atom Updates
src/components/atoms/Button/button.tsx, src/components/atoms/Textarea/Textarea.tsx, src/components/atoms/UnderLineTab/UnderLineTab.tsx, src/components/atoms/sideBar/Sidebar.tsx
Added asChild prop and Slot support to Button; removed disabled background from Textarea; replaced border height unit in UnderLineTab; updated Sidebar checked-state styling.
Layout Updates
src/components/molecules/layout/Header.tsx, src/components/molecules/layout/MobileHeader.tsx, src/components/molecules/layout/sections/ReviewWriteDropdown.tsx
Removed vertical padding (py-3) from header elements; replaced ReviewWriteDropdown multi-option menu with single direct link to AppPath.reviewNew().
Club Explore Page
src/components/(pages)/club/explore/Explore.tsx
Refactored to use new CardOverlay, MobileFilterBar, TabOverlay; integrated useUserSubscribes and useToggleClubSubscription; replaced hero logic with HERO_IMAGES constant; added responsive sidebar/mobile layouts.
Dynamic QA Section
src/components/molecules/dynamicQaSection/DynamicQASection.tsx, src/components/molecules/dynamicQaSection/DynamicQASection.stories.tsx, src/components/molecules/dynamicQaSection/index.ts
Added DynamicQASection with react-hook-form integration, array field management, focus-based label coloring, and per-item question/answer input.
Card Stories
src/components/molecules/card/Card.stories.tsx
Updated HorizontalRender to simplify Card.Meta and remove Card.Stats; changed Col4Phone story from Vertical to Horizontal orientation.
Icons
src/assets/icons/index.ts
Added 5 new icon exports: DocumentFileIcon, BookmarkFilledIcon, BookmarkEmptyIcon, BookmarkMobileFilledIcon, BookmarkMobileEmptyIcon.
Tab Type Updates
src/components/molecules/tab/Tab.tsx
Changed Tab type from 'recruit' to 'deadline'; updated OPTIONS array label from '모집중' to '마감순'.
Feature Mutations
src/features/clubs/mutations.ts, src/features/like/mutations.ts, src/features/review/mutations.ts, src/features/subscribe/mutations.ts
Updated onSuccess/onError callback signatures across useToggleClubSubscription, useToggleLike, usePostBasicReview, usePostPremiumReview to include onMutateResult parameter.
Form Hooks Index
src/components/pages/review/new/forms/hooks/index.ts
Removed 6 form hook re-exports and associated option constant re-exports for legacy normal/premium forms.
Form Index
src/components/pages/review/new/forms/index.ts
Replaced specific form exports with new PaperForm, InterviewForm, ActivityForm; updated FormFactory exports from FormType/isValidFormCombination to FormKind/isValidFormKind/getFormTitle.
Design Constants
src/shared/constants/category.ts, src/shared/constants/filters.ts
Added CATEGORY_OPTIONS array and HERO_IMAGES mapping; added SORT_OPTIONS, PART_OPTIONS, WAY_OPTIONS, TARGET_OPTIONS filter constants.
Design Tokens & Typography
src/styles/design-tokens.css, src/styles/typography.css, src/styles/globals.css
Added caption (--text-caption-1/2/3) and review-title tokens; refactored typography utilities with expanded button/body/title/caption variants; added backward-compat legacy names; changed body background to white.

Sequence Diagram

sequenceDiagram
    participant User
    participant ReviewNewPage as /review/new<br/>[kind]
    participant FormFactory
    participant FormComponent as PaperForm/<br/>InterviewForm/<br/>ActivityForm
    participant StepComponent as Step1/Step2<br/>Components
    participant useFormHook as useXForm<br/>Hook
    participant Mutation as postBasicReview<br/>Mutation
    participant API
    participant SuccessPage

    User->>ReviewNewPage: Load page with kind param
    ReviewNewPage->>ReviewNewPage: Validate kind, set formKind state
    ReviewNewPage->>FormFactory: Pass validated kind
    FormFactory->>FormComponent: Render PaperForm/InterviewForm/ActivityForm
    
    rect rgb(200, 220, 255)
        note over StepComponent,useFormHook: Multi-step form flow
        FormComponent->>useFormHook: Initialize form (step 1)
        useFormHook->>StepComponent: Render Step 1
        
        User->>StepComponent: Fill step 1 fields
        StepComponent->>useFormHook: Validate step 1 via trigger()
        
        User->>StepComponent: Click next
        StepComponent->>FormComponent: Call goToNextStep
        FormComponent->>useFormHook: Execute trigger validation
        useFormHook->>StepComponent: Render Step 2 on success
        
        User->>StepComponent: Fill step 2 fields (QA items, etc.)
        User->>StepComponent: Click submit
    end
    
    rect rgb(220, 255, 220)
        note over StepComponent,API: Form submission flow
        FormComponent->>useFormHook: Call onSubmit via form.handleSubmit()
        useFormHook->>useFormHook: transformToApiRequest() - convert form to API payload
        useFormHook->>Mutation: Call postBasicReviewMutation.mutate(payload)
        Mutation->>API: POST /api/reviews/basic
        API->>Mutation: Return { reviewId }
    end
    
    rect rgb(255, 240, 220)
        note over Mutation,SuccessPage: Post-submission
        Mutation->>useFormHook: onSuccess callback with reviewId
        useFormHook->>SuccessPage: Navigate to AppPath.reviewSubmitted()
        SuccessPage->>User: Show success message
    end
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Areas requiring extra attention:

  • Multi-step form architecture: Review the new form step flow, validation logic (trigger vs. full validation), and navigation handlers across useActivityForm, useInterviewForm, usePaperForm to ensure correct validation gates between steps.
  • Card component restructuring: Verify that all Card subcomponents (CardImage, CardMeta, CardStats, CardBookmark) work correctly with CardCtx and that the preset system properly handles responsive sizing changes (especially col4Phone width changes).
  • Mobile component state management: The MobileMultiDropdown with complex "all" option logic and temp value state should be tested thoroughly for edge cases (selecting/deselecting all vs. individual items).
  • MSW timestamp propagation: Confirm that requestInterceptedAt is correctly threaded through the entire request lifecycle in mockServiceWorker.js and that the payload structure matches client expectations.
  • Mutation callback signature changes: Verify all updated onSuccess/onError callbacks across clubs/like/review/subscribe mutations receive onMutateResult correctly and that callers pass this parameter.
  • AppPath.reviewNew refactoring: Ensure all call sites using the old two-parameter signature are updated to the new single-parameter variant (or no parameter for the entry page).
  • Design token usage: Check that new typography utilities (typo-caption-1/2/3, typo-review-title, typo-button-m/b) are consistently applied and that legacy names in the "이전버전" section don't cause conflicts.

Possibly related PRs

Suggested labels

✨ Feature, 🟨 중

Suggested reviewers

  • oaoong

Poem

🐰 Hops through forms with steps so neat,
Cards and filters, mobile sweet,
From kinds past types, we now are free,
Design tokens bloom in harmony—
Multi-step reviews, a rabbit's delight! 🌿

✨ 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 build/#138

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 86ccddd and fe1ec9a.

⛔ Files ignored due to path filters (8)
  • package-lock.json is excluded by !**/package-lock.json
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
  • public/images/heroAll.svg is excluded by !**/*.svg
  • src/assets/icons/bookmark-empty-icon.svg is excluded by !**/*.svg
  • src/assets/icons/bookmark-filled-icon.svg is excluded by !**/*.svg
  • src/assets/icons/bookmark-mobile-empty.svg is excluded by !**/*.svg
  • src/assets/icons/bookmark-mobile-filled.svg is excluded by !**/*.svg
  • src/assets/icons/document-file-icon.svg is excluded by !**/*.svg
📒 Files selected for processing (82)
  • .example.env (0 hunks)
  • CLAUDE.md (1 hunks)
  • package.json (3 hunks)
  • public/mockServiceWorker.js (5 hunks)
  • src/app/(root)/(routes)/review/new/[kind]/[type]/page.tsx (0 hunks)
  • src/app/(root)/(routes)/review/new/[kind]/page.tsx (1 hunks)
  • src/app/(root)/(routes)/review/new/page.tsx (1 hunks)
  • src/assets/icons/index.ts (1 hunks)
  • src/components/(pages)/club/explore/Explore.tsx (2 hunks)
  • src/components/atoms/Button/button.tsx (2 hunks)
  • src/components/atoms/Textarea/Textarea.tsx (1 hunks)
  • src/components/atoms/UnderLineTab/UnderLineTab.tsx (1 hunks)
  • src/components/atoms/sideBar/Sidebar.tsx (1 hunks)
  • src/components/molecules/card/Card.stories.tsx (2 hunks)
  • src/components/molecules/card/Card.tsx (4 hunks)
  • src/components/molecules/card/CardContent.tsx (0 hunks)
  • src/components/molecules/card/CardDescription.tsx (0 hunks)
  • src/components/molecules/card/CardFooter.tsx (0 hunks)
  • src/components/molecules/card/CardHeader.tsx (0 hunks)
  • src/components/molecules/card/CardImage.tsx (0 hunks)
  • src/components/molecules/card/CardMeta.tsx (0 hunks)
  • src/components/molecules/card/CardOverlay.tsx (1 hunks)
  • src/components/molecules/card/CardStats.tsx (0 hunks)
  • src/components/molecules/card/CardTitle.tsx (0 hunks)
  • src/components/molecules/card/MobileCard.tsx (1 hunks)
  • src/components/molecules/card/index.ts (4 hunks)
  • src/components/molecules/card/presets.ts (2 hunks)
  • src/components/molecules/drawer/drawer.tsx (1 hunks)
  • src/components/molecules/drawer/index.ts (1 hunks)
  • src/components/molecules/dynamicQaSection/DynamicQASection.stories.tsx (1 hunks)
  • src/components/molecules/dynamicQaSection/DynamicQASection.tsx (1 hunks)
  • src/components/molecules/dynamicQaSection/index.ts (1 hunks)
  • src/components/molecules/filterBar/MobileFilterBar.tsx (1 hunks)
  • src/components/molecules/layout/Header.tsx (1 hunks)
  • src/components/molecules/layout/MobileHeader.tsx (1 hunks)
  • src/components/molecules/layout/sections/ReviewWriteDropdown.tsx (1 hunks)
  • src/components/molecules/multiDropDown/MobileMultiDropdown.tsx (1 hunks)
  • src/components/molecules/multiDropDown/MultiDropDown.tsx (4 hunks)
  • src/components/molecules/tab/MobileTab.tsx (1 hunks)
  • src/components/molecules/tab/Tab.tsx (1 hunks)
  • src/components/molecules/tab/TabOverlay.tsx (1 hunks)
  • src/components/pages/review/new/ReviewCardTemplate.tsx (0 hunks)
  • src/components/pages/review/new/forms/ActivityNormalForm.tsx (0 hunks)
  • src/components/pages/review/new/forms/ActivityPremiumForm.tsx (0 hunks)
  • src/components/pages/review/new/forms/FormFactory.tsx (1 hunks)
  • src/components/pages/review/new/forms/InterviewNormalForm.tsx (0 hunks)
  • src/components/pages/review/new/forms/InterviewPremiumForm.tsx (0 hunks)
  • src/components/pages/review/new/forms/PaperNormalForm.tsx (0 hunks)
  • src/components/pages/review/new/forms/PaperPremiumForm.tsx (0 hunks)
  • src/components/pages/review/new/forms/activity/ActivityStep1.tsx (1 hunks)
  • src/components/pages/review/new/forms/activity/ActivityStep2.tsx (1 hunks)
  • src/components/pages/review/new/forms/activity/index.tsx (1 hunks)
  • src/components/pages/review/new/forms/activity/useActivityForm.ts (1 hunks)
  • src/components/pages/review/new/forms/hooks/index.ts (0 hunks)
  • src/components/pages/review/new/forms/hooks/useActivityNormalForm.ts (0 hunks)
  • src/components/pages/review/new/forms/hooks/useActivityPremiumForm.ts (0 hunks)
  • src/components/pages/review/new/forms/hooks/useInterviewNormalForm.ts (0 hunks)
  • src/components/pages/review/new/forms/hooks/useInterviewPremiumForm.ts (0 hunks)
  • src/components/pages/review/new/forms/hooks/usePaperNormalForm.ts (0 hunks)
  • src/components/pages/review/new/forms/hooks/usePaperPremiumForm.ts (0 hunks)
  • src/components/pages/review/new/forms/index.ts (1 hunks)
  • src/components/pages/review/new/forms/interview/InterviewStep1.tsx (1 hunks)
  • src/components/pages/review/new/forms/interview/InterviewStep2.tsx (1 hunks)
  • src/components/pages/review/new/forms/interview/index.tsx (1 hunks)
  • src/components/pages/review/new/forms/interview/useInterviewForm.ts (1 hunks)
  • src/components/pages/review/new/forms/paper/PaperStep1.tsx (1 hunks)
  • src/components/pages/review/new/forms/paper/PaperStep2.tsx (1 hunks)
  • src/components/pages/review/new/forms/paper/index.tsx (1 hunks)
  • src/components/pages/review/new/forms/paper/usePaperForm.ts (1 hunks)
  • src/components/pages/review/new/shared/ReviewFormHeader.tsx (1 hunks)
  • src/components/pages/review/new/shared/StepNavigation.tsx (1 hunks)
  • src/components/pages/review/new/shared/index.ts (1 hunks)
  • src/features/clubs/mutations.ts (3 hunks)
  • src/features/like/mutations.ts (2 hunks)
  • src/features/review/mutations.ts (2 hunks)
  • src/features/subscribe/mutations.ts (1 hunks)
  • src/shared/configs/appPath.ts (1 hunks)
  • src/shared/constants/category.ts (1 hunks)
  • src/shared/constants/filters.ts (1 hunks)
  • src/styles/design-tokens.css (1 hunks)
  • src/styles/globals.css (1 hunks)
  • src/styles/typography.css (1 hunks)

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.

@yura0302 yura0302 merged commit 5f74aca into main Dec 9, 2025
3 of 4 checks passed
@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!

이 Pull Request는 리뷰 작성 프로세스를 간소화하고 동아리 탐색 페이지의 사용자 경험을 개선하는 데 중점을 둡니다. 리뷰 폼을 다단계 형식으로 통합하고, 모바일 필터링 및 북마크 기능을 추가하여 전반적인 UI/UX를 향상시켰습니다. 또한, 최신 의존성 업데이트와 새로운 개발 가이드 도입을 통해 프로젝트의 안정성과 개발 효율성을 높였습니다.

Highlights

  • 리뷰 작성 플로우 개편: 기존의 '일반' 및 '프리미엄' 리뷰 유형 구분을 제거하고, 서류, 면접, 활동 각 카테고리별로 단일화된 다단계(multi-step) 리뷰 작성 폼으로 개편했습니다. 이제 사용자는 먼저 리뷰 카테고리를 선택한 후, 해당 카테고리에 맞는 폼을 작성하게 됩니다.
  • 동아리 탐색 페이지 개선: 동아리 탐색 페이지에 북마크(구독) 기능을 추가하고, 모바일 환경에 최적화된 필터 바를 도입하여 사용자 경험을 향상시켰습니다. 또한, 카드 컴포넌트를 재사용성 높은 형태로 리팩토링하여 데스크톱과 모바일 뷰포트에서 일관된 UI를 제공합니다.
  • 의존성 업데이트 및 신규 라이브러리 도입: Next.js, React, React-DOM, MSW 등 주요 의존성을 최신 버전으로 업데이트했습니다. 더불어 모바일 드로어(Drawer) UI를 위한 'vaul' 라이브러리와 동적 모듈 로딩/패치를 위한 'import-in-the-middle', 'require-in-the-middle'을 새로 추가했습니다.
  • AI 개발 가이드 추가: Claude Code와 같은 AI 코드 어시스턴트가 프로젝트 구조와 컨벤션을 더 잘 이해하고 협업할 수 있도록 돕는 CLAUDE.md 파일을 새로 추가했습니다.
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.

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은 의존성 업데이트와 함께 후기 작성 플로우 및 UI/UX를 대대적으로 개선하는 내용을 담고 있습니다. 특히 후기 작성 폼을 단계별로 리팩터링하고, 재사용 가능한 컴포넌트(DynamicQASection, StepNavigation 등)를 도입하여 코드 구조를 크게 향상시킨 점이 인상적입니다. 또한 반응형 디자인을 고려한 MobileFilterBar, CardOverlay 등의 컴포넌트 추가도 좋은 변화입니다.

다만, 몇 가지 개선이 필요한 부분이 보입니다. Explore 페이지에서 로딩 및 에러, 빈 상태 처리가 누락되어 사용자 경험을 해칠 수 있습니다. 또한, 여러 mutations.ts 파일에서 useMutation의 콜백 시그니처가 잘못 사용된 것으로 보이며, 이는 타입 에러나 예기치 않은 동작을 유발할 수 있습니다. 마지막으로 Card 컴포넌트의 스타일링에 작은 구문 오류가 발견되었습니다.

자세한 내용은 각 파일에 남긴 리뷰 코멘트를 참고해주세요.

className={cn(
base,
'gap-[var(--card-gap)] p-[var(--card-pad)] rounded-[12px]',
'gap-(--card-gap) p-(--card-pad) rounded-[12px]',

Choose a reason for hiding this comment

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

critical

Tailwind CSS의 임의 값(arbitrary values) 구문이 잘못 사용되었습니다. gap-(--card-gap)p-(--card-pad)는 유효하지 않은 클래스명이며, gap-[var(--card-gap)]p-[var(--card-pad)]로 수정해야 합니다. 이 오류로 인해 카드 컴포넌트의 간격과 패딩이 제대로 적용되지 않을 수 있습니다.

          'gap-[var(--card-gap)] p-[var(--card-pad)] rounded-[12px]',

isLoading: loading,
error: queryError,
} = useExploreClubs(queryParams)
const { data: clubsData } = useExploreClubs(queryParams)

Choose a reason for hiding this comment

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

high

useExploreClubs 훅에서 isLoadingerror 상태를 더 이상 사용하지 않아 로딩 및 에러 상태에 대한 UI 처리가 누락되었습니다. 데이터 로딩 중이거나 에러가 발생했을 때 사용자에게 적절한 피드백을 제공하지 않으면 UX가 저하될 수 있습니다. 이전 코드처럼 로딩 스피너나 에러 메시지를 다시 추가하는 것을 고려해 보세요. 또한, 데이터가 비어있을 때의 처리(clubs.length === 0)도 함께 복구하는 것이 좋겠습니다.

Suggested change
const { data: clubsData } = useExploreClubs(queryParams)
const { data: clubsData, isLoading, error: queryError } = useExploreClubs(queryParams)

Comment on lines +29 to 34
onSuccess: (data, variables, onMutateResult, context) => {
queryClient.invalidateQueries({
queryKey: clubKeys.detail(variables.clubId),
})
options?.onSuccess?.(data, variables, context as never)
options?.onSuccess?.(data, variables, onMutateResult, context)
},

Choose a reason for hiding this comment

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

high

useMutationonSuccess 콜백 시그니처가 잘못되었습니다. @tanstack/react-query v5에서 onSuccess(data, variables, context) 3개의 인자를 받습니다. onMutateResult라는 파라미터는 표준 시그니처에 존재하지 않습니다.

Suggested change
onSuccess: (data, variables, onMutateResult, context) => {
queryClient.invalidateQueries({
queryKey: clubKeys.detail(variables.clubId),
})
options?.onSuccess?.(data, variables, context as never)
options?.onSuccess?.(data, variables, onMutateResult, context)
},
onSuccess: (data, variables, context) => {
queryClient.invalidateQueries({
queryKey: clubKeys.detail(variables.clubId),
})
options?.onSuccess?.(data, variables, context)
},

Comment on lines +23 to 29
onSuccess: (data, variables, onMutateResult, context) => {
// 베이직 후기 목록 쿼리 무효화
queryClient.invalidateQueries({
queryKey: reviewKeys.basicLists(),
})
options?.onSuccess?.(data, variables, context as never)
options?.onSuccess?.(data, variables, onMutateResult, context)
},

Choose a reason for hiding this comment

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

high

useMutationonSuccess 콜백 시그니처가 잘못되었습니다. @tanstack/react-query v5에서 onSuccess(data, variables, context) 3개의 인자를 받습니다. onMutateResult라는 파라미터는 표준 시그니처에 존재하지 않습니다.

Suggested change
onSuccess: (data, variables, onMutateResult, context) => {
// 베이직 후기 목록 쿼리 무효화
queryClient.invalidateQueries({
queryKey: reviewKeys.basicLists(),
})
options?.onSuccess?.(data, variables, context as never)
options?.onSuccess?.(data, variables, onMutateResult, context)
},
onSuccess: (data, variables, context) => {
// 베이직 후기 목록 쿼리 무효화
queryClient.invalidateQueries({
queryKey: reviewKeys.basicLists(),
})
options?.onSuccess?.(data, variables, context)
},

Comment on lines +50 to 56
onSuccess: (data, variables, onMutateResult, context) => {
// 프리미엄 후기 목록 쿼리 무효화
queryClient.invalidateQueries({
queryKey: reviewKeys.premiumLists(),
})
options?.onSuccess?.(data, variables, context as never)
options?.onSuccess?.(data, variables, onMutateResult, context)
},

Choose a reason for hiding this comment

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

high

useMutationonSuccess 콜백 시그니처가 잘못되었습니다. @tanstack/react-query v5에서 onSuccess(data, variables, context) 3개의 인자를 받습니다. onMutateResult라는 파라미터는 표준 시그니처에 존재하지 않습니다.

Suggested change
onSuccess: (data, variables, onMutateResult, context) => {
// 프리미엄 후기 목록 쿼리 무효화
queryClient.invalidateQueries({
queryKey: reviewKeys.premiumLists(),
})
options?.onSuccess?.(data, variables, context as never)
options?.onSuccess?.(data, variables, onMutateResult, context)
},
onSuccess: (data, variables, context) => {
// 프리미엄 후기 목록 쿼리 무효화
queryClient.invalidateQueries({
queryKey: reviewKeys.premiumLists(),
})
options?.onSuccess?.(data, variables, context)
},

Comment on lines +18 to 23
onSuccess: (data, clubId, onMutateResult, context) => {
queryClient.invalidateQueries({
queryKey: subscribeKeys.userSubscribes(),
})
options?.onSuccess?.(data, clubId, context as never)
options?.onSuccess?.(data, clubId, onMutateResult, context)
},

Choose a reason for hiding this comment

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

high

useMutationonSuccess 콜백 시그니처가 잘못되었습니다. @tanstack/react-query v5에서 onSuccess(data, variables, context) 3개의 인자를 받습니다. onMutateResult라는 파라미터는 표준 시그니처에 존재하지 않습니다.

Suggested change
onSuccess: (data, clubId, onMutateResult, context) => {
queryClient.invalidateQueries({
queryKey: subscribeKeys.userSubscribes(),
})
options?.onSuccess?.(data, clubId, context as never)
options?.onSuccess?.(data, clubId, onMutateResult, context)
},
onSuccess: (data, clubId, context) => {
queryClient.invalidateQueries({
queryKey: subscribeKeys.userSubscribes(),
})
options?.onSuccess?.(data, clubId, context)
},

Comment on lines +81 to +84
NEXT_PUBLIC_API_ADDRESS # Backend API URL
NEXT_PUBLIC_API_MOCKING # MSW toggle (enabled/disabled)
NEXT_PUBLIC_GA_ID # Google Analytics
```

Choose a reason for hiding this comment

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

medium

CHROMATIC_PROJECT_TOKEN 환경 변수에 대한 설명이 누락되었습니다. package.jsonchromatic 스크립트에서 사용되고 있으므로, 이 문서에도 추가하여 다른 개발자들이 혼동하지 않도록 하는 것이 좋겠습니다.

Suggested change
NEXT_PUBLIC_API_ADDRESS # Backend API URL
NEXT_PUBLIC_API_MOCKING # MSW toggle (enabled/disabled)
NEXT_PUBLIC_GA_ID # Google Analytics
```
NEXT_PUBLIC_API_ADDRESS # Backend API URL
NEXT_PUBLIC_API_MOCKING # MSW toggle (enabled/disabled)
NEXT_PUBLIC_GA_ID # Google Analytics
CHROMATIC_PROJECT_TOKEN # Chromatic project token

'block w-full py-3 px-5',
'cursor-pointer select-none',
'peer-data-[state=checked]:bg-white rounded-[8px]',
'peer-data-[state=checked]:bg-light-color-2 ',

Choose a reason for hiding this comment

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

medium

선택된 사이드바 아이템의 스타일에서 rounded-[8px]가 제거되었습니다. 이로 인해 선택된 항목의 배경이 둥근 모서리 없이 표시될 수 있습니다. 의도된 변경이 아니라면, bg-light-color-2와 함께 rounded-[8px]를 다시 추가하여 디자인 일관성을 유지하는 것이 좋겠습니다.

Suggested change
'peer-data-[state=checked]:bg-light-color-2 ',
'peer-data-[state=checked]:bg-light-color-2 rounded-[8px]',

@yura0302 yura0302 deleted the build/#138 branch December 13, 2025 06:02
@coderabbitai coderabbitai bot mentioned this pull request Dec 13, 2025
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.

2 participants