Skip to content

release 1.6.0#27

Merged
SeongHoonC merged 9 commits into
prodfrom
main
Jun 13, 2026
Merged

release 1.6.0#27
SeongHoonC merged 9 commits into
prodfrom
main

Conversation

@SeongHoonC

@SeongHoonC SeongHoonC commented Jun 13, 2026

Copy link
Copy Markdown
Collaborator

Summary

  • Bump Expo app version to 1.6.0
  • Bump iOS build number and Android versionCode to 16
  • Align native iOS project version values with Expo config

Validation

  • npm run lint (passes with 5 existing warnings)

Summary by CodeRabbit

릴리스 노트

  • 신기능

    • WebView 내 뒤로가기 네비게이션 지원
    • 외부 링크 처리 개선
    • WebView에서 공유 기능 추가
    • 앱 버전 정보 요청 기능 추가
  • 개선사항

    • 네비게이션 라우팅 구조 개선
    • 클럽 상세 페이지 연결 최적화
    • 웹뷰 메시지 처리 로직 확장
  • Chores

    • 앱 버전 업데이트: 1.5.2 → 1.6.0
    • 빌드 번호 및 버전 코드 증가

seongwon030 and others added 9 commits June 2, 2026 13:37
- (tabs) 탭 레이아웃 및 구독/메뉴 네이티브 화면 제거, app/index.tsx로 홈 웹뷰 단일 호스트
- _layout Stack/anchor를 index로, 상세/웹뷰 back 폴백을 /로 변경
- home-webview-screen에 REQUEST_APP_VERSION→APP_VERSION 핸들러 추가
- ui/subscribe 제거(웹이 대체)
- NAVIGATE_BACK 메시지 수신 시 webView.goBack() (상세 '<' 버튼)
- Android 하드웨어 백: 웹뷰 히스토리 있으면 goBack, 없으면 종료
- iOS 엣지 스와이프 백 제스처 활성화 (allowsBackForwardNavigationGestures)
Resolve conflicts:
- ui/home/home-webview-screen.tsx: keep both canGoBackRef (Android back) and
  loadFailedRef (preload failure tracking); wire onNavigationStateChange together
  with the new handleError for onError/onHttpError
- app/(tabs)/_layout.tsx, app/(tabs)/more.tsx, ui/subscribe/{components/empty-state,subscribe-screen}.tsx:
  keep deletions (native tabs/subscribe removed in favor of single webview shell)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
onShouldStartLoadWithRequest로 moadong.com 외부 URL 탐색을 가로채
/webview/[slug] 화면으로 push — 개인정보처리방침(노션) 등 외부 링크에
네이티브 헤더와 뒤로가기 버튼이 표시됨

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- handleShouldStartLoadWithRequest: iOS는 navigationType === 'click'인
  경우(사용자 탭)만 외부 URL로 인터셉트. 초기 로드·서버 리다이렉트('other')는
  통과시켜 스플래시 중 잘못된 화면 전환 방지
- handleMessage NAVIGATE_WEBVIEW: loaded 상태 guard 추가, 첫 로드 완료 전
  웹 페이지의 navigation 메시지 무시
- _layout.tsx: initialPathnameRef로 초기 경로 캡처, preload 중 pathname 변경에
  무관하게 homeWebViewPreloadSettled 조건 유지

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
feat: 네이티브 바텀탭 제거 → 단일 웹뷰 셸 + 앱 버전 브릿지
- NAVIGATE_WEBVIEW 브릿지 payload에 clubId(ObjectId) 필드 추가
- ClubDetailScreen에서 slug 대신 ObjectId로 isSubscribed 조회하여 is_subscribed 초기값 항상 false 버그 수정
- HomeWebViewScreen SHARE 브릿지 메시지 처리 추가

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
feat: 웹뷰 셸 마이그레이션 — NAVIGATE_WEBVIEW clubId 연동 및 브릿지 보완
@coderabbitai

coderabbitai Bot commented Jun 13, 2026

Copy link
Copy Markdown

Review Change Stack

개요

이 PR은 네이티브 바텀 탭 네비게이션을 제거하고 웹뷰 중심의 네비게이션 모델로 마이그레이션합니다. 루트 레이아웃 초기화, 스플래시 제어, 웹뷰 메시지 프로토콜을 재구성하며 플랫폼 설정 파일의 버전 정보를 1.6.0으로 업데이트합니다.

변경 사항

웹뷰 기반 네비게이션 구조 변경

레이어 / 파일 설명
앱 버전 & 빌드 메타데이터
app.json, ios/app/Info.plist, ios/app.xcodeproj/project.pbxproj
앱 버전 1.5.2 → 1.6.0 및 빌드 번호 15 → 16으로 업데이트. 모든 플랫폼 설정 파일의 MARKETING_VERSION, CURRENT_PROJECT_VERSION, CFBundleShortVersionString, CFBundleVersion 동기화
루트 네비게이션 앵커 & 스플래시 로직 재설계
app/_layout.tsx
unstable_settings.anchor'(tabs)'에서 'index'로 변경해 초기 라우팅 기준점 변경. shouldBlockSplash 계산을 homeWebViewPreloadStatus에서 homeWebViewPreloadSettled로 전환하고 초기 경로가 '/'인 경우에만 스플래시 차단 조건 적용. 네비게이션 스택 라우트 정의를 '(tabs)'에서 'index'로 교체
네이티브 탭 레이아웃 & 구독 화면 제거
app/(tabs)/_layout.tsx, app/(tabs)/explore.tsx, ui/subscribe/subscribe-screen.tsx, ui/subscribe/components/*, ui/subscribe/hook/*, ui/subscribe/index.ts
TabLayout 전체 구현 제거 (탭 바 설정, 탭 아이콘/라벨, Mixpanel 트래킹). SubscribeScreen 컴포넌트 및 관련 훅(useSubscribeScreen), 서브컴포넌트(EmptyState, SubscribedClubList), 모든 재내보내기 경로 삭제
웹뷰 메시지 프로토콜 확장 (clubId 지원)
types/webview-message.types.ts, hooks/use-webview-message-handler.ts
NAVIGATE_WEBVIEW 메시지 페이로드에 선택 필드 clubId?: string 추가. 핸들러 콜백 시그니처를 (slug: string)(slug: string, clubId?: string)로 확장하고 메시지 처리 시 clubId 값 전파
홈 웹뷰 통합 확장
ui/home/home-webview-screen.tsx
새로운 imports 추가 (expo-constants, Platform, BackHandler, Share, 웹뷰 타입). canGoBackRef로 웹뷰 뒤로가기 추적 상태 유지. 메시지 핸들러에 NAVIGATE_BACK (웹뷰 내 뒤로가기), SHARE (네이티브 공유), REQUEST_APP_VERSION (앱 버전 응답) 케이스 추가. handleNavigationStateChange로 웹뷰 네비게이션 상태 업데이트. handleShouldStartLoadWithRequest로 외부 http 네비게이션 인터셉트 후 /webview/[slug] 페이지로 재라우팅. Android 하드웨어 뒤로 버튼 핸들러 추가. 웹뷰 콜백 및 back gesture 활성화
웹뷰 라우트 & 클럽 상세 네비게이션 업데이트
app/webview/[slug].tsx, ui/club-detail/club-detail-screen.tsx
handleBack 폴백 네비게이션을 "/" 으로 변경. handleNavigateWebview 확장으로 clubId 선택 매개변수 지원 및 club/* slug에서 추출한 ID를 /club/[id] 라우트로 전달. 클럽 상세 화면에서 useLocalSearchParamsclubId를 우선 사용하고 URI/구독 상태를 이를 기반으로 계산. 뒤로 갈 수 없을 때 "/" 로 이동

예상 코드 리뷰 시간

🎯 4 (복잡함) | ⏱️ ~45분

관련 가능성 있는 PR

  • Moadong/moadong-react-native#6: 두 PR 모두 app/(tabs)/_layout.tsx의 탭 레이아웃 설정 직접 수정 (메인 PR은 전체 TabLayout 제거, 검색된 PR은 탭 설정/스타일 및 탭 press 트래킹 재작성)
  • Moadong/moadong-react-native#16: 메인 PR이 NAVIGATE_WEBVIEW 처리 흐름을 다루는 hooks/use-webview-message-handler.ts, app/webview/[slug].tsx, types/webview-message.types.ts 수정과 검색된 PR의 동일한 메시지 핸들링 변경이 직접적으로 연결
  • Moadong/moadong-react-native#21: 메인 PR의 탭 레이아웃 제거, app/_layout.tsx 앵커/스플래시 로직 변경, 구독 화면 삭제, ui/home/home-webview-screen.tsx 앱 버전 브릿지/뒤로가기 처리가 PR #21의 "네이티브 바텀탭 제거 → 단일 웹뷰 셸" 아키텍처 변경과 완전히 일치

추천 검토자

  • seongwon030
🚥 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 제목 'release 1.6.0'은 주요 변경 사항인 앱 버전 1.5.2에서 1.6.0으로의 업그레이드를 명확하게 요약하고 있습니다.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ 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 main

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ESLint

If the error stems from missing dependencies, add them to the package.json file. For unrecoverable errors (e.g., due to private dependencies), disable the tool in the CodeRabbit configuration.

ESLint install failed due to a network error.


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.

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
ui/club-detail/club-detail-screen.tsx (1)

81-97: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

handleSubscribeToggle에서 lookupId 대신 id를 사용하여 일관성이 없습니다.

URI 생성(line 41-43)과 subscribed 계산(line 48-51)에서는 lookupId를 사용하여 objectId를 우선시하도록 수정되었지만, handleSubscribeToggle 함수는 여전히 id를 직접 사용합니다. 이로 인해 구독 토글 시 잘못된 ID로 동작할 수 있습니다.

🐛 수정 제안
  const handleSubscribeToggle = async () => {
-   if (id && typeof id === "string") {
-     const wasSubscribed = isSubscribed(id);
+   const lookupId = typeof objectId === 'string' ? objectId : id;
+   if (lookupId && typeof lookupId === "string") {
+     const wasSubscribed = isSubscribed(lookupId);

      trackEvent(USER_EVENT.SUBSCRIBE_BUTTON_CLICKED, {
        clubName: name,
        subscribed: !wasSubscribed,
        from: "club_detail",
        url: "app://moadong/club",
      });

-     const result = await toggleSubscribe(id);
+     const result = await toggleSubscribe(lookupId);
      if (result.needsPermission) {
        setShowPermissionDialog(true);
      }
    }
  };
🤖 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 `@ui/club-detail/club-detail-screen.tsx` around lines 81 - 97, The handler uses
id directly causing inconsistency with earlier logic that prefers lookupId
(which prioritizes objectId); update handleSubscribeToggle to use lookupId
everywhere: change the guard to if (lookupId && typeof lookupId === "string"),
compute wasSubscribed = isSubscribed(lookupId), and call
toggleSubscribe(lookupId); keep the existing trackEvent call but ensure it uses
the same subscribed value (i.e., subscribed: !wasSubscribed). This makes
handleSubscribeToggle consistent with the URI/subscribed calculations that rely
on lookupId.
ui/home/home-webview-screen.tsx (1)

119-124: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

loaded 의존성이 handleMessage useCallback에서 누락되었습니다.

Line 92에서 loaded 상태를 사용하지만 dependency array (line 123)에 포함되어 있지 않습니다. 이로 인해 loadedtrue로 변경된 후에도 오래된 false 값을 참조할 수 있어 NAVIGATE_WEBVIEW 메시지가 무시될 수 있습니다.

🐛 수정 제안
-  }, [subscribedClubIds, toggleSubscribe, sendMessage, sendSubscribeState, router]);
+  }, [subscribedClubIds, toggleSubscribe, sendMessage, sendSubscribeState, router, loaded]);
🤖 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 `@ui/home/home-webview-screen.tsx` around lines 119 - 124, handleMessage
useCallback currently reads the loaded state but doesn't list loaded in its
dependency array, so update the dependency array for the handleMessage callback
(the useCallback that references loaded and handles NAVIGATE_WEBVIEW) to include
loaded alongside subscribedClubIds, toggleSubscribe, sendMessage,
sendSubscribeState, and router to ensure the callback sees latest loaded value.
🤖 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.

Outside diff comments:
In `@ui/club-detail/club-detail-screen.tsx`:
- Around line 81-97: The handler uses id directly causing inconsistency with
earlier logic that prefers lookupId (which prioritizes objectId); update
handleSubscribeToggle to use lookupId everywhere: change the guard to if
(lookupId && typeof lookupId === "string"), compute wasSubscribed =
isSubscribed(lookupId), and call toggleSubscribe(lookupId); keep the existing
trackEvent call but ensure it uses the same subscribed value (i.e., subscribed:
!wasSubscribed). This makes handleSubscribeToggle consistent with the
URI/subscribed calculations that rely on lookupId.

In `@ui/home/home-webview-screen.tsx`:
- Around line 119-124: handleMessage useCallback currently reads the loaded
state but doesn't list loaded in its dependency array, so update the dependency
array for the handleMessage callback (the useCallback that references loaded and
handles NAVIGATE_WEBVIEW) to include loaded alongside subscribedClubIds,
toggleSubscribe, sendMessage, sendSubscribeState, and router to ensure the
callback sees latest loaded value.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: c6b73fbe-5aab-4d21-bb54-57e7b68031d0

📥 Commits

Reviewing files that changed from the base of the PR and between 2f4516f and 55d1774.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (21)
  • app.json
  • app/(tabs)/_layout.tsx
  • app/(tabs)/explore.tsx
  • app/(tabs)/index.tsx.backup
  • app/(tabs)/more.tsx
  • app/_layout.tsx
  • app/index.tsx
  • app/webview/[slug].tsx
  • hooks/use-webview-message-handler.ts
  • ios/app.xcodeproj/project.pbxproj
  • ios/app/Info.plist
  • types/webview-message.types.ts
  • ui/club-detail/club-detail-screen.tsx
  • ui/home/home-webview-screen.tsx
  • ui/subscribe/components/empty-state.tsx
  • ui/subscribe/components/index.ts
  • ui/subscribe/components/subscribed-club-list.tsx
  • ui/subscribe/hook/index.ts
  • ui/subscribe/hook/use-subscribe-screen.ts
  • ui/subscribe/index.ts
  • ui/subscribe/subscribe-screen.tsx
💤 Files with no reviewable changes (11)
  • ui/subscribe/components/subscribed-club-list.tsx
  • app/(tabs)/more.tsx
  • app/(tabs)/index.tsx.backup
  • ui/subscribe/hook/index.ts
  • ui/subscribe/components/empty-state.tsx
  • ui/subscribe/components/index.ts
  • ui/subscribe/subscribe-screen.tsx
  • ui/subscribe/index.ts
  • app/(tabs)/_layout.tsx
  • app/(tabs)/explore.tsx
  • ui/subscribe/hook/use-subscribe-screen.ts

@SeongHoonC SeongHoonC merged commit d99bc3e into prod Jun 13, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants