diff --git a/src/components/player/AndroidVideoPlayer.tsx b/src/components/player/AndroidVideoPlayer.tsx index 6d501453..c5a52d55 100644 --- a/src/components/player/AndroidVideoPlayer.tsx +++ b/src/components/player/AndroidVideoPlayer.tsx @@ -1581,6 +1581,7 @@ const AndroidVideoPlayer: React.FC = () => { cycleAspectRatio={cycleAspectRatio} setShowAudioModal={setShowAudioModal} setShowSubtitleModal={setShowSubtitleModal} + isSubtitleModalOpen={showSubtitleModal} setShowSourcesModal={setShowSourcesModal} onSliderValueChange={handleSliderValueChange} onSlidingStart={handleSlidingStart} diff --git a/src/components/player/VideoPlayer.tsx b/src/components/player/VideoPlayer.tsx index e568c01e..1bc12af1 100644 --- a/src/components/player/VideoPlayer.tsx +++ b/src/components/player/VideoPlayer.tsx @@ -1497,6 +1497,7 @@ const VideoPlayer: React.FC = () => { cycleAspectRatio={cycleAspectRatio} setShowAudioModal={setShowAudioModal} setShowSubtitleModal={setShowSubtitleModal} + isSubtitleModalOpen={showSubtitleModal} setShowSourcesModal={setShowSourcesModal} onSliderValueChange={handleSliderValueChange} onSlidingStart={handleSlidingStart} diff --git a/src/components/player/controls/PlayerControls.tsx b/src/components/player/controls/PlayerControls.tsx index 695e995d..6829b780 100644 --- a/src/components/player/controls/PlayerControls.tsx +++ b/src/components/player/controls/PlayerControls.tsx @@ -31,6 +31,7 @@ interface PlayerControlsProps { cycleAspectRatio: () => void; setShowAudioModal: (show: boolean) => void; setShowSubtitleModal: (show: boolean) => void; + isSubtitleModalOpen?: boolean; setShowSourcesModal?: (show: boolean) => void; // Slider-specific props onSliderValueChange: (value: number) => void; @@ -65,6 +66,7 @@ export const PlayerControls: React.FC = ({ cycleAspectRatio, setShowAudioModal, setShowSubtitleModal, + isSubtitleModalOpen, setShowSourcesModal, onSliderValueChange, onSlidingStart, @@ -182,7 +184,7 @@ export const PlayerControls: React.FC = ({ {/* Subtitle Button - Always available for external subtitle search */} setShowSubtitleModal(true)} + onPress={() => setShowSubtitleModal(!isSubtitleModalOpen)} > diff --git a/src/screens/StreamsScreen.tsx b/src/screens/StreamsScreen.tsx index 8ace52fa..0eb567f4 100644 --- a/src/screens/StreamsScreen.tsx +++ b/src/screens/StreamsScreen.tsx @@ -305,8 +305,8 @@ const ProviderFilter = memo(({ const styles = React.useMemo(() => createStyles(theme.colors), [theme.colors]); const renderItem = useCallback(({ item, index }: { item: { id: string; name: string }; index: number }) => ( - + + ), [selectedProvider, onSelect, styles]); return ( @@ -1284,16 +1285,17 @@ export const StreamsScreen = () => { const isLoading = false; // If streams are being rendered, they're available and shouldn't be loading return ( - handleStreamPress(stream)} - index={index} - isLoading={isLoading} - statusMessage={undefined} - theme={currentTheme} - showLogos={settings.showScraperLogos} - /> + + handleStreamPress(stream)} + index={index} + isLoading={isLoading} + statusMessage={undefined} + theme={currentTheme} + showLogos={settings.showScraperLogos} + /> + ); }, [handleStreamPress, currentTheme, settings.showScraperLogos]); @@ -1369,44 +1371,32 @@ export const StreamsScreen = () => { )} - {type === 'series' && currentEpisode && ( + {type === 'series' && ( - - + - + - - - - - {currentEpisode.episodeString} - + + {currentEpisode ? ( + + {currentEpisode.episodeString} {currentEpisode.name} - {currentEpisode.overview && ( + {!!currentEpisode.overview && ( {currentEpisode.overview} @@ -1417,17 +1407,13 @@ export const StreamsScreen = () => { {currentEpisode.vote_average > 0 && ( - + {currentEpisode.vote_average.toFixed(1)} )} - {currentEpisode.runtime && ( + {!!currentEpisode.runtime && ( @@ -1438,10 +1424,13 @@ export const StreamsScreen = () => { )} - - - - + + ) : ( + // Placeholder to reserve space and avoid layout shift while loading + + )} + + @@ -1800,7 +1789,7 @@ const createStyles = (colors: any) => StyleSheet.create({ }, streamsHeroContainer: { width: '100%', - height: 220, + height: 220, // Fixed height to prevent layout shift marginBottom: 0, position: 'relative', backgroundColor: colors.black, @@ -1812,7 +1801,7 @@ const createStyles = (colors: any) => StyleSheet.create({ backgroundColor: colors.black, }, streamsHeroGradient: { - flex: 1, + ...StyleSheet.absoluteFillObject, justifyContent: 'flex-end', padding: 16, paddingBottom: 0,