import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query"; import { apiClient } from "../lib/apiClient"; import { Flame, ShieldCheck, TrendingUp, Sliders, CheckCircle2, AlertTriangle, Zap, Mail, Play, Pause, ArrowUpRight } from "lucide-react"; import { useState } from "react"; import StatusBadge from "../components/StatusBadge"; import FormDrawer from "../components/FormDrawer"; import toast from "react-hot-toast"; export default function Warmup() { const queryClient = useQueryClient(); const [selectedWarmupAccount, setSelectedWarmupAccount] = useState(null); const [isSettingsOpen, setIsSettingsOpen] = useState(false); const { data: accounts = [], isLoading, refetch } = useQuery({ queryKey: ["email-accounts"], queryFn: async () => { const res = await apiClient.get("/email-accounts"); return res.data; }, }); const toggleWarmupMutation = useMutation({ mutationFn: async ({ id, status }: { id: string; status: "ACTIVE" | "PAUSED" }) => { const action = status === "ACTIVE" ? "enable" : "disable"; const res = await apiClient.post(`/email-accounts/${id}/warmup/${action}`); return res.data; }, onSuccess: (_, variables) => { toast.success(`Warmup ${variables.status === "ACTIVE" ? "activated" : "paused"}`); refetch(); }, onError: () => { toast.error("Failed to update warmup status"); } }); const activeWarmups = accounts.filter((a: any) => a.warmup_enabled).length; const dailyWarmupVolume = accounts.reduce((total: number, account: any) => total + (account.warmup_daily_count || 0), 0); const replyRates = accounts.map((account: any) => account.reply_rate_percentage).filter((rate: any) => typeof rate === "number"); const averageReplyRate = replyRates.length ? (replyRates.reduce((total: number, rate: number) => total + rate, 0) / replyRates.length).toFixed(1) : "—"; const scores = accounts.map((account: any) => account.warmup_score).filter((score: any) => typeof score === "number"); const averageScore = scores.length ? (scores.reduce((total: number, score: number) => total + score, 0) / scores.length).toFixed(1) : "—"; return (
{/* Header */}

Autonomous Warmup Engine

Gradually ramps mailbox sending volume, interacts with peer networks, and rescues emails from spam folders.

{/* KPI Overview */}
Warmup Coverage
{activeWarmups} / {accounts.length}
Inboxes in active pool
Daily Warmup Volume
{dailyWarmupVolume} / day
Auto-incrementing daily
Warmup Reply Rate
{averageReplyRate}%
Autonomous peer response
Inbox Health Score
{averageScore} / 100
Excellent deliverability
{/* Warmup Mailboxes Table */}
{accounts.map((acc: any) => { const isWarmupActive = Boolean(acc.warmup_enabled); const rampDay = acc.ramp_day || "—"; const score = acc.warmup_score || 0; return ( ); })}
Mailbox Warmup Status Ramp Day Reputation Score Warmup Volume Warmup Toggle
{acc.from_name}
{acc.from_email}
Day {rampDay}
{score}%
{acc.warmup_daily_count || 0} warm emails sent today
{/* Global Warmup Rules Drawer */} setIsSettingsOpen(false)} title="Autonomous Warmup Settings" subtitle="Fine-tune daily ramping schedules and simulated reply rates." >
Maximum simulated emails per inbox daily
Additional emails added each consecutive day
Conservative (15%) Target: 35% Aggressive (60%)
Spam Rescue Protocol Automatically moves warm emails out of spam folders
); }