From 6ae32875cb953181278255ed0178954d2f3b3a2b Mon Sep 17 00:00:00 2001 From: yoonsojung Date: Fri, 31 Jul 2026 16:15:08 +0900 Subject: [PATCH 1/8] refactor: axios->fetch --- src/lib/api/moverEstimateRequests.ts | 48 +++++++--------------------- 1 file changed, 12 insertions(+), 36 deletions(-) diff --git a/src/lib/api/moverEstimateRequests.ts b/src/lib/api/moverEstimateRequests.ts index d608588b..454ec9d3 100644 --- a/src/lib/api/moverEstimateRequests.ts +++ b/src/lib/api/moverEstimateRequests.ts @@ -1,15 +1,15 @@ import type { MoverEstimateRequestQuery, - MoverEstimateRequestResponse, + MoverEstimateRequestResult, RejectEstimateRequest, - RejectEstimateResponse, - RejectedEstimateRequestListResponse, + RejectedEstimate, + RejectedEstimateRequestListResult, SendEstimateRequest, - SendEstimateResponse, + SentEstimate, } from "@/types/moverEstimateRequest"; -import { API_ROUTES } from "../constants/apiRoutes"; -import axiosInstance from "./axiosInstance"; +import fetchInstance from "@/lib/api/fetchInstance"; +import { API_ROUTES } from "@/lib/constants/apiRoutes"; // 기사 견적 요청 목록 조회 // GET /api/estimates/requests @@ -34,45 +34,27 @@ export async function getMoverEstimateRequests(query: MoverEstimateRequestQuery) //이사 유형 필터 query.moveType?.forEach((moveType) => params.append("moveType", moveType)); - const response = await axiosInstance.get( + return fetchInstance.get( `${API_ROUTES.ESTIMATES.REQUESTS}?${params.toString()}`, ); - - if (!response.data.success) { - throw new Error(response.data.error.code); - } - - return response.data.data; } // 기사가 고객의 견적 요청에 견적 전송 // POST /api/estimates/requests/:estimateRequestId -export async function sendMoverEstimate(estimateRequestId: number, input: SendEstimateRequest) { - const response = await axiosInstance.post( +export function sendMoverEstimate(estimateRequestId: number, input: SendEstimateRequest) { + return fetchInstance.post( API_ROUTES.ESTIMATES.SEND(estimateRequestId), input, ); - - if (!response.data.success) { - throw new Error(response.data.error.message); - } - - return response.data.data; } // 기사 견적 반려 // POST /api/estimates/requests/:id/reject -export async function rejectMoverEstimate(estimateRequestId: number, input: RejectEstimateRequest) { - const response = await axiosInstance.post( +export function rejectMoverEstimate(estimateRequestId: number, input: RejectEstimateRequest) { + return fetchInstance.post( API_ROUTES.ESTIMATES.REJECT(estimateRequestId), input, ); - - if (!response.data.success) { - throw new Error(response.data.error.message); - } - - return response.data.data; } //기사님 반려 내역 조회 @@ -81,13 +63,7 @@ export async function getRejectedEstimateRequests(cursor?: string, limit = 10) { const params = new URLSearchParams({ limit: String(limit) }); if (cursor) params.set("cursor", cursor); - const response = await axiosInstance.get( + return fetchInstance.get( `${API_ROUTES.ESTIMATES.REJECTIONS}?${params.toString()}`, ); - - if (!response.data.success) { - throw new Error(response.data.error.message); - } - - return response.data.data; } From b87a9c8ac195cda7643fa345ec530a4103dbf6ab Mon Sep 17 00:00:00 2001 From: yoonsojung Date: Fri, 31 Jul 2026 16:17:21 +0900 Subject: [PATCH 2/8] =?UTF-8?q?refactor:=20=EA=B3=B5=ED=86=B5=20=ED=9B=85?= =?UTF-8?q?=20=EC=82=AC=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/hooks/useMoverEstimateRequests.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/hooks/useMoverEstimateRequests.ts b/src/hooks/useMoverEstimateRequests.ts index cd38570c..e5b1e467 100644 --- a/src/hooks/useMoverEstimateRequests.ts +++ b/src/hooks/useMoverEstimateRequests.ts @@ -1,5 +1,7 @@ -import { useInfiniteQuery, useMutation, useQueryClient } from "@tanstack/react-query"; +import { useQueryClient } from "@tanstack/react-query"; +import { useApiInfiniteQuery } from "@/hooks/queries/useApiInfiniteQuery"; +import { useApiMutation } from "@/hooks/queries/useApiMutation"; import { getMoverEstimateRequests, getRejectedEstimateRequests, @@ -14,7 +16,7 @@ import type { } from "@/types/moverEstimateRequest"; export function useMoverEstimateRequests(query: MoverEstimateRequestQuery) { - return useInfiniteQuery({ + return useApiInfiniteQuery({ queryKey: [...QUERY_KEYS.ESTIMATES.ALL, query], queryFn: ({ pageParam }) => getMoverEstimateRequests({ ...query, cursor: pageParam }), initialPageParam: undefined as string | undefined, @@ -24,7 +26,7 @@ export function useMoverEstimateRequests(query: MoverEstimateRequestQuery) { //견적 반려 조회 export function useRejectedEstimateRequests() { - return useInfiniteQuery({ + return useApiInfiniteQuery({ queryKey: QUERY_KEYS.ESTIMATES.REJECTED, queryFn: ({ pageParam }) => getRejectedEstimateRequests(pageParam), initialPageParam: undefined as string | undefined, @@ -41,7 +43,7 @@ type SendMoverEstimateVariables = { export function useSendMoverEstimate() { const queryClient = useQueryClient(); - return useMutation({ + return useApiMutation({ mutationFn: ({ estimateRequestId, input }: SendMoverEstimateVariables) => sendMoverEstimate(estimateRequestId, input), @@ -61,7 +63,7 @@ type RejectMoverEstimateVariables = { export function useRejectMoverEstimate() { const queryClient = useQueryClient(); - return useMutation({ + return useApiMutation({ mutationFn: ({ estimateRequestId, input }: RejectMoverEstimateVariables) => rejectMoverEstimate(estimateRequestId, input), onSuccess: async () => { From 84480e8cf81e3af2ef979d8290b16daf50672b4f Mon Sep 17 00:00:00 2001 From: yoonsojung Date: Fri, 31 Jul 2026 16:38:21 +0900 Subject: [PATCH 3/8] =?UTF-8?q?refactor:=20=EA=B8=B0=EC=82=AC=20=EA=B2=AC?= =?UTF-8?q?=EC=A0=81=20API=20=EC=9D=91=EB=8B=B5=20=ED=83=80=EC=9E=85=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/types/moverEstimateRequest.ts | 79 ++++++------------------------- 1 file changed, 15 insertions(+), 64 deletions(-) diff --git a/src/types/moverEstimateRequest.ts b/src/types/moverEstimateRequest.ts index cdf82f4f..86c69dd3 100644 --- a/src/types/moverEstimateRequest.ts +++ b/src/types/moverEstimateRequest.ts @@ -28,25 +28,14 @@ export type MoverEstimateRequestQuery = { limit: number; }; -export type MoverEstimateRequestResponse = - | { - success: true; - data: { - items: MoverEstimateRequest[]; - pagination: { - nextCursor: string | null; - hasNextPage: boolean; - totalCount: number; - }; - }; - } - | { - success: false; - error: { - code: string; - message: string; - }; - }; +export type MoverEstimateRequestResult = { + items: MoverEstimateRequest[]; + pagination: { + nextCursor: string | null; + hasNextPage: boolean; + totalCount: number; + }; +}; // 기사 견적 전송 요청 Body export type SendEstimateRequest = { @@ -70,20 +59,6 @@ export type SentEstimate = { createdAt: string; }; -// 기사 견적 전송 API 응답 -export type SendEstimateResponse = - | { - success: true; - data: SentEstimate; - } - | { - success: false; - error: { - code: string; - message: string; - }; - }; - export type RejectedEstimate = { id: number; estimateRequestId: number; @@ -92,19 +67,6 @@ export type RejectedEstimate = { createdAt: string; }; -export type RejectEstimateResponse = - | { - success: true; - data: RejectedEstimate; - } - | { - success: false; - error: { - code: string; - message: string; - }; - }; - //기사 견적 반려 조회 export type RejectedEstimateRequestItem = { id: number; @@ -126,21 +88,10 @@ export type RejectedEstimateRequestItem = { }; }; -export type RejectedEstimateRequestListResponse = - | { - success: true; - data: { - items: RejectedEstimateRequestItem[]; - pagination: { - nextCursor: string | null; - hasNextPage: boolean; - }; - }; - } - | { - success: false; - error: { - code: string; - message: string; - }; - }; +export type RejectedEstimateRequestListResult = { + items: RejectedEstimateRequestItem[]; + pagination: { + nextCursor: string | null; + hasNextPage: boolean; + }; +}; From 8dd49faa81c2e3e9d1f91839c92ee69ed5714e1c Mon Sep 17 00:00:00 2001 From: yoonsojung Date: Fri, 31 Jul 2026 18:47:53 +0900 Subject: [PATCH 4/8] =?UTF-8?q?refactor:=20=EB=B0=9B=EC=9D=80=20=EC=9A=94?= =?UTF-8?q?=EC=B2=AD=20h1=ED=83=9C=EA=B7=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/ReceivedRequestsPage.tsx | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/components/estimate/ReceivedRequestsPage.tsx b/src/components/estimate/ReceivedRequestsPage.tsx index 8018177b..11a39250 100644 --- a/src/components/estimate/ReceivedRequestsPage.tsx +++ b/src/components/estimate/ReceivedRequestsPage.tsx @@ -102,6 +102,12 @@ export default function ReceivedRequestsPage() { return ( <> +
+

+ 받은 요청 +

+
+
From cf5d599dafa5330c841875d2b3365e56ce1c44cb Mon Sep 17 00:00:00 2001 From: yoonsojung Date: Sat, 1 Aug 2026 10:26:39 +0900 Subject: [PATCH 5/8] =?UTF-8?q?refactor:=20=EB=82=A0=EC=A7=9C=20=ED=8F=AC?= =?UTF-8?q?=EB=A7=B7=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../estimate/sent/SentEstimateCard.tsx | 35 +++++++++++++------ 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/src/components/estimate/sent/SentEstimateCard.tsx b/src/components/estimate/sent/SentEstimateCard.tsx index 17719c2d..9dcbab0d 100644 --- a/src/components/estimate/sent/SentEstimateCard.tsx +++ b/src/components/estimate/sent/SentEstimateCard.tsx @@ -30,25 +30,32 @@ function RouteArrow() { ); } +function formatMoveDate(date: string): string { + return formatKoreanDateTime(date).replace( + /^(\d{4})\.\s*(\d{2})\.\s*(\d{2})\.\s*/, + "$1년 $2월 $3일 ", + ); +} + export default function SentEstimateCard({ estimate, onViewDetail }: SentEstimateCardProps) { const isConfirmed = estimate.status !== "SENT"; const isCompleted = estimate.status === "COMPLETED"; return ( -
-
+
+
- + {estimate.isDesignated ? ( <> - - + + ) : null}
@@ -68,7 +75,7 @@ export default function SentEstimateCard({ estimate, onViewDetail }: SentEstimat
-
+
@@ -94,17 +101,23 @@ export default function SentEstimateCard({ estimate, onViewDetail }: SentEstimat 이사일 - {formatKoreanDateTime(estimate.moveDate)} + {formatMoveDate(estimate.moveDate)}
-
- +
+ 견적 금액 - + {estimate.price.toLocaleString("ko-KR")}원
From 09e7f1dc4b5b7e1d5b42abe55ff65a3a074472e4 Mon Sep 17 00:00:00 2001 From: yoonsojung Date: Sat, 1 Aug 2026 10:28:03 +0900 Subject: [PATCH 6/8] =?UTF-8?q?refactor:=20=EB=B0=98=EC=9D=91=ED=98=95=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/sent/SentEstimatesPage.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/estimate/sent/SentEstimatesPage.tsx b/src/components/estimate/sent/SentEstimatesPage.tsx index 98a3be7f..c60c4620 100644 --- a/src/components/estimate/sent/SentEstimatesPage.tsx +++ b/src/components/estimate/sent/SentEstimatesPage.tsx @@ -34,7 +34,7 @@ export default function SentEstimatesPage() { return ( <> -
+

보낸 견적 조회

{query.isPending ? : null} @@ -52,9 +52,9 @@ export default function SentEstimatesPage() { ) : null} {estimates.length > 0 ? ( -
+
{estimates.map((estimate) => ( -
+
Date: Sat, 1 Aug 2026 10:31:05 +0900 Subject: [PATCH 7/8] =?UTF-8?q?refactor:=20=EC=83=81=EC=84=B8=20=ED=8E=98?= =?UTF-8?q?=EC=9D=B4=EC=A7=80=EC=97=90=EC=84=9C=20=EA=B2=AC=EC=A0=81=20?= =?UTF-8?q?=EA=B3=B5=EC=9C=A0=ED=95=98=EA=B8=B0=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/estimate/sent/SentEstimateDetailPage.tsx | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/components/estimate/sent/SentEstimateDetailPage.tsx b/src/components/estimate/sent/SentEstimateDetailPage.tsx index 0b39f147..0c190c9f 100644 --- a/src/components/estimate/sent/SentEstimateDetailPage.tsx +++ b/src/components/estimate/sent/SentEstimateDetailPage.tsx @@ -6,7 +6,6 @@ import EstimateDetailLayout, { } from "@/components/estimate/detail/EstimateDetailLayout"; import { EstimateDetailInfoSection } from "@/components/estimate/detail/EstimateDetailInfoSection"; import EstimateDetailPrice from "@/components/estimate/detail/EstimateDetailPrice"; -import EstimateDetailShare from "@/components/estimate/detail/EstimateDetailShare"; import { DesignatedChip, MoveTypeChip } from "@/components/estimate/received/MoveTypeChip"; import { useSentEstimateDetail } from "@/hooks/useSentEstimates"; import FrameIcon from "@/icons/frame.svg"; @@ -97,7 +96,6 @@ export default function SentEstimateDetailPage({ estimateId }: SentEstimateDetai contentClassName="pt-35 pb-64 md:pt-[46px] md:pb-80 lg:pt-[43px] lg:pb-37-5" rowClassName="gap-20 md:gap-32 lg:gap-0" mainClassName="gap-20 md:gap-30 lg:w-185" - asideClassName="border-border-subtle gap-12 border-t pt-20 md:gap-22 md:pt-32 lg:w-xs lg:border-t-0 lg:pt-0" main={ <>
@@ -122,7 +120,6 @@ export default function SentEstimateDetailPage({ estimateId }: SentEstimateDetai /> } - aside={} /> ); } From 12bf5112d39eca32fb31375834cae77bc09df44a Mon Sep 17 00:00:00 2001 From: yoonsojung Date: Sat, 1 Aug 2026 11:29:09 +0900 Subject: [PATCH 8/8] =?UTF-8?q?feat:=20=EA=B8=B0=EC=82=AC=EB=8B=98=20?= =?UTF-8?q?=EC=BD=94=EB=A9=98=ED=8A=B8=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../estimate/sent/SentEstimateDetailPage.tsx | 61 ++++++++++++++----- 1 file changed, 46 insertions(+), 15 deletions(-) diff --git a/src/components/estimate/sent/SentEstimateDetailPage.tsx b/src/components/estimate/sent/SentEstimateDetailPage.tsx index 0c190c9f..54b66a52 100644 --- a/src/components/estimate/sent/SentEstimateDetailPage.tsx +++ b/src/components/estimate/sent/SentEstimateDetailPage.tsx @@ -69,6 +69,32 @@ function SentEstimateSummary({ estimate }: { estimate: SentEstimate }) { ); } +function SentEstimateComment({ comment }: { comment: string }) { + return ( +
+

+ + 기사님 코멘트 + + + 기사님 코멘트 + +

+ + + {comment} + +
+ ); +} + export default function SentEstimateDetailPage({ estimateId }: SentEstimateDetailPageProps) { const query = useSentEstimateDetail(estimateId); @@ -103,21 +129,26 @@ export default function SentEstimateDetailPage({ estimateId }: SentEstimateDetai
- +
+ + + + } />