import React, { useMemo, useRef } from 'react'; import { Sparkles, ArrowRight, ArrowLeft } from 'lucide-react'; import { Button } from '@/components/ui/button'; import { motion, AnimatePresence } from 'framer-motion'; import UploadStep from '@/components/upload/UploadStep'; import ProductSelector from '@/components/products/ProductSelector'; import PromptEditor from '@/components/prompts/PromptEditor'; import SequenceViewer from '@/components/sequences/SequenceViewer'; import { apiFetch } from '@/lib/api'; import { useGeneratorWorkflow } from '@/context/GeneratorWorkflowContext'; export default function EmailGeneratorTab() { const { step, setStep, uploadedFile, setUploadedFile, selectedProducts, setSelectedProducts, prompts, setPrompts, linkedinPrompts, setLinkedinPrompts, includeLinkedin, setIncludeLinkedin, isGenerating, generationComplete, beginGeneration, } = useGeneratorWorkflow(); const generateButtonRef = useRef(null); const canProceedToStep2 = uploadedFile && selectedProducts.length > 0; const canProceedToStep3 = useMemo(() => { const emailOk = selectedProducts.length > 0 && selectedProducts.every((p) => (prompts[p.name] || '').trim()); if (!emailOk) return false; if (!includeLinkedin) return true; return selectedProducts.every((p) => (linkedinPrompts[p.name] || '').trim()); }, [selectedProducts, prompts, linkedinPrompts, includeLinkedin]); const scrollToGenerateButton = () => { if (generateButtonRef.current) { generateButtonRef.current.scrollIntoView({ behavior: 'smooth', block: 'center' }); } }; const handleGenerate = async () => { if (!uploadedFile?.fileId || !canProceedToStep3) { alert('Please complete all steps before generating sequences.'); return; } try { const res = await apiFetch('/api/save-prompts', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ file_id: uploadedFile.fileId, prompts, products: selectedProducts.map((p) => p.name), linkedin_prompts: includeLinkedin ? linkedinPrompts : {}, }), }); if (!res.ok) { const err = await res.json().catch(() => ({})); throw new Error(err.detail || res.statusText); } } catch (error) { console.error('Error saving prompts:', error); alert('Failed to save templates. Please try again.'); return; } setStep(3); beginGeneration(true); }; return (
{[ { num: 1, label: 'Upload & Select' }, { num: 2, label: 'Configure Prompts' }, { num: 3, label: 'Generate & Export' }, ].map((s, idx) => (
= s.num ? 'bg-violet-600 text-white shadow-lg shadow-violet-200' : 'bg-slate-100 text-slate-400' }`} > {s.num}
{idx < 2 && (
s.num ? 'bg-violet-600' : 'bg-slate-200' }`} /> )} ))}
{step === 1 && (

Upload Your Contacts

Import your Apollo CSV and select products for your campaign

setUploadedFile(null)} /> {uploadedFile && ( )}
)} {step === 2 && (

Customize Your Prompts

Edit templates before generation.

{includeLinkedin ? (

LinkedIn prompts

) : null}
)} {step === 3 && (

{generationComplete ? 'Your Sequences Are Ready!' : 'Generating…'}

{generationComplete ? 'Review and export below.' : 'You can navigate away; generation continues in background.'}

{!isGenerating && (
)}
)}
); }