"use client"; import { RefObject } from "react"; import { Play, Pause, SkipBack, SkipForward, ChevronFirst, ChevronLast, Maximize2, MessageSquarePlus, Pencil, Eye, EyeOff, } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Tooltip, TooltipContent, TooltipTrigger, } from "@/components/ui/tooltip"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { useReviewStore } from "@/hooks/use-review-player"; import { frameToTimecode } from "@/lib/frame-utils"; import { cn } from "@/lib/utils"; const PLAYBACK_RATES = [0.25, 0.5, 0.75, 1, 1.25, 1.5, 2]; interface PlaybackControlsProps { videoRef: RefObject; fps: number; isReversing: boolean; onStepBackward: () => void; onStepForward: () => void; onReverse: () => void; onTogglePlay: () => void; onToggleFullscreen: () => void; onAddComment: () => void; } export function PlaybackControls({ videoRef, fps, isReversing, onStepBackward, onStepForward, onReverse, onTogglePlay, onToggleFullscreen, onAddComment, }: PlaybackControlsProps) { const { isPlaying, currentFrame, currentTime, totalFrames, playbackRate, isAnnotating, showAnnotations, setPlaybackRate, setAnnotating, setShowAnnotations, } = useReviewStore(); const handleRateChange = (val: string) => { const rate = parseFloat(val); if (videoRef.current) videoRef.current.playbackRate = rate; setPlaybackRate(rate); }; const timecode = frameToTimecode(currentFrame, fps); return (
{/* Frame info */}
{timecode} F{String(currentFrame).padStart(4, "0")} / {totalFrames}
{/* Divider */}
{/* Transport Controls */}
Go to start Reverse (J) Step back (←) {/* Play/Pause — slightly larger */} Play / Pause (K or Space) Step forward (→) Go to end
{/* Spacer */}
{/* Right Controls */}
{/* Playback speed */} {/* Annotation toggle */} {isAnnotating ? "Stop drawing" : "Draw annotation"} {/* Show/hide annotations */} {showAnnotations ? "Hide annotations" : "Show annotations"} {/* Add Comment */} Add comment at frame {currentFrame} {/* Fullscreen */} Fullscreen (F)
); }