From 2ed130f6a1bd86f867fdc8830761b9910831c9b8 Mon Sep 17 00:00:00 2001 From: joyeongchan Date: Thu, 13 Aug 2026 00:48:32 +0900 Subject: [PATCH 1/3] =?UTF-8?q?fix:=20=EC=B0=B8=EC=97=AC=EC=9E=90=C2=B7?= =?UTF-8?q?=EA=B2=8C=EC=8A=A4=ED=8A=B8=EB=8F=84=20=EC=A0=84=EC=B2=B4=20?= =?UTF-8?q?=EA=B2=B0=EA=B3=BC=20=EB=B3=B4=EA=B8=B0=EB=A5=BC=20=EB=B3=BC=20?= =?UTF-8?q?=EC=88=98=20=EC=9E=88=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 노출 조건이 isRoot 를 요구해 주최자에게만 카드가 보였다. 참여자와 플레이 링크 게스트는 시작 시 본인 CLONE 이 생겨 isRoot=false 가 되므로 항상 걸러졌다. - 노출 조건에서 isRoot 제거 - 그룹 결과는 원본(ROOT) 단위라 CLONE 이면 sourceTournamentId 로 조회 --- .../[id]/result/_components/ResultClient.tsx | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/apps/web/src/app/tournament/[id]/result/_components/ResultClient.tsx b/apps/web/src/app/tournament/[id]/result/_components/ResultClient.tsx index 2bd840c5..75a4ae02 100644 --- a/apps/web/src/app/tournament/[id]/result/_components/ResultClient.tsx +++ b/apps/web/src/app/tournament/[id]/result/_components/ResultClient.tsx @@ -60,6 +60,8 @@ function ResultClient({ tournamentId, isGuest = false }: ResultClientProps) { const result = tournamentData.completed.result; // 플레이 링크 공유는 ROOT 의 소유자만 가능 — CLONE 소유자(친구 초대 → CLONE 생성한 사람) 제외 const canSharePlayLink = tournamentData.isRoot && tournamentData.isOwner; + // 그룹 결과는 원본(ROOT) 단위로 집계된다. CLONE 에서 보고 있으면 원본 id 로 조회해야 한다. + const groupResultTournamentId = tournamentData.sourceTournamentId ?? tournamentId; const handleSharePlayLink = () => { setIsShareDialogOpen(true); @@ -70,7 +72,12 @@ function ResultClient({ tournamentId, isGuest = false }: ResultClientProps) { const mainPb = isGuest && !tournamentData.isRoot ? 'pb-[145px]' : 'pb-40'; return ( -
+
@@ -93,14 +100,16 @@ function ResultClient({ tournamentId, isGuest = false }: ResultClientProps) { {/* 친구 토너먼트 결과보기 카드 노출 + 라우팅. - - ROOT 사용자(주최자 / 친구 초대 멤버) 에게만 노출. - - CLONE 사용자(플레이 링크 게스트)는 숨긴다. + - 주최자·참여자·플레이 링크 게스트 모두에게 노출한다. + 참여자와 게스트는 시작 시 본인 CLONE 이 생겨 isRoot=false 라, 이 값으로 거르면 + 주최자에게만 보인다. 전원이 전체 결과를 볼 수 있어야 하므로 조건에서 뺀다. + - 그룹 결과는 원본(ROOT) 단위로 집계되므로 CLONE 이면 sourceTournamentId 로 조회한다. - 친구 유무는 클릭 시 group-result API 응답으로 판단한다 (캐시 의존 X). - 앱 화면이 낮게 크롭될 때도 CTA 는 항상 고정돼야 해서 스크롤 영역에 둔다. */} - {tournamentData.isRoot && (!isGuest || tournamentData.completed.hasGroupResult) && ( + {(!isGuest || tournamentData.completed.hasGroupResult) && (
- +
)}
From 364c9a46cf7bbd66381b1386f7a2d9da8ea17527 Mon Sep 17 00:00:00 2001 From: joyeongchan Date: Thu, 13 Aug 2026 00:58:11 +0900 Subject: [PATCH 2/3] =?UTF-8?q?fix:=20=ED=98=BC=EC=9E=90=20=EB=81=9D?= =?UTF-8?q?=EB=82=B8=20=ED=86=A0=EB=84=88=EB=A8=BC=ED=8A=B8=EC=97=90?= =?UTF-8?q?=EC=84=9C=20=EC=A0=84=EC=B2=B4=20=EA=B2=B0=EA=B3=BC=20=EB=B3=B4?= =?UTF-8?q?=EA=B8=B0=EB=A5=BC=20=EC=88=A8=EA=B9=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit hasGroupResult 검사를 게스트에게만 적용해, 회원은 완료한 CLONE 이 없어도 카드가 보였다. 누르면 서버가 409(TOURNAMENT-028) 를 준다. dev 서버 실측으로 확인 — 혼자 끝낸 토너먼트 11건 모두 hasGroupResult=false + group-result 409, CLONE 이 있는 2건만 true. --- .../app/tournament/[id]/result/_components/ResultClient.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/apps/web/src/app/tournament/[id]/result/_components/ResultClient.tsx b/apps/web/src/app/tournament/[id]/result/_components/ResultClient.tsx index 75a4ae02..8319e54f 100644 --- a/apps/web/src/app/tournament/[id]/result/_components/ResultClient.tsx +++ b/apps/web/src/app/tournament/[id]/result/_components/ResultClient.tsx @@ -104,10 +104,11 @@ function ResultClient({ tournamentId, isGuest = false }: ResultClientProps) { 참여자와 게스트는 시작 시 본인 CLONE 이 생겨 isRoot=false 라, 이 값으로 거르면 주최자에게만 보인다. 전원이 전체 결과를 볼 수 있어야 하므로 조건에서 뺀다. - 그룹 결과는 원본(ROOT) 단위로 집계되므로 CLONE 이면 sourceTournamentId 로 조회한다. - - 친구 유무는 클릭 시 group-result API 응답으로 판단한다 (캐시 의존 X). + - hasGroupResult 는 완료한 CLONE 이 있는지를 뜻한다. 혼자 끝낸 토너먼트에서 누르면 + 서버가 409(TOURNAMENT-028) 를 주므로 회원·게스트 가리지 않고 이 값으로 막는다. - 앱 화면이 낮게 크롭될 때도 CTA 는 항상 고정돼야 해서 스크롤 영역에 둔다. */} - {(!isGuest || tournamentData.completed.hasGroupResult) && ( + {tournamentData.completed.hasGroupResult && (
From 43bc8e33ae3fe8676db8e110536facb65fd1d860 Mon Sep 17 00:00:00 2001 From: joyeongchan Date: Thu, 13 Aug 2026 01:00:01 +0900 Subject: [PATCH 3/3] =?UTF-8?q?chore:=20=EA=B2=B0=EA=B3=BC=20=ED=99=94?= =?UTF-8?q?=EB=A9=B4=20=EC=A3=BC=EC=84=9D=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../[id]/result/_components/ResultClient.tsx | 19 +++---------------- 1 file changed, 3 insertions(+), 16 deletions(-) diff --git a/apps/web/src/app/tournament/[id]/result/_components/ResultClient.tsx b/apps/web/src/app/tournament/[id]/result/_components/ResultClient.tsx index 8319e54f..9e132fc5 100644 --- a/apps/web/src/app/tournament/[id]/result/_components/ResultClient.tsx +++ b/apps/web/src/app/tournament/[id]/result/_components/ResultClient.tsx @@ -67,8 +67,7 @@ function ResultClient({ tournamentId, isGuest = false }: ResultClientProps) { setIsShareDialogOpen(true); }; - // 비회원 솔로(isRoot=false): 배너가 스크롤 마지막 — 버튼과 13px 간격 - // 나머지: pb-40 (160px) → GroupResultEntryCard 또는 ReceiptDrawMachine과 BottomCta 버튼 사이 ~28px + /** 비회원 솔로는 배너가 스크롤 마지막이라 하단 여백을 줄인다 */ const mainPb = isGuest && !tournamentData.isRoot ? 'pb-[145px]' : 'pb-40'; return ( @@ -88,10 +87,6 @@ function ResultClient({ tournamentId, isGuest = false }: ResultClientProps) { date={date} /> - {/* - 비회원 유도 배너 — 게스트일 때만 노출. - 영수증과 61px 간격: gap-3(12px) + mt-[49px](49px) = 61px. - */} {isGuest && (
@@ -99,14 +94,8 @@ function ResultClient({ tournamentId, isGuest = false }: ResultClientProps) { )} {/* - 친구 토너먼트 결과보기 카드 노출 + 라우팅. - - 주최자·참여자·플레이 링크 게스트 모두에게 노출한다. - 참여자와 게스트는 시작 시 본인 CLONE 이 생겨 isRoot=false 라, 이 값으로 거르면 - 주최자에게만 보인다. 전원이 전체 결과를 볼 수 있어야 하므로 조건에서 뺀다. - - 그룹 결과는 원본(ROOT) 단위로 집계되므로 CLONE 이면 sourceTournamentId 로 조회한다. - - hasGroupResult 는 완료한 CLONE 이 있는지를 뜻한다. 혼자 끝낸 토너먼트에서 누르면 - 서버가 409(TOURNAMENT-028) 를 주므로 회원·게스트 가리지 않고 이 값으로 막는다. - - 앱 화면이 낮게 크롭될 때도 CTA 는 항상 고정돼야 해서 스크롤 영역에 둔다. + 전체 결과 보기 — 주최자·참여자·게스트 모두에게 노출한다. + hasGroupResult 가 false 면(완료한 CLONE 없음) 눌러도 서버가 409 를 주므로 숨긴다. */} {tournamentData.completed.hasGroupResult && (
@@ -115,9 +104,7 @@ function ResultClient({ tournamentId, isGuest = false }: ResultClientProps) { )}
- {/* 하단 CTA — 저장/공유 버튼 → 홈으로 가기 순 위계, 항상 화면 하단 고정 */} - {/* 영수증 공유 (모든 사용자) + 토너먼트 공유 (ROOT 소유자만, 플레이 링크 공유) */}