From 3b8dc90384a869025943e4d1b7cfc7536d79b4f7 Mon Sep 17 00:00:00 2001 From: joyeongchan Date: Wed, 12 Aug 2026 15:48:52 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=ED=86=A0=EB=84=88=EB=A8=BC=ED=8A=B8=20?= =?UTF-8?q?=EC=8B=9C=EC=9E=91=20=ED=9B=84=20=EC=B0=B8=EC=97=AC=EC=9E=90=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=EC=97=90=20=EB=8B=B4=EA=B8=B0=20=EB=B2=84?= =?UTF-8?q?=ED=8A=BC=EC=9D=B4=20=EB=82=A8=EB=8D=98=20=EB=AC=B8=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit + 버튼 노출이 isDepositClosed 만 보는데, 이 값은 ownerStarted 일 때 오히려 false 가 되어 시작 후에도 버튼이 남고 누르면 409 만 돌아왔다. - 담기 차단 여부를 isAddItemBlocked 로 분리 (만료 마감 + 주최자 시작) - 쿼리 파라미터로 열리는 담기 다이얼로그도 같은 조건으로 차단 --- .../[id]/create/_components/TournamentCreateClient.tsx | 7 +++++-- .../tournament-item-basket/TournamentItemBasket.tsx | 6 +++--- .../TournamentItemBasketCarousel.tsx | 8 ++++---- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/apps/web/src/app/tournament/[id]/create/_components/TournamentCreateClient.tsx b/apps/web/src/app/tournament/[id]/create/_components/TournamentCreateClient.tsx index d0a34702..b1254a8a 100644 --- a/apps/web/src/app/tournament/[id]/create/_components/TournamentCreateClient.tsx +++ b/apps/web/src/app/tournament/[id]/create/_components/TournamentCreateClient.tsx @@ -99,6 +99,8 @@ function TournamentCreateClient({ tournamentId }: TournamentCreateClientProps) { // ownerStarted 면 어차피 시작 흐름으로 넘어가야 하므로 마감 처리하지 않는다. // 협업 의도가 없는 토너먼트는 만료 자체를 무시한다. const isDepositClosed = !tournamentData.isOwner && !ownerStarted && isExpired && isCollaborative; + // 참여자는 주최자가 시작한 뒤로 담을 수 없다(서버 409). 만료 마감과 별개 사유라 따로 둔다. + const isAddItemBlocked = isDepositClosed || (!tournamentData.isOwner && ownerStarted); const participantImageMap = new Map( (pending?.participants ?? []).map(p => [p.userId, p.profileImage]) @@ -195,7 +197,7 @@ function TournamentCreateClient({ tournamentId }: TournamentCreateClientProps) { items={pending?.items} scrollToLast={scrollToLast} previousItemCount={previousItemCount} - isDepositClosed={isDepositClosed} + isAddItemBlocked={isAddItemBlocked} participantImageMap={participantImageMap} /> - + {/* 쿼리 파라미터로 직접 열 수 있어 + 버튼과 같은 조건으로 막는다 */} + diff --git a/apps/web/src/app/tournament/[id]/create/_components/tournament-item-basket/TournamentItemBasket.tsx b/apps/web/src/app/tournament/[id]/create/_components/tournament-item-basket/TournamentItemBasket.tsx index 29fc1449..730f7834 100644 --- a/apps/web/src/app/tournament/[id]/create/_components/tournament-item-basket/TournamentItemBasket.tsx +++ b/apps/web/src/app/tournament/[id]/create/_components/tournament-item-basket/TournamentItemBasket.tsx @@ -18,7 +18,7 @@ type TournamentItemBasketProps = { basketIndex: number; items: TournamentPendingItemT[]; maxHeight?: number; - isDepositClosed?: boolean; + isAddItemBlocked?: boolean; participantImageMap?: Map; }; @@ -26,7 +26,7 @@ function TournamentItemBasket({ basketIndex, items, maxHeight, - isDepositClosed = false, + isAddItemBlocked = false, participantImageMap, }: TournamentItemBasketProps) { const { id } = useParams<{ id: string }>(); @@ -41,7 +41,7 @@ function TournamentItemBasket({ }; const isFull = items.length >= ITEMS_PER_BASKET; - const showAddButton = !isDepositClosed && !isFull; + const showAddButton = !isAddItemBlocked && !isFull; const addSlot = showAddButton ? ( diff --git a/apps/web/src/app/tournament/[id]/create/_components/tournament-item-basket/TournamentItemBasketCarousel.tsx b/apps/web/src/app/tournament/[id]/create/_components/tournament-item-basket/TournamentItemBasketCarousel.tsx index 91bf972a..f317e61d 100644 --- a/apps/web/src/app/tournament/[id]/create/_components/tournament-item-basket/TournamentItemBasketCarousel.tsx +++ b/apps/web/src/app/tournament/[id]/create/_components/tournament-item-basket/TournamentItemBasketCarousel.tsx @@ -21,7 +21,7 @@ type TournamentItemBasketCarouselProps = { scrollToLast?: boolean; /** 위시 담기 등 재진입 시점의 기존 아이템 개수 */ previousItemCount?: number | null; - isDepositClosed?: boolean; + isAddItemBlocked?: boolean; participantImageMap?: Map; }; @@ -29,7 +29,7 @@ function TournamentItemBasketCarousel({ items = [], scrollToLast = false, previousItemCount = null, - isDepositClosed = false, + isAddItemBlocked = false, participantImageMap, }: TournamentItemBasketCarouselProps) { const [carouselApi, setCarouselApi] = useState(); @@ -116,7 +116,7 @@ function TournamentItemBasketCarousel({ @@ -145,7 +145,7 @@ function TournamentItemBasketCarousel({