import { ArrowDownUp, Download, Maximize, Maximize2, Minimize, Minimize2, Pause, Play, Repeat1, RotateCcw, RotateCw, Volume2, VolumeX, } from "lucide-react"; import type { RefObject } from "react"; import type { LoopMode, ObjectFit, User } from "../types.ts"; import { formatRelativeTime, formatTime, formatAbsoluteUTC } from "../utils"; import { ProgressBar } from "./ProgressBar"; import { SegmentedProgressBar } from "./SegmentedProgressBar"; interface MediaControlsProps { isVideo: boolean; isPlaying: boolean; progress: number; volume: number; rate: number; rotation: number; objectFit: ObjectFit; loopMode: LoopMode; isFullscreen: boolean; author: User; createdAt: string | Date; desc: string; // 视频专用 videoRef?: RefObject; // 图文专用 currentIndex?: number; totalSegments?: number; segmentProgress?: number; musicUrl?: string | null; audioRef?: RefObject; // 回调 onTogglePlay: () => void; onSeek: (ratio: number) => void; onVolumeChange: (volume: number) => void; onRateChange: (rate: number) => void; onRotationChange: (rotation: number) => void; onObjectFitChange: (fit: ObjectFit) => void; onLoopModeChange: (mode: LoopMode) => void; onDownload: () => void; onToggleFullscreen: () => void; } export function MediaControls({ isVideo, isPlaying, progress, volume, rate, rotation, objectFit, loopMode, isFullscreen, author, createdAt, desc, videoRef, currentIndex = 0, totalSegments = 0, segmentProgress = 0, musicUrl, audioRef, onTogglePlay, onSeek, onVolumeChange, onRateChange, onRotationChange, onObjectFitChange, onLoopModeChange, onDownload, onToggleFullscreen, }: MediaControlsProps) { return (
{/* 描述行 */}
{author.nickname} · {formatRelativeTime(createdAt)}
{desc ? (

{desc}

) : null} {/* 进度条:图文=分段;视频=单段 */} {!isVideo && totalSegments > 0 ? ( ) : ( )} {/* 控制按钮行 - 响应式布局 */}
{/* 左侧:播放控制 + 时间/进度 */}
{/* 播放进度显示 - 所有设备都显示 */}
{isVideo ? ( (() => { const v = videoRef?.current; const current = v?.currentTime ?? 0; const total = v?.duration ?? 0; return total > 0 ? `${formatTime(current)} / ${formatTime(total)}` : "--:-- / --:--"; })() ) : ( `${currentIndex + 1} / ${totalSegments}` )}
{/* 倍速 - 中等屏幕以上显示,仅视频 */} {isVideo && ( )}
{/* 中间:音量控制 - 中等屏幕以上显示 */}
{/* 旋转按钮 - 小屏幕以上显示 */} onVolumeChange(parseFloat(e.target.value))} className="w-20 lg:w-28 accent-white cursor-pointer" aria-label="音量" />
{/* 右侧:功能按钮组 */}
{/* 音量按钮 - 仅在小屏幕显示(中等屏幕以上有滑块) */} {/* 循环模式 - 中等屏幕以上显示 */} {/* 适配模式 - 小屏幕以上显示 */} {/* 下载 - 中等屏幕以上显示 */} {/* 全屏 - 所有设备都显示 */}
{/* 图文 BGM(隐藏控件,仅用于播放) */} {!isVideo && musicUrl ?
); }