import React, { useState } from 'react'; import { AnalysisResult, EmailDraft, Language, OutreachResponse } from '../types'; import { generateOutreachCampaign, translateEmailDrafts } from '../services/geminiService'; import { Upload, FileText, Sparkles, Copy, Check, Loader2, ArrowRight, CheckCircle2, Download, Languages, Plus, UserPlus } 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 [isGeneratingSpecific, setIsGeneratingSpecific] = useState(null); // Track which specific role is loading const [emails, setEmails] = useState([]); const [availableRoles, setAvailableRoles] = useState([]); // Suggested roles not yet generated 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 { // Initial generation (Top 5 + Suggestions) const response: OutreachResponse = await generateOutreachCampaign(company, fileContent, language, referenceUrl); setEmails(response.campaigns); setAvailableRoles(response.available_roles || []); } catch (e) { console.error(e); alert('Failed to generate campaign. Please try again.'); } finally { setIsProcessing(false); } }; const handleGenerateSpecific = async (role: string) => { if (!fileContent) return; setIsGeneratingSpecific(role); try { // Generate single specific campaign const response: OutreachResponse = await generateOutreachCampaign(company, fileContent, language, referenceUrl, role); if (response.campaigns && response.campaigns.length > 0) { // Add new campaign to list setEmails(prev => [...prev, response.campaigns[0]]); // Remove from available roles setAvailableRoles(prev => prev.filter(r => r !== role)); // Switch view to new campaign setActiveTab(emails.length); } } catch (e) { console.error("Failed to generate specific role", e); alert(`Failed to generate campaign for ${role}`); } finally { setIsGeneratingSpecific(null); } }; 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 */}

Generated Campaigns

{/* Generated List */}
{emails.map((email, idx) => ( ))}
{/* Suggestions List */} {availableRoles.length > 0 && (

Other Relevant Roles

{availableRoles.map((role, i) => (
{role}
))}
)}
{/* 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}

)}
); };