'use client'; import { memo, type RefObject } from 'react'; import { AlertCircle, Clock, Gauge, Maximize, MessageSquare, MessageSquareOff, Minimize, Pause, Play, SkipBack, SkipForward, Volume2, VolumeX, Loader2, } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from '@/components/ui/dropdown-menu'; import { cn } from '@/lib/utils'; import { AnnotationCanvas, type AnnotationCanvasHandle, type AnnotationStroke, } from '@/components/annotation-canvas'; import type { BunnyQualityOption, CommentMarker } from '@/components/video-page/types'; interface PlayerCoreProps { activeVersionId: string | null; activeProviderId: string | undefined; embedUrl: string; videoRef: RefObject; iframeRef: RefObject; bunnyViewportRef: RefObject; timelineRef: RefObject; videoContainerRef: RefObject; isFullscreenMode: boolean; cursorIdle: boolean; isPlaying: boolean; handlePlayPause: () => void; handleVideoMouseMove: () => void; handleVideoMouseLeave: () => void; isBunnyPortraitSource: boolean; bunnyPortraitFrameWidth: number; showBunnyProcessingOverlay: boolean; showBunnyErrorOverlay: boolean; showResumePrompt: boolean; savedProgress: number | null; formatTime: (value: number) => string; handleResumeFromSaved: () => void; handleDismissResume: () => void; isAnnotating: boolean; annotationCanvasRef: RefObject; setAnnotationStrokes: (strokes: AnnotationStroke[] | null) => void; setIsAnnotating: (value: boolean) => void; setViewingAnnotation: (strokes: AnnotationStroke[] | null) => void; viewingAnnotation: AnnotationStroke[] | null; isEditingAnnotation: boolean; editAnnotationCanvasRef: RefObject; editAnnotationInitialStrokes?: AnnotationStroke[]; setEditAnnotationData: (value: string | null | undefined) => void; setIsEditingAnnotation: (value: boolean) => void; currentTime: number; duration: number; handleSkip: (seconds: number) => void; handleMuteToggle: () => void; isMuted: boolean; selectedQualityLabel: string; selectedQualityLevel: number; qualityOptions: BunnyQualityOption[]; handleQualityChange: (level: number) => void; playbackSpeed: number; speedOptions: number[]; handleSpeedChange: (speed: number) => void; toggleFullscreen: () => void; showComments: boolean; setShowComments: (value: boolean) => void; setIsMobileCommentsOpen: (value: boolean) => void; handleTimelineMouseDown: (e: React.MouseEvent) => void; handleTimelineMouseMove: (e: React.MouseEvent) => void; handleSeekToTimestamp: (timestamp: number, annotation?: string | null) => void; commentMarkers: CommentMarker[]; } export const PlayerCore = memo(function PlayerCore({ activeVersionId, activeProviderId, embedUrl, videoRef, iframeRef, bunnyViewportRef, timelineRef, videoContainerRef, isFullscreenMode, cursorIdle, isPlaying, handlePlayPause, handleVideoMouseMove, handleVideoMouseLeave, isBunnyPortraitSource, bunnyPortraitFrameWidth, showBunnyProcessingOverlay, showBunnyErrorOverlay, showResumePrompt, savedProgress, formatTime, handleResumeFromSaved, handleDismissResume, isAnnotating, annotationCanvasRef, setAnnotationStrokes, setIsAnnotating, setViewingAnnotation, viewingAnnotation, isEditingAnnotation, editAnnotationCanvasRef, editAnnotationInitialStrokes, setEditAnnotationData, setIsEditingAnnotation, currentTime, duration, handleSkip, handleMuteToggle, isMuted, selectedQualityLabel, selectedQualityLevel, qualityOptions, handleQualityChange, playbackSpeed, speedOptions, handleSpeedChange, toggleFullscreen, showComments, setShowComments, setIsMobileCommentsOpen, handleTimelineMouseDown, handleTimelineMouseMove, handleSeekToTimestamp, commentMarkers, }: PlayerCoreProps) { return ( <>
{activeProviderId === 'bunny' ? (
0 ? { width: `${bunnyPortraitFrameWidth}px` } : undefined } >
) : (