mirror of
https://github.com/KuekHaoYang/KVideo.git
synced 2026-08-20 19:23:42 +08:00
195 lines
6.0 KiB
TypeScript
195 lines
6.0 KiB
TypeScript
import { usePlaybackControls } from './desktop/usePlaybackControls';
|
|
import { useVolumeControls } from './desktop/useVolumeControls';
|
|
import { useProgressControls } from './desktop/useProgressControls';
|
|
import { useSkipControls } from './desktop/useSkipControls';
|
|
import { useFullscreenControls } from './desktop/useFullscreenControls';
|
|
import { useKeyboardShortcuts } from './desktop/useKeyboardShortcuts';
|
|
import { useControlsVisibility } from './desktop/useControlsVisibility';
|
|
import { useUtilities } from './desktop/useUtilities';
|
|
|
|
interface UseDesktopPlayerLogicProps {
|
|
src: string;
|
|
initialTime: number;
|
|
onError?: (error: string) => void;
|
|
onTimeUpdate?: (currentTime: number, duration: number) => void;
|
|
refs: any;
|
|
state: any;
|
|
}
|
|
|
|
export function useDesktopPlayerLogic({
|
|
src,
|
|
initialTime,
|
|
onError,
|
|
onTimeUpdate,
|
|
refs,
|
|
state
|
|
}: UseDesktopPlayerLogicProps) {
|
|
const {
|
|
videoRef,
|
|
containerRef,
|
|
progressBarRef,
|
|
volumeBarRef,
|
|
controlsTimeoutRef,
|
|
speedMenuTimeoutRef,
|
|
skipForwardTimeoutRef,
|
|
skipBackwardTimeoutRef,
|
|
volumeBarTimeoutRef,
|
|
isDraggingProgressRef,
|
|
isDraggingVolumeRef,
|
|
mouseMoveThrottleRef,
|
|
toastTimeoutRef
|
|
} = refs;
|
|
|
|
const {
|
|
isPlaying, setIsPlaying,
|
|
currentTime, setCurrentTime,
|
|
duration, setDuration,
|
|
volume, setVolume,
|
|
isMuted, setIsMuted,
|
|
isFullscreen, setIsFullscreen,
|
|
showControls, setShowControls,
|
|
setIsLoading,
|
|
playbackRate, setPlaybackRate,
|
|
showSpeedMenu, setShowSpeedMenu,
|
|
isPiPSupported, setIsPiPSupported,
|
|
isAirPlaySupported, setIsAirPlaySupported,
|
|
skipForwardAmount, setSkipForwardAmount,
|
|
skipBackwardAmount, setSkipBackwardAmount,
|
|
showSkipForwardIndicator, setShowSkipForwardIndicator,
|
|
showSkipBackwardIndicator, setShowSkipBackwardIndicator,
|
|
setIsSkipForwardAnimatingOut,
|
|
setIsSkipBackwardAnimatingOut,
|
|
setShowVolumeBar,
|
|
setToastMessage,
|
|
setShowToast
|
|
} = state;
|
|
|
|
const playbackControls = usePlaybackControls({
|
|
videoRef,
|
|
isPlaying,
|
|
setIsPlaying,
|
|
setIsLoading,
|
|
initialTime,
|
|
setDuration,
|
|
setCurrentTime,
|
|
onTimeUpdate,
|
|
onError,
|
|
isDraggingProgressRef
|
|
});
|
|
|
|
const volumeControls = useVolumeControls({
|
|
videoRef,
|
|
volumeBarRef,
|
|
volume,
|
|
isMuted,
|
|
setVolume,
|
|
setIsMuted,
|
|
setShowVolumeBar,
|
|
volumeBarTimeoutRef,
|
|
isDraggingVolumeRef
|
|
});
|
|
|
|
const progressControls = useProgressControls({
|
|
videoRef,
|
|
progressBarRef,
|
|
duration,
|
|
setCurrentTime,
|
|
isDraggingProgressRef
|
|
});
|
|
|
|
const skipControls = useSkipControls({
|
|
videoRef,
|
|
duration,
|
|
setCurrentTime,
|
|
showSkipForwardIndicator,
|
|
showSkipBackwardIndicator,
|
|
skipForwardAmount,
|
|
skipBackwardAmount,
|
|
setShowSkipForwardIndicator,
|
|
setShowSkipBackwardIndicator,
|
|
setSkipForwardAmount,
|
|
setSkipBackwardAmount,
|
|
setIsSkipForwardAnimatingOut,
|
|
setIsSkipBackwardAnimatingOut,
|
|
skipForwardTimeoutRef,
|
|
skipBackwardTimeoutRef
|
|
});
|
|
|
|
const fullscreenControls = useFullscreenControls({
|
|
containerRef,
|
|
videoRef,
|
|
isFullscreen,
|
|
setIsFullscreen,
|
|
isPiPSupported,
|
|
isAirPlaySupported,
|
|
setIsPiPSupported,
|
|
setIsAirPlaySupported
|
|
});
|
|
|
|
const controlsVisibility = useControlsVisibility({
|
|
isPlaying,
|
|
showControls,
|
|
showSpeedMenu,
|
|
setShowControls,
|
|
setShowSpeedMenu,
|
|
controlsTimeoutRef,
|
|
speedMenuTimeoutRef,
|
|
mouseMoveThrottleRef
|
|
});
|
|
|
|
const utilities = useUtilities({
|
|
src,
|
|
setToastMessage,
|
|
setShowToast,
|
|
toastTimeoutRef
|
|
});
|
|
|
|
const changePlaybackSpeed = (speed: number) => {
|
|
playbackControls.changePlaybackSpeed(speed, speedMenuTimeoutRef, setPlaybackRate, setShowSpeedMenu);
|
|
};
|
|
|
|
useKeyboardShortcuts({
|
|
videoRef,
|
|
isPlaying,
|
|
volume,
|
|
isPiPSupported,
|
|
togglePlay: playbackControls.togglePlay,
|
|
toggleMute: volumeControls.toggleMute,
|
|
toggleFullscreen: fullscreenControls.toggleFullscreen,
|
|
togglePictureInPicture: fullscreenControls.togglePictureInPicture,
|
|
skipForward: skipControls.skipForward,
|
|
skipBackward: skipControls.skipBackward,
|
|
showVolumeBarTemporarily: volumeControls.showVolumeBarTemporarily,
|
|
setShowControls,
|
|
setVolume,
|
|
setIsMuted,
|
|
controlsTimeoutRef
|
|
});
|
|
|
|
return {
|
|
handleMouseMove: controlsVisibility.handleMouseMove,
|
|
togglePlay: playbackControls.togglePlay,
|
|
handlePlay: playbackControls.handlePlay,
|
|
handlePause: playbackControls.handlePause,
|
|
handleTimeUpdateEvent: playbackControls.handleTimeUpdateEvent,
|
|
handleLoadedMetadata: playbackControls.handleLoadedMetadata,
|
|
handleVideoError: playbackControls.handleVideoError,
|
|
handleProgressClick: progressControls.handleProgressClick,
|
|
handleProgressMouseDown: progressControls.handleProgressMouseDown,
|
|
toggleMute: volumeControls.toggleMute,
|
|
showVolumeBarTemporarily: volumeControls.showVolumeBarTemporarily,
|
|
handleVolumeChange: volumeControls.handleVolumeChange,
|
|
handleVolumeMouseDown: volumeControls.handleVolumeMouseDown,
|
|
toggleFullscreen: fullscreenControls.toggleFullscreen,
|
|
togglePictureInPicture: fullscreenControls.togglePictureInPicture,
|
|
showAirPlayMenu: fullscreenControls.showAirPlayMenu,
|
|
skipForward: skipControls.skipForward,
|
|
skipBackward: skipControls.skipBackward,
|
|
changePlaybackSpeed,
|
|
handleCopyLink: utilities.handleCopyLink,
|
|
startSpeedMenuTimeout: controlsVisibility.startSpeedMenuTimeout,
|
|
clearSpeedMenuTimeout: controlsVisibility.clearSpeedMenuTimeout,
|
|
formatTime: playbackControls.formatTime
|
|
};
|
|
}
|