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({