import { create } from "zustand"; import type { AnnotationTool } from "@/types"; import { ASPECT_OFF, type BlankingMode } from "@/lib/aspect-overlays"; import type { EditRange } from "@/lib/handles"; interface ReviewPlayerStore { // Playback isPlaying: boolean; currentFrame: number; currentTime: number; duration: number; playbackRate: number; volume: number; isMuted: boolean; isFullscreen: boolean; // Annotation isAnnotating: boolean; selectedTool: AnnotationTool; selectedColor: string; strokeWidth: number; showAnnotations: boolean; // Delivery blanking — a viewing aid only, never part of the saved review aspectPresetId: string; blankingMode: BlankingMode; // Config (set from version data) fps: number; totalFrames: number; // Handles — where the cut sits in the media (null: no handles marked), and // whether playback keeps to it. Viewing aids only; the media is untouched. editRange: EditRange | null; editRangeOnly: boolean; // Actions setPlaying: (playing: boolean) => void; setCurrentFrame: (frame: number) => void; setCurrentTime: (time: number) => void; setDuration: (duration: number) => void; setPlaybackRate: (rate: number) => void; setVolume: (volume: number) => void; setMuted: (muted: boolean) => void; setFullscreen: (fullscreen: boolean) => void; setAnnotating: (annotating: boolean) => void; setSelectedTool: (tool: AnnotationTool) => void; setSelectedColor: (color: string) => void; setStrokeWidth: (width: number) => void; setShowAnnotations: (show: boolean) => void; setAspectPresetId: (id: string) => void; setBlankingMode: (mode: BlankingMode) => void; setFps: (fps: number) => void; setTotalFrames: (frames: number) => void; setEditRange: (range: EditRange | null) => void; setEditRangeOnly: (on: boolean) => void; reset: () => void; } const initialState = { isPlaying: false, currentFrame: 0, currentTime: 0, duration: 0, playbackRate: 1, volume: 1, isMuted: false, isFullscreen: false, isAnnotating: false, selectedTool: "freehand" as AnnotationTool, selectedColor: "#ef4444", strokeWidth: 2, showAnnotations: true, aspectPresetId: ASPECT_OFF, blankingMode: "solid" as BlankingMode, fps: 24, totalFrames: 0, editRange: null as EditRange | null, editRangeOnly: false, }; export const useReviewStore = create((set) => ({ ...initialState, setPlaying: (isPlaying) => set({ isPlaying }), setCurrentFrame: (currentFrame) => set({ currentFrame }), setCurrentTime: (currentTime) => set({ currentTime }), setDuration: (duration) => set({ duration }), setPlaybackRate: (playbackRate) => set({ playbackRate }), setVolume: (volume) => set({ volume }), setMuted: (isMuted) => set({ isMuted }), setFullscreen: (isFullscreen) => set({ isFullscreen }), setAnnotating: (isAnnotating) => set({ isAnnotating }), setSelectedTool: (selectedTool) => set({ selectedTool }), setSelectedColor: (selectedColor) => set({ selectedColor }), setStrokeWidth: (strokeWidth) => set({ strokeWidth }), setShowAnnotations: (showAnnotations) => set({ showAnnotations }), setAspectPresetId: (aspectPresetId) => set({ aspectPresetId }), setBlankingMode: (blankingMode) => set({ blankingMode }), setFps: (fps) => set({ fps }), setTotalFrames: (totalFrames) => set({ totalFrames }), setEditRange: (editRange) => set({ editRange }), setEditRangeOnly: (editRangeOnly) => set({ editRangeOnly }), reset: () => set(initialState), }));