import { useParams } from 'react-router-dom'; import { useEffect, useRef, useState } from "react"; import Playbar from "./../components/video/Playbar"; import PlaybackSlider from "./../components/video/PlaybackSlider"; import ClipRangeSlider from "./../components/video/ClipRangeSlider"; import ConfigBox from "../components/video/ConfigBox.tsx"; import ExportWidget from "../components/video/ExportWidget.tsx"; import {editFile, getMetadata, processFile, getProgress} from "../utils/endpoints" import type { VideoMetadata } from "../utils/types.ts"; import Box from "../components/Box.tsx"; import MetadataBox from "../components/video/MetadataBox.tsx"; const API_URL = import.meta.env.VITE_API_URL; const ClipEdit = () => { const { id } = useParams(); const videoRef = useRef(null); const videoUrl = API_URL + `/api/v1/download/input/${id}` const [metadata, setMetadata] = useState(null); const [playbackValue, setPlaybackValue] = useState(0); const [outputMetadata, setOutputMetadata] = useState({ // default values title: "", description: "", startPoint: 0, duration: 5, width: 1280, height: 720, fps: 30, fileSize: 10000 }); const [progress, setProgress] = useState(0); const [downloadable, setDownloadable] = useState(false); const [error, setError] = useState(null); const sendData = async() => { if (!id) return; editFile(id, outputMetadata) .then(() => { processFile(id) .catch((err: Error) => setError(`Failed to process file: ${err.message}`)); }) .catch((err: Error) => setError(`Failed to edit file: ${err.message}`)); const interval = setInterval(async() => await pollProgress(id, interval), 500); } const pollProgress = async (id: string, intervalId: number) => { getProgress(id) .then((progress) => { setProgress(progress.process.progress); if (progress.process.complete) { clearInterval(intervalId); setDownloadable(true); } else { setDownloadable(false) } }) .catch((err: Error) => { setError(`Failed to fetch progress: ${err.message}`); clearInterval(intervalId); }); } const handleDownload = async () => { const response = await fetch(API_URL + `/api/v1/download/output/${id}`); if (!response.ok) { console.error('Download failed'); return; } const blob = await response.blob(); const url = window.URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `${id}.mp4`; document.body.appendChild(a); a.click(); a.remove(); window.URL.revokeObjectURL(url); }; useEffect(() => { if (!id) return; getMetadata(id) .then((data) => setMetadata(data ?? null)) .catch((err) => console.error("Metadata fetch failed:", err)); }, [id]); return (
{metadata && {error && (
{error}
)}
}
); } export default ClipEdit;