import React, { FC, useState, useEffect } from '../../lib/teact/teact'; import { IS_SINGLE_COLUMN_LAYOUT } from '../../util/environment'; import { formatMediaDuration } from '../../util/dateFormat'; import formatFileSize from './helpers/formatFileSize'; import useLang from '../../hooks/useLang'; import Button from '../ui/Button'; import './VideoPlayerControls.scss'; type IProps = { bufferedProgress: number; currentTime: number; duration: number; fileSize: number; isForceVisible: boolean; isForceMobileVersion?: boolean; isPlayed: boolean; isFullscreenSupported: boolean; isFullscreen: boolean; onChangeFullscreen: (e: React.MouseEvent) => void; onPlayPause: (e: React.MouseEvent) => void; onSeek: OnChangeHandler; }; type OnChangeHandler = (e: React.ChangeEvent) => void; const stopEvent = (e: React.MouseEvent) => { e.stopPropagation(); }; const HIDE_CONTROLS_TIMEOUT_MS = 800; const VideoPlayerControls: FC = ({ bufferedProgress, currentTime, duration, fileSize, isForceVisible, isForceMobileVersion, isPlayed, isFullscreenSupported, isFullscreen, onChangeFullscreen, onPlayPause, onSeek, }) => { const [isVisible, setVisibility] = useState(true); useEffect(() => { if (isForceVisible) { setVisibility(isForceVisible); } }, [isForceVisible]); useEffect(() => { let timeout: number | undefined; if (!isForceVisible) { if (IS_SINGLE_COLUMN_LAYOUT) { setVisibility(false); } else { timeout = window.setTimeout(() => { setVisibility(false); }, HIDE_CONTROLS_TIMEOUT_MS); } } return () => { if (timeout) { window.clearTimeout(timeout); } }; }, [isForceVisible]); useEffect(() => { if (isVisible || isForceVisible) { document.body.classList.add('video-controls-visible'); } return () => { document.body.classList.remove('video-controls-visible'); }; }, [isForceVisible, isVisible]); const lang = useLang(); if (!isVisible && !isForceVisible) { return undefined; } return (
{renderSeekLine(currentTime, duration, bufferedProgress, onSeek)} {renderTime(currentTime, duration)} {bufferedProgress < 1 && renderFileSize(bufferedProgress, fileSize)} {isFullscreenSupported && ( )}
); }; function renderTime(currentTime: number, duration: number) { return (
{`${formatMediaDuration(currentTime)} / ${formatMediaDuration(duration)}`}
); } function renderFileSize(downloadedPercent: number, totalSize: number) { return (
{`${formatFileSize(totalSize * downloadedPercent)} / ${formatFileSize(totalSize)}`}
); } function renderSeekLine(currentTime: number, duration: number, bufferedProgress: number, onSeek: OnChangeHandler) { const percentagePlayed = (currentTime / duration) * 100; const percentageBuffered = bufferedProgress * 100; return (
); } export default VideoPlayerControls;