'use client'; import React from 'react'; import { useDesktopPlayerState } from './hooks/useDesktopPlayerState'; import { useDesktopPlayerLogic } from './hooks/useDesktopPlayerLogic'; import { useHlsPlayer } from './hooks/useHlsPlayer'; import { useAutoSkip } from './hooks/useAutoSkip'; import { useStallDetection } from './hooks/useStallDetection'; import { DesktopControlsWrapper } from './desktop/DesktopControlsWrapper'; import { DesktopOverlayWrapper } from './desktop/DesktopOverlayWrapper'; interface DesktopVideoPlayerProps { src: string; poster?: string; onError?: (error: string) => void; onTimeUpdate?: (currentTime: number, duration: number) => void; initialTime?: number; shouldAutoPlay?: boolean; // Episode navigation props for auto-skip/auto-next totalEpisodes?: number; currentEpisodeIndex?: number; onNextEpisode?: () => void; isReversed?: boolean; } export function DesktopVideoPlayer({ src, poster, onError, onTimeUpdate, initialTime = 0, shouldAutoPlay = false, totalEpisodes = 1, currentEpisodeIndex = 0, onNextEpisode, isReversed = false, }: DesktopVideoPlayerProps) { const { refs, data, actions } = useDesktopPlayerState(); // Initialize HLS Player useHlsPlayer({ videoRef: refs.videoRef, src, autoPlay: shouldAutoPlay }); const { videoRef, containerRef, } = refs; const { isPlaying, currentTime, duration, } = data; const { setShowControls, setIsLoading, setCurrentTime, setDuration, } = actions; // Reset loading state and show spinner when source changes React.useEffect(() => { setIsLoading(true); }, [src, setIsLoading]); const logic = useDesktopPlayerLogic({ src, initialTime, shouldAutoPlay, onError, onTimeUpdate, refs, data, actions }); // Auto-skip intro/outro and auto-next episode const { isOutroActive, isTransitioningToNextEpisode } = useAutoSkip({ videoRef, currentTime, duration, isPlaying, totalEpisodes, currentEpisodeIndex, onNextEpisode, isReversed, src, }); // Sensitive stalling detection (e.g. video stuck but HTML5 state says playing) useStallDetection({ videoRef, isPlaying: data.isPlaying, isDraggingProgressRef: refs.isDraggingProgressRef, setIsLoading: actions.setIsLoading, isTransitioningToNextEpisode }); const { handleMouseMove, togglePlay, handlePlay, handlePause, handleTimeUpdateEvent, handleLoadedMetadata, handleVideoError, } = logic; return (
isPlaying && setShowControls(false)} > {/* Video Element */}
); }