Skip to content

fix: 토너먼트 준비 화면 실시간 아이템 상태 미반영 버그 수정 #264

Merged
kanghaeun merged 3 commits into
devfrom
fix/tournament-item-sync
Jun 19, 2026
Merged

fix: 토너먼트 준비 화면 실시간 아이템 상태 미반영 버그 수정 #264
kanghaeun merged 3 commits into
devfrom
fix/tournament-item-sync

Conversation

@kanghaeun

@kanghaeun kanghaeun commented Jun 19, 2026

Copy link
Copy Markdown
Contributor

작업 요약

  • 신규 SSE 동기화 이벤트 연동으로 참여자 화면에서 아이템 파싱 완료/실패 및 삭제 상태가 즉시 반영되도록 수정

작업 세부 내용

1. 아이템 파싱 완료 후 로딩바 무한 유지

현상

  • 주최자가 링크/이미지로 아이템 추가 시 참여자 화면에 PENDING 로딩바 노출
  • 파싱 완료 후에도 참여자 화면에서 로딩바가 사라지지 않음
  • 새로고침 후에만 파싱 완료 상태가 반영됨

원인

ITEM_PARSING_COMPLETED / ITEM_PARSING_FAILED 이벤트는 아이템을 추가한 본인에게만 전송됨
참여자는 파싱 완료 시점을 SSE로 알 수 없어 로딩바가 무한히 유지됨

수정

백엔드에서 파싱 완료/실패 시 참여자에게 tournament-item-parsed SSE 동기화 이벤트 신규 추가
onmessage에서 해당 이벤트 분기 처리

  • notification 이벤트와 달리 알림/토스트 없이 invalidateQueries만 수행

  • TournamentItemParsedSsePayloadT 타입 추가

    필드 타입
    tournamentId number
    tournamentItemId number
    status 'READY' | 'FAILED'

2. 아이템 삭제 시 다른 참여자 화면 미반영

현상

  • 참여자가 아이템을 삭제해도 다른 참여자 화면에 즉시 반영되지 않음
  • 새로고침 후에만 삭제된 아이템이 반영됨

원인

TOURNAMENT_ITEM_DELETED 이벤트가 NotificationTypeT에 미정의되어switchdefault 케이스로 빠지면서 토스트만 노출되고 화면 갱신이 발생하지 않음

수정

  • NotificationTypeTTOURNAMENT_ITEM_DELETED 타입 추가
  • TOURNAMENT_ITEM_ADDED와 동일하게 invalidateQueries 처리 → 참여자 화면 즉시 갱신

연관 이슈

closes #260
closes #205

Summary by CodeRabbit

릴리스 노트

  • 성능 개선

    • 토너먼트 데이터 자동 새로고침 주기 제거로 불필요한 폴링 감소
  • 새로운 기능

    • 토너먼트 아이템 삭제 알림 지원 추가
    • 아이템 파싱 완료/실패 상태 알림 처리 개선

@vercel

vercel Bot commented Jun 19, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
depromeet Ready Ready Preview, Comment Jun 19, 2026 5:21am

@coderabbitai

coderabbitai Bot commented Jun 19, 2026

Copy link
Copy Markdown

Review Change Stack

Walkthrough

useGetTournament에서 30초 폴링(refetchInterval)을 제거하고, SSE 수신 측에서 tournament-item-parsed 이벤트와 TOURNAMENT_ITEM_DELETED 알림을 처리하도록 확장했습니다. 관련 타입(TournamentItemParsedSsePayloadT, TOURNAMENT_ITEM_DELETED)도 추가되었습니다.

Changes

SSE 기반 토너먼트 실시간 동기화 개선

Layer / File(s) Summary
알림 타입 및 SSE 페이로드 계약 확장
apps/web/src/types/notification.ts
NotificationTypeT 유니온에 TOURNAMENT_ITEM_DELETED 추가, 토너먼트 아이템 파싱 결과를 표현하는 TournamentItemParsedSsePayloadT (tournamentId, tournamentItemId, status: 'READY' | 'FAILED') 신규 정의.
SSE 이벤트 핸들러 확장 및 폴링 제거
apps/web/src/hooks/useNotificationSSE.ts, apps/web/src/app/tournament/[id]/_common/_hooks/useGetTournament.ts
TournamentItemParsedSsePayloadT 임포트 추가, tournament-item-parsed SSE 이벤트 수신 시 tournamentId 기준 쿼리 무효화 처리 추가, TOURNAMENT_ITEM_DELETED 알림을 기존 토스트+무효화 흐름에 포함, useGetTournamentrefetchInterval: 30_000 폴링 제거.

예상 리뷰 노력

🎯 2 (Simple) | ⏱️ ~10 minutes

관련 가능성이 있는 PR

  • depromeet/PIKI-Client#171: useNotificationSSE SSE 구독 구현 및 apps/web/src/types/notification.ts 알림 타입 정의를 도입한 PR로, 이번 PR이 그 위에서 이벤트 타입과 핸들러를 확장합니다.
  • depromeet/PIKI-Client#174: useGetTournament 폴링 및 useNotificationSSE['tournament', ...] 쿼리 무효화 메커니즘을 동일하게 다루는 PR입니다.

추천 레이블

WEB

추천 리뷰어

  • iOdiO89
  • ychany

🐇 폴링은 이제 그만, SSE로 달려요~
tournament-item-parsed, 귀 쫑긋 듣는 토끼
삭제도 추가도 실시간으로 쏙쏙!
새로고침 없이 화면이 반짝반짝 ✨
버그는 사라지고 당근만 남았네 🥕

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed PR 제목이 변경 내용의 핵심을 명확하게 반영하고 있습니다. '토너먼트 준비 화면 실시간 아이템 상태 미반영 버그 수정'은 두 가지 핵심 이슈(아이템 파싱 상태, 아이템 삭제 상태)를 모두 포괄하는 간결한 설명입니다.
Linked Issues check ✅ Passed PR이 #260과 #205의 모든 코딩 요구사항을 충족합니다. 새로운 tournament-item-parsed SSE 이벤트 처리 [#260], TOURNAMENT_ITEM_DELETED 타입 추가 및 쿼리 무효화 [#205], 관련 타입 정의 등이 모두 구현되었습니다.
Out of Scope Changes check ✅ Passed useGetTournament에서 30초 폴링 제거는 SSE 기반의 실시간 동기화로의 전환을 반영하는 범위 내 변경입니다. 모든 변경이 #260, #205의 요구사항과 일관성 있게 연관되어 있습니다.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fix/tournament-item-sync

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions github-actions Bot added the fix Something isn't working label Jun 19, 2026
@github-actions

Copy link
Copy Markdown

No description provided.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
apps/web/src/hooks/useNotificationSSE.ts (1)

113-116: ⚡ Quick win

tournament-item-parsed payload를 런타임 스키마로 검증해주세요.

현재는 타입 단언만 사용해서 payload shape 불일치가 런타임에서 걸러지지 않습니다. tournamentId가 비정상인 경우 잘못된 queryKey 무효화로 실시간 갱신 누락이 생길 수 있습니다.

제안 diff
+import { z } from 'zod';
 import type { NotificationSsePayloadT, TournamentItemParsedSsePayloadT } from '`@/types/notification`';

+const tournamentItemParsedSsePayloadSchema = z.object({
+  tournamentId: z.number(),
+  tournamentItemId: z.number(),
+  status: z.enum(['READY', 'FAILED']),
+});

 // ...
         onmessage: event => {
           if (event.event === 'tournament-item-parsed') {
             try {
-              const payload = JSON.parse(event.data) as TournamentItemParsedSsePayloadT;
+              const parsed = tournamentItemParsedSsePayloadSchema.safeParse(JSON.parse(event.data));
+              if (!parsed.success) return;
+              const payload: TournamentItemParsedSsePayloadT = parsed.data;
               queryClient.invalidateQueries({ queryKey: ['tournament', payload.tournamentId] });
             } catch {
               // malformed JSON — 무시
             }
             return;
           }

As per coding guidelines, apps/web/src/**/*.{ts,tsx}에서 "Use Zod for schema validation" 규칙을 적용해야 합니다.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@apps/web/src/hooks/useNotificationSSE.ts` around lines 113 - 116, The
tournament-item-parsed event handler uses a type assertion without runtime
validation of the payload structure, which allows invalid payloads to pass
through and cause incorrect queryKey invalidations. Create a Zod schema that
validates the TournamentItemParsedSsePayloadT structure, then replace the type
assertion in the JSON.parse line (where the event.data is cast as
TournamentItemParsedSsePayloadT) with Zod's .safeParse() method. Handle the
validation result by checking if parsing succeeded before proceeding with the
queryClient.invalidateQueries call, and log an error or return early if
validation fails to prevent invalid tournamentId values from being used.

Source: Coding guidelines

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@apps/web/src/hooks/useNotificationSSE.ts`:
- Around line 113-116: The tournament-item-parsed event handler uses a type
assertion without runtime validation of the payload structure, which allows
invalid payloads to pass through and cause incorrect queryKey invalidations.
Create a Zod schema that validates the TournamentItemParsedSsePayloadT
structure, then replace the type assertion in the JSON.parse line (where the
event.data is cast as TournamentItemParsedSsePayloadT) with Zod's .safeParse()
method. Handle the validation result by checking if parsing succeeded before
proceeding with the queryClient.invalidateQueries call, and log an error or
return early if validation fails to prevent invalid tournamentId values from
being used.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 139bc487-2bc6-42de-a891-b68301026c34

📥 Commits

Reviewing files that changed from the base of the PR and between 2278b1d and 7cbea0e.

📒 Files selected for processing (3)
  • apps/web/src/app/tournament/[id]/_common/_hooks/useGetTournament.ts
  • apps/web/src/hooks/useNotificationSSE.ts
  • apps/web/src/types/notification.ts
💤 Files with no reviewable changes (1)
  • apps/web/src/app/tournament/[id]/_common/_hooks/useGetTournament.ts

@kanghaeun
kanghaeun merged commit 683c155 into dev Jun 19, 2026
6 checks passed
@kanghaeun
kanghaeun deleted the fix/tournament-item-sync branch June 19, 2026 05:24
iOdiO89 pushed a commit that referenced this pull request Jun 19, 2026
* feat: tournament-item-parsed SSE 이벤트 처리 추가

* feat: 토너먼트 아이템 삭제 시 참여자 화면 실시간 갱신 처리 추가

* chore: 토너먼트 조회 30초 폴링 제거 (SSE로 대체)
iOdiO89 added a commit that referenced this pull request Jun 19, 2026
* feat: 홈에서 담는중, 플레이 상태인 토너먼트 카드만 보여주도록 수정

* refactor: UserProfileGroup에서 게스트 프로필 이미지 그대로 사용하도록 수정

* feat: Tournament Card 제목 클릭 시 토너먼트 준비/진행/결과 페이지로 이동

* fix: 화면 리사이즈 시 웹 스플래시 로고 한쪽으로 치우치는 오류 수정

* fix: QA 통합 — 토너먼트 시작 흐름 모달 / 영수증 캡처 / 초대 마감 보정 (#236) (#243)

* fix: 영수증 캡처 시 S3 이미지 CORS 차단 회피 (cacheBust false + force-cache)

* fix: 플레이 체험 게스트(CLONE)는 결과 페이지에서 전체 결과 보기 카드 숨김

* fix: 서버 ISO UTC 응답을 Z 떼지 않고 그대로 파싱 (만료됨 오표시 해결)

* fix: 초대 마감 시각 picker 가 ISO 8601 UTC 형식으로 전송하도록 변경

* fix: 휠 picker remount 방지 (key 에서 inviteExpiresAt 제거)

* chore: consolelog 삭제

* fix: 초대 마감 시 토너먼트 시작 버튼 비활성 처리

* fix: 영수증 캡처 시 상품 사진 누락 (next/image proxy URL 로 same-origin 우회)

* feat: 토너먼트 시작 전 부전승 안내 모달 추가 (2의 거듭제곱 아닌 경우)

* feat: 담기 시간 종료 시 주최자에게 자동 안내 모달 노출

* feat: 주최자 시작 SSE 신호 감지 → 참여자에게 자동 안내 모달 노출

* refactor: ConfirmStartDialog / ConfirmExitDialog 의 raw button → 공통 Button 컴포넌트 교체

* chore: format

* fix: react-hooks/set-state-in-effect lint 에러 해결 (이전 값 state 패턴으로 변경)

* style: not-found 페이지 Link 의 cursor-pointer 제거 및 canonical class 정리

* fix: 휠 picker 드래그 직후 click 이벤트가 잘못된 점프를 일으키던 문제 수정

* fix: 모달 시작 버튼 중복 mutation 호출 방지 (isPending 가드 + disabled)

* style: 위시에서 가져오기 CTA 영역 그라데이션 디자인 반영 (#245)

* style: 위시에서 가져오기 CTA 영역 그라데이션 디자인 반영

* style: 토너먼트 로딩 브라켓 아이콘 그림자 box-shadow로 변경

* style: 하단 바텀 내비 그라디언트 레이어 추가 (#247)

* style: 하단 바텀 내비 그라디언트 레이어 추가

* fix: 바텀 내비 그라디언트 포털 SSR 오류 수정 및 lint 에러 해결

* style: 토너먼트 준비 페이지 상태 라벨 주최자·참여자 디자인 통일 (#251)

* fix: 화면 확대 시 장바구니 크기 미복구 버그 수정 (#252)

* fix: 장바구니 8개 가득 찬 상태에서 아이템 삭제 시 장바구니 사라짐 버그 수정 (#254)

* fix: SSE 알림 구독 토큰 만료 시 재연결 처리 (#255)

* fix: SSE 알림 구독 토큰 만료 시 재연결 처리

* fix: SSE refresh 하드코딩 URL 상수로 교체 및 웹뷰 토큰 저장 누락 수정

* feat: 위시·토너먼트 아이템 수정 기능 개선 (#256)

* feat: 위시 Pending 상태일 때도 클릭 안 되도록 변경

* feat: item status Completed 인 경우에도 클릭 가능하도록 변경

* feat: item status Completed인 경우에 링크 갱신하는 drawer 추가

* feat: 위시, 토너먼트 아이템 Pending 상태일 때도 클릭 안 되도록 변경

* chore: 위시, 토너먼트 아이템 수정 문구 변경

* feat: 위시, 토너먼트 아이템 status = Ready인 경우 이미지 수정 불가능하도록 설정

* feat: 토너먼트 아이템 수정 기능 추가

* style: 토너먼트 아이템 수정 페이지 bg color 고정

* style: 토너먼트 아이템 수정 페이지 bg color 고정

* style: 위시 수정 페이지 스타일 변경

* feat: 링크로 토너먼트 등록 시 에러 토스트 추가

* feat: 토너먼트 아이템 수정 모든 필드 required로 변경

* feat: 위시 수정 모든 필드 required로 변경

* feat: 등록 성공한 위시 갱신 api 연결

* feat: 링크로 위시 등록 시 에러 토스트 추가

* chore: 불필요한 파일 제거

* fix: 토너먼트 아이템에 친구 프로필 얼굴 추가하도록 변경

* fix: 토너먼트 후보 Patch 누락된 에러 핸들링 추가

* refactor: 위시 수정 시 다른 액션 실행되지 않도록 설정

* style: 토너먼트 담기 화면 레이아웃 및 UI 개선 (#259)

* style: layout.tsx에서 불필요한 padding 제거

* style: 참여자 프로필 그룹 z-index 순서 수정

* style: 장바구니와 상태 라벨 사이 여백 조정

* style: 캐러셀 슬라이드 크기 비율 85%에서 90%로 변경

* feat: 토너먼트 헤더에서 뒤로가기 버튼 클릭 시 홈으로 이동하도록 수정

* feat: 장바구니 아이템 수 증가 시 알림 토스트 추가

* feat: 위시 상품 삭제 토스트 추가 및 복구 필드명 수정 (#263)

* fix: 위시 복구 요청 폼 필드명 수정 (price → currentPrice)

* feat: 위시 삭제 시 성공 토스트 메시지 추가

* fix: 애플 로그인 시 비회원으로 로그인되는 문제 수정 (#242)

* fix: Apple OAuth POST 콜백을 올바른 핸들러로 rewrite하는 미들웨어 추가

* fix: Apple OAuth POST 콜백을 proxy.ts에서 올바른 핸들러로 rewrite

* fix: 로그인 상태에서 /login 접근 시 /home으로 리다이렉트

* fix: Apple OAuth POST 콜백 rewrite를 307 redirect로 변경

* fix: Apple 콜백 route.ts 디버그 로그 추가

* fix: Apple 콜백 실패 시 에러 정보를 URL 파라미터로 전달

* fix: Apple 콜백 성공 시 307 대신 302로 리다이렉트하여 POST 루프 방지

* fix: Apple 콜백 쿠키 SameSite=Strict → Lax로 변경하여 cross-site 리다이렉트 후 인증 유지

* chore: Apple 콜백 디버그 코드 제거

* fix: 탈퇴 후 무한루프 유발하는 /login → /home 리다이렉트 제거

* fix: 애플 콜백 쿠키 SameSite 변환 코드 제거 (서버에서 Lax로 일괄 변경)

* refactor: 애플 콜백 처리 BE 이관으로 FE route.ts 및 proxy Apple POST 감지 코드 제거

* fix: 애플 로그인 redirectUri를 BE 콜백 URL로 변경

* fix: Apple getAuthUrl 호출 시 redirectUri 파라미터 제거 (BE 브릿지 URL 사용)

* fix: no-undefined lint 에러 수정

* fix: Apple redirectUri URL 조합 안전하게 수정

* fix: 토너먼트 준비 화면 실시간 아이템 상태 미반영 버그 수정  (#264)

* feat: tournament-item-parsed SSE 이벤트 처리 추가

* feat: 토너먼트 아이템 삭제 시 참여자 화면 실시간 갱신 처리 추가

* chore: 토너먼트 조회 30초 폴링 제거 (SSE로 대체)

* chore: 게스트 프로필 dice bear 처리 삭제

---------

Co-authored-by: 조영찬 <tigerbone@naver.com>
Co-authored-by: Soyeong Park <mb535622@gmail.com>
Co-authored-by: kanghaeun <145974230+kanghaeun@users.noreply.github.com>
iOdiO89 pushed a commit that referenced this pull request Jun 19, 2026
* feat: tournament-item-parsed SSE 이벤트 처리 추가

* feat: 토너먼트 아이템 삭제 시 참여자 화면 실시간 갱신 처리 추가

* chore: 토너먼트 조회 30초 폴링 제거 (SSE로 대체)
iOdiO89 added a commit that referenced this pull request Jun 19, 2026
* feat: 홈에서 담는중, 플레이 상태인 토너먼트 카드만 보여주도록 수정

* refactor: UserProfileGroup에서 게스트 프로필 이미지 그대로 사용하도록 수정

* feat: Tournament Card 제목 클릭 시 토너먼트 준비/진행/결과 페이지로 이동

* fix: 화면 리사이즈 시 웹 스플래시 로고 한쪽으로 치우치는 오류 수정

* fix: QA 통합 — 토너먼트 시작 흐름 모달 / 영수증 캡처 / 초대 마감 보정 (#236) (#243)

* fix: 영수증 캡처 시 S3 이미지 CORS 차단 회피 (cacheBust false + force-cache)

* fix: 플레이 체험 게스트(CLONE)는 결과 페이지에서 전체 결과 보기 카드 숨김

* fix: 서버 ISO UTC 응답을 Z 떼지 않고 그대로 파싱 (만료됨 오표시 해결)

* fix: 초대 마감 시각 picker 가 ISO 8601 UTC 형식으로 전송하도록 변경

* fix: 휠 picker remount 방지 (key 에서 inviteExpiresAt 제거)

* chore: consolelog 삭제

* fix: 초대 마감 시 토너먼트 시작 버튼 비활성 처리

* fix: 영수증 캡처 시 상품 사진 누락 (next/image proxy URL 로 same-origin 우회)

* feat: 토너먼트 시작 전 부전승 안내 모달 추가 (2의 거듭제곱 아닌 경우)

* feat: 담기 시간 종료 시 주최자에게 자동 안내 모달 노출

* feat: 주최자 시작 SSE 신호 감지 → 참여자에게 자동 안내 모달 노출

* refactor: ConfirmStartDialog / ConfirmExitDialog 의 raw button → 공통 Button 컴포넌트 교체

* chore: format

* fix: react-hooks/set-state-in-effect lint 에러 해결 (이전 값 state 패턴으로 변경)

* style: not-found 페이지 Link 의 cursor-pointer 제거 및 canonical class 정리

* fix: 휠 picker 드래그 직후 click 이벤트가 잘못된 점프를 일으키던 문제 수정

* fix: 모달 시작 버튼 중복 mutation 호출 방지 (isPending 가드 + disabled)

* style: 위시에서 가져오기 CTA 영역 그라데이션 디자인 반영 (#245)

* style: 위시에서 가져오기 CTA 영역 그라데이션 디자인 반영

* style: 토너먼트 로딩 브라켓 아이콘 그림자 box-shadow로 변경

* style: 하단 바텀 내비 그라디언트 레이어 추가 (#247)

* style: 하단 바텀 내비 그라디언트 레이어 추가

* fix: 바텀 내비 그라디언트 포털 SSR 오류 수정 및 lint 에러 해결

* style: 토너먼트 준비 페이지 상태 라벨 주최자·참여자 디자인 통일 (#251)

* fix: 화면 확대 시 장바구니 크기 미복구 버그 수정 (#252)

* fix: 장바구니 8개 가득 찬 상태에서 아이템 삭제 시 장바구니 사라짐 버그 수정 (#254)

* fix: SSE 알림 구독 토큰 만료 시 재연결 처리 (#255)

* fix: SSE 알림 구독 토큰 만료 시 재연결 처리

* fix: SSE refresh 하드코딩 URL 상수로 교체 및 웹뷰 토큰 저장 누락 수정

* feat: 위시·토너먼트 아이템 수정 기능 개선 (#256)

* feat: 위시 Pending 상태일 때도 클릭 안 되도록 변경

* feat: item status Completed 인 경우에도 클릭 가능하도록 변경

* feat: item status Completed인 경우에 링크 갱신하는 drawer 추가

* feat: 위시, 토너먼트 아이템 Pending 상태일 때도 클릭 안 되도록 변경

* chore: 위시, 토너먼트 아이템 수정 문구 변경

* feat: 위시, 토너먼트 아이템 status = Ready인 경우 이미지 수정 불가능하도록 설정

* feat: 토너먼트 아이템 수정 기능 추가

* style: 토너먼트 아이템 수정 페이지 bg color 고정

* style: 토너먼트 아이템 수정 페이지 bg color 고정

* style: 위시 수정 페이지 스타일 변경

* feat: 링크로 토너먼트 등록 시 에러 토스트 추가

* feat: 토너먼트 아이템 수정 모든 필드 required로 변경

* feat: 위시 수정 모든 필드 required로 변경

* feat: 등록 성공한 위시 갱신 api 연결

* feat: 링크로 위시 등록 시 에러 토스트 추가

* chore: 불필요한 파일 제거

* fix: 토너먼트 아이템에 친구 프로필 얼굴 추가하도록 변경

* fix: 토너먼트 후보 Patch 누락된 에러 핸들링 추가

* refactor: 위시 수정 시 다른 액션 실행되지 않도록 설정

* style: 토너먼트 담기 화면 레이아웃 및 UI 개선 (#259)

* style: layout.tsx에서 불필요한 padding 제거

* style: 참여자 프로필 그룹 z-index 순서 수정

* style: 장바구니와 상태 라벨 사이 여백 조정

* style: 캐러셀 슬라이드 크기 비율 85%에서 90%로 변경

* feat: 토너먼트 헤더에서 뒤로가기 버튼 클릭 시 홈으로 이동하도록 수정

* feat: 장바구니 아이템 수 증가 시 알림 토스트 추가

* feat: 위시 상품 삭제 토스트 추가 및 복구 필드명 수정 (#263)

* fix: 위시 복구 요청 폼 필드명 수정 (price → currentPrice)

* feat: 위시 삭제 시 성공 토스트 메시지 추가

* fix: 애플 로그인 시 비회원으로 로그인되는 문제 수정 (#242)

* fix: Apple OAuth POST 콜백을 올바른 핸들러로 rewrite하는 미들웨어 추가

* fix: Apple OAuth POST 콜백을 proxy.ts에서 올바른 핸들러로 rewrite

* fix: 로그인 상태에서 /login 접근 시 /home으로 리다이렉트

* fix: Apple OAuth POST 콜백 rewrite를 307 redirect로 변경

* fix: Apple 콜백 route.ts 디버그 로그 추가

* fix: Apple 콜백 실패 시 에러 정보를 URL 파라미터로 전달

* fix: Apple 콜백 성공 시 307 대신 302로 리다이렉트하여 POST 루프 방지

* fix: Apple 콜백 쿠키 SameSite=Strict → Lax로 변경하여 cross-site 리다이렉트 후 인증 유지

* chore: Apple 콜백 디버그 코드 제거

* fix: 탈퇴 후 무한루프 유발하는 /login → /home 리다이렉트 제거

* fix: 애플 콜백 쿠키 SameSite 변환 코드 제거 (서버에서 Lax로 일괄 변경)

* refactor: 애플 콜백 처리 BE 이관으로 FE route.ts 및 proxy Apple POST 감지 코드 제거

* fix: 애플 로그인 redirectUri를 BE 콜백 URL로 변경

* fix: Apple getAuthUrl 호출 시 redirectUri 파라미터 제거 (BE 브릿지 URL 사용)

* fix: no-undefined lint 에러 수정

* fix: Apple redirectUri URL 조합 안전하게 수정

* fix: 토너먼트 준비 화면 실시간 아이템 상태 미반영 버그 수정  (#264)

* feat: tournament-item-parsed SSE 이벤트 처리 추가

* feat: 토너먼트 아이템 삭제 시 참여자 화면 실시간 갱신 처리 추가

* chore: 토너먼트 조회 30초 폴링 제거 (SSE로 대체)

* chore: 게스트 프로필 dice bear 처리 삭제

---------

Co-authored-by: 조영찬 <tigerbone@naver.com>
Co-authored-by: Soyeong Park <mb535622@gmail.com>
Co-authored-by: kanghaeun <145974230+kanghaeun@users.noreply.github.com>
iOdiO89 pushed a commit that referenced this pull request Jun 23, 2026
* feat: tournament-item-parsed SSE 이벤트 처리 추가

* feat: 토너먼트 아이템 삭제 시 참여자 화면 실시간 갱신 처리 추가

* chore: 토너먼트 조회 30초 폴링 제거 (SSE로 대체)
iOdiO89 added a commit that referenced this pull request Jun 23, 2026
* feat: 홈에서 담는중, 플레이 상태인 토너먼트 카드만 보여주도록 수정

* refactor: UserProfileGroup에서 게스트 프로필 이미지 그대로 사용하도록 수정

* feat: Tournament Card 제목 클릭 시 토너먼트 준비/진행/결과 페이지로 이동

* fix: 화면 리사이즈 시 웹 스플래시 로고 한쪽으로 치우치는 오류 수정

* fix: QA 통합 — 토너먼트 시작 흐름 모달 / 영수증 캡처 / 초대 마감 보정 (#236) (#243)

* fix: 영수증 캡처 시 S3 이미지 CORS 차단 회피 (cacheBust false + force-cache)

* fix: 플레이 체험 게스트(CLONE)는 결과 페이지에서 전체 결과 보기 카드 숨김

* fix: 서버 ISO UTC 응답을 Z 떼지 않고 그대로 파싱 (만료됨 오표시 해결)

* fix: 초대 마감 시각 picker 가 ISO 8601 UTC 형식으로 전송하도록 변경

* fix: 휠 picker remount 방지 (key 에서 inviteExpiresAt 제거)

* chore: consolelog 삭제

* fix: 초대 마감 시 토너먼트 시작 버튼 비활성 처리

* fix: 영수증 캡처 시 상품 사진 누락 (next/image proxy URL 로 same-origin 우회)

* feat: 토너먼트 시작 전 부전승 안내 모달 추가 (2의 거듭제곱 아닌 경우)

* feat: 담기 시간 종료 시 주최자에게 자동 안내 모달 노출

* feat: 주최자 시작 SSE 신호 감지 → 참여자에게 자동 안내 모달 노출

* refactor: ConfirmStartDialog / ConfirmExitDialog 의 raw button → 공통 Button 컴포넌트 교체

* chore: format

* fix: react-hooks/set-state-in-effect lint 에러 해결 (이전 값 state 패턴으로 변경)

* style: not-found 페이지 Link 의 cursor-pointer 제거 및 canonical class 정리

* fix: 휠 picker 드래그 직후 click 이벤트가 잘못된 점프를 일으키던 문제 수정

* fix: 모달 시작 버튼 중복 mutation 호출 방지 (isPending 가드 + disabled)

* style: 위시에서 가져오기 CTA 영역 그라데이션 디자인 반영 (#245)

* style: 위시에서 가져오기 CTA 영역 그라데이션 디자인 반영

* style: 토너먼트 로딩 브라켓 아이콘 그림자 box-shadow로 변경

* style: 하단 바텀 내비 그라디언트 레이어 추가 (#247)

* style: 하단 바텀 내비 그라디언트 레이어 추가

* fix: 바텀 내비 그라디언트 포털 SSR 오류 수정 및 lint 에러 해결

* style: 토너먼트 준비 페이지 상태 라벨 주최자·참여자 디자인 통일 (#251)

* fix: 화면 확대 시 장바구니 크기 미복구 버그 수정 (#252)

* fix: 장바구니 8개 가득 찬 상태에서 아이템 삭제 시 장바구니 사라짐 버그 수정 (#254)

* fix: SSE 알림 구독 토큰 만료 시 재연결 처리 (#255)

* fix: SSE 알림 구독 토큰 만료 시 재연결 처리

* fix: SSE refresh 하드코딩 URL 상수로 교체 및 웹뷰 토큰 저장 누락 수정

* feat: 위시·토너먼트 아이템 수정 기능 개선 (#256)

* feat: 위시 Pending 상태일 때도 클릭 안 되도록 변경

* feat: item status Completed 인 경우에도 클릭 가능하도록 변경

* feat: item status Completed인 경우에 링크 갱신하는 drawer 추가

* feat: 위시, 토너먼트 아이템 Pending 상태일 때도 클릭 안 되도록 변경

* chore: 위시, 토너먼트 아이템 수정 문구 변경

* feat: 위시, 토너먼트 아이템 status = Ready인 경우 이미지 수정 불가능하도록 설정

* feat: 토너먼트 아이템 수정 기능 추가

* style: 토너먼트 아이템 수정 페이지 bg color 고정

* style: 토너먼트 아이템 수정 페이지 bg color 고정

* style: 위시 수정 페이지 스타일 변경

* feat: 링크로 토너먼트 등록 시 에러 토스트 추가

* feat: 토너먼트 아이템 수정 모든 필드 required로 변경

* feat: 위시 수정 모든 필드 required로 변경

* feat: 등록 성공한 위시 갱신 api 연결

* feat: 링크로 위시 등록 시 에러 토스트 추가

* chore: 불필요한 파일 제거

* fix: 토너먼트 아이템에 친구 프로필 얼굴 추가하도록 변경

* fix: 토너먼트 후보 Patch 누락된 에러 핸들링 추가

* refactor: 위시 수정 시 다른 액션 실행되지 않도록 설정

* style: 토너먼트 담기 화면 레이아웃 및 UI 개선 (#259)

* style: layout.tsx에서 불필요한 padding 제거

* style: 참여자 프로필 그룹 z-index 순서 수정

* style: 장바구니와 상태 라벨 사이 여백 조정

* style: 캐러셀 슬라이드 크기 비율 85%에서 90%로 변경

* feat: 토너먼트 헤더에서 뒤로가기 버튼 클릭 시 홈으로 이동하도록 수정

* feat: 장바구니 아이템 수 증가 시 알림 토스트 추가

* feat: 위시 상품 삭제 토스트 추가 및 복구 필드명 수정 (#263)

* fix: 위시 복구 요청 폼 필드명 수정 (price → currentPrice)

* feat: 위시 삭제 시 성공 토스트 메시지 추가

* fix: 애플 로그인 시 비회원으로 로그인되는 문제 수정 (#242)

* fix: Apple OAuth POST 콜백을 올바른 핸들러로 rewrite하는 미들웨어 추가

* fix: Apple OAuth POST 콜백을 proxy.ts에서 올바른 핸들러로 rewrite

* fix: 로그인 상태에서 /login 접근 시 /home으로 리다이렉트

* fix: Apple OAuth POST 콜백 rewrite를 307 redirect로 변경

* fix: Apple 콜백 route.ts 디버그 로그 추가

* fix: Apple 콜백 실패 시 에러 정보를 URL 파라미터로 전달

* fix: Apple 콜백 성공 시 307 대신 302로 리다이렉트하여 POST 루프 방지

* fix: Apple 콜백 쿠키 SameSite=Strict → Lax로 변경하여 cross-site 리다이렉트 후 인증 유지

* chore: Apple 콜백 디버그 코드 제거

* fix: 탈퇴 후 무한루프 유발하는 /login → /home 리다이렉트 제거

* fix: 애플 콜백 쿠키 SameSite 변환 코드 제거 (서버에서 Lax로 일괄 변경)

* refactor: 애플 콜백 처리 BE 이관으로 FE route.ts 및 proxy Apple POST 감지 코드 제거

* fix: 애플 로그인 redirectUri를 BE 콜백 URL로 변경

* fix: Apple getAuthUrl 호출 시 redirectUri 파라미터 제거 (BE 브릿지 URL 사용)

* fix: no-undefined lint 에러 수정

* fix: Apple redirectUri URL 조합 안전하게 수정

* fix: 토너먼트 준비 화면 실시간 아이템 상태 미반영 버그 수정  (#264)

* feat: tournament-item-parsed SSE 이벤트 처리 추가

* feat: 토너먼트 아이템 삭제 시 참여자 화면 실시간 갱신 처리 추가

* chore: 토너먼트 조회 30초 폴링 제거 (SSE로 대체)

* chore: 게스트 프로필 dice bear 처리 삭제

---------

Co-authored-by: 조영찬 <tigerbone@naver.com>
Co-authored-by: Soyeong Park <mb535622@gmail.com>
Co-authored-by: kanghaeun <145974230+kanghaeun@users.noreply.github.com>
iOdiO89 added a commit that referenced this pull request Jun 26, 2026
* feat: 위시 단일 삭제 시 삭제 성공 토스트 추가

* refactor: layout 권한 확인 시 fetchQuery 활용하여 다중 호출되지 않도록 방지

* feat: getMe 404인 경우 login 페이지로 redirect

* chore: 아카이브 페이지 props 네이밍 변경

* refactor: prefetch, getQueryState 대신 fetchQuery로 권한 검증 로직 단순화

* style: 토너먼트 담기 화면 레이아웃 및 UI 개선 (#259)

* style: layout.tsx에서 불필요한 padding 제거

* style: 참여자 프로필 그룹 z-index 순서 수정

* style: 장바구니와 상태 라벨 사이 여백 조정

* style: 캐러셀 슬라이드 크기 비율 85%에서 90%로 변경

* feat: 토너먼트 헤더에서 뒤로가기 버튼 클릭 시 홈으로 이동하도록 수정

* feat: 장바구니 아이템 수 증가 시 알림 토스트 추가

* feat: 위시 상품 삭제 토스트 추가 및 복구 필드명 수정 (#263)

* fix: 위시 복구 요청 폼 필드명 수정 (price → currentPrice)

* feat: 위시 삭제 시 성공 토스트 메시지 추가

* fix: 애플 로그인 시 비회원으로 로그인되는 문제 수정 (#242)

* fix: Apple OAuth POST 콜백을 올바른 핸들러로 rewrite하는 미들웨어 추가

* fix: Apple OAuth POST 콜백을 proxy.ts에서 올바른 핸들러로 rewrite

* fix: 로그인 상태에서 /login 접근 시 /home으로 리다이렉트

* fix: Apple OAuth POST 콜백 rewrite를 307 redirect로 변경

* fix: Apple 콜백 route.ts 디버그 로그 추가

* fix: Apple 콜백 실패 시 에러 정보를 URL 파라미터로 전달

* fix: Apple 콜백 성공 시 307 대신 302로 리다이렉트하여 POST 루프 방지

* fix: Apple 콜백 쿠키 SameSite=Strict → Lax로 변경하여 cross-site 리다이렉트 후 인증 유지

* chore: Apple 콜백 디버그 코드 제거

* fix: 탈퇴 후 무한루프 유발하는 /login → /home 리다이렉트 제거

* fix: 애플 콜백 쿠키 SameSite 변환 코드 제거 (서버에서 Lax로 일괄 변경)

* refactor: 애플 콜백 처리 BE 이관으로 FE route.ts 및 proxy Apple POST 감지 코드 제거

* fix: 애플 로그인 redirectUri를 BE 콜백 URL로 변경

* fix: Apple getAuthUrl 호출 시 redirectUri 파라미터 제거 (BE 브릿지 URL 사용)

* fix: no-undefined lint 에러 수정

* fix: Apple redirectUri URL 조합 안전하게 수정

* fix: 토너먼트 준비 화면 실시간 아이템 상태 미반영 버그 수정  (#264)

* feat: tournament-item-parsed SSE 이벤트 처리 추가

* feat: 토너먼트 아이템 삭제 시 참여자 화면 실시간 갱신 처리 추가

* chore: 토너먼트 조회 30초 폴링 제거 (SSE로 대체)

* style: 홈 토너먼트 목록 및 프로필 이미지 개선 (#265)

* feat: 홈에서 담는중, 플레이 상태인 토너먼트 카드만 보여주도록 수정

* refactor: UserProfileGroup에서 게스트 프로필 이미지 그대로 사용하도록 수정

* feat: Tournament Card 제목 클릭 시 토너먼트 준비/진행/결과 페이지로 이동

* fix: 화면 리사이즈 시 웹 스플래시 로고 한쪽으로 치우치는 오류 수정

* fix: QA 통합 — 토너먼트 시작 흐름 모달 / 영수증 캡처 / 초대 마감 보정 (#236) (#243)

* fix: 영수증 캡처 시 S3 이미지 CORS 차단 회피 (cacheBust false + force-cache)

* fix: 플레이 체험 게스트(CLONE)는 결과 페이지에서 전체 결과 보기 카드 숨김

* fix: 서버 ISO UTC 응답을 Z 떼지 않고 그대로 파싱 (만료됨 오표시 해결)

* fix: 초대 마감 시각 picker 가 ISO 8601 UTC 형식으로 전송하도록 변경

* fix: 휠 picker remount 방지 (key 에서 inviteExpiresAt 제거)

* chore: consolelog 삭제

* fix: 초대 마감 시 토너먼트 시작 버튼 비활성 처리

* fix: 영수증 캡처 시 상품 사진 누락 (next/image proxy URL 로 same-origin 우회)

* feat: 토너먼트 시작 전 부전승 안내 모달 추가 (2의 거듭제곱 아닌 경우)

* feat: 담기 시간 종료 시 주최자에게 자동 안내 모달 노출

* feat: 주최자 시작 SSE 신호 감지 → 참여자에게 자동 안내 모달 노출

* refactor: ConfirmStartDialog / ConfirmExitDialog 의 raw button → 공통 Button 컴포넌트 교체

* chore: format

* fix: react-hooks/set-state-in-effect lint 에러 해결 (이전 값 state 패턴으로 변경)

* style: not-found 페이지 Link 의 cursor-pointer 제거 및 canonical class 정리

* fix: 휠 picker 드래그 직후 click 이벤트가 잘못된 점프를 일으키던 문제 수정

* fix: 모달 시작 버튼 중복 mutation 호출 방지 (isPending 가드 + disabled)

* style: 위시에서 가져오기 CTA 영역 그라데이션 디자인 반영 (#245)

* style: 위시에서 가져오기 CTA 영역 그라데이션 디자인 반영

* style: 토너먼트 로딩 브라켓 아이콘 그림자 box-shadow로 변경

* style: 하단 바텀 내비 그라디언트 레이어 추가 (#247)

* style: 하단 바텀 내비 그라디언트 레이어 추가

* fix: 바텀 내비 그라디언트 포털 SSR 오류 수정 및 lint 에러 해결

* style: 토너먼트 준비 페이지 상태 라벨 주최자·참여자 디자인 통일 (#251)

* fix: 화면 확대 시 장바구니 크기 미복구 버그 수정 (#252)

* fix: 장바구니 8개 가득 찬 상태에서 아이템 삭제 시 장바구니 사라짐 버그 수정 (#254)

* fix: SSE 알림 구독 토큰 만료 시 재연결 처리 (#255)

* fix: SSE 알림 구독 토큰 만료 시 재연결 처리

* fix: SSE refresh 하드코딩 URL 상수로 교체 및 웹뷰 토큰 저장 누락 수정

* feat: 위시·토너먼트 아이템 수정 기능 개선 (#256)

* feat: 위시 Pending 상태일 때도 클릭 안 되도록 변경

* feat: item status Completed 인 경우에도 클릭 가능하도록 변경

* feat: item status Completed인 경우에 링크 갱신하는 drawer 추가

* feat: 위시, 토너먼트 아이템 Pending 상태일 때도 클릭 안 되도록 변경

* chore: 위시, 토너먼트 아이템 수정 문구 변경

* feat: 위시, 토너먼트 아이템 status = Ready인 경우 이미지 수정 불가능하도록 설정

* feat: 토너먼트 아이템 수정 기능 추가

* style: 토너먼트 아이템 수정 페이지 bg color 고정

* style: 토너먼트 아이템 수정 페이지 bg color 고정

* style: 위시 수정 페이지 스타일 변경

* feat: 링크로 토너먼트 등록 시 에러 토스트 추가

* feat: 토너먼트 아이템 수정 모든 필드 required로 변경

* feat: 위시 수정 모든 필드 required로 변경

* feat: 등록 성공한 위시 갱신 api 연결

* feat: 링크로 위시 등록 시 에러 토스트 추가

* chore: 불필요한 파일 제거

* fix: 토너먼트 아이템에 친구 프로필 얼굴 추가하도록 변경

* fix: 토너먼트 후보 Patch 누락된 에러 핸들링 추가

* refactor: 위시 수정 시 다른 액션 실행되지 않도록 설정

* style: 토너먼트 담기 화면 레이아웃 및 UI 개선 (#259)

* style: layout.tsx에서 불필요한 padding 제거

* style: 참여자 프로필 그룹 z-index 순서 수정

* style: 장바구니와 상태 라벨 사이 여백 조정

* style: 캐러셀 슬라이드 크기 비율 85%에서 90%로 변경

* feat: 토너먼트 헤더에서 뒤로가기 버튼 클릭 시 홈으로 이동하도록 수정

* feat: 장바구니 아이템 수 증가 시 알림 토스트 추가

* feat: 위시 상품 삭제 토스트 추가 및 복구 필드명 수정 (#263)

* fix: 위시 복구 요청 폼 필드명 수정 (price → currentPrice)

* feat: 위시 삭제 시 성공 토스트 메시지 추가

* fix: 애플 로그인 시 비회원으로 로그인되는 문제 수정 (#242)

* fix: Apple OAuth POST 콜백을 올바른 핸들러로 rewrite하는 미들웨어 추가

* fix: Apple OAuth POST 콜백을 proxy.ts에서 올바른 핸들러로 rewrite

* fix: 로그인 상태에서 /login 접근 시 /home으로 리다이렉트

* fix: Apple OAuth POST 콜백 rewrite를 307 redirect로 변경

* fix: Apple 콜백 route.ts 디버그 로그 추가

* fix: Apple 콜백 실패 시 에러 정보를 URL 파라미터로 전달

* fix: Apple 콜백 성공 시 307 대신 302로 리다이렉트하여 POST 루프 방지

* fix: Apple 콜백 쿠키 SameSite=Strict → Lax로 변경하여 cross-site 리다이렉트 후 인증 유지

* chore: Apple 콜백 디버그 코드 제거

* fix: 탈퇴 후 무한루프 유발하는 /login → /home 리다이렉트 제거

* fix: 애플 콜백 쿠키 SameSite 변환 코드 제거 (서버에서 Lax로 일괄 변경)

* refactor: 애플 콜백 처리 BE 이관으로 FE route.ts 및 proxy Apple POST 감지 코드 제거

* fix: 애플 로그인 redirectUri를 BE 콜백 URL로 변경

* fix: Apple getAuthUrl 호출 시 redirectUri 파라미터 제거 (BE 브릿지 URL 사용)

* fix: no-undefined lint 에러 수정

* fix: Apple redirectUri URL 조합 안전하게 수정

* fix: 토너먼트 준비 화면 실시간 아이템 상태 미반영 버그 수정  (#264)

* feat: tournament-item-parsed SSE 이벤트 처리 추가

* feat: 토너먼트 아이템 삭제 시 참여자 화면 실시간 갱신 처리 추가

* chore: 토너먼트 조회 30초 폴링 제거 (SSE로 대체)

* chore: 게스트 프로필 dice bear 처리 삭제

---------

Co-authored-by: 조영찬 <tigerbone@naver.com>
Co-authored-by: Soyeong Park <mb535622@gmail.com>
Co-authored-by: kanghaeun <145974230+kanghaeun@users.noreply.github.com>

* feat: Firebase Analytics 연동 (앱 사용자 행동 분석) (#258)

* feat: Firebase Analytics (GA4) 연동 + 핵심 9개 이벤트 로깅

* feat: GA4 web stream 추가 (@next/third-parties) + 환경별 분기 로직

* fix: TOURNAMENT_COMPLETE 이벤트가 tournamentId 변경을 추적하도록 의존성 보강

* fix: firebase 패키지 버전 불일치로 인한 런타임 에러 가능성 제거

* feat: GA4 funnel 이벤트 보강 + iOS Analytics 빌드 fix (#268)

* fix: app.json 에 @react-native-firebase/analytics 플러그인 + forceStaticLinking 추가

* feat: GA4 이벤트 시안 기준 보강 (wish_add_start, social_invite_click, guest_visit 추가 + 이벤트명 정리)

* fix: 영수증 화면 상품 사진 미표시 및 긴 상품명 넘침 수정 (#271)

* fix: 영수증 상품 사진 미표시 수정 (_next/image 허용 width 사용)

* fix: 영수증 상품명 줄바꿈처리

* feat: 담기 마감 동작 개선 (협업 의도 판정 + 이어서 담기) (#272)

* feat: 담기 마감 모달에 '이어서 담기' 버튼 추가

* feat: 초대 보냈거나 친구 합류한 토너먼트만 담기 타이머 노출

* fix: refresh_token 동시 호출로 인한 자동 로그아웃 수정 (rotation 대응 dedupe) (#273)

* fix: SSE 의 refresh 가 별도 경로로 호출되어 race 발생하던 문제 수정 (#274)

* refactor: 홈 페이지 단위 await 제거 후 tournamentList 범위에만 await 설정

* refactor: WishCard 이미지 로딩 시 Skeleton 사용

* fix: BaseImage loading -> success로 전환되는 시점에 아무것도 뜨지 않는 현상 해결

* refactor: Archive 페이지 초기 페이지 진입 속도 개선

* refactor: UserProfile image 로딩 시 skeleton 적용

* chore: fix import error

* chore: 불필요한 eas 파일 삭제

* perf: wishcard 이미지 preload 최적화 및 LCP 지표 개선

* refactor: queryClient 캐싱 추가

* refactor: Button Spinner dynamic import 로 변경

* refactor: query client 캐시 스코프 변경

* chore: 아카이브/위시 - main 태그 하나만 사용하도록 변경

* fix: 아카이브, 마이페이지 처리되지 않은 에러는 throw되도록 처리

* chore: 위시 삭제 토스트 중복 제거

* refactor: 위시 수정 - layout으로 페이지 진입 권한 확인 분리

* fix: 토너먼트 Pick 뱃지 이미지보다 뒤에 뜨는 현상 제거

* fix: 토너먼트 준비 페이지 헤더 center text 잘림 현상 해결

* fix: 등록 실패한 위시도 삭제 가능하도록 버튼 추가

* fix: 앱 KeyboardAvoidingView 제거

* fix: 프로필 이미지 zindex 수정

* chore: 아카이브 페이지 main 태그 한개로 유지

* chore: 불필요한 403 에러 처리 삭제

* style: TournamentCard 텍스트 줄바꿈되는 경우 대응

* refactor: 위시 저장/삭제/수정 동시에 일어날 수 없도록 disabled 처리

---------

Co-authored-by: kanghaeun <145974230+kanghaeun@users.noreply.github.com>
Co-authored-by: Soyeong Park <mb535622@gmail.com>
Co-authored-by: 조영찬 <tigerbone@naver.com>
iOdiO89 pushed a commit that referenced this pull request Jul 19, 2026
* feat: tournament-item-parsed SSE 이벤트 처리 추가

* feat: 토너먼트 아이템 삭제 시 참여자 화면 실시간 갱신 처리 추가

* chore: 토너먼트 조회 30초 폴링 제거 (SSE로 대체)
iOdiO89 added a commit that referenced this pull request Jul 19, 2026
* feat: 홈에서 담는중, 플레이 상태인 토너먼트 카드만 보여주도록 수정

* refactor: UserProfileGroup에서 게스트 프로필 이미지 그대로 사용하도록 수정

* feat: Tournament Card 제목 클릭 시 토너먼트 준비/진행/결과 페이지로 이동

* fix: 화면 리사이즈 시 웹 스플래시 로고 한쪽으로 치우치는 오류 수정

* fix: QA 통합 — 토너먼트 시작 흐름 모달 / 영수증 캡처 / 초대 마감 보정 (#236) (#243)

* fix: 영수증 캡처 시 S3 이미지 CORS 차단 회피 (cacheBust false + force-cache)

* fix: 플레이 체험 게스트(CLONE)는 결과 페이지에서 전체 결과 보기 카드 숨김

* fix: 서버 ISO UTC 응답을 Z 떼지 않고 그대로 파싱 (만료됨 오표시 해결)

* fix: 초대 마감 시각 picker 가 ISO 8601 UTC 형식으로 전송하도록 변경

* fix: 휠 picker remount 방지 (key 에서 inviteExpiresAt 제거)

* chore: consolelog 삭제

* fix: 초대 마감 시 토너먼트 시작 버튼 비활성 처리

* fix: 영수증 캡처 시 상품 사진 누락 (next/image proxy URL 로 same-origin 우회)

* feat: 토너먼트 시작 전 부전승 안내 모달 추가 (2의 거듭제곱 아닌 경우)

* feat: 담기 시간 종료 시 주최자에게 자동 안내 모달 노출

* feat: 주최자 시작 SSE 신호 감지 → 참여자에게 자동 안내 모달 노출

* refactor: ConfirmStartDialog / ConfirmExitDialog 의 raw button → 공통 Button 컴포넌트 교체

* chore: format

* fix: react-hooks/set-state-in-effect lint 에러 해결 (이전 값 state 패턴으로 변경)

* style: not-found 페이지 Link 의 cursor-pointer 제거 및 canonical class 정리

* fix: 휠 picker 드래그 직후 click 이벤트가 잘못된 점프를 일으키던 문제 수정

* fix: 모달 시작 버튼 중복 mutation 호출 방지 (isPending 가드 + disabled)

* style: 위시에서 가져오기 CTA 영역 그라데이션 디자인 반영 (#245)

* style: 위시에서 가져오기 CTA 영역 그라데이션 디자인 반영

* style: 토너먼트 로딩 브라켓 아이콘 그림자 box-shadow로 변경

* style: 하단 바텀 내비 그라디언트 레이어 추가 (#247)

* style: 하단 바텀 내비 그라디언트 레이어 추가

* fix: 바텀 내비 그라디언트 포털 SSR 오류 수정 및 lint 에러 해결

* style: 토너먼트 준비 페이지 상태 라벨 주최자·참여자 디자인 통일 (#251)

* fix: 화면 확대 시 장바구니 크기 미복구 버그 수정 (#252)

* fix: 장바구니 8개 가득 찬 상태에서 아이템 삭제 시 장바구니 사라짐 버그 수정 (#254)

* fix: SSE 알림 구독 토큰 만료 시 재연결 처리 (#255)

* fix: SSE 알림 구독 토큰 만료 시 재연결 처리

* fix: SSE refresh 하드코딩 URL 상수로 교체 및 웹뷰 토큰 저장 누락 수정

* feat: 위시·토너먼트 아이템 수정 기능 개선 (#256)

* feat: 위시 Pending 상태일 때도 클릭 안 되도록 변경

* feat: item status Completed 인 경우에도 클릭 가능하도록 변경

* feat: item status Completed인 경우에 링크 갱신하는 drawer 추가

* feat: 위시, 토너먼트 아이템 Pending 상태일 때도 클릭 안 되도록 변경

* chore: 위시, 토너먼트 아이템 수정 문구 변경

* feat: 위시, 토너먼트 아이템 status = Ready인 경우 이미지 수정 불가능하도록 설정

* feat: 토너먼트 아이템 수정 기능 추가

* style: 토너먼트 아이템 수정 페이지 bg color 고정

* style: 토너먼트 아이템 수정 페이지 bg color 고정

* style: 위시 수정 페이지 스타일 변경

* feat: 링크로 토너먼트 등록 시 에러 토스트 추가

* feat: 토너먼트 아이템 수정 모든 필드 required로 변경

* feat: 위시 수정 모든 필드 required로 변경

* feat: 등록 성공한 위시 갱신 api 연결

* feat: 링크로 위시 등록 시 에러 토스트 추가

* chore: 불필요한 파일 제거

* fix: 토너먼트 아이템에 친구 프로필 얼굴 추가하도록 변경

* fix: 토너먼트 후보 Patch 누락된 에러 핸들링 추가

* refactor: 위시 수정 시 다른 액션 실행되지 않도록 설정

* style: 토너먼트 담기 화면 레이아웃 및 UI 개선 (#259)

* style: layout.tsx에서 불필요한 padding 제거

* style: 참여자 프로필 그룹 z-index 순서 수정

* style: 장바구니와 상태 라벨 사이 여백 조정

* style: 캐러셀 슬라이드 크기 비율 85%에서 90%로 변경

* feat: 토너먼트 헤더에서 뒤로가기 버튼 클릭 시 홈으로 이동하도록 수정

* feat: 장바구니 아이템 수 증가 시 알림 토스트 추가

* feat: 위시 상품 삭제 토스트 추가 및 복구 필드명 수정 (#263)

* fix: 위시 복구 요청 폼 필드명 수정 (price → currentPrice)

* feat: 위시 삭제 시 성공 토스트 메시지 추가

* fix: 애플 로그인 시 비회원으로 로그인되는 문제 수정 (#242)

* fix: Apple OAuth POST 콜백을 올바른 핸들러로 rewrite하는 미들웨어 추가

* fix: Apple OAuth POST 콜백을 proxy.ts에서 올바른 핸들러로 rewrite

* fix: 로그인 상태에서 /login 접근 시 /home으로 리다이렉트

* fix: Apple OAuth POST 콜백 rewrite를 307 redirect로 변경

* fix: Apple 콜백 route.ts 디버그 로그 추가

* fix: Apple 콜백 실패 시 에러 정보를 URL 파라미터로 전달

* fix: Apple 콜백 성공 시 307 대신 302로 리다이렉트하여 POST 루프 방지

* fix: Apple 콜백 쿠키 SameSite=Strict → Lax로 변경하여 cross-site 리다이렉트 후 인증 유지

* chore: Apple 콜백 디버그 코드 제거

* fix: 탈퇴 후 무한루프 유발하는 /login → /home 리다이렉트 제거

* fix: 애플 콜백 쿠키 SameSite 변환 코드 제거 (서버에서 Lax로 일괄 변경)

* refactor: 애플 콜백 처리 BE 이관으로 FE route.ts 및 proxy Apple POST 감지 코드 제거

* fix: 애플 로그인 redirectUri를 BE 콜백 URL로 변경

* fix: Apple getAuthUrl 호출 시 redirectUri 파라미터 제거 (BE 브릿지 URL 사용)

* fix: no-undefined lint 에러 수정

* fix: Apple redirectUri URL 조합 안전하게 수정

* fix: 토너먼트 준비 화면 실시간 아이템 상태 미반영 버그 수정  (#264)

* feat: tournament-item-parsed SSE 이벤트 처리 추가

* feat: 토너먼트 아이템 삭제 시 참여자 화면 실시간 갱신 처리 추가

* chore: 토너먼트 조회 30초 폴링 제거 (SSE로 대체)

* chore: 게스트 프로필 dice bear 처리 삭제

---------

Co-authored-by: 조영찬 <tigerbone@naver.com>
Co-authored-by: Soyeong Park <mb535622@gmail.com>
Co-authored-by: kanghaeun <145974230+kanghaeun@users.noreply.github.com>
iOdiO89 added a commit that referenced this pull request Jul 19, 2026
* feat: 위시 단일 삭제 시 삭제 성공 토스트 추가

* refactor: layout 권한 확인 시 fetchQuery 활용하여 다중 호출되지 않도록 방지

* feat: getMe 404인 경우 login 페이지로 redirect

* chore: 아카이브 페이지 props 네이밍 변경

* refactor: prefetch, getQueryState 대신 fetchQuery로 권한 검증 로직 단순화

* style: 토너먼트 담기 화면 레이아웃 및 UI 개선 (#259)

* style: layout.tsx에서 불필요한 padding 제거

* style: 참여자 프로필 그룹 z-index 순서 수정

* style: 장바구니와 상태 라벨 사이 여백 조정

* style: 캐러셀 슬라이드 크기 비율 85%에서 90%로 변경

* feat: 토너먼트 헤더에서 뒤로가기 버튼 클릭 시 홈으로 이동하도록 수정

* feat: 장바구니 아이템 수 증가 시 알림 토스트 추가

* feat: 위시 상품 삭제 토스트 추가 및 복구 필드명 수정 (#263)

* fix: 위시 복구 요청 폼 필드명 수정 (price → currentPrice)

* feat: 위시 삭제 시 성공 토스트 메시지 추가

* fix: 애플 로그인 시 비회원으로 로그인되는 문제 수정 (#242)

* fix: Apple OAuth POST 콜백을 올바른 핸들러로 rewrite하는 미들웨어 추가

* fix: Apple OAuth POST 콜백을 proxy.ts에서 올바른 핸들러로 rewrite

* fix: 로그인 상태에서 /login 접근 시 /home으로 리다이렉트

* fix: Apple OAuth POST 콜백 rewrite를 307 redirect로 변경

* fix: Apple 콜백 route.ts 디버그 로그 추가

* fix: Apple 콜백 실패 시 에러 정보를 URL 파라미터로 전달

* fix: Apple 콜백 성공 시 307 대신 302로 리다이렉트하여 POST 루프 방지

* fix: Apple 콜백 쿠키 SameSite=Strict → Lax로 변경하여 cross-site 리다이렉트 후 인증 유지

* chore: Apple 콜백 디버그 코드 제거

* fix: 탈퇴 후 무한루프 유발하는 /login → /home 리다이렉트 제거

* fix: 애플 콜백 쿠키 SameSite 변환 코드 제거 (서버에서 Lax로 일괄 변경)

* refactor: 애플 콜백 처리 BE 이관으로 FE route.ts 및 proxy Apple POST 감지 코드 제거

* fix: 애플 로그인 redirectUri를 BE 콜백 URL로 변경

* fix: Apple getAuthUrl 호출 시 redirectUri 파라미터 제거 (BE 브릿지 URL 사용)

* fix: no-undefined lint 에러 수정

* fix: Apple redirectUri URL 조합 안전하게 수정

* fix: 토너먼트 준비 화면 실시간 아이템 상태 미반영 버그 수정  (#264)

* feat: tournament-item-parsed SSE 이벤트 처리 추가

* feat: 토너먼트 아이템 삭제 시 참여자 화면 실시간 갱신 처리 추가

* chore: 토너먼트 조회 30초 폴링 제거 (SSE로 대체)

* style: 홈 토너먼트 목록 및 프로필 이미지 개선 (#265)

* feat: 홈에서 담는중, 플레이 상태인 토너먼트 카드만 보여주도록 수정

* refactor: UserProfileGroup에서 게스트 프로필 이미지 그대로 사용하도록 수정

* feat: Tournament Card 제목 클릭 시 토너먼트 준비/진행/결과 페이지로 이동

* fix: 화면 리사이즈 시 웹 스플래시 로고 한쪽으로 치우치는 오류 수정

* fix: QA 통합 — 토너먼트 시작 흐름 모달 / 영수증 캡처 / 초대 마감 보정 (#236) (#243)

* fix: 영수증 캡처 시 S3 이미지 CORS 차단 회피 (cacheBust false + force-cache)

* fix: 플레이 체험 게스트(CLONE)는 결과 페이지에서 전체 결과 보기 카드 숨김

* fix: 서버 ISO UTC 응답을 Z 떼지 않고 그대로 파싱 (만료됨 오표시 해결)

* fix: 초대 마감 시각 picker 가 ISO 8601 UTC 형식으로 전송하도록 변경

* fix: 휠 picker remount 방지 (key 에서 inviteExpiresAt 제거)

* chore: consolelog 삭제

* fix: 초대 마감 시 토너먼트 시작 버튼 비활성 처리

* fix: 영수증 캡처 시 상품 사진 누락 (next/image proxy URL 로 same-origin 우회)

* feat: 토너먼트 시작 전 부전승 안내 모달 추가 (2의 거듭제곱 아닌 경우)

* feat: 담기 시간 종료 시 주최자에게 자동 안내 모달 노출

* feat: 주최자 시작 SSE 신호 감지 → 참여자에게 자동 안내 모달 노출

* refactor: ConfirmStartDialog / ConfirmExitDialog 의 raw button → 공통 Button 컴포넌트 교체

* chore: format

* fix: react-hooks/set-state-in-effect lint 에러 해결 (이전 값 state 패턴으로 변경)

* style: not-found 페이지 Link 의 cursor-pointer 제거 및 canonical class 정리

* fix: 휠 picker 드래그 직후 click 이벤트가 잘못된 점프를 일으키던 문제 수정

* fix: 모달 시작 버튼 중복 mutation 호출 방지 (isPending 가드 + disabled)

* style: 위시에서 가져오기 CTA 영역 그라데이션 디자인 반영 (#245)

* style: 위시에서 가져오기 CTA 영역 그라데이션 디자인 반영

* style: 토너먼트 로딩 브라켓 아이콘 그림자 box-shadow로 변경

* style: 하단 바텀 내비 그라디언트 레이어 추가 (#247)

* style: 하단 바텀 내비 그라디언트 레이어 추가

* fix: 바텀 내비 그라디언트 포털 SSR 오류 수정 및 lint 에러 해결

* style: 토너먼트 준비 페이지 상태 라벨 주최자·참여자 디자인 통일 (#251)

* fix: 화면 확대 시 장바구니 크기 미복구 버그 수정 (#252)

* fix: 장바구니 8개 가득 찬 상태에서 아이템 삭제 시 장바구니 사라짐 버그 수정 (#254)

* fix: SSE 알림 구독 토큰 만료 시 재연결 처리 (#255)

* fix: SSE 알림 구독 토큰 만료 시 재연결 처리

* fix: SSE refresh 하드코딩 URL 상수로 교체 및 웹뷰 토큰 저장 누락 수정

* feat: 위시·토너먼트 아이템 수정 기능 개선 (#256)

* feat: 위시 Pending 상태일 때도 클릭 안 되도록 변경

* feat: item status Completed 인 경우에도 클릭 가능하도록 변경

* feat: item status Completed인 경우에 링크 갱신하는 drawer 추가

* feat: 위시, 토너먼트 아이템 Pending 상태일 때도 클릭 안 되도록 변경

* chore: 위시, 토너먼트 아이템 수정 문구 변경

* feat: 위시, 토너먼트 아이템 status = Ready인 경우 이미지 수정 불가능하도록 설정

* feat: 토너먼트 아이템 수정 기능 추가

* style: 토너먼트 아이템 수정 페이지 bg color 고정

* style: 토너먼트 아이템 수정 페이지 bg color 고정

* style: 위시 수정 페이지 스타일 변경

* feat: 링크로 토너먼트 등록 시 에러 토스트 추가

* feat: 토너먼트 아이템 수정 모든 필드 required로 변경

* feat: 위시 수정 모든 필드 required로 변경

* feat: 등록 성공한 위시 갱신 api 연결

* feat: 링크로 위시 등록 시 에러 토스트 추가

* chore: 불필요한 파일 제거

* fix: 토너먼트 아이템에 친구 프로필 얼굴 추가하도록 변경

* fix: 토너먼트 후보 Patch 누락된 에러 핸들링 추가

* refactor: 위시 수정 시 다른 액션 실행되지 않도록 설정

* style: 토너먼트 담기 화면 레이아웃 및 UI 개선 (#259)

* style: layout.tsx에서 불필요한 padding 제거

* style: 참여자 프로필 그룹 z-index 순서 수정

* style: 장바구니와 상태 라벨 사이 여백 조정

* style: 캐러셀 슬라이드 크기 비율 85%에서 90%로 변경

* feat: 토너먼트 헤더에서 뒤로가기 버튼 클릭 시 홈으로 이동하도록 수정

* feat: 장바구니 아이템 수 증가 시 알림 토스트 추가

* feat: 위시 상품 삭제 토스트 추가 및 복구 필드명 수정 (#263)

* fix: 위시 복구 요청 폼 필드명 수정 (price → currentPrice)

* feat: 위시 삭제 시 성공 토스트 메시지 추가

* fix: 애플 로그인 시 비회원으로 로그인되는 문제 수정 (#242)

* fix: Apple OAuth POST 콜백을 올바른 핸들러로 rewrite하는 미들웨어 추가

* fix: Apple OAuth POST 콜백을 proxy.ts에서 올바른 핸들러로 rewrite

* fix: 로그인 상태에서 /login 접근 시 /home으로 리다이렉트

* fix: Apple OAuth POST 콜백 rewrite를 307 redirect로 변경

* fix: Apple 콜백 route.ts 디버그 로그 추가

* fix: Apple 콜백 실패 시 에러 정보를 URL 파라미터로 전달

* fix: Apple 콜백 성공 시 307 대신 302로 리다이렉트하여 POST 루프 방지

* fix: Apple 콜백 쿠키 SameSite=Strict → Lax로 변경하여 cross-site 리다이렉트 후 인증 유지

* chore: Apple 콜백 디버그 코드 제거

* fix: 탈퇴 후 무한루프 유발하는 /login → /home 리다이렉트 제거

* fix: 애플 콜백 쿠키 SameSite 변환 코드 제거 (서버에서 Lax로 일괄 변경)

* refactor: 애플 콜백 처리 BE 이관으로 FE route.ts 및 proxy Apple POST 감지 코드 제거

* fix: 애플 로그인 redirectUri를 BE 콜백 URL로 변경

* fix: Apple getAuthUrl 호출 시 redirectUri 파라미터 제거 (BE 브릿지 URL 사용)

* fix: no-undefined lint 에러 수정

* fix: Apple redirectUri URL 조합 안전하게 수정

* fix: 토너먼트 준비 화면 실시간 아이템 상태 미반영 버그 수정  (#264)

* feat: tournament-item-parsed SSE 이벤트 처리 추가

* feat: 토너먼트 아이템 삭제 시 참여자 화면 실시간 갱신 처리 추가

* chore: 토너먼트 조회 30초 폴링 제거 (SSE로 대체)

* chore: 게스트 프로필 dice bear 처리 삭제

---------

Co-authored-by: 조영찬 <tigerbone@naver.com>
Co-authored-by: Soyeong Park <mb535622@gmail.com>
Co-authored-by: kanghaeun <145974230+kanghaeun@users.noreply.github.com>

* feat: Firebase Analytics 연동 (앱 사용자 행동 분석) (#258)

* feat: Firebase Analytics (GA4) 연동 + 핵심 9개 이벤트 로깅

* feat: GA4 web stream 추가 (@next/third-parties) + 환경별 분기 로직

* fix: TOURNAMENT_COMPLETE 이벤트가 tournamentId 변경을 추적하도록 의존성 보강

* fix: firebase 패키지 버전 불일치로 인한 런타임 에러 가능성 제거

* feat: GA4 funnel 이벤트 보강 + iOS Analytics 빌드 fix (#268)

* fix: app.json 에 @react-native-firebase/analytics 플러그인 + forceStaticLinking 추가

* feat: GA4 이벤트 시안 기준 보강 (wish_add_start, social_invite_click, guest_visit 추가 + 이벤트명 정리)

* fix: 영수증 화면 상품 사진 미표시 및 긴 상품명 넘침 수정 (#271)

* fix: 영수증 상품 사진 미표시 수정 (_next/image 허용 width 사용)

* fix: 영수증 상품명 줄바꿈처리

* feat: 담기 마감 동작 개선 (협업 의도 판정 + 이어서 담기) (#272)

* feat: 담기 마감 모달에 '이어서 담기' 버튼 추가

* feat: 초대 보냈거나 친구 합류한 토너먼트만 담기 타이머 노출

* fix: refresh_token 동시 호출로 인한 자동 로그아웃 수정 (rotation 대응 dedupe) (#273)

* fix: SSE 의 refresh 가 별도 경로로 호출되어 race 발생하던 문제 수정 (#274)

* refactor: 홈 페이지 단위 await 제거 후 tournamentList 범위에만 await 설정

* refactor: WishCard 이미지 로딩 시 Skeleton 사용

* fix: BaseImage loading -> success로 전환되는 시점에 아무것도 뜨지 않는 현상 해결

* refactor: Archive 페이지 초기 페이지 진입 속도 개선

* refactor: UserProfile image 로딩 시 skeleton 적용

* chore: fix import error

* chore: 불필요한 eas 파일 삭제

* perf: wishcard 이미지 preload 최적화 및 LCP 지표 개선

* refactor: queryClient 캐싱 추가

* refactor: Button Spinner dynamic import 로 변경

* refactor: query client 캐시 스코프 변경

* chore: 아카이브/위시 - main 태그 하나만 사용하도록 변경

* fix: 아카이브, 마이페이지 처리되지 않은 에러는 throw되도록 처리

* chore: 위시 삭제 토스트 중복 제거

* refactor: 위시 수정 - layout으로 페이지 진입 권한 확인 분리

* fix: 토너먼트 Pick 뱃지 이미지보다 뒤에 뜨는 현상 제거

* fix: 토너먼트 준비 페이지 헤더 center text 잘림 현상 해결

* fix: 등록 실패한 위시도 삭제 가능하도록 버튼 추가

* fix: 앱 KeyboardAvoidingView 제거

* fix: 프로필 이미지 zindex 수정

* chore: 아카이브 페이지 main 태그 한개로 유지

* chore: 불필요한 403 에러 처리 삭제

* style: TournamentCard 텍스트 줄바꿈되는 경우 대응

* refactor: 위시 저장/삭제/수정 동시에 일어날 수 없도록 disabled 처리

---------

Co-authored-by: kanghaeun <145974230+kanghaeun@users.noreply.github.com>
Co-authored-by: Soyeong Park <mb535622@gmail.com>
Co-authored-by: 조영찬 <tigerbone@naver.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

fix Something isn't working

Projects

None yet

1 participant