Skip to content

Commit c67c5f5

Browse files
committed
fix(app): fix webview going to ttv after background
1 parent 9668273 commit c67c5f5

2 files changed

Lines changed: 18 additions & 39 deletions

File tree

src/components/StreamPlayer/StreamPlayer.tsx

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -751,10 +751,23 @@ export const StreamPlayer = forwardRef<StreamPlayerRef, StreamPlayerProps>(
751751
const stuckCountRef = useRef<number>(0);
752752
const appStateRef = useRef<AppStateStatus>(AppState.currentState);
753753

754+
// Avoid WebView.reload(): with source={{ html, baseUrl: https://www.twitch.tv/ }} it loads twitch.tv, not the embed HTML (issue #524).
755+
const remountEmbedWebView = useCallback(() => {
756+
setPlayerState(prev => ({
757+
...prev,
758+
isReady: false,
759+
isBuffering: true,
760+
}));
761+
needsInitRef.current = true;
762+
setWebViewKey(k => k + 1);
763+
}, []);
764+
765+
const forceRefresh = remountEmbedWebView;
766+
754767
useEffect(() => {
755768
const handleAppStateChange = (nextAppState: AppStateStatus) => {
756769
if (appStateRef.current === 'background' && nextAppState === 'active') {
757-
setWebViewKey(k => k + 1);
770+
remountEmbedWebView();
758771
}
759772

760773
appStateRef.current = nextAppState;
@@ -768,7 +781,7 @@ export const StreamPlayer = forwardRef<StreamPlayerRef, StreamPlayerProps>(
768781
return () => {
769782
subscription.remove();
770783
};
771-
}, []);
784+
}, [remountEmbedWebView]);
772785

773786
useEffect(() => {
774787
streamWebViewWarmupPool.startWarmup(parent);
@@ -881,19 +894,6 @@ export const StreamPlayer = forwardRef<StreamPlayerRef, StreamPlayerProps>(
881894
});
882895
}, [injectJS, playerState.duration]);
883896

884-
const forceRefresh = useCallback(() => {
885-
setPlayerState(prev => ({
886-
...prev,
887-
isReady: false,
888-
isBuffering: true,
889-
}));
890-
needsInitRef.current = true;
891-
892-
setTimeout(() => {
893-
webViewRef.current?.reload();
894-
}, 100);
895-
}, []);
896-
897897
useImperativeHandle(
898898
ref,
899899
() => ({
@@ -1287,8 +1287,7 @@ export const StreamPlayer = forwardRef<StreamPlayerRef, StreamPlayerProps>(
12871287
source={webViewSource}
12881288
style={[styles.webView, hasContentGate && styles.webViewScrollable]}
12891289
onContentProcessDidTerminate={() => {
1290-
needsInitRef.current = true;
1291-
webViewRef.current?.reload();
1290+
remountEmbedWebView();
12921291
}}
12931292
onError={handleWebViewError}
12941293
onHttpError={handleWebViewHttpError}
@@ -1311,8 +1310,7 @@ export const StreamPlayer = forwardRef<StreamPlayerRef, StreamPlayerProps>(
13111310
}}
13121311
onMessage={handleMessage}
13131312
onRenderProcessGone={() => {
1314-
needsInitRef.current = true;
1315-
webViewRef.current?.reload();
1313+
remountEmbedWebView();
13161314
}}
13171315
/>
13181316

src/screens/Stream/LiveStreamScreen.tsx

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -10,12 +10,7 @@ import { twitchQueries } from '@app/queries/twitchQueries';
1010
import { useQueries } from '@tanstack/react-query';
1111
import * as ScreenOrientation from 'expo-screen-orientation';
1212
import { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';
13-
import {
14-
AppState,
15-
type AppStateStatus,
16-
useWindowDimensions,
17-
View,
18-
} from 'react-native';
13+
import { useWindowDimensions, View } from 'react-native';
1914
import Animated, {
2015
Easing,
2116
useAnimatedStyle,
@@ -48,7 +43,6 @@ export const LiveStreamScreen = memo(function LiveStreamScreen({
4843
const [isChatVisible, setChatVisible] = useState<boolean>(true);
4944
const [hasContentGate, setHasContentGate] = useState(false);
5045
const streamPlayerRef = useRef<StreamPlayerRef>(null);
51-
const appStateRef = useRef<AppStateStatus>(AppState.currentState);
5246
const lastChatToggleTimeRef = useRef<number>(0);
5347
const CHAT_TOGGLE_DEBOUNCE_MS = 450;
5448

@@ -61,19 +55,6 @@ export const LiveStreamScreen = memo(function LiveStreamScreen({
6155
};
6256
}, []);
6357

64-
useEffect(() => {
65-
const sub = AppState.addEventListener(
66-
'change',
67-
(nextState: AppStateStatus) => {
68-
if (appStateRef.current === 'background' && nextState === 'active') {
69-
streamPlayerRef.current?.forceRefresh();
70-
}
71-
appStateRef.current = nextState;
72-
},
73-
);
74-
return () => sub.remove();
75-
}, []);
76-
7758
const handleContentGateChange = useCallback((hasGate: boolean) => {
7859
setHasContentGate(prev => (prev === hasGate ? prev : hasGate));
7960
}, []);

0 commit comments

Comments
 (0)