import React from 'react'; import { View, Text, TouchableOpacity, ScrollView, Dimensions } from 'react-native'; import { Ionicons, MaterialIcons } from '@expo/vector-icons'; import { BlurView } from 'expo-blur'; import Animated, { FadeIn, FadeOut, SlideInDown, SlideOutDown, FadeInDown, FadeInUp, Layout, withSpring, withTiming, useAnimatedStyle, useSharedValue, interpolate, Easing, withDelay, withSequence, runOnJS, BounceIn, ZoomIn } from 'react-native-reanimated'; import { LinearGradient } from 'expo-linear-gradient'; import { styles } from '../utils/playerStyles'; import { getTrackDisplayName } from '../utils/playerUtils'; interface AudioTrackModalProps { showAudioModal: boolean; setShowAudioModal: (show: boolean) => void; vlcAudioTracks: Array<{id: number, name: string, language?: string}>; selectedAudioTrack: number | null; selectAudioTrack: (trackId: number) => void; } const { width, height } = Dimensions.get('window'); // Fixed dimensions for the modal const MODAL_WIDTH = Math.min(width - 32, 520); const MODAL_MAX_HEIGHT = height * 0.85; const AudioBadge = ({ text, color, bgColor, icon, delay = 0 }: { text: string; color: string; bgColor: string; icon?: string; delay?: number; }) => ( {icon && ( )} {text} ); export const AudioTrackModal: React.FC = ({ showAudioModal, setShowAudioModal, vlcAudioTracks, selectedAudioTrack, selectAudioTrack, }) => { const modalScale = useSharedValue(0.9); const modalOpacity = useSharedValue(0); React.useEffect(() => { if (showAudioModal) { modalScale.value = withSpring(1, { damping: 20, stiffness: 300, mass: 0.8, }); modalOpacity.value = withTiming(1, { duration: 200, easing: Easing.out(Easing.quad), }); } }, [showAudioModal]); const modalStyle = useAnimatedStyle(() => ({ transform: [{ scale: modalScale.value }], opacity: modalOpacity.value, })); const handleClose = () => { modalScale.value = withTiming(0.9, { duration: 150 }); modalOpacity.value = withTiming(0, { duration: 150 }); setTimeout(() => setShowAudioModal(false), 150); }; if (!showAudioModal) return null; return ( {/* Backdrop */} {/* Modal Content */} {/* Glassmorphism Background */} {/* Header */} Audio Tracks Choose from {vlcAudioTracks.length} available track{vlcAudioTracks.length !== 1 ? 's' : ''} {/* Content */} {vlcAudioTracks.length > 0 ? vlcAudioTracks.map((track, index) => ( { selectAudioTrack(track.id); handleClose(); }} activeOpacity={0.85} > {getTrackDisplayName(track)} {selectedAudioTrack === track.id && ( ACTIVE )} {track.language && ( )} {selectedAudioTrack === track.id ? ( ) : ( )} )) : ( No audio tracks found No audio tracks are available for this content.{'\n'}Try a different source or check your connection. )} ); }; export default AudioTrackModal;