'use client' import { useState, useRef } from 'react' import Header from '@/components/Header' import { Upload, Loader2, Sparkles, Download, Play } from 'lucide-react' import { useSettings } from '@/lib/context/SettingsContext' import { analyzeMediaWithAI } from '@/lib/api/opencode' import { generateVideo, waitForTaskCompletion } from '@/lib/api/api34ai' interface AnalysisResult { contentSummary: string style: { lighting: string; colorPalette: string; mood: string } motion: { type: string; transitions: string[]; duration: string } script: string keyframes: { time: string; description: string }[] } export default function UploadPage() { const { settings, isMounted } = useSettings() const fileInputRef = useRef(null) const [isDragging, setIsDragging] = useState(false) const [file, setFile] = useState(null) const [previewUrl, setPreviewUrl] = useState(null) const [isAnalyzing, setIsAnalyzing] = useState(false) const [isGenerating, setIsGenerating] = useState(false) const [analysis, setAnalysis] = useState(null) const [generatedVideo, setGeneratedVideo] = useState(null) const [error, setError] = useState(null) if (!isMounted) { return (
Loading...
) } const handleDragOver = (e: React.DragEvent) => { e.preventDefault() setIsDragging(true) } const handleDragLeave = () => { setIsDragging(false) } const handleDrop = (e: React.DragEvent) => { e.preventDefault() setIsDragging(false) const droppedFile = e.dataTransfer.files[0] if (droppedFile) { handleFileSelect(droppedFile) } } const handleFileSelect = (selectedFile: File) => { const validTypes = ['image/jpeg', 'image/png', 'image/gif', 'video/mp4', 'video/quicktime'] if (!validTypes.includes(selectedFile.type)) { setError('Invalid file type. Please upload JPG, PNG, GIF, or MP4.') return } setFile(selectedFile) setPreviewUrl(URL.createObjectURL(selectedFile)) setAnalysis(null) setGeneratedVideo(null) setError(null) } const handleFileInputChange = (e: React.ChangeEvent) => { const selectedFile = e.target.files?.[0] if (selectedFile) { handleFileSelect(selectedFile) } } const handleAnalyze = async () => { if (!file || !previewUrl) return if (!settings.opencodeApiKey) { setError('Please configure OpenCode API key in Settings') return } setIsAnalyzing(true) setError(null) try { const mediaType = file.type.startsWith('video') ? 'video' : 'image' const result = await analyzeMediaWithAI( settings.opencodeApiKey, settings.opencodeModel, mediaType, previewUrl ) setAnalysis(result) } catch (e: any) { setError(e.message || 'Failed to analyze media') } finally { setIsAnalyzing(false) } } const handleRecreate = async () => { if (!analysis || !settings.api34aiKey) return setIsGenerating(true) setError(null) try { const videoResult = await generateVideo( settings.api34aiKey, { prompt: analysis.script, model: settings.videoModel || 'veo3.1', duration: settings.defaultDuration, ratio: settings.defaultAspectRatio, resolution: '720p', quality: 'fast' } ) const videoUrl = await waitForTaskCompletion( settings.api34aiKey, videoResult.task_id ) setGeneratedVideo(videoUrl) } catch (e: any) { setError(e.message || 'Failed to generate video') } finally { setIsGenerating(false) } } const downloadVideo = async () => { if (!generatedVideo) return try { const response = await fetch(generatedVideo) const blob = await response.blob() const url = window.URL.createObjectURL(blob) const link = document.createElement('a') link.href = url link.download = `recreated-${Date.now()}.mp4` link.click() window.URL.revokeObjectURL(url) } catch (e) { console.error('Download failed:', e) } } return (

Upload & Analyze Media

Upload an image or video for AI to analyze and recreate

{!file ? (
fileInputRef.current?.click()} className={`border-2 border-dashed rounded-xl p-12 text-center cursor-pointer transition-colors ${ isDragging ? 'border-primary bg-primary/10' : 'border-slate-600 hover:border-slate-500' }`} >

Drag & drop files here or click to upload

Supports: JPG, PNG, GIF, MP4, MOV

) : (

{file.name}

{(file.size / 1024 / 1024).toFixed(2)} MB

{file.type.startsWith('video') ? (
{analysis && ( )}
{error && (
{error}
)} {analysis && (

AI Analysis

Content Summary

{analysis.contentSummary}

Lighting

{analysis.style.lighting}

Color Palette

{analysis.style.colorPalette}

Mood

{analysis.style.mood}

Script (AI Generated)

{analysis.script}

Animation Breakdown

{analysis.keyframes.map((kf, i) => (
{kf.time} {kf.description}
))}
)} {generatedVideo && (

Generated Video

)}
)}
) }