import React from "react"; import { View, Text, StyleSheet, Pressable } from "react-native"; import { Pause, Play, SkipForward, List, Tv, ArrowDownToDot, ArrowUpFromDot, Gauge } from "lucide-react-native"; import { ThemedText } from "@/components/ThemedText"; import { MediaButton } from "@/components/MediaButton"; import usePlayerStore from "@/stores/playerStore"; import useDetailStore from "@/stores/detailStore"; import { useSources } from "@/stores/sourceStore"; interface PlayerControlsProps { showControls: boolean; setShowControls: (show: boolean) => void; } export const PlayerControls: React.FC = ({ showControls, setShowControls }) => { const { currentEpisodeIndex, episodes, status, isSeeking, seekPosition, progressPosition, playbackRate, togglePlayPause, playEpisode, setShowEpisodeModal, setShowSourceModal, setShowSpeedModal, setIntroEndTime, setOutroStartTime, introEndTime, outroStartTime, } = usePlayerStore(); const { detail } = useDetailStore(); const resources = useSources(); const videoTitle = detail?.title || ""; const currentEpisode = episodes[currentEpisodeIndex]; const currentEpisodeTitle = currentEpisode?.title; const currentSource = resources.find((r) => r.source === detail?.source); const currentSourceName = currentSource?.source_name; const hasNextEpisode = currentEpisodeIndex < (episodes.length || 0) - 1; const formatTime = (milliseconds: number) => { if (!milliseconds) return "00:00"; const totalSeconds = Math.floor(milliseconds / 1000); const minutes = Math.floor(totalSeconds / 60); const seconds = totalSeconds % 60; return `${minutes.toString().padStart(2, "0")}:${seconds.toString().padStart(2, "0")}`; }; const onPlayNextEpisode = () => { if (hasNextEpisode) { playEpisode(currentEpisodeIndex + 1); } }; return ( {videoTitle} {currentEpisodeTitle ? `- ${currentEpisodeTitle}` : ""}{" "} {currentSourceName ? `(${currentSourceName})` : ""} {status?.isLoaded ? `${formatTime(status.positionMillis)} / ${formatTime(status.durationMillis || 0)}` : "00:00 / 00:00"} {status?.isLoaded && status.isPlaying ? ( ) : ( )} setShowEpisodeModal(true)}> setShowSpeedModal(true)} timeLabel={playbackRate !== 1.0 ? `${playbackRate}x` : undefined}> setShowSourceModal(true)}> ); }; const styles = StyleSheet.create({ controlsOverlay: { ...StyleSheet.absoluteFillObject, backgroundColor: "rgba(0, 0, 0, 0.4)", justifyContent: "space-between", padding: 20, }, topControls: { flexDirection: "row", justifyContent: "space-between", alignItems: "center", }, controlTitle: { color: "white", fontSize: 16, fontWeight: "bold", flex: 1, textAlign: "center", marginHorizontal: 10, }, bottomControlsContainer: { width: "100%", alignItems: "center", }, bottomControls: { flexDirection: "row", justifyContent: "center", alignItems: "center", gap: 10, flexWrap: "wrap", marginTop: 15, }, progressBarContainer: { width: "100%", height: 8, position: "relative", marginTop: 10, }, progressBarBackground: { position: "absolute", left: 0, right: 0, height: 8, backgroundColor: "rgba(255, 255, 255, 0.3)", borderRadius: 4, }, progressBarFilled: { position: "absolute", left: 0, height: 8, backgroundColor: "#fff", borderRadius: 4, }, progressBarTouchable: { position: "absolute", left: 0, right: 0, height: 30, top: -10, zIndex: 10, }, controlButton: { padding: 10, flexDirection: "row", alignItems: "center", }, topRightContainer: { padding: 10, alignItems: "center", justifyContent: "center", minWidth: 44, // Match TouchableOpacity default size for alignment }, resolutionText: { color: "white", fontSize: 16, fontWeight: "bold", backgroundColor: "rgba(0,0,0,0.5)", paddingHorizontal: 8, paddingVertical: 4, borderRadius: 6, }, });