From aeacaa4e7eef8f6eed61d34eba52821c52e15ed0 Mon Sep 17 00:00:00 2001 From: yjudy0531 Date: Thu, 13 Aug 2026 21:25:57 +0900 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20=EA=B1=B0=EB=9E=98=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=EC=B1=84=ED=8C=85=ED=95=98=EA=B8=B0=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=EC=9D=84=20=EA=B1=B0=EB=9E=98=20=EA=B8=B0=EC=A4=80=20?= =?UTF-8?q?=EC=B1=84=ED=8C=85=EB=B0=A9=20API=EB=A1=9C=20=EC=97=B0=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - room.ts에 createOrGetChatRoomByTrade(tradeId) 추가 - createOrGetChatRoom의 purchaseOfferId는 optional로 유지 - TradeDetailPage.tsx 채팅하기 버튼을 createOrGetChatRoomByTrade(trade.tradeId)로 연결 백엔드 PR #412(Tenure_BE) 머지·배포 후 실제 동작 확인 필요 Co-Authored-By: Claude Sonnet 5 --- src/features/chat/api/room.ts | 10 +++++----- src/pages/mypage/TradeDetailPage.tsx | 4 ++-- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/features/chat/api/room.ts b/src/features/chat/api/room.ts index 21dbfd4..ef1cf3e 100644 --- a/src/features/chat/api/room.ts +++ b/src/features/chat/api/room.ts @@ -4,12 +4,12 @@ import type { ChatProduct, ChatRole, SaleStatus, TradeStatus } from '../model/ty import type { ChatRoomDetailResponse, ProductStatus } from './dto'; // 채팅방 생성 또는 조회 (아이템 상세 페이지 채팅하기 버튼). -// 판매자가 받은 구매 제안 상세에서 열 땐 purchaseOfferId를 함께 보내 제안자↔소유자 방을 잡는다. export const createOrGetChatRoom = (itemId: number, purchaseOfferId?: number) => - api.post<{ chatRoomId: number }>('/chats', { - itemId, - ...(purchaseOfferId != null && { purchaseOfferId }), - }); + api.post<{ chatRoomId: number }>('/chats', { itemId, purchaseOfferId }); + +// 채팅방 생성 또는 조회 (거래 상세 페이지 채팅하기 버튼). +export const createOrGetChatRoomByTrade = (tradeId: number) => + api.post<{ chatRoomId: number }>(`/chats/trades/${tradeId}`); // 채팅방 상세 조회 (프로덕트 바 데이터) export const getChatRoom = (chatRoomId: number) => { diff --git a/src/pages/mypage/TradeDetailPage.tsx b/src/pages/mypage/TradeDetailPage.tsx index ba83116..44a761d 100644 --- a/src/pages/mypage/TradeDetailPage.tsx +++ b/src/pages/mypage/TradeDetailPage.tsx @@ -8,7 +8,7 @@ import { useTradeStatusChange } from '@/features/trade/api/useTradeStatusChange' import type { TradeStatus } from '@/features/trade/api/types'; import { buildTradeTimeline } from '@/features/trade/lib/buildTradeTimeline'; import { resolveImageUrl } from '@/shared/lib/resolveImageUrl'; -import { createOrGetChatRoom } from '@/features/chat/api/room'; +import { createOrGetChatRoomByTrade } from '@/features/chat/api/room'; const SectionTitle = ({ children }: { children: ReactNode }) => (

{children}

@@ -152,7 +152,7 @@ const TradeDetailPage = () => { if (isChatLoading) return; setIsChatLoading(true); try { - const { chatRoomId } = await createOrGetChatRoom(trade.itemId); + const { chatRoomId } = await createOrGetChatRoomByTrade(trade.tradeId); navigate(`/chat/${chatRoomId}`); } finally { setIsChatLoading(false); From 660fc9f0dac5d0fbffc1bef479181246f1fb9700 Mon Sep 17 00:00:00 2001 From: lgdl24 Date: Thu, 13 Aug 2026 21:58:52 +0900 Subject: [PATCH 2/3] =?UTF-8?q?[fix/#260]=20=ED=83=9C=EA=B7=B8=206?= =?UTF-8?q?=EA=B0=9C=20=EC=9D=B4=EC=83=81=20=EC=8B=9C=20=EC=A0=9C=ED=95=9C?= =?UTF-8?q?=20=EB=B0=8F=20=ED=86=A0=EC=8A=A4=ED=8A=B8=20=EB=A9=94=EC=8B=9C?= =?UTF-8?q?=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/features/ootd/ui/OotdTagEditor.tsx | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/features/ootd/ui/OotdTagEditor.tsx b/src/features/ootd/ui/OotdTagEditor.tsx index 94832a2..7958655 100644 --- a/src/features/ootd/ui/OotdTagEditor.tsx +++ b/src/features/ootd/ui/OotdTagEditor.tsx @@ -8,6 +8,8 @@ import { getItemDetail } from '@/features/mypage/api/itemsApi'; import type { ItemDetailResponse } from '@/features/mypage/model/items'; import { getDaysAgo } from '@/features/mypage/lib/daysAgo'; import { resolveFileUrl } from '@/shared/lib/resolveFileUrl'; +import { Toast } from '@/shared/components'; +import { useToast } from '@/shared/hooks/useToast'; import TagLoading from '@/pages/camera/component/TagLoading'; import TagResultSheet, { MIDDLE as RESULT_SHEET_DEFAULT_H, @@ -43,6 +45,7 @@ type Props = { className?: string; }; +const MAX_TAGS = 5; // 한 게시물에 붙일 수 있는 최대 태그 수 const BOX_W = 0.26; const BOX_H = 0.22; const clamp = (v: number, min: number, max: number) => Math.min(Math.max(v, min), max); @@ -140,6 +143,7 @@ const OotdTagEditor = ({ const [query, setQuery] = useState(''); const [newItemOpen, setNewItemOpen] = useState(false); const [showBox, setShowBox] = useState(true); + const { message: toastMessage, show: showToast, hide: hideToast } = useToast(); const activeBox = boxes.find((b) => b.id === activeBoxId) ?? null; const tagCount = boxes.filter((b) => b.itemId).length; // 아이템 부착된 박스 = 완성 태그 @@ -266,6 +270,11 @@ const OotdTagEditor = ({ // 이미지 빈 곳 탭 → 그 위치에 박스 생성 + 활성화 + 분석 API 호출 const handleAreaClick = (e: MouseEvent) => { if ((e.target as HTMLElement).dataset.tagArea !== 'true') return; // 박스/버튼 클릭은 무시 + // 완성 태그가 최대치면 새 박스 생성 차단 (기존 태그 편집/이동은 그대로) + if (tagCount >= MAX_TAGS) { + showToast(`태그는 최대 ${MAX_TAGS}개까지 추가할 수 있어요.`); + return; + } const rect = e.currentTarget.getBoundingClientRect(); const cx = (e.clientX - rect.left) / rect.width; const cy = (e.clientY - rect.top) / rect.height; @@ -401,6 +410,8 @@ const OotdTagEditor = ({ onSubmit={handleRegister} /> )} + + ); }; From f1af3bbbf16ffed03b02c27c60e8012e5a602661 Mon Sep 17 00:00:00 2001 From: yjudy0531 Date: Thu, 13 Aug 2026 22:00:30 +0900 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20=EB=B0=B0=EC=86=A1=EC=A7=80=20?= =?UTF-8?q?=EA=B4=80=EB=A6=AC/=EC=9E=91=EC=84=B1=20=ED=99=94=EB=A9=B4=20?= =?UTF-8?q?=EB=AA=A8=EB=B0=94=EC=9D=BC=20=EB=B7=B0=ED=8F=AC=ED=8A=B8=20?= =?UTF-8?q?=EB=86=92=EC=9D=B4=20=EC=9D=B4=EC=8A=88=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit #252에서 누락된 min-h-screen 패턴 수정 - AddressManagePage.tsx, AddressFormPage.tsx의 min-h-screen을 min-h-dvh로 교체 Co-Authored-By: Claude Sonnet 5 --- src/pages/mypage/AddressFormPage.tsx | 6 +++--- src/pages/mypage/AddressManagePage.tsx | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/pages/mypage/AddressFormPage.tsx b/src/pages/mypage/AddressFormPage.tsx index 58473d9..ba261b6 100644 --- a/src/pages/mypage/AddressFormPage.tsx +++ b/src/pages/mypage/AddressFormPage.tsx @@ -36,7 +36,7 @@ const AddressFormPage = () => { if (isEditMode && isPending) { return ( -
+
navigate(-1)} />

불러오는 중...

@@ -47,7 +47,7 @@ const AddressFormPage = () => { if (isEditMode && !target) { return ( -
+
navigate(-1)} />

배송지 정보를 찾을 수 없습니다. @@ -123,7 +123,7 @@ const AddressForm = ({ addressId, initial, onDone }: AddressFormProps) => { }; return ( -

+
diff --git a/src/pages/mypage/AddressManagePage.tsx b/src/pages/mypage/AddressManagePage.tsx index f7b44d7..2872c2e 100644 --- a/src/pages/mypage/AddressManagePage.tsx +++ b/src/pages/mypage/AddressManagePage.tsx @@ -23,7 +23,7 @@ const AddressManagePage = () => { }; return ( -
+