email-agent-api / frontend /src /hooks /useEmailQueue.js
habib-analyst's picture
Initial commit for deployment
e9d1895
Raw History Blame Contribute Delete
1.69 kB
import { useState, useCallback } from "react";
export function useEmailQueue() {
const [queue, setQueue] = useState([]);
const [currentIndex, setCurrentIndex] = useState(0);
const [stats, setStats] = useState({
queued: 0,
researching: 0,
generated: 0,
approved: 0,
sent: 0,
skipped: 0,
failed: 0,
});
const initQueue = useCallback((recipientList) => {
const items = recipientList
.filter((p) => p.trim())
.map((p, i) => ({
index: i,
input: p.trim(),
status: "queued",
contactData: null,
emailContent: null,
htmlBody: null,
error: null,
}));
setQueue(items);
setCurrentIndex(0);
setStats({ ...stats, queued: items.length });
return items;
}, []);
const updateItem = useCallback((index, updates) => {
setQueue((prev) =>
prev.map((item) =>
item.index === index ? { ...item, ...updates } : item
)
);
}, []);
const nextItem = useCallback(() => {
setCurrentIndex((prev) => {
const next = prev + 1;
return next < queue.length ? next : prev;
});
}, [queue.length]);
const currentItem = queue[currentIndex] || null;
const recalcStats = useCallback(() => {
const s = {
queued: 0,
researching: 0,
generated: 0,
approved: 0,
sent: 0,
skipped: 0,
failed: 0,
};
queue.forEach((item) => {
if (s[item.status] !== undefined) s[item.status]++;
});
setStats(s);
}, [queue]);
return {
queue,
currentIndex,
currentItem,
stats,
initQueue,
updateItem,
nextItem,
setCurrentIndex,
recalcStats,
};
}