"use client"; import { useState, useEffect } from "react"; import { useEditor } from "@/hooks/use-editor"; import { formatTimeCode } from "opencut-wasm"; import { invokeAction } from "@/lib/actions"; import { EditableTimecode } from "@/components/editable-timecode"; import { Button } from "@/components/ui/button"; import { FullScreenIcon, GridTableIcon, PauseIcon, PlayIcon, } from "@hugeicons/core-free-icons"; import { HugeiconsIcon } from "@hugeicons/react"; import { getGuideById } from "@/lib/guides"; import { Separator } from "@/components/ui/separator"; import { Select, SelectTrigger, SelectContent, SelectItem, SelectSeparator, } from "@/components/ui/select"; import { PREVIEW_ZOOM_PRESETS } from "@/lib/preview/constants"; import { usePreviewViewport } from "./preview-viewport"; import { GridPopover } from "./guide-popover"; import { usePreviewStore } from "@/stores/preview-store"; export function PreviewToolbar({ onToggleFullscreen, }: { onToggleFullscreen: () => void; }) { const activeGuide = usePreviewStore((state) => state.activeGuide); const activeGuideDefinition = getGuideById(activeGuide); return (
); } function TimecodeDisplay() { const editor = useEditor(); const totalDuration = useEditor((e) => e.timeline.getTotalDuration()); const fps = useEditor((e) => e.project.getActive().settings.fps); const [currentTime, setCurrentTime] = useState(() => editor.playback.getCurrentTime(), ); useEffect(() => { const handler = (e: Event) => setCurrentTime((e as CustomEvent<{ time: number }>).detail.time); window.addEventListener("playback-update", handler); window.addEventListener("playback-seek", handler); return () => { window.removeEventListener("playback-update", handler); window.removeEventListener("playback-seek", handler); }; }, []); return (
editor.playback.seek({ time })} className="text-center" /> / {formatTimeCode({ timeInSeconds: totalDuration, format: "HH:MM:SS:FF", fps })}
); } function ZoomSelect() { const { isAtFit, zoomPercent, fitToScreen, setViewportPercent } = usePreviewViewport(); const displayLabel = isAtFit ? "Fit" : `${zoomPercent}%`; const onValueChange = (value: string) => { if (value === "fit") { fitToScreen(); } else { setViewportPercent({ percent: Number(value) }); } }; return ( ); } function PlayPauseButton() { const isPlaying = useEditor((e) => e.playback.getIsPlaying()); return ( ); }