import React, { useState } from 'react'; import { AnalysisResult, EmailDraft, Language } from '../types'; import { generateOutreachCampaign, translateEmailDrafts } from '../services/geminiService'; import { Upload, FileText, Sparkles, Copy, Check, Loader2, ArrowRight, CheckCircle2, Download, Languages } from 'lucide-react'; interface StepOutreachProps { company: AnalysisResult; language: Language; referenceUrl: string; onBack: () => void; knowledgeBase?: string; // New prop for pre-loaded context } export const StepOutreach: React.FC = ({ company, language, referenceUrl, onBack, knowledgeBase }) => { const [fileContent, setFileContent] = useState(knowledgeBase || ''); const [fileName, setFileName] = useState(knowledgeBase ? 'Knowledge Base from Strategy Step' : ''); const [isProcessing, setIsProcessing] = useState(false); const [isTranslating, setIsTranslating] = useState(false); const [emails, setEmails] = useState([]); const [activeTab, setActiveTab] = useState(0); const [copied, setCopied] = useState(false); // If knowledgeBase prop changes, update state (useful if it loads late) React.useEffect(() => { if (knowledgeBase && !fileContent) { setFileContent(knowledgeBase); setFileName('Knowledge Base from Strategy Step'); } }, [knowledgeBase]); const handleFileUpload = (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (file) { const reader = new FileReader(); reader.onload = (event) => { setFileContent(event.target?.result as string); setFileName(file.name); }; reader.readAsText(file); } }; const handleGenerate = async () => { if (!fileContent) return; setIsProcessing(true); try { const drafts = await generateOutreachCampaign(company, fileContent, language, referenceUrl); setEmails(drafts); } catch (e) { console.error(e); alert('Failed to generate campaign. Please try again.'); } finally { setIsProcessing(false); } }; const handleTranslate = async (targetLang: Language) => { if (emails.length === 0) return; setIsTranslating(true); try { const translated = await translateEmailDrafts(emails, targetLang); setEmails(translated); } catch (e) { console.error("Translation failed", e); alert("Translation failed."); } finally { setIsTranslating(false); } } const handleDownloadMD = () => { if (emails.length === 0) return; let content = `# Hyper-Personalized Campaign: ${company.companyName}\n\n`; content += `Generated by parcelLab Intel\n\n`; emails.forEach((email, index) => { content += `## Variant ${index + 1}: ${email.persona}\n\n`; content += `**Subject:** ${email.subject}\n\n`; content += `**Body:**\n\n${email.body}\n\n`; content += `**Analysis:**\n`; email.keyPoints.forEach(kp => content += `- ${kp}\n`); content += `\n---\n\n`; }); const blob = new Blob([content], { type: 'text/markdown' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `campaign_${company.companyName.replace(/\s+/g, '_')}_variants.md`; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); }; const copyToClipboard = (text: string) => { navigator.clipboard.writeText(text); setCopied(true); setTimeout(() => setCopied(false), 2000); }; // Helper to render text with bold syntax **text** const renderBoldText = (text: string) => { const parts = text.split(/(\*\*.*?\*\*)/g); return parts.map((part, index) => { if (part.startsWith('**') && part.endsWith('**')) { return {part.slice(2, -2)}; } return {part}; }); }; if (emails.length > 0) { const activeEmail = emails[activeTab]; return (

Hyper-Personalized Campaign

Target: {company.companyName}

{/* Toolbar */}
Translate
{isTranslating && }
{/* Sidebar Tabs */}
{emails.map((email, idx) => ( ))}
{/* Content Area */}
{activeEmail ? ( <>
{activeEmail.subject}
{renderBoldText(activeEmail.body)}
{/* Checklist Section */} {activeEmail.keyPoints && activeEmail.keyPoints.length > 0 && (

Persona & KPI Analysis

    {activeEmail.keyPoints.map((point, i) => (
  • {point}
  • ))}
)} ) : (
Select a variant
)}
); } return (

Create Outreach Campaign

Generating emails for {company.companyName}.
Please upload your marketing knowledge base (Markdown/Text) to begin.

{!fileContent ? (
) : (

Knowledge Base Loaded

{fileName}

)}
); };