const { useState, useCallback } = React; const FileUpload = ({ onFilesLoaded }) => { const [isDragging, setIsDragging] = useState(false); const [jsonFile, setJsonFile] = useState(null); const [videoFile, setVideoFile] = useState(null); const [error, setError] = useState(null); const handleDrag = useCallback((e) => { e.preventDefault(); e.stopPropagation(); if (e.type === "dragenter" || e.type === "dragover") { setIsDragging(true); } else if (e.type === "dragleave") { setIsDragging(false); } }, []); const processFiles = (files) => { let newJson = jsonFile; let newVideo = videoFile; let err = null; Array.from(files).forEach(file => { if (file.name.endsWith('.json')) { newJson = file; } else if (file.type.startsWith('video/') || file.name.match(/\.(mp4|mov|webm|mkv)$/i)) { newVideo = file; } else { err = "Unsupported file type. Please upload a JSON and a Video file."; } }); if (err) setError(err); else setError(null); setJsonFile(newJson); setVideoFile(newVideo); }; const handleDrop = useCallback((e) => { e.preventDefault(); e.stopPropagation(); setIsDragging(false); if (e.dataTransfer.files && e.dataTransfer.files.length > 0) { processFiles(e.dataTransfer.files); e.dataTransfer.clearData(); } }, [jsonFile, videoFile]); const handleInput = (e) => { if (e.target.files && e.target.files.length > 0) { processFiles(e.target.files); } }; const handleStart = async () => { if (!jsonFile || !videoFile) { setError("Please upload both a JSON file and a Video file."); return; } try { const text = await jsonFile.text(); const data = JSON.parse(text); const videoUrl = URL.createObjectURL(videoFile); onFilesLoaded({ data, videoUrl, videoFileName: videoFile.name }); } catch (e) { setError("Failed to parse JSON file."); console.error(e); } }; return (

Drop your files here

Upload the Video Intelligence JSON output and the source Video file.

{jsonFile ? jsonFile.name : 'Waiting for JSON...'}
{videoFile ? videoFile.name : 'Waiting for Video...'}
{error && (
{error}
)} {jsonFile && videoFile && (
)}
); }; window.FileUpload = FileUpload;