fix: 상세 웹뷰 uri를 마운트 시점 구독 상태로 고정한다 - #38
seongwon030 wants to merge 1 commit into
Conversation
uri useMemo가 isSubscribed에 의존하고 있어서, 구독을 토글하면 subscribed-clubs-context가 setSubscribedClubIds로 목록을 갈아끼우고 → isSubscribed 함수 아이덴티티가 바뀌고 → uri가 재계산되어 is_subscribed=true가 붙거나 빠진다. 그러면 source.uri가 바뀌고 웹뷰가 그 URL을 다시 로드한다. react-native-webview 13.15.0 기준: - iOS: RNCWebViewImpl.m setSource가 source 딕셔너리를 비교해 다르면 visitSource -> loadRequest. - Android: RNCWebViewManagerImpl.kt loadSource가 view.url(현재 표시 중인 URL)과 비교하는데, 상세는 /webview/club/:id 로 진입해 /clubDetail/:id 로 리다이렉트되고 웹이 history.replaceState로 session_id까지 지우므로 두 값이 같아질 수 없다. 즉 가드가 무력해서 source prop이 바뀌면 항상 loadUrl. 지금은 이 화면에서 구독을 토글할 방법이 없어 드러나지 않는다. 웹 종 버튼이 보내는 SUBSCRIBE_TOGGLE을 use-webview-message-handler가 모르고, 네이티브 종 버튼은 hasError일 때만 렌더링된다. #34가 SUBSCRIBE_TOGGLE 처리를 추가하면 종을 누를 때마다 리로드가 발생한다. 웹은 이 파라미터를 ClubDetailPage의 initialIsSubscribed(첫 페인트 깜빡임 방지) 로만 쓰고 이후 상태는 SUBSCRIBE_STATE 메시지로 받으므로, 마운트 시점 값으로 고정해도 기능이 줄지 않는다. 파라미터를 없애면 첫 페인트가 깜빡여서 남긴다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Warning Review limit reachedNext included review available in 29 minutes. View limit detailsLimit details: You’ve used the included review currently available. You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository. Review configuration: ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Advanced Run ID: 📒 Files selected for processing (1)
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. Comment |
|
검증 정정: 이 PR을 올릴 때 적은 의존성을 설치하고 이 브랜치에서 다시 돌렸습니다:
결과적으로 원래 주장은 맞았지만, 그때는 근거가 없었습니다. 본문의 동작 검증(입출력 시뮬레이션)은 실제로 돌린 것이라 유효합니다. 🤖 Generated with Claude Code |
문제
uriuseMemo가isSubscribed에 의존합니다. 구독을 토글하면:subscribed-clubs-context.tsx:147setSubscribedClubIds(즉시)isSubscribed함수 아이덴티티 변경uri재계산,is_subscribed=true가 붙거나 빠짐source.uri변경 → 웹뷰가 그 URL을 다시 로드리로드가 실제로 일어나는 근거
react-native-webview@13.15.0소스에서 확인했습니다. 추정이 아닙니다.iOS —
apple/RNCWebViewImpl.m:794-802Fabric의
RNCWebView.mm:472-495가 prop 갱신마다 source 딕셔너리를 조건 없이 만들어 이 setter를 호출합니다.Android —
RNCWebViewManagerImpl.kt:401-405상세는
/webview/club/:id로 진입해/clubDetail/:id로 리다이렉트되고, 웹이history.replaceState로session_id까지 URL에서 지웁니다(initSDK.ts). 그래서view.url과 prop의 uri가 같아질 수 없고, 가드가 무력해져 source prop이 바뀌면 항상loadUrl입니다.왜 지금은 안 터지나 — 그리고 #34와의 관계
이 화면에서 구독을 토글할 경로가 현재 없습니다.
SUBSCRIBE_TOGGLE을use-webview-message-handler가 몰라서default에서 버립니다.handleSubscribeToggle)은{hasError && (<Header>…)}안이라 에러 화면에서만 렌더링됩니다.#34가
SUBSCRIBE_TOGGLE처리를 추가하면 종을 누를 때마다 리로드가 납니다. 그리고 #34가 리로드와 경합합니다 —setSubscribedClubIds가 먼저 실행돼 로드가 시작되고,SUBSCRIBE_RESULT주입은 스토리지 저장·FCM 토큰·서버 동기화를 모두 await한 뒤라서, 토스트가 갈아엎히는 문서에 꽂힙니다.이 PR은 #34를 막지 않습니다. #34 머지 전에 들어가면 그 체크리스트 1번(종 클릭 → 토스트)이 리로드 없이 통과합니다.
해법
웹은 이 파라미터를
ClubDetailPage.tsx:206의initialIsSubscribed로만 씁니다 — 첫 페인트에 종 아이콘이 잘못된 상태로 깜빡이는 걸 막는 용도입니다. 실시간 상태는ClubDetailTopBar.tsx:75가SUBSCRIBE_STATE메시지로 받습니다.그래서 마운트 시점 값으로 고정해도 기능이 줄지 않습니다. 이름부터
initialIsSubscribed입니다.파라미터를 없애지는 않았습니다 — 없애면 첫 페인트가 깜빡입니다.
네이티브 헤더 종 아이콘용
subscribeduseMemo는 그대로 라이브 상태를 씁니다. 거긴 리로드와 무관합니다.확인
tsc --noEmit통과merge-tree테스트 충돌 없음. 병합본에서urideps에isSubscribed가 없고 #34의onSubscribeToggle/SUBSCRIBE_RESULT가 함께 살아 있는 것 확인리뷰어가 실기기로 봐줄 것: 종 탭 시 페이지가 다시 뜨지 않고 스크롤 위치가 유지되는지.
범위 밖
sessionId가 나중에 채워지는 경우(부트스트랩 완료 전 딥링크 진입)에도uri가 바뀌어 같은 리로드가 납니다. 그건 홈(home-webview-screen.tsx)처럼 세션 로딩 게이트를 두는 문제라 이 PR에 넣지 않았습니다.