import { useState, useCallback } from 'react'; import { useParams, useNavigate } from 'react-router-dom'; import { useDispatch } from 'react-redux'; import { motion, AnimatePresence } from 'framer-motion'; import { AppDispatch } from '../store'; import { createVideo } from '../store/videosSlice'; import AITerminal from '../components/AITerminal'; const STEPS = [ { num: 1, title: 'Script', desc: 'Paste or write your video script' }, { num: 2, title: 'Voice', desc: 'Choose voice settings' }, { num: 3, title: 'Music', desc: 'Select background music' }, { num: 4, title: 'Style', desc: 'Set visual preferences' }, { num: 5, title: 'Assets', desc: 'Upload media files' }, ]; export default function VideoCreate() { const { projectId } = useParams<{ projectId: string }>(); const dispatch = useDispatch(); const navigate = useNavigate(); const [step, setStep] = useState(1); const [showTerminal, setShowTerminal] = useState(false); const [submitting, setSubmitting] = useState(false); // Form state const [script, setScript] = useState(''); const [voice, setVoice] = useState({ type: 'neutral', language: 'en', tone: 'professional', speed: 1.0, }); const [music, setMusic] = useState(''); const [style, setStyle] = useState({ fonts: { primary: 'Playfair Display', secondary: 'Montserrat' }, colors: { primary: '#1A1A1A', secondary: '#F5F5F5', accent: '#D4AF37' }, transitions: 'fade', videoStyle: 'minimal', }); const [files, setFiles] = useState([]); const next = () => setStep((s) => Math.min(s + 1, 5)); const prev = () => setStep((s) => Math.max(s - 1, 1)); const handleFileChange = useCallback((e: React.ChangeEvent) => { if (e.target.files) { setFiles(Array.from(e.target.files)); } }, []); const handleGenerate = async () => { if (!projectId || !script.trim()) return; setSubmitting(true); const videoData = { script, voice, music: { filePath: music }, assets: files.map((f) => ({ type: 'clip' as const, path: f.name })), }; const result = await dispatch(createVideo({ projectId, data: videoData })); setSubmitting(false); if (createVideo.fulfilled.match(result)) { navigate(`/video/${result.payload._id}/preview`); } }; return (
{/* Stepper */}
{STEPS.map((s) => (
setStep(s.num)} >
s.num ? 'bg-gold-500/20 text-gold-500 border border-gold-500/40' : 'bg-dark-600 text-light-500 border border-dark-400/30' }`}> {step > s.num ? ( ) : s.num}
{s.title}
))}
{/* Step Content */} {step === 1 && (

Your Script

Paste your video script or write it directly. This will be used for voiceover and subtitles.