[FEAT] 디자이너 외주 내용 조회 페이지 퍼블리싱#62
Conversation
📝 WalkthroughWalkthrough디자이너 커미션 상세 조회와 제출 페이지를 추가하고, 상세 데이터·탭 UI·파일 업로드 모달을 구성했습니다. 홈, 검색, 결제 내역 행에는 상세 및 제출 페이지로 이동하는 라우팅을 연결했습니다. Changes디자이너 커미션 상세 및 제출 흐름
Estimated code review effort: 3 (Moderate) | ~25 minutes Sequence Diagram(s)sequenceDiagram
participant Designer
participant DesignerRow
participant DetailPage
participant CommissionDetailSection
Designer->>DesignerRow: 상세 보기 클릭
DesignerRow->>DetailPage: commissionId와 hideActions로 이동
DetailPage->>CommissionDetailSection: 커미션 상세 데이터 전달
CommissionDetailSection->>Designer: 선택된 상세 탭 표시
sequenceDiagram
participant Designer
participant SubmitPage
participant useUploadedFiles
participant Modal
participant NextRouter
Designer->>SubmitPage: 파일 업로드 및 제출 클릭
SubmitPage->>useUploadedFiles: 업로드 파일 상태 조회
SubmitPage->>Modal: 제출 확인 요청
Designer->>Modal: 제출 확인
Modal->>NextRouter: /designer로 이동
Possibly related PRs
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
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. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (3)
src/app/designer/(withSidebar)/submit/[commissionId]/page.tsx (1)
56-71: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win조건부
className을cn()으로 정리하세요.src/app/designer/(withSidebar)/submit/[commissionId]/page.tsx:56-71에서isFileSubmitView분기를 직접 문자열로 나누고 있어"w-fit"가 중복됩니다.cn("w-fit", condition && "...")형태로 바꾸고, import는@/shared/lib/utils/cn을 사용하세요.🤖 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/app/designer/`(withSidebar)/submit/[commissionId]/page.tsx around lines 56 - 71, Update the two Button className expressions in the submit view to use cn from "`@/shared/lib/utils/cn`", extracting the shared "w-fit" class and applying each conditional class through cn instead of duplicating it in ternary strings. Preserve the existing conditional styling for isFileSubmitView.Source: Path instructions
src/widgets/designer/detail/ui/DesignInfoTab.tsx (1)
35-41: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win
UnderlineTitle컴포넌트가 중복 정의되어 있습니다.동일한
UnderlineTitle컴포넌트가ReferenceTab.tsx(Lines 14-20)에도 정의되어 있습니다. 공유 컴포넌트로 추출하여 중복을 제거하세요.♻️ 제안하는 수정 — 공유 컴포넌트 추출
src/widgets/designer/detail/ui/UnderlineTitle.tsx생성 후 양쪽에서 import:+const UnderlineTitle = ({ children }: { children: string }) => { + return ( + <h3 className="border-gray-30 text-body1-sb text-gray-70 inline-block w-fit border-b pb-1"> + {children} + </h3> + ); +}; + +export default UnderlineTitle;
DesignInfoTab.tsx및ReferenceTab.tsx에서는 기존 로컬 정의를 삭제하고 import로 대체합니다.🤖 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/widgets/designer/detail/ui/DesignInfoTab.tsx` around lines 35 - 41, Extract the duplicated UnderlineTitle component into the shared ui/UnderlineTitle.tsx module, preserving its current props, markup, and styling. Remove the local UnderlineTitle definitions from DesignInfoTab.tsx and ReferenceTab.tsx, and import the shared component in both files.src/widgets/designer/detail/config/commission.ts (1)
1-1: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win타입 정의 위치를 분리하는 것을 권장합니다.
commission.ts(설정 파일)가CommissionDetailSection.tsx(UI 컴포넌트)에서 타입을 가져옵니다. 설정→UI 의존 방향은 피하는 것이 좋으며,DesignerCommissionDetail타입을 별도 파일(예:types.ts)로 분리하면 의존성 방향이 개선됩니다.🤖 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/widgets/designer/detail/config/commission.ts` at line 1, Move the DesignerCommissionDetail type definition out of the UI component module and into a dedicated shared types module, then update commission.ts and CommissionDetailSection to import it from that module. Preserve the existing type shape while removing the configuration file’s dependency on the UI component.
🤖 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/app/designer/`(withSidebar)/detail/[commissionId]/page.tsx:
- Around line 24-26: Update the commission selection logic in the page component
so an unmatched commissionId does not fall back to designerDetailCommissions[0].
Preserve the matched commission path, and explicitly handle an undefined find
result with the page’s not-found behavior instead of rendering another
commission’s data.
---
Nitpick comments:
In `@src/app/designer/`(withSidebar)/submit/[commissionId]/page.tsx:
- Around line 56-71: Update the two Button className expressions in the submit
view to use cn from "`@/shared/lib/utils/cn`", extracting the shared "w-fit" class
and applying each conditional class through cn instead of duplicating it in
ternary strings. Preserve the existing conditional styling for isFileSubmitView.
In `@src/widgets/designer/detail/config/commission.ts`:
- Line 1: Move the DesignerCommissionDetail type definition out of the UI
component module and into a dedicated shared types module, then update
commission.ts and CommissionDetailSection to import it from that module.
Preserve the existing type shape while removing the configuration file’s
dependency on the UI component.
In `@src/widgets/designer/detail/ui/DesignInfoTab.tsx`:
- Around line 35-41: Extract the duplicated UnderlineTitle component into the
shared ui/UnderlineTitle.tsx module, preserving its current props, markup, and
styling. Remove the local UnderlineTitle definitions from DesignInfoTab.tsx and
ReferenceTab.tsx, and import the shared component in both files.
🪄 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: CHILL
Plan: Pro Plus
Run ID: 1e0751a8-58bb-4826-a338-2d1b59b77e96
📒 Files selected for processing (15)
src/app/designer/(withSidebar)/detail/[commissionId]/page.tsxsrc/app/designer/(withSidebar)/submit/[commissionId]/page.tsxsrc/features/designer/home/ui/DraftSubmissionScheduleRow.tsxsrc/features/designer/home/ui/PresentationWaitingRow.tsxsrc/features/designer/my/ui/PaymentHistoryRow.tsxsrc/features/designer/search/ui/MatchingWaitingRow.tsxsrc/widgets/designer/detail/config/commission.tssrc/widgets/designer/detail/index.tssrc/widgets/designer/detail/ui/BackToListButton.tsxsrc/widgets/designer/detail/ui/CommissionDetailSection.tsxsrc/widgets/designer/detail/ui/CommissionHeader.tsxsrc/widgets/designer/detail/ui/CommissionParticipationBar.tsxsrc/widgets/designer/detail/ui/DesignInfoTab.tsxsrc/widgets/designer/detail/ui/ReferenceTab.tsxsrc/widgets/designer/detail/ui/WorkRequestTab.tsx
| const commission = | ||
| designerDetailCommissions.find(item => String(item.id) === commissionId) ?? | ||
| designerDetailCommissions[0]; |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win
존재하지 않는 commissionId에 대한 silent fallback를 수정해주세요.
find() 결과가 없을 때 designerDetailCommissions[0]로 fallback하면, 잘못된 ID로 접근한 사용자에게 다른 커미션 데이터를 보여주게 됩니다. not-found 상태 처리를 권장합니다.
🛡️ 제안 수정: not-found 처리 추가
const commission =
- designerDetailCommissions.find(item => String(item.id) === commissionId) ??
- designerDetailCommissions[0];
+ designerDetailCommissions.find(item => String(item.id) === commissionId);
+
+ if (!commission) {
+ return <div>존재하지 않는 커미션입니다.</div>;
+ }📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| const commission = | |
| designerDetailCommissions.find(item => String(item.id) === commissionId) ?? | |
| designerDetailCommissions[0]; | |
| const commission = | |
| designerDetailCommissions.find(item => String(item.id) === commissionId); | |
| if (!commission) { | |
| return <div>존재하지 않는 커미션입니다.</div>; | |
| } |
🤖 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/app/designer/`(withSidebar)/detail/[commissionId]/page.tsx around lines
24 - 26, Update the commission selection logic in the page component so an
unmatched commissionId does not fall back to designerDetailCommissions[0].
Preserve the matched commission path, and explicitly handle an undefined find
result with the page’s not-found behavior instead of rendering another
commission’s data.
📢 PR 유형
어떤 변경 사항이 있었나요?
📌 관련 이슈번호
✅ Key Changes
📸 스크린샷 or 실행영상
2026-07-13.02.47.57.mov
2026-07-13.02.51.32.mov
2026-07-13.02.52.00.mov
🎸 기타 사항 or 추가 코멘트
Summary by CodeRabbit