mirror of
https://github.com/KuekHaoYang/KVideo.git
synced 2026-08-15 16:53:42 +08:00
81 lines
2.8 KiB
TypeScript
81 lines
2.8 KiB
TypeScript
import { useCallback, useEffect } from 'react';
|
|
|
|
interface UseMobileProgressControlsProps {
|
|
videoRef: React.RefObject<HTMLVideoElement>;
|
|
progressBarRef: React.RefObject<HTMLDivElement>;
|
|
duration: number;
|
|
setCurrentTime: (time: number) => void;
|
|
isDraggingProgressRef: React.MutableRefObject<boolean>;
|
|
}
|
|
|
|
export function useMobileProgressControls({
|
|
videoRef,
|
|
progressBarRef,
|
|
duration,
|
|
setCurrentTime,
|
|
isDraggingProgressRef
|
|
}: UseMobileProgressControlsProps) {
|
|
const updateProgressFromEvent = useCallback((e: any) => {
|
|
if (!videoRef.current || !progressBarRef.current) return;
|
|
|
|
const rect = progressBarRef.current.getBoundingClientRect();
|
|
let clientX: number;
|
|
|
|
if ('touches' in e) {
|
|
const touch = e.touches[0] || e.changedTouches?.[0];
|
|
if (!touch) return;
|
|
clientX = touch.clientX;
|
|
} else {
|
|
clientX = e.clientX;
|
|
}
|
|
|
|
const pos = Math.max(0, Math.min(1, (clientX - rect.left) / rect.width));
|
|
return pos * duration;
|
|
}, [videoRef, progressBarRef, duration]);
|
|
|
|
const handleProgressTouchStart = useCallback((e: any) => {
|
|
isDraggingProgressRef.current = true;
|
|
const newTime = updateProgressFromEvent(e);
|
|
if (newTime !== undefined) {
|
|
setCurrentTime(newTime);
|
|
}
|
|
}, [isDraggingProgressRef, updateProgressFromEvent, setCurrentTime]);
|
|
|
|
const handleProgressTouchMove = useCallback((e: any) => {
|
|
if (!isDraggingProgressRef.current) return;
|
|
e.preventDefault();
|
|
const newTime = updateProgressFromEvent(e);
|
|
if (newTime !== undefined) {
|
|
setCurrentTime(newTime);
|
|
if (videoRef.current) {
|
|
videoRef.current.currentTime = newTime;
|
|
}
|
|
}
|
|
}, [isDraggingProgressRef, updateProgressFromEvent, setCurrentTime, videoRef]);
|
|
|
|
const handleProgressTouchEnd = useCallback((e: any) => {
|
|
if (!isDraggingProgressRef.current) return;
|
|
isDraggingProgressRef.current = false;
|
|
const newTime = updateProgressFromEvent(e);
|
|
if (newTime !== undefined && videoRef.current) {
|
|
videoRef.current.currentTime = newTime;
|
|
setCurrentTime(newTime);
|
|
}
|
|
}, [isDraggingProgressRef, updateProgressFromEvent, videoRef, setCurrentTime]);
|
|
|
|
const handleProgressClick = useCallback((e: any) => {
|
|
const newTime = updateProgressFromEvent(e);
|
|
if (newTime !== undefined && videoRef.current) {
|
|
videoRef.current.currentTime = newTime;
|
|
setCurrentTime(newTime);
|
|
}
|
|
}, [updateProgressFromEvent, videoRef, setCurrentTime]);
|
|
|
|
return {
|
|
handleProgressTouchStart,
|
|
handleProgressTouchMove,
|
|
handleProgressTouchEnd,
|
|
handleProgressClick
|
|
};
|
|
}
|