feat: 대기 중 견적 목록·상세 UI 및 찜/캐시 정합 - #17
Conversation
내 견적 관리 pending 라우트와 mock 기반 상세를 추가하고, 찜·확정·견적 요청 시 React Query 캐시가 목록·상세와 맞게 갱신되도록 정리한다. Co-authored-by: Cursor <cursoragent@cursor.com>
Tablet 아바타를 100×100 둥근 네모로 맞추고, 기본 프로필 아이콘 원형 배경을 사각으로 변경한다. Co-authored-by: Cursor <cursoragent@cursor.com>
📝 WalkthroughWalkthrough대기 견적 목록·상세 페이지와 조회·확정 API, React Query 캐시 동기화, 즐겨찾기 인증 처리, 관련 UI·디자인 토큰 및 SVG 로더 설정이 추가·변경되었습니다. Changes대기 견적 데이터와 서비스
대기 견적 목록
대기 견적 상세
캐시와 인증
공통 UI와 빌드 설정
Estimated code review effort: 4 (Complex) | ~60 minutes Sequence Diagram(s)sequenceDiagram
participant PageClient as PendingEstimatesPageClient
participant QueryHook as useMyEstimateRequests
participant Service as fetchPendingEstimateSections
participant List as PendingEstimatesList
participant Card as PendingEstimateCard
PageClient->>QueryHook: 대기 견적 목록 조회
QueryHook->>Service: query 전달
Service-->>QueryHook: sections 반환
QueryHook-->>PageClient: 조회 상태와 sections 전달
PageClient->>List: sections 렌더링
List->>Card: offer 전달
Card->>Card: 확정 또는 즐겨찾기 처리
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: 5
🧹 Nitpick comments (9)
src/components/common/Button/Button.tsx (1)
18-35: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winCTA shadow와 min-width를 디자인 토큰으로 이동해 주세요.
min-w-[300px],min-w-[600px],shadow-[...rgba(...)]가 컴포넌트에 직접 하드코딩되어 있습니다. As per path instructions, 컴포넌트의 디자인 값은 프로젝트 토큰을 우선 사용해야 합니다. ``수정 예시
+ --shadow-button-cta: 4px 4px 10px 0 rgba(195, 217, 242, 0.2); - class: "px-24 py-16 shadow-[4px_4px_10px_0_rgba(195,217,242,0.2)]", + class: "px-24 py-16 shadow-button-cta",min-width도 동일하게 명명된 토큰으로 분리해 주세요.
🤖 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/common/Button/Button.tsx` around lines 18 - 35, Update the Button variant definitions and the outline/cta compound variant to replace the hardcoded min-width values and CTA shadow with the project’s existing design tokens. Define or reuse clearly named tokens for the sm/md min-widths and CTA shadow, while preserving the current sizing and visual behavior.Source: Path instructions
src/types/estimate.ts (1)
165-170: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win
PendingEstimateDetailViewModel이EstimateDetail과 완전 동일 — 주석의 "분리" 설명과 불일치주석은 대기 견적 상세 UI ViewModel이며 기존
EstimateDetailAPI DTO와 분리한다고 되어 있지만, 실제로는export type PendingEstimateDetailViewModel = EstimateDetail;로 완전히 같은 타입입니다.EstimateDetail이 나중에 변경되면 대기 견적 ViewModel도 그대로 영향을 받아, 문서상 의도(분리)와 다르게 강하게 결합되어 있습니다. 실제 필드를 명시한 별도 interface로 정의하거나, 주석을 사실에 맞게 고쳐주세요.🤖 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/types/estimate.ts` around lines 165 - 170, Resolve the mismatch between the PendingEstimateDetailViewModel declaration and its documentation: either define PendingEstimateDetailViewModel as an explicit interface containing the intended fields independently of EstimateDetail, or revise the comment to accurately state that it is an alias. Prefer the explicit interface when the ViewModel is intended to remain decoupled from the EstimateDetail API DTO.src/lib/mocks/myEstimateRequests.mock.ts (1)
205-209: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win확정 불가 안내 문구가 두 파일에 동일하게 하드코딩됨
"이미 확정된 견적이 있어 추가로 확정할 수 없습니다."라는 문구가 mock의confirmDisabledReason계산과 UI의 fallback 로직에 각각 독립적으로 하드코딩되어 있습니다. 근본 원인은 공유 상수가 없다는 점이며, 문구를 바꿀 때 한쪽만 수정하면 서버 값과 UI fallback이 어긋나 사용자에게 잘못된 비활성 이유가 노출될 수 있습니다.
src/lib/mocks/myEstimateRequests.mock.ts#L205-L209: 이 문구를 공유 상수(예:src/lib/constants)로 추출해 재사용하세요.src/components/estimate/pending/PendingEstimateDetailActions.tsx#L52-L55: 로컬 하드코딩 fallback을 제거하고, 위에서 추출한 공유 상수를 참조하거나 서버가 내려주는confirmDisabledReason값만 신뢰하도록 단순화하세요.♻️ 제안 diff
+// src/lib/constants/estimateMessages.ts +export const ALREADY_CONFIRMED_REASON = + "이미 확정된 견적이 있어 추가로 확정할 수 없습니다.";const confirmDisabledReason = canConfirm ? null : isConfirmed ? null - : "이미 확정된 견적이 있어 추가로 확정할 수 없습니다."; + : ALREADY_CONFIRMED_REASON;const disabled = !canConfirm || isConfirming; - const reason = - confirmDisabledReason ?? - (!canConfirm ? "이미 확정된 견적이 있어 추가로 확정할 수 없습니다." : null); + const reason = confirmDisabledReason;🤖 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/lib/mocks/myEstimateRequests.mock.ts` around lines 205 - 209, Extract the duplicated confirmation-disabled message into a shared constant and use it in the confirmDisabledReason calculation in src/lib/mocks/myEstimateRequests.mock.ts (lines 205-209). Replace the local fallback in src/components/estimate/pending/PendingEstimateDetailActions.tsx (lines 52-55) with the same shared constant, or simplify it to trust the server-provided confirmDisabledReason.Source: Coding guidelines
src/components/estimate/received/MoveTypeChip.tsx (2)
7-59: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winsize variant를 cva로 통합 권장.
MoveTypeChip/DesignatedChip모두size에 따라 className과Textvariant를 분기하는 동일한 패턴을 개별 ternary로 반복하고 있습니다. 프로젝트 규칙상 variant가 여러 개인 컴포넌트는cva를 사용해야 하며Text.tsx가 참고 사례로 지정되어 있습니다.cva로 전환하면 두 컴포넌트의 sm/md 분기를 일관되게 관리할 수 있습니다.♻️ cva 전환 예시
const chipVariants = cva("flex items-center justify-center shadow-chip", { variants: { size: { sm: "rounded-4 gap-2 py-2 pr-7 pl-4", md: "rounded-6 gap-4 py-4 pr-8 pl-6", }, }, defaultVariants: { size: "md" }, });🤖 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` around lines 7 - 59, Replace the duplicated size-based className ternaries in MoveTypeChip and DesignatedChip with a shared cva variant definition, using sm and md entries and md as the default. Reuse that variant for both chip containers while preserving each component’s existing icon, text color, and size-dependent Text variant behavior.Source: Path instructions
23-24: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winshadow 값이 디자인 토큰 없이 rgba로 하드코딩됨. (
PendingEstimateCard.tsx와 동일 근본 원인 — 아래 consolidated 참고)Also applies to: 48-49
🤖 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` around lines 23 - 24, MoveTypeChip의 클래스 조합에서 하드코딩된 rgba 기반 shadow 값을 제거하고 프로젝트의 기존 디자인 토큰 shadow를 사용하도록 변경하세요. isSm 분기와 나머지 레이아웃 클래스는 유지하며, PendingEstimateCard.tsx에서 사용하는 동일한 shadow 토큰을 재사용하세요.Source: Path instructions
src/components/estimate/pending/PendingEstimateCard.tsx (1)
58-63: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winshadow 값이 디자인 토큰 없이 rgba로 하드코딩됨.
tokens.theme.css에 이번 PR에서 추가된 토큰 목록에는 shadow가 없고, 이 컴포넌트에서shadow-[-2px_-2px_10px_0_rgba(220,220,220,0.2),...]처럼 임의 값을 직접 사용하고 있습니다.MoveTypeChip.tsx에도 동일한 패턴이 반복되므로, 카드/칩 공용 shadow 토큰을tokens.theme.css에 추가하고 참조하는 방식을 권장합니다.🤖 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/pending/PendingEstimateCard.tsx` around lines 58 - 63, Replace the hardcoded shadow values in the PendingEstimateCard article and the matching MoveTypeChip shadow usage with a shared design-token class. Add the common card/chip shadow token to tokens.theme.css, then reference that token from both components instead of inline rgba values.Source: Path instructions
src/hooks/usePendingEstimateDetail.ts (1)
38-44: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winstable-callback-ref 보일러플레이트 중복.
onSuccessRef/onErrorRef를 최신 값으로 유지하는useRef+useEffect패턴이 이 파일 내 두 훅에서 반복되고,useFavoriteMover.ts에도 동일 패턴이 있습니다(아래 consolidated 참고). 공용useLatestCallbacks같은 내부 훅으로 추출을 권장합니다.Also applies to: 75-81
🤖 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/usePendingEstimateDetail.ts` around lines 38 - 44, Extract the repeated onSuccessRef/onErrorRef useRef and useEffect logic from the hooks in usePendingEstimateDetail.ts into a shared internal useLatestCallbacks hook, and reuse it in both locations. Also replace the equivalent callback-ref boilerplate in useFavoriteMover.ts with this helper while preserving the latest callback behavior.Source: Path instructions
src/hooks/useFavoriteMover.ts (1)
64-69: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winstable-callback-ref 보일러플레이트 중복. (
usePendingEstimateDetail.ts와 동일 근본 원인 — 아래 consolidated 참고)🤖 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/useFavoriteMover.ts` around lines 64 - 69, Replace the manual onErrorRef useRef/useEffect synchronization in the favorite-mover hook with the shared stable-callback-ref utility already used for this pattern, matching usePendingEstimateDetail. Preserve the behavior of always invoking the latest options.onError callback while removing the duplicated ref-update boilerplate.Source: Path instructions
src/app/estimates/pending/page.tsx (1)
1-5: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win페이지 전용 metadata를 추가하거나 공통 설정을 확인해 주세요.
이 route는 Server Component이므로
metadata를 export할 수 있지만 현재 페이지 제목·설정이 없습니다. 공통 layout에서 이 페이지의 metadata를 명시적으로 제공하지 않는다면대기 중인 견적에 맞는 metadata를 추가해 주세요.As per path instructions: App Router 페이지는 페이지별
metadataexport 설정 여부를 확인해야 합니다.🤖 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 - 5, PendingEstimatesPage에 페이지별 metadata export가 있는지 확인하고, 공통 layout에서 제공하지 않는 경우 `대기 중인 견적`에 맞는 title metadata를 추가하세요. 기존 PendingEstimatesPageClient 렌더링은 유지하세요.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 `@next.config.ts`:
- Around line 26-35: Update the svgoConfig.plugins configuration in
next.config.ts so preset-default remains enabled, and restrict
convertColors.currentColor to icons explicitly intended to inherit currentColor
rather than applying it globally. Preserve fixed-color assets such as
ProfileDefaultIcon and their original color combinations.
In `@src/components/common/Button/Button.tsx`:
- Around line 18-23: Resolve a null size before passing variants to
buttonVariants so the default size classes are applied. Update the Button
component’s buttonVariants invocation to pass size: resolvedSize instead of the
raw size value, preserving the existing size mappings and other variant props.
In `@src/components/estimate/detail/EstimateDetailHero.tsx`:
- Around line 18-19: Update the arbitrary Tailwind position classes on
HeroDecorationRightIcon, HeroDecorationLeftIcon, and the related avatar
positioning to use underscores for spaces around calc() operators, including the
nested max() expression, so Tailwind generates valid CSS while preserving the
existing coordinates.
In `@src/components/estimate/pending/PendingEstimateRequestHeader.tsx`:
- Line 20: Replace the arbitrary shadow utility on the
PendingEstimateRequestHeader component with the project’s existing semantic
shadow token and its corresponding Tailwind utility. If no suitable token
exists, define one in tokens.theme.css first, then reference it from the
component; preserve the current layout and other classes.
In `@src/lib/utils/estimateFormat.ts`:
- Around line 53-55: Update formatKoreanDateLong to format createdAt values in
the Asia/Seoul timezone rather than the browser’s local timezone. Use the
existing date-formatting approach or normalize to a date-only value before
extracting the year, month, and day, while preserving the current Korean output
format.
---
Nitpick comments:
In `@src/app/estimates/pending/page.tsx`:
- Around line 1-5: PendingEstimatesPage에 페이지별 metadata export가 있는지 확인하고, 공통
layout에서 제공하지 않는 경우 `대기 중인 견적`에 맞는 title metadata를 추가하세요. 기존
PendingEstimatesPageClient 렌더링은 유지하세요.
In `@src/components/common/Button/Button.tsx`:
- Around line 18-35: Update the Button variant definitions and the outline/cta
compound variant to replace the hardcoded min-width values and CTA shadow with
the project’s existing design tokens. Define or reuse clearly named tokens for
the sm/md min-widths and CTA shadow, while preserving the current sizing and
visual behavior.
In `@src/components/estimate/pending/PendingEstimateCard.tsx`:
- Around line 58-63: Replace the hardcoded shadow values in the
PendingEstimateCard article and the matching MoveTypeChip shadow usage with a
shared design-token class. Add the common card/chip shadow token to
tokens.theme.css, then reference that token from both components instead of
inline rgba values.
In `@src/components/estimate/received/MoveTypeChip.tsx`:
- Around line 7-59: Replace the duplicated size-based className ternaries in
MoveTypeChip and DesignatedChip with a shared cva variant definition, using sm
and md entries and md as the default. Reuse that variant for both chip
containers while preserving each component’s existing icon, text color, and
size-dependent Text variant behavior.
- Around line 23-24: MoveTypeChip의 클래스 조합에서 하드코딩된 rgba 기반 shadow 값을 제거하고 프로젝트의
기존 디자인 토큰 shadow를 사용하도록 변경하세요. isSm 분기와 나머지 레이아웃 클래스는 유지하며,
PendingEstimateCard.tsx에서 사용하는 동일한 shadow 토큰을 재사용하세요.
In `@src/hooks/useFavoriteMover.ts`:
- Around line 64-69: Replace the manual onErrorRef useRef/useEffect
synchronization in the favorite-mover hook with the shared stable-callback-ref
utility already used for this pattern, matching usePendingEstimateDetail.
Preserve the behavior of always invoking the latest options.onError callback
while removing the duplicated ref-update boilerplate.
In `@src/hooks/usePendingEstimateDetail.ts`:
- Around line 38-44: Extract the repeated onSuccessRef/onErrorRef useRef and
useEffect logic from the hooks in usePendingEstimateDetail.ts into a shared
internal useLatestCallbacks hook, and reuse it in both locations. Also replace
the equivalent callback-ref boilerplate in useFavoriteMover.ts with this helper
while preserving the latest callback behavior.
In `@src/lib/mocks/myEstimateRequests.mock.ts`:
- Around line 205-209: Extract the duplicated confirmation-disabled message into
a shared constant and use it in the confirmDisabledReason calculation in
src/lib/mocks/myEstimateRequests.mock.ts (lines 205-209). Replace the local
fallback in src/components/estimate/pending/PendingEstimateDetailActions.tsx
(lines 52-55) with the same shared constant, or simplify it to trust the
server-provided confirmDisabledReason.
In `@src/types/estimate.ts`:
- Around line 165-170: Resolve the mismatch between the
PendingEstimateDetailViewModel declaration and its documentation: either define
PendingEstimateDetailViewModel as an explicit interface containing the intended
fields independently of EstimateDetail, or revise the comment to accurately
state that it is an alias. Prefer the explicit interface when the ViewModel is
intended to remain decoupled from the EstimateDetail API DTO.
🪄 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: 03d57df6-2ca4-4c45-b5df-2381eaf86d4b
⛔ Files ignored due to path filters (2)
public/images/empty-moving-car.pngis excluded by!**/*.pngsrc/icons/profile-default.svgis excluded by!**/*.svg
📒 Files selected for processing (42)
.coderabbit.yamlnext.config.tssrc/app/estimates/pending/[estimateId]/page.tsxsrc/app/estimates/pending/page.tsxsrc/components/common/Button/Button.tsxsrc/components/common/Header/Header.tsxsrc/components/estimate/EstimateRequestForm.tsxsrc/components/estimate/EstimatesShell.tsxsrc/components/estimate/detail/EstimateDetailDriverSummary.tsxsrc/components/estimate/detail/EstimateDetailHero.tsxsrc/components/estimate/detail/EstimateDetailInfo.tsxsrc/components/estimate/detail/EstimateDetailPrice.tsxsrc/components/estimate/detail/EstimateDetailShare.tsxsrc/components/estimate/pending/PendingEstimateCard.tsxsrc/components/estimate/pending/PendingEstimateDetailActions.tsxsrc/components/estimate/pending/PendingEstimateDetailView.tsxsrc/components/estimate/pending/PendingEstimateRequestHeader.tsxsrc/components/estimate/pending/PendingEstimatesEmpty.tsxsrc/components/estimate/pending/PendingEstimatesList.tsxsrc/components/estimate/pending/PendingEstimatesPageClient.tsxsrc/components/estimate/received/MoveTypeChip.tsxsrc/hooks/useFavoriteMover.tssrc/hooks/useMyEstimateRequests.tssrc/hooks/usePendingEstimateDetail.tssrc/icons/hero-decoration-left.tsxsrc/icons/hero-decoration-right.tsxsrc/icons/index.tssrc/lib/api/axiosInstance.tssrc/lib/api/estimateRequest.tssrc/lib/api/myEstimateRequests.tssrc/lib/auth/session.tssrc/lib/constants/apiRoutes.tssrc/lib/constants/appRoutes.tssrc/lib/constants/queryKeys.tssrc/lib/mocks/myEstimateRequests.mock.tssrc/lib/mocks/pagination.tssrc/lib/utils/estimateFormat.tssrc/providers/QueryProvider.tsxsrc/styles/tokens.theme.csssrc/types/estimate.tssrc/types/pagination.tssvgr.config.ts
💤 Files with no reviewable changes (2)
- svgr.config.ts
- src/providers/QueryProvider.tsx
svgr preset-default와 webpack 동일 적용, button null 처리, hero calc/kst 날짜/shadow 토큰/a11y alt를 정리한다. Co-authored-by: Cursor <cursoragent@cursor.com>
There was a problem hiding this comment.
사실 useFavoriteMover은 찜 api를 구현한 제가 해야할 일인데 제가 진도가 느린 탓에.. 미리 해주셔서 감사합니다. 그 외에도 여러 공통 작업을 해주셔서 작업이 수월하네요. 늘 감사드립니다!
useFavoriteMover은 관련 캐시의 찜 상태를 함께 바꾸고, 실패 시 여러 캐시를 함께 복구하는 점, 비로그인 상태에서는 API와 낙관적 업데이트를 실행하지 않는 점, timeout을 cleanup하는 로직이 있는 점, 여러 파라미터의 상세/목록 캐시를 prefix로 처리하는 점 등 여러 케이스를 고려해 잘 설계되었다고 느껴졌습니다!
또한 컴포넌트에서도 <article>, <Link> 등 의미 있는 태그를 사용하신 점, 찜 버튼에 키보드 focus 스타일이 존재하는 점, 중복 요청이 가지 않도록 요청 중에는 찜 버튼에 disabled을 사용하신 등 잘 설계되었다고 느껴졌습니다!
개선하면 더 좋을 사항은 아래 인라인 코멘트로 남겨놨습니다!
찜은 nextIsFavorite와 count 가드, invalidate는 onSettled로 옮기고 카드/헤더 a11y·dl/header 시맨틱을 정리한다. Co-authored-by: Cursor <cursoragent@cursor.com>
There was a problem hiding this comment.
🧹 Nitpick comments (1)
src/components/estimate/pending/PendingEstimateRequestHeader.tsx (1)
28-39: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win
Text에 반응형 variant를 추가해 이 헤더의 타이포그래피를 공통화해 주세요.
src/components/estimate/pending/PendingEstimateRequestHeader.tsx:32,39의md:text-[length:var(...)]/md:leading-[var(...)]는Text의 variant 체계를 우회합니다. 같은 패턴이 다른 estimate 화면에도 있어,Text에 반응형 variant를 넣고 여기서는variant만 쓰는 쪽이 좋습니다.🤖 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/pending/PendingEstimateRequestHeader.tsx` around lines 28 - 39, Update the Text component’s variant definitions to support the required responsive typography for this estimate header, then replace the md:text and md:leading utility classes on the title and subtitle Text elements in PendingEstimateRequestHeader with the appropriate responsive variant values. Keep the existing visual styles and use variants only for the responsive typography.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.
Nitpick comments:
In `@src/components/estimate/pending/PendingEstimateRequestHeader.tsx`:
- Around line 28-39: Update the Text component’s variant definitions to support
the required responsive typography for this estimate header, then replace the
md:text and md:leading utility classes on the title and subtitle Text elements
in PendingEstimateRequestHeader with the appropriate responsive variant values.
Keep the existing visual styles and use variants only for the responsive
typography.
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro Plus
Run ID: 3d19f0a8-4ad9-424c-8638-3d1acb9961a2
📒 Files selected for processing (6)
src/components/estimate/detail/EstimateDetailDriverSummary.tsxsrc/components/estimate/pending/PendingEstimateCard.tsxsrc/components/estimate/pending/PendingEstimateRequestHeader.tsxsrc/components/estimate/pending/PendingEstimatesList.tsxsrc/components/estimate/received/EstimateOfferCard.tsxsrc/hooks/useFavoriteMover.ts
🚧 Files skipped from review as they are similar to previous changes (3)
- src/components/estimate/pending/PendingEstimatesList.tsx
- src/components/estimate/pending/PendingEstimateCard.tsx
- src/hooks/useFavoriteMover.ts
📋 작업 내용
고객 견적 관리의 받은 견적·대기 중 견적 목록/상세 UI를 구현하고, 찜·확정·견적 요청 시 React Query 캐시가 화면과 맞게 갱신되도록 정리했습니다.
/estimates/pending,/estimates/pending/[estimateId](mock 기반)🔥 변경 사항
받은 견적
/estimates/received,/estimates/[estimateId]라우트 및 Desktop/Mobile UI/dev-login(개발 환경에서만)대기 중 견적
useConfirmPendingEstimate/ Detail)React Query / 인증
useFavoriteMover: received + pendingMY_LIST/PENDING_DETAIL낙관적 갱신·롤백·invalidateMY_LISTinvalidatehasAuthSession/getLoginRedirectPath로 로그인 경로 통일providers/QueryProvider.tsx제거✅ 체크리스트
📷 스크린샷 (선택)
🔗 관련 이슈
Closes #
💬 To Reviewer
Summary by CodeRabbit