File size: 6,893 Bytes
cc6cee7 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 | import React, { useState, useEffect } from 'react';
import { RefreshCw, Check, X, Send, Edit, Copy } from 'lucide-react';
import axios from 'axios';
import { API_BASE_URL } from '../config';
const GeneratorView = ({ uploadData }) => {
const [generatedEmails, setGeneratedEmails] = useState([]);
const [selectedEmailIndex, setSelectedEmailIndex] = useState(0);
const [loading, setLoading] = useState(false);
const [sending, setSending] = useState(false);
useEffect(() => {
if (uploadData && generatedEmails.length === 0) {
generateEmails();
}
}, [uploadData]);
const generateEmails = async () => {
setLoading(true);
try {
const res = await axios.post(`${API_BASE_URL}/generate-emails`, {
resume_filename: uploadData.resume_filename,
excel_filename: uploadData.excel_filename
});
setGeneratedEmails(res.data.emails);
} catch (e) {
console.error(e);
alert("Error generating emails");
} finally {
setLoading(false);
}
};
const handleSendCurrent = async () => {
// Logic to send single email or push to queue
if (!uploadData.smtpEmail || !uploadData.smtpPassword) {
alert("Missing SMTP Credentials. Go back to Upload.");
return;
}
const current = generatedEmails[selectedEmailIndex];
setSending(true);
try {
const payload = {
emails: [{
to: current.hr_email,
subject: current.email.split('\n')[0].replace("Subject: ", ""), // Simple extraction
body: current.email
}],
smtp_email: uploadData.smtpEmail,
smtp_password: uploadData.smtpPassword,
resume_filename: uploadData.resume_filename // Pass filename for attachment
};
await axios.post(`${API_BASE_URL}/send-bulk-emails`, payload);
alert(`Email sent to ${current.company}`);
} catch (e) {
console.error(e);
alert("Sending failed.");
} finally {
setSending(false);
}
};
if (!uploadData) return (
<div className="flex items-center justify-center h-full text-slate-500">
No data loaded. Please start from Upload page.
</div>
);
return (
<div className="h-[calc(100vh-100px)] flex gap-6">
{/* Left: List */}
<div className="w-1/3 glass-panel overflow-hidden flex flex-col bg-white">
<div className="p-4 border-b border-slate-200 bg-slate-50 flex justify-between items-center">
<h3 className="font-semibold text-slate-900">Candidates ({generatedEmails.length})</h3>
<button
onClick={generateEmails}
className="p-2 hover:bg-white/10 rounded-lg transition-colors"
title="Regenerate All"
>
<RefreshCw className={`w-4 h-4 text-slate-400 ${loading ? 'animate-spin' : ''}`} />
</button>
</div>
<div className="overflow-y-auto flex-1 p-2 space-y-2">
{loading ? (
<div className="text-center p-8 text-slate-500">AI is brainstorming...</div>
) : generatedEmails.map((item, idx) => (
<div
key={idx}
onClick={() => setSelectedEmailIndex(idx)}
className={`p-4 rounded-xl cursor-pointer border transition-all ${selectedEmailIndex === idx ? 'bg-indigo-50 border-indigo-200' : 'bg-transparent border-transparent hover:bg-slate-50'}`}
>
<div className="flex justify-between items-center mb-1">
<h4 className={`font-medium ${selectedEmailIndex === idx ? 'text-indigo-700' : 'text-slate-700'}`}>{item.company}</h4>
<span className="text-xs text-slate-500 px-2 py-0.5 rounded-full bg-slate-100">95%</span>
</div>
<p className="text-xs text-slate-500 truncate">{item.hr_email}</p>
</div>
))}
</div>
</div>
{/* Right: Preview */}
<div className="flex-1 glass-panel flex flex-col overflow-hidden relative bg-white">
{generatedEmails.length > 0 && (
<>
<div className="p-6 border-b border-slate-200 bg-slate-50 flex justify-between items-center">
<div>
<p className="text-sm text-slate-500 mb-1">Subject</p>
<h2 className="text-lg font-medium text-slate-900 truncate max-w-lg">
{generatedEmails[selectedEmailIndex].email.split('\n')[0].replace("Subject: ", "")}
</h2>
</div>
<div className="flex gap-2">
<button className="flex items-center gap-2 px-4 py-2 rounded-lg bg-white border border-slate-200 hover:bg-slate-50 text-slate-700 text-sm font-medium transition-colors">
<Edit className="w-4 h-4" /> Edit
</button>
<button
onClick={handleSendCurrent}
disabled={sending}
className="flex items-center gap-2 px-4 py-2 rounded-lg bg-indigo-600 hover:bg-indigo-700 text-white text-sm font-medium transition-colors shadow-lg shadow-indigo-500/20"
>
<Send className="w-4 h-4" /> {sending ? 'Sending...' : 'Send Now'}
</button>
</div>
</div>
<div className="flex-1 p-8 overflow-y-auto bg-slate-100/50">
<div className="max-w-3xl mx-auto bg-white text-slate-900 p-8 rounded-lg shadow-sm border border-slate-200 min-h-full font-serif loading-relaxed leading-7 whitespace-pre-wrap">
{generatedEmails[selectedEmailIndex].email}
</div>
</div>
</>
)}
</div>
</div>
);
};
export default GeneratorView;
|