feat: 받은 견적 기능 구현 - #15
Conversation
|
Note Reviews pausedIt 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 Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthrough개발 인증과 견적 API를 연동하고, 받은 견적 목록·필터·찜 기능 및 견적 상세 조회·확정·공유 화면을 구현했습니다. 견적 라우트 레이아웃, 탭 네비게이션, 관련 타입·아이콘·스타일 토큰도 추가되었습니다. Changes견적 계약과 개발 인증 기반
받은 견적 조회와 목록 UI
견적 상세 조회와 확정
견적 라우트와 공통 레이아웃
공통 UI와 포맷팅
Estimated code review effort: 4 (Complex) | ~60 minutes Possibly related PRs
Suggested labels: Suggested reviewers: 🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 7
🧹 Nitpick comments (5)
src/app/dev-login/page.tsx (1)
1-25: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win페이지를 Server Component 래퍼와 클라이언트 폼으로 분리하세요.
현재
"use client"때문에 이 라우트에서metadata를 export할 수 없고 전체 페이지가 클라이언트 번들로 내려갑니다.page.tsx는 서버 래퍼로 두고, 폼만 별도 Client Component로 옮겨noindex메타데이터를 설정하세요.As per path instructions, 페이지별 메타데이터를 설정하고
"use client"는 가능한 말단 컴포넌트에만 두어야 합니다.🤖 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/dev-login/page.tsx` around lines 1 - 25, Split DevLoginPage into a server-side page wrapper and a separate client form component, moving the current state, router, event, and login logic into the form component with the "use client" directive. Remove "use client" from page.tsx, export page-level noindex metadata there, and keep the existing development login behavior unchanged.Source: Path instructions
src/components/estimate/detail/EstimateDetailShare.tsx (1)
10-30: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low valueKakao/Facebook 아이콘을 공통 아이콘으로 분리하세요.
src/icons/index.ts에는 아직 없어서, 이 컴포넌트에서 재사용할 예정이면 SVG를 그쪽으로 옮겨 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/components/estimate/detail/EstimateDetailShare.tsx` around lines 10 - 30, Move the KakaoIcon and FacebookIcon SVG components from EstimateDetailShare into the shared src/icons/index.ts exports, then import and reuse those shared icons in EstimateDetailShare instead of defining local copies.Source: Path instructions
src/app/estimates/pending/page.tsx (1)
1-13: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win페이지별
metadataexport 누락.실제 콘텐츠를 렌더링하는 페이지인데
metadataexport가 없습니다. As per path instructions, "metadata export로 페이지별 메타데이터를 설정했는지 확인해 주세요."🤖 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/estimates/pending/page.tsx` around lines 1 - 13, PendingEstimatesPage 페이지에 metadata export를 추가해 페이지 제목 등 필요한 메타데이터를 설정하세요. 기존 Text 렌더링과 레이아웃은 유지하고, 프로젝트의 다른 페이지에서 사용하는 metadata 형식과 명명 규칙을 재사용하세요.Source: Path instructions
src/components/estimate/received/EstimateOfferCard.tsx (1)
69-82: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value반응형 분기용 Text 중복 렌더링.
동일 텍스트를
md:hidden/hidden md:blockvariant로 3곳에서 이중 렌더링하고 있습니다. 접근성 문제는 없지만(비표시 요소는display:none), DOM 중복과 유지보수 부담이 있습니다.Text가 반응형 variant를 지원하지 않는다면 지금 구조가 최선일 수 있으나, 반복되는 패턴이라면 헬퍼로 추출하는 것도 고려해 보세요.Also applies to: 105-118, 200-209
🤖 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/components/estimate/received/EstimateOfferCard.tsx` around lines 69 - 82, EstimateOfferCard에서 동일한 intro 텍스트를 md:hidden 및 hidden md:block Text로 반복 렌더링하는 패턴을 3곳에서 헬퍼로 추출해 중복을 제거하세요. Text가 반응형 variant를 직접 지원하지 않는 경우 헬퍼가 현재의 모바일/데스크톱 스타일과 표시 동작을 그대로 유지하도록 하며, 세 위치 모두 해당 헬퍼를 재사용하세요.src/components/estimate/received/MoveTypeChip.tsx (1)
16-16: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value공통 shadow 값 분리 두 칩에서 같은
shadow-[4px_4px_4px_0_rgba(217,217,217,0.1)]가 반복됩니다. 공통 토큰이나 유틸로 빼서 중복을 줄여 주세요.🤖 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/components/estimate/received/MoveTypeChip.tsx` at line 16, Move the duplicated shadow utility used by both chips into a shared design token or reusable utility, then reference that shared symbol from the chip class definitions instead of repeating shadow-[4px_4px_4px_0_rgba(217,217,217,0.1)].Source: Path instructions
🤖 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/dev-login/page.tsx`:
- Around line 97-101: Update the errorMessage rendering in the dev-login page to
expose asynchronously added login failures as an accessible live region. Add an
appropriate alert or aria-live attribute to the existing Text element while
preserving its current conditional rendering and styling.
In `@src/app/estimates/`[estimateId]/page.tsx:
- Around line 1-19: EstimateDetailPage에 페이지별 메타데이터를 제공하는 metadata export를 추가하세요.
기존 EstimateDetailPage의 라우트 동작과 EstimateDetailView 렌더링은 유지하고, 상세 견적 페이지에 적절한
title과 description을 설정하세요.
- Around line 12-16: Update the estimateId validation in the page component to
reject non-integer numeric IDs as well as non-finite and non-positive values.
Ensure values such as “1.5” are handled by notFound() and only positive integers
reach EstimateDetailView.
In `@src/app/estimates/received/page.tsx`:
- Around line 4-6: Export page metadata alongside ReceivedEstimatesPage,
defining the route’s page title and SEO-relevant fields while preserving the
existing server wrapper and its ReceivedEstimatesPageClient render.
In `@src/components/estimate/MyEstimateTabs.tsx`:
- Line 22: MyEstimateTabs의 탭 컨테이너에서 하드코딩된 shadow arbitrary value를 제거하세요. 프로젝트의
디자인 토큰 체계에 의미 있는 탭 그림자 토큰을 추가하고, 해당 className이 새 토큰 기반 shadow 유틸리티를 사용하도록 변경하세요.
In `@src/lib/dev-auth.ts`:
- Around line 58-64: Remove the client-accessible default password retrieval
from getDevLoginDefaultPassword in src/lib/dev-auth.ts, and update
src/app/dev-login/page.tsx to initialize the password useState value as an empty
string instead of calling it; keep the email default behavior unchanged.
In `@src/lib/utils/estimateFormat.ts`:
- Around line 15-38: formatMoveDateLabel에서 date-only 문자열을 new Date(value)로 파싱해
타임존에 따라 날짜가 전날로 바뀌는 문제를 수정하세요. 해당 함수의 문자열 처리만 별도 로직 또는 공용 파서로 분리해 YYYY-MM-DD 각
부분을 직접 해석하고 로컬 날짜로 구성하며, Date 입력 처리와 기존 출력 형식은 유지하세요.
---
Nitpick comments:
In `@src/app/dev-login/page.tsx`:
- Around line 1-25: Split DevLoginPage into a server-side page wrapper and a
separate client form component, moving the current state, router, event, and
login logic into the form component with the "use client" directive. Remove "use
client" from page.tsx, export page-level noindex metadata there, and keep the
existing development login behavior unchanged.
In `@src/app/estimates/pending/page.tsx`:
- Around line 1-13: PendingEstimatesPage 페이지에 metadata export를 추가해 페이지 제목 등 필요한
메타데이터를 설정하세요. 기존 Text 렌더링과 레이아웃은 유지하고, 프로젝트의 다른 페이지에서 사용하는 metadata 형식과 명명 규칙을
재사용하세요.
In `@src/components/estimate/detail/EstimateDetailShare.tsx`:
- Around line 10-30: Move the KakaoIcon and FacebookIcon SVG components from
EstimateDetailShare into the shared src/icons/index.ts exports, then import and
reuse those shared icons in EstimateDetailShare instead of defining local
copies.
In `@src/components/estimate/received/EstimateOfferCard.tsx`:
- Around line 69-82: EstimateOfferCard에서 동일한 intro 텍스트를 md:hidden 및 hidden
md:block Text로 반복 렌더링하는 패턴을 3곳에서 헬퍼로 추출해 중복을 제거하세요. Text가 반응형 variant를 직접 지원하지
않는 경우 헬퍼가 현재의 모바일/데스크톱 스타일과 표시 동작을 그대로 유지하도록 하며, 세 위치 모두 해당 헬퍼를 재사용하세요.
In `@src/components/estimate/received/MoveTypeChip.tsx`:
- Line 16: Move the duplicated shadow utility used by both chips into a shared
design token or reusable utility, then reference that shared symbol from the
chip class definitions instead of repeating
shadow-[4px_4px_4px_0_rgba(217,217,217,0.1)].
🪄 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: 228da132-1f61-40d4-940e-3051dcd6b471
⛔ Files ignored due to path filters (1)
src/icons/confirmed-estimate.svgis excluded by!**/*.svg
📒 Files selected for processing (49)
src/app/dev-login/page.tsxsrc/app/estimates/[estimateId]/page.tsxsrc/app/estimates/layout.tsxsrc/app/estimates/page.tsxsrc/app/estimates/pending/page.tsxsrc/app/estimates/received/page.tsxsrc/components/.gitkeepsrc/components/common/Footer/Footer.tsxsrc/components/common/Header/Header.tsxsrc/components/common/Select/SelectMain.tsxsrc/components/estimate/.gitkeepsrc/components/estimate/EstimatesShell.tsxsrc/components/estimate/MyEstimateTabs.tsxsrc/components/estimate/detail/EstimateDetailActions.tsxsrc/components/estimate/detail/EstimateDetailDriverSummary.tsxsrc/components/estimate/detail/EstimateDetailHeader.tsxsrc/components/estimate/detail/EstimateDetailHero.tsxsrc/components/estimate/detail/EstimateDetailInfo.tsxsrc/components/estimate/detail/EstimateDetailPrice.tsxsrc/components/estimate/detail/EstimateDetailShare.tsxsrc/components/estimate/detail/EstimateDetailView.tsxsrc/components/estimate/received/EstimateDetailPanel.tsxsrc/components/estimate/received/EstimateOfferCard.tsxsrc/components/estimate/received/EstimateOfferSection.tsxsrc/components/estimate/received/EstimateRequestSummary.tsxsrc/components/estimate/received/MoveTypeChip.tsxsrc/components/estimate/received/ReceivedEstimatesList.tsxsrc/components/estimate/received/ReceivedEstimatesPageClient.tsxsrc/components/estimate/received/ReceivedEstimatesStatus.tsxsrc/hooks/.gitkeepsrc/hooks/useEstimateDetail.tssrc/hooks/useFavoriteMover.tssrc/hooks/useReceivedEstimates.tssrc/icons/index.tssrc/icons/like.tsxsrc/lib/.gitkeepsrc/lib/api/axiosInstance.tssrc/lib/api/devLogin.tssrc/lib/api/favorites.tssrc/lib/api/getApiErrorMessage.tssrc/lib/api/receivedEstimates.tssrc/lib/constants/apiRoutes.tssrc/lib/constants/queryKeys.tssrc/lib/dev-auth.tssrc/lib/utils/estimateFormat.tssrc/styles/.gitkeepsrc/styles/tokens.theme.csssrc/types/.gitkeepsrc/types/estimate.ts
There was a problem hiding this comment.
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/lib/api/axiosInstance.ts`:
- Around line 73-75: Update the isDevAuthEnabled branch in the Axios request
configuration flow to read the token via getDevAccessToken() and inject it into
the Authorization header before returning config. Preserve the existing
immediate return behavior while ensuring tokens stored by the dev-login flow are
sent on protected API requests.
🪄 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: 9814072c-a17e-4d8e-9bb6-69f769cbb8af
📒 Files selected for processing (2)
src/lib/api/axiosInstance.tssrc/lib/constants/apiRoutes.ts
🚧 Files skipped from review as they are similar to previous changes (1)
- src/lib/constants/apiRoutes.ts
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
src/components/estimate/received/EstimateDetailPanel.tsx (1)
19-19: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win하드코딩된 그림자 색상을 토큰으로 교체하세요.
Line 19의
shadow-[...rgba(220,220,220,0.14)...]는 디자인 토큰 체계를 우회합니다. 정의된 shadow/color 토큰 조합으로 대체하세요.🤖 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/components/estimate/received/EstimateDetailPanel.tsx` at line 19, Replace the hardcoded rgba shadow value in the EstimateDetailPanel className with the existing design-system shadow/color token combination, preserving the current responsive shadow behavior and all other classes.Sources: Coding guidelines, Path instructions
🤖 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/lib/utils/date.ts`:
- Around line 32-33: Update the date parsing logic around the value split and
Date construction to validate the YYYY-MM-DD format with a regular expression,
then compare the constructed Date’s year, month, and day against the original
components. Throw a RangeError for malformed or calendar-invalid values such as
2026-02-30, while preserving valid date handling.
---
Nitpick comments:
In `@src/components/estimate/received/EstimateDetailPanel.tsx`:
- Line 19: Replace the hardcoded rgba shadow value in the EstimateDetailPanel
className with the existing design-system shadow/color token combination,
preserving the current responsive shadow behavior and all other classes.
🪄 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: 229a64f9-d264-4e16-b0ab-ee1effb75435
⛔ Files ignored due to path filters (1)
src/icons/document.svgis excluded by!**/*.svg
📒 Files selected for processing (15)
src/app/dev-login/page.tsxsrc/app/estimates/[estimateId]/page.tsxsrc/app/estimates/received/page.tsxsrc/components/estimate/detail/EstimateDetailShare.tsxsrc/components/estimate/detail/EstimateDetailView.tsxsrc/components/estimate/received/EstimateDetailPanel.tsxsrc/components/estimate/received/EstimateOfferSection.tsxsrc/components/estimate/received/MoveTypeChip.tsxsrc/hooks/useEstimateDetail.tssrc/lib/api/axiosInstance.tssrc/lib/api/fetchInstance.tssrc/lib/constants/apiRoutes.tssrc/lib/dev-auth.tssrc/lib/utils/date.tssrc/lib/utils/estimateFormat.ts
💤 Files with no reviewable changes (1)
- src/lib/constants/apiRoutes.ts
🚧 Files skipped from review as they are similar to previous changes (7)
- src/app/estimates/received/page.tsx
- src/components/estimate/received/MoveTypeChip.tsx
- src/app/estimates/[estimateId]/page.tsx
- src/hooks/useEstimateDetail.ts
- src/components/estimate/received/EstimateOfferSection.tsx
- src/components/estimate/detail/EstimateDetailView.tsx
- src/lib/utils/estimateFormat.ts
There was a problem hiding this comment.
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/lib/utils/date.ts`:
- Around line 62-68: Update the date construction logic in the surrounding
date-parsing function to handle years 0–99 without JavaScript’s automatic
1900–1999 adjustment, using setFullYear or explicitly rejecting that range.
Preserve the existing calendar-validity round-trip checks and returned Date
behavior for supported inputs.
- Around line 28-34: Align the moveDate input contract with date-only strings
expected by formatMoveDateLabel. Update API and mock data to use YYYY-MM-DD
values, or normalize ISO datetime strings before parseDateOnly receives them,
while preserving invalid-date validation.
🪄 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: 20c73c57-d1b0-4797-b7e9-66b28ed2e836
📒 Files selected for processing (6)
src/app/dev-login/page.tsxsrc/hooks/useEstimateDetail.tssrc/hooks/useFavoriteMover.tssrc/lib/api/axiosInstance.tssrc/lib/utils/date.tssrc/lib/utils/estimateFormat.ts
🚧 Files skipped from review as they are similar to previous changes (2)
- src/app/dev-login/page.tsx
- src/hooks/useFavoriteMover.ts
There was a problem hiding this comment.
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/lib/utils/date.ts`:
- Around line 13-26: Update the date formatting flow around parsed and
parseDateOnly so date-only inputs are formatted using local date semantics
without applying the Asia/Seoul timeZone; retain the Asia/Seoul formatter for
actual datetime inputs. Preserve the existing invalid-date validation and Korean
date formatting options.
🪄 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: 198f3090-8c03-4204-b073-397d63559d7b
📒 Files selected for processing (3)
src/lib/api/moverEstimateRequests.tssrc/lib/utils/date.tssrc/lib/utils/estimateFormat.ts
🚧 Files skipped from review as they are similar to previous changes (1)
- src/lib/utils/estimateFormat.ts
📋 작업 내용
받은 견적 기능을 구현했습니다.
🔥 변경 사항
✅ 체크리스트
📷 스크린샷 (선택)
🔗 관련 이슈
Closes #
💬 To Reviewer
받은 견적 목록, 상세 조회, 견적 확정 및 반응형 UI가 정상적으로 동작하는지 확인 부탁드립니다.
Summary by CodeRabbit
/estimates기본 리다이렉트를 적용했습니다.