Skip to content

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

Merged
ychany merged 6 commits into
devfrom
feat/257-firebase-analytics
Jun 19, 2026
Merged

feat: Firebase Analytics 연동 (앱 사용자 행동 분석)#258
ychany merged 6 commits into
devfrom
feat/257-firebase-analytics

Conversation

@ychany

@ychany ychany commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

작업 요약

  • Firebase Analytics (GA4) 연동 — 앱/웹뷰 통합 추적
  • 핵심 funnel + 사용자 행동 9개 이벤트 부착
  • webBridge 로 웹 → 앱 메시지 타입 추가 (LOG_ANALYTICS_EVENT)

작업 세부 내용

인프라

  • packages/coreWEB_REQ_LOG_ANALYTICS_EVENT 메시지 타입 정의
  • apps/app@react-native-firebase/analytics 설치 + 헬퍼 (utils/analytics.ts)
  • 앱 진입 시 logAppOpen() 호출
  • webBridge onMessage 핸들러에 케이스 추가 → analytics().logEvent 위임
  • apps/web 에 이벤트 상수 / 헬퍼 (consts/analytics.ts, utils/analytics.ts)
  • 웹 → 앱 통합으로 사용자 1명 = 1 ID, 일관된 측정

부착된 이벤트 (9종)

  • funnel: sign_up_complete, wish_add, tournament_create, tournament_start, tournament_complete
  • 사용자 행동: friend_invite_send, friend_join, receipt_share, play_link_share, invite_expiry_change

PII 처리

  • 모든 params 는 ID(number) 또는 enum-like 상수만 전송
  • 닉네임/이메일/실명 등은 일절 전달하지 않음

검증

  • TypeScript (web + app) 통과
  • ESLint (변경 영역) 에러 0
  • 네이티브 모듈이라 pnpm expo prebuild --clean 후 iOS/Android 빌드 필요

연관 이슈

closes #257

Summary by CodeRabbit

릴리스 노트

  • Chores
    • Firebase/GA4 기반 사용자 행동 분석이 도입/확장되었습니다.
    • 앱 진입 시 분석 세션이 시작되고, 웹뷰에서는 분석 이벤트가 네이티브로 전달되어 중복 집계를 방지합니다.
    • 웹에서는 설정된 경우에만 GA4가 활성화됩니다.
    • 회원가입, 토너먼트 생성/시작/완료, 친구 초대·조인, 영수증/플레이 링크 공유, 위시 추가, 초대 만료 변경 등 주요 흐름의 이벤트가 기록됩니다.

@vercel

vercel Bot commented Jun 18, 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 7:45am

@github-actions

Copy link
Copy Markdown

No description provided.

@github-actions github-actions Bot added APP Good for newcomers feature New feature or request WEB labels Jun 18, 2026
@coderabbitai

coderabbitai Bot commented Jun 18, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@ychany, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 49 minutes and 28 seconds. Learn how PR review limits work.

Your organization has used up its prepaid credits, and credit purchases are no longer available. Enable the review add-on in the billing tab to keep reviews running — you're only billed for reviews past your plan's rate limits ($0.25/file).

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based credits.

🚦 How do rate limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan refill rate.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, the refill rate gradually slows as usage increases. The highest same-day bursts are limited more strictly.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 928eca80-311f-401b-85c2-982cd2e0ec3e

📥 Commits

Reviewing files that changed from the base of the PR and between c60c237 and ecb5309.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (3)
  • apps/app/package.json
  • apps/web/src/app/layout.tsx
  • apps/web/src/app/tournament/[id]/result/_components/ResultClient.tsx

Walkthrough

packages/core에 WebBridge 분석 메시지 타입과 WEB_REQ_LOG_ANALYTICS_EVENT 상수를 추가하고, apps/app에 Firebase Analytics 유틸(logAnalyticsEvent, logAppOpenEvent)과 브릿지 핸들러를 구현하며, apps/web에 이벤트 상수·웹 유틸을 신규 작성하고 GA4 웹 스트림을 설정한 후 주요 사용자 행동 훅/컴포넌트 13곳에 이벤트 로깅 호출을 추가한다.

Changes

Firebase Analytics WebBridge 연동

Layer / File(s) Summary
공유 타입 및 WebBridge 메시지 상수
packages/core/src/types/analytics.ts, packages/core/src/consts/webBridge.ts, packages/core/src/types/webBridge.ts, packages/core/src/index.ts
AnalyticsEventParamT, AnalyticsEventParamsT, LogAnalyticsEventPayloadT, WebReqLogAnalyticsEventMessageT 타입 4종을 신규 정의하고, WEBBRIDGE_MESSAGE_TYPE.WEB_REQ_LOG_ANALYTICS_EVENT 상수를 추가하며, WebBridgeMessageT 유니온에 새 메시지 타입을 포함시켜 core에서 재노출한다.
네이티브 앱 Analytics 유틸 및 브릿지 핸들러
apps/app/package.json, apps/app/utils/analytics.ts, apps/app/app/index.tsx
@react-native-firebase/analytics 의존성을 추가하고, 예외 비전파 방식의 logAnalyticsEvent/logAppOpenEvent 유틸을 신규 작성한다. 앱 진입 시 logAppOpenEvent를 호출하고, WebBridge switch에 WEB_REQ_LOG_ANALYTICS_EVENT 케이스를 추가해 웹에서 전달된 이벤트를 Firebase Analytics로 기록한다.
웹 Analytics 유틸 및 이벤트 상수
apps/web/src/consts/analytics.ts, apps/web/src/utils/analytics.ts
ANALYTICS_EVENT 상수 객체(13개 이벤트명)와 AnalyticsEventNameT 타입을 신규 정의하고, logAnalyticsEvent 유틸을 작성해 웹뷰에서는 WebBridge.postMessage로 네이티브에, 일반 브라우저에서는 window.gtag로 이벤트를 전달한다.
GA4 웹 스트림 설정 및 의존성
apps/web/package.json, apps/web/src/app/layout.tsx
@next/third-parties 의존성을 추가하고 RootLayout에서 GoogleAnalytics 컴포넌트를 조건부 렌더링한다: 웹뷰(!isWebview) 환경에서는 중복 집계를 방지하고, 일반 브라우저 환경에서만 NEXT_PUBLIC_GA_ID가 설정된 경우 GA4 웹 스트림을 활성화한다.
웹 훅·컴포넌트 이벤트 호출 추가
apps/web/src/app/auth/callback/.../usePostSocialLogin.ts, apps/web/src/app/home/_hooks/usePostCreateTournament.ts, apps/web/src/hooks/usePostWishLink.ts, apps/web/src/hooks/usePostWishOCR.ts, apps/web/src/app/tournament/[id]/create/..., apps/web/src/app/tournament/[id]/result/..., apps/web/src/app/tournament/join/_hooks/...
소셜 로그인 완료(SIGN_UP_COMPLETE), 위시 추가(WISH_ADD), 토너먼트 생성/시작/완료(TOURNAMENT_*), 친구 초대 전송/합류/공유(FRIEND_*, RECEIPT_SHARE, PLAY_LINK_SHARE), 초대 만료 변경(INVITE_EXPIRY_CHANGE) 등 13개의 사용자 행동 시점에 logAnalyticsEvent 호출을 추가한다. ResultClient에는 COMPLETED 상태 진입 시 1회 실행되는 useEffect도 신설된다.

Sequence Diagram(s)

sequenceDiagram
  rect rgba(135, 206, 235, 0.5)
    note over 웹훅,WebBridge: 웹뷰 (apps/web)
    participant 웹훅 as 웹 훅/컴포넌트
    participant logEvent_web as logAnalyticsEvent (web util)
    participant WebBridge as WebBridge.postMessage
  end
  rect rgba(144, 238, 144, 0.5)
    note over AppIndex,FirebaseSDK: 네이티브 앱 (apps/app)
    participant AppIndex as app/index.tsx
    participant logEvent_app as logAnalyticsEvent (app util)
    participant FirebaseSDK as Firebase Analytics SDK
  end

  웹훅->>logEvent_web: logAnalyticsEvent(ANALYTICS_EVENT.X, params)
  logEvent_web->>WebBridge: postMessage({type: WEB_REQ_LOG_ANALYTICS_EVENT, payload: {name, params}})
  WebBridge->>AppIndex: onMessage 수신
  AppIndex->>logEvent_app: logAnalyticsEvent(name, params)
  logEvent_app->>FirebaseSDK: analytics().logEvent(name, params)
Loading
sequenceDiagram
  rect rgba(176, 224, 230, 0.5)
    note over 사용자,분석: 일반 브라우저 (apps/web)
    participant 사용자 as 사용자
    participant 웹페이지 as 웹 페이지
    participant logEvent as logAnalyticsEvent
    participant gtag as window.gtag
    participant GA4 as Google Analytics 4
  end

  사용자->>웹페이지: 사용자 행동 (로그인/토너먼트 생성)
  웹페이지->>logEvent: logAnalyticsEvent(ANALYTICS_EVENT.X, params)
  logEvent->>gtag: gtag('event', name, params)
  gtag->>GA4: 이벤트 전송
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • depromeet/PIKI-Client#164: apps/app/app/index.tsx의 WebView→네이티브 switch 메시지 처리 로직을 확장하는데, 본 PR은 WEB_REQ_LOG_ANALYTICS_EVENT 케이스를 추가하고 retrieved PR은 WEB_REQ_LOGOUT 케이스를 추가해 같은 디스패처를 다른 이벤트 로직으로 업데이트한다.
  • depromeet/PIKI-Client#166: packages/core/src/consts/webBridge.tsWEBBRIDGE_MESSAGE_TYPEpackages/core/src/types/webBridge.tsWebBridgeMessageT 유니온을 확장해 웹↔앱 브리지 메시지 인프라를 같은 지점에서 수정하므로 코드 레벨상 연관된다.

Suggested reviewers

  • iOdiO89
  • kanghaeun

Poem

🐰 토끼가 발자국을 남기기 시작했어요~
로그인하고, 위시 담고, 토너먼트 만들고,
친구 초대하고 영수증도 공유하면~
Firebase가 모든 걸 살짝 기록해요! 📊
이제 어디서 이탈하는지 훤히 보인다네요 ✨

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed PR 제목이 Firebase Analytics 연동이라는 주요 변경사항을 명확하게 요약하고 있으며, 부제목으로 '앱 사용자 행동 분석'을 통해 목적을 명확히 함.
Linked Issues check ✅ Passed PR이 연결된 이슈 #257의 모든 주요 코딩 요구사항을 충족함: Firebase 모듈 설치, analytics 유틸 작성, 앱 진입 시 logAppOpen 호출, webBridge 통합, 9개 이벤트 추적 구현, TypeScript/ESLint 검증 완료.
Out of Scope Changes check ✅ Passed 모든 변경사항이 Firebase Analytics 연동과 이벤트 추적이라는 명확한 범위 내에 있으며, 관련 없는 기능이나 리팩토링이 없음.

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

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/257-firebase-analytics

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.

@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.

Actionable comments posted: 2

🤖 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.

Inline comments:
In `@apps/app/package.json`:
- Around line 18-20: The `@react-native-firebase` packages in package.json have
inconsistent versions which violates React Native Firebase's "One True Version"
policy. Update all `@react-native-firebase/`* packages (analytics, app, and
messaging) to use exactly the same version number. Choose either ^24.1.1 for all
packages or downgrade analytics to ^24.1.0 to match app and messaging, then
ensure every `@react-native-firebase` dependency throughout the file uses the
selected unified version.

In `@apps/web/src/app/tournament/`[id]/result/_components/ResultClient.tsx:
- Around line 46-52: The useEffect hook in the completion event logging is
missing tournamentId in its dependency array despite using it in the
logAnalyticsEvent call. Add tournamentId to the dependency array alongside
tournamentData.status so that the analytics event is properly triggered whenever
either the tournament ID or the status changes to COMPLETED. This ensures that
if the same component instance is reused with a different tournament ID, the
completion event will be logged correctly for the new tournament rather than
being skipped or recorded with stale data.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: eb17079d-7169-413a-bece-4ba984a7a701

📥 Commits

Reviewing files that changed from the base of the PR and between aec1fa5 and 196ffe6.

⛔ Files ignored due to path filters (1)
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
📒 Files selected for processing (20)
  • apps/app/app/index.tsx
  • apps/app/package.json
  • apps/app/utils/analytics.ts
  • apps/web/src/app/auth/callback/[provider]/_hooks/usePostSocialLogin.ts
  • apps/web/src/app/home/_hooks/usePostCreateTournament.ts
  • apps/web/src/app/tournament/[id]/create/_components/invite-friends/InviteFriendsDialog.tsx
  • apps/web/src/app/tournament/[id]/create/_hooks/usePatchInviteExpiry.ts
  • apps/web/src/app/tournament/[id]/create/_hooks/usePostTournamentStart.ts
  • apps/web/src/app/tournament/[id]/result/_components/ResultClient.tsx
  • apps/web/src/app/tournament/[id]/result/_components/plate-share-dialog/PlateShareDialog.tsx
  • apps/web/src/app/tournament/join/_hooks/usePostJoin.ts
  • apps/web/src/app/tournament/join/_hooks/usePostJoinGuest.ts
  • apps/web/src/consts/analytics.ts
  • apps/web/src/hooks/usePostWishLink.ts
  • apps/web/src/hooks/usePostWishOCR.ts
  • apps/web/src/utils/analytics.ts
  • packages/core/src/consts/webBridge.ts
  • packages/core/src/index.ts
  • packages/core/src/types/analytics.ts
  • packages/core/src/types/webBridge.ts

Comment thread apps/app/package.json Outdated
Comment thread apps/web/src/app/tournament/[id]/result/_components/ResultClient.tsx Outdated
@ychany
ychany merged commit ca3bb42 into dev Jun 19, 2026
5 checks passed
@ychany
ychany deleted the feat/257-firebase-analytics branch June 19, 2026 07:46
iOdiO89 pushed a commit that referenced this pull request Jun 19, 2026
* feat: Firebase Analytics (GA4) 연동 + 핵심 9개 이벤트 로깅

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

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

* fix: firebase 패키지 버전 불일치로 인한 런타임 에러 가능성 제거
iOdiO89 pushed a commit that referenced this pull request Jun 23, 2026
* feat: Firebase Analytics (GA4) 연동 + 핵심 9개 이벤트 로깅

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

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

* fix: firebase 패키지 버전 불일치로 인한 런타임 에러 가능성 제거
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: Firebase Analytics (GA4) 연동 + 핵심 9개 이벤트 로깅

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

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

* fix: firebase 패키지 버전 불일치로 인한 런타임 에러 가능성 제거
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

APP Good for newcomers feature New feature or request WEB

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

1 participant