Spaces:
Sleeping
Sleeping
File size: 1,685 Bytes
e9d1895 | 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 | 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,
};
}
|