import React from 'react'; import { View, Text, TouchableOpacity, ScrollView, ActivityIndicator, Dimensions } from 'react-native'; import { MaterialIcons } from '@expo/vector-icons'; import Animated, { FadeIn, FadeOut, SlideInRight, SlideOutRight, } from 'react-native-reanimated'; import { styles } from '../utils/playerStyles'; import { WyzieSubtitle, SubtitleCue } from '../utils/playerTypes'; import { getTrackDisplayName, formatLanguage } from '../utils/playerUtils'; interface SubtitleModalsProps { showSubtitleModal: boolean; setShowSubtitleModal: (show: boolean) => void; showSubtitleLanguageModal: boolean; setShowSubtitleLanguageModal: (show: boolean) => void; isLoadingSubtitleList: boolean; isLoadingSubtitles: boolean; customSubtitles: SubtitleCue[]; availableSubtitles: WyzieSubtitle[]; vlcTextTracks: Array<{id: number, name: string, language?: string}>; selectedTextTrack: number; useCustomSubtitles: boolean; subtitleSize: number; subtitleBackground: boolean; fetchAvailableSubtitles: () => void; loadWyzieSubtitle: (subtitle: WyzieSubtitle) => void; selectTextTrack: (trackId: number) => void; increaseSubtitleSize: () => void; decreaseSubtitleSize: () => void; toggleSubtitleBackground: () => void; } const { width, height } = Dimensions.get('window'); const MENU_WIDTH = Math.min(width * 0.85, 400); export const SubtitleModals: React.FC = ({ showSubtitleModal, setShowSubtitleModal, showSubtitleLanguageModal, setShowSubtitleLanguageModal, isLoadingSubtitleList, isLoadingSubtitles, customSubtitles, availableSubtitles, vlcTextTracks, selectedTextTrack, useCustomSubtitles, subtitleSize, subtitleBackground, fetchAvailableSubtitles, loadWyzieSubtitle, selectTextTrack, increaseSubtitleSize, decreaseSubtitleSize, toggleSubtitleBackground, }) => { // Track which specific online subtitle is currently loaded const [selectedOnlineSubtitleId, setSelectedOnlineSubtitleId] = React.useState(null); React.useEffect(() => { if (showSubtitleModal && !isLoadingSubtitleList && availableSubtitles.length === 0) { fetchAvailableSubtitles(); } }, [showSubtitleModal]); // Reset selected online subtitle when switching to built-in tracks React.useEffect(() => { if (!useCustomSubtitles) { setSelectedOnlineSubtitleId(null); } }, [useCustomSubtitles]); const handleClose = () => { setShowSubtitleModal(false); }; const handleLoadWyzieSubtitle = (subtitle: WyzieSubtitle) => { setSelectedOnlineSubtitleId(subtitle.id); loadWyzieSubtitle(subtitle); }; // Main subtitle menu const renderSubtitleMenu = () => { if (!showSubtitleModal) return null; return ( <> {/* Backdrop */} {/* Side Menu */} {/* Header */} Subtitles {/* Font Size Section - Only show for custom subtitles */} {useCustomSubtitles && ( Font Size {subtitleSize} )} {/* Background Toggle Section - Only show for custom subtitles */} {useCustomSubtitles && ( Background Show Background )} {/* Built-in Subtitles */} {vlcTextTracks.length > 0 && ( Built-in Subtitles {vlcTextTracks.map((track) => { const isSelected = selectedTextTrack === track.id && !useCustomSubtitles; return ( { selectTextTrack(track.id); setSelectedOnlineSubtitleId(null); }} activeOpacity={0.7} > {getTrackDisplayName(track)} {isSelected && ( )} ); })} )} {/* Online Subtitles */} Online Subtitles fetchAvailableSubtitles()} disabled={isLoadingSubtitleList} > {isLoadingSubtitleList ? ( ) : ( )} {isLoadingSubtitleList ? 'Searching' : 'Refresh'} {availableSubtitles.length > 0 ? ( {availableSubtitles.map((sub) => { const isSelected = useCustomSubtitles && selectedOnlineSubtitleId === sub.id; return ( { handleLoadWyzieSubtitle(sub); }} activeOpacity={0.7} disabled={isLoadingSubtitles} > {sub.display} {formatLanguage(sub.language)} {isLoadingSubtitles ? ( ) : isSelected ? ( ) : ( )} ); })} ) : !isLoadingSubtitleList ? ( fetchAvailableSubtitles()} activeOpacity={0.7} > Tap to search online ) : ( Searching... )} {/* Turn Off Subtitles */} Options { selectTextTrack(-1); setSelectedOnlineSubtitleId(null); }} activeOpacity={0.7} > Turn Off Subtitles {selectedTextTrack === -1 && !useCustomSubtitles && ( )} ); }; return ( <> {renderSubtitleMenu()} ); }; export default SubtitleModals;