import React from 'react'; import { View, Text, TouchableOpacity, Platform, useWindowDimensions, ScrollView } from 'react-native'; import { MaterialIcons } from '@expo/vector-icons'; import Animated, { FadeIn, FadeOut, SlideInRight, SlideOutRight, } from 'react-native-reanimated'; import { useSafeAreaInsets } from 'react-native-safe-area-context'; interface SpeedModalProps { showSpeedModal: boolean; setShowSpeedModal: (show: boolean) => void; currentSpeed: number; setPlaybackSpeed: (speed: number) => void; holdToSpeedEnabled: boolean; setHoldToSpeedEnabled: (enabled: boolean) => void; holdToSpeedValue: number; setHoldToSpeedValue: (speed: number) => void; } export const SpeedModal: React.FC = ({ showSpeedModal, setShowSpeedModal, currentSpeed, setPlaybackSpeed, holdToSpeedEnabled, setHoldToSpeedEnabled, holdToSpeedValue, setHoldToSpeedValue, }) => { const insets = useSafeAreaInsets(); const { width, height } = useWindowDimensions(); const isIos = Platform.OS === 'ios'; const isLandscape = width > height; // Responsive tuning - more aggressive compacting const isCompact = width < 360 || height < 640; const sectionPad = isCompact ? 6 : 8; const chipPadH = isCompact ? 4 : 6; const chipPadV = isCompact ? 3 : 4; const menuWidth = Math.min( width * (isIos ? (isLandscape ? 0.55 : 0.8) : 0.85), isIos ? 380 : 360 ); const speedPresets = [0.5, 1.0, 1.5, 2.0, 2.5]; const holdSpeedOptions = [1.5, 2.0]; const handleClose = () => { setShowSpeedModal(false); }; const handleSpeedSelect = (speed: number) => { setPlaybackSpeed(speed); }; const handleHoldSpeedSelect = (speed: number) => { setHoldToSpeedValue(speed); }; const renderSpeedModal = () => { if (!showSpeedModal) return null; return ( <> {/* Backdrop */} {/* Side Menu */} {/* Header */} Playback Speed {/* Current Speed Display */} Current: {currentSpeed}x {/* Speed Presets */} Speed Presets {speedPresets.map((speed) => { const isSelected = currentSpeed === speed; return ( handleSpeedSelect(speed)} style={{ paddingHorizontal: chipPadH, paddingVertical: chipPadV, borderRadius: 12, backgroundColor: isSelected ? 'rgba(59, 130, 246, 0.15)' : 'rgba(255, 255, 255, 0.05)', borderWidth: 1, borderColor: isSelected ? 'rgba(59, 130, 246, 0.3)' : 'rgba(255, 255, 255, 0.1)', minWidth: 50, alignItems: 'center', }} activeOpacity={0.7} > {speed}x ); })} {/* Hold-to-Speed Settings */} Hold-to-Speed {/* Enable Toggle */} Enable Hold Speed setHoldToSpeedEnabled(!holdToSpeedEnabled)} > {/* Hold Speed Selector */} {holdToSpeedEnabled && ( Hold Speed {holdSpeedOptions.map((speed) => { const isSelected = holdToSpeedValue === speed; return ( handleHoldSpeedSelect(speed)} style={{ paddingHorizontal: chipPadH, paddingVertical: chipPadV, borderRadius: 10, backgroundColor: isSelected ? 'rgba(34, 197, 94, 0.15)' : 'rgba(255, 255, 255, 0.05)', borderWidth: 1, borderColor: isSelected ? 'rgba(34, 197, 94, 0.3)' : 'rgba(255, 255, 255, 0.1)', minWidth: 45, alignItems: 'center', }} activeOpacity={0.7} > {speed}x ); })} )} {/* Info Text */} Hold left/right sides Hold and press the left or right side of the video player to temporarily boost playback speed. ); }; return ( <> {renderSpeedModal()} ); }; export default SpeedModal;