'use client' import { useState } from 'react' import { Sparkles, Play, Download, RefreshCw, Loader2, CheckCircle, AlertCircle } from 'lucide-react' import { useSettings } from '@/lib/context/SettingsContext' import { createWorkflowWithAI } from '@/lib/api/opencode' import { generateImage, generateVideo, waitForTaskCompletion } from '@/lib/api/api34ai' import { WorkflowNode } from '@/lib/types' const nodeIcons: Record = { idea: '💡', script: '📝', image: '🖼️', video: '🎬', } const nodeLabels: Record = { idea: 'Idea', script: 'Script', image: 'Image', video: 'Video', } export default function CreateTab() { const { settings } = useSettings() const [idea, setIdea] = useState('') const [isCreatingWorkflow, setIsCreatingWorkflow] = useState(false) const [isExecuting, setIsExecuting] = useState(false) const [workflow, setWorkflow] = useState([]) const [currentStep, setCurrentStep] = useState(null) const [error, setError] = useState(null) const handleCreateWorkflow = async () => { if (!idea.trim()) { setError('Please enter a video idea') return } if (!settings.opencodeApiKey) { setError('Please configure OpenCode API key in Settings') return } setIsCreatingWorkflow(true) setError(null) try { const result = await createWorkflowWithAI( settings.opencodeApiKey, settings.opencodeModel, idea ) const nodes: WorkflowNode[] = result.nodes.map((node, index) => ({ id: `node-${index}`, type: node.type, data: { prompt: node.prompt, status: 'idle', model: node.type === 'image' ? settings.imageModel : node.type === 'video' ? settings.videoModel : undefined, duration: settings.defaultDuration, aspectRatio: settings.defaultAspectRatio, }, position: { x: 100, y: 100 + index * 150 }, })) setWorkflow(nodes) } catch (e: any) { setError(e.message || 'Failed to create workflow') } finally { setIsCreatingWorkflow(false) } } const handleExecuteWorkflow = async () => { if (!settings.api34aiKey) { setError('Please configure 34ai API key in Settings') return } setIsExecuting(true) setError(null) try { for (const node of workflow) { setCurrentStep(nodeLabels[node.type]) const updatedNodes = [...workflow] const nodeIndex = updatedNodes.findIndex(n => n.id === node.id) updatedNodes[nodeIndex] = { ...node, data: { ...node.data, status: 'running' }, } setWorkflow(updatedNodes) try { if (node.type === 'image') { const result = await generateImage( settings.api34aiKey, { prompt: node.data.prompt, model: node.data.model || 'banana_pro_2', ratio: node.data.aspectRatio || '1:1', resolution: '1K' } ) const imageUrl = await waitForTaskCompletion( settings.api34aiKey, result.task_id ) updatedNodes[nodeIndex] = { ...updatedNodes[nodeIndex], data: { ...updatedNodes[nodeIndex].data, status: 'completed', result: imageUrl, }, } setWorkflow([...updatedNodes]) } else if (node.type === 'video') { const videoResult = await generateVideo( settings.api34aiKey, { prompt: node.data.prompt, model: node.data.model || 'veo3.1', duration: node.data.duration || 4, ratio: node.data.aspectRatio || '16:9', resolution: '720p', quality: 'fast' } ) const videoUrl = await waitForTaskCompletion( settings.api34aiKey, videoResult.task_id ) updatedNodes[nodeIndex] = { ...updatedNodes[nodeIndex], data: { ...updatedNodes[nodeIndex].data, status: 'completed', result: videoUrl, }, } setWorkflow([...updatedNodes]) } else { updatedNodes[nodeIndex] = { ...updatedNodes[nodeIndex], data: { ...updatedNodes[nodeIndex].data, status: 'completed', }, } setWorkflow([...updatedNodes]) } } catch (nodeError: any) { updatedNodes[nodeIndex] = { ...updatedNodes[nodeIndex], data: { ...updatedNodes[nodeIndex].data, status: 'error', error: nodeError.message, }, } setWorkflow([...updatedNodes]) throw nodeError } } } catch (e: any) { setError(e.message || 'Workflow execution failed') } finally { setIsExecuting(false) setCurrentStep(null) } } const downloadMedia = async (url: string, filename: string) => { try { const response = await fetch(url) const blob = await response.blob() const downloadUrl = window.URL.createObjectURL(blob) const link = document.createElement('a') link.href = downloadUrl link.download = filename link.click() window.URL.revokeObjectURL(downloadUrl) } catch (e) { console.error('Download failed:', e) } } const getStatusIcon = (status: string) => { switch (status) { case 'running': return case 'completed': return case 'error': return default: return
} } return (

Create Video from Idea

Enter your video idea and let AI create the workflow