mirror of
https://github.com/KuekHaoYang/KVideo.git
synced 2026-08-16 01:03:42 +08:00
108 lines
2.5 KiB
TypeScript
108 lines
2.5 KiB
TypeScript
'use client';
|
|
|
|
import { useDesktopPlayerState } from './hooks/useDesktopPlayerState';
|
|
import { useDesktopPlayerLogic } from './hooks/useDesktopPlayerLogic';
|
|
import { useHLSPreloader } from './hooks/useHLSPreloader';
|
|
import { useHlsPlayer } from './hooks/useHlsPlayer';
|
|
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;
|
|
}
|
|
|
|
export function DesktopVideoPlayer({
|
|
src,
|
|
poster,
|
|
onError,
|
|
onTimeUpdate,
|
|
initialTime = 0,
|
|
shouldAutoPlay = false
|
|
}: DesktopVideoPlayerProps) {
|
|
const { refs, state } = useDesktopPlayerState();
|
|
const { currentTime } = state;
|
|
|
|
// Preload HLS segments
|
|
useHLSPreloader({ src, currentTime, videoRef: refs.videoRef, isLoading: state.isLoading });
|
|
|
|
// Initialize HLS Player
|
|
useHlsPlayer({
|
|
videoRef: refs.videoRef,
|
|
src,
|
|
autoPlay: shouldAutoPlay
|
|
});
|
|
|
|
const {
|
|
videoRef,
|
|
containerRef,
|
|
} = refs;
|
|
|
|
const {
|
|
isPlaying,
|
|
setShowControls,
|
|
setIsLoading,
|
|
} = state;
|
|
|
|
const logic = useDesktopPlayerLogic({
|
|
src,
|
|
initialTime,
|
|
shouldAutoPlay,
|
|
onError,
|
|
onTimeUpdate,
|
|
refs,
|
|
state
|
|
});
|
|
|
|
const {
|
|
handleMouseMove,
|
|
togglePlay,
|
|
handlePlay,
|
|
handlePause,
|
|
handleTimeUpdateEvent,
|
|
handleLoadedMetadata,
|
|
handleVideoError,
|
|
} = logic;
|
|
|
|
return (
|
|
<div
|
|
ref={containerRef}
|
|
className="relative aspect-video bg-black rounded-[var(--radius-2xl)] overflow-hidden group"
|
|
onMouseMove={handleMouseMove}
|
|
onMouseLeave={() => isPlaying && setShowControls(false)}
|
|
>
|
|
{/* Video Element */}
|
|
<video
|
|
ref={videoRef}
|
|
className="w-full h-full object-contain"
|
|
poster={poster}
|
|
x-webkit-airplay="allow"
|
|
onPlay={handlePlay}
|
|
onPause={handlePause}
|
|
onTimeUpdate={handleTimeUpdateEvent}
|
|
onLoadedMetadata={handleLoadedMetadata}
|
|
onError={handleVideoError}
|
|
onWaiting={() => setIsLoading(true)}
|
|
onCanPlay={() => setIsLoading(false)}
|
|
onClick={togglePlay}
|
|
/>
|
|
|
|
<DesktopOverlayWrapper
|
|
state={state}
|
|
onTogglePlay={togglePlay}
|
|
/>
|
|
|
|
<DesktopControlsWrapper
|
|
src={src}
|
|
state={state}
|
|
logic={logic}
|
|
refs={refs}
|
|
/>
|
|
</div>
|
|
);
|
|
}
|