import React, { useState, useMemo, useRef, useCallback } from 'react'; import { DndContext, DragOverlay, PointerSensor, TouchSensor, useSensor, useSensors, pointerWithin, rectIntersection } from '@dnd-kit/core'; import { motion, AnimatePresence } from 'framer-motion'; import { useTheme } from '../context/ThemeContext'; import { useAuth, ROLES } from '../context/AuthContext'; import { useMockStore } from '../data/mockStore'; import { toast } from 'sonner'; import { LayoutGrid, Search, Filter, X, Send, Pencil, Plus } from 'lucide-react'; import KanbanCard, { KanbanCardDisplay } from '../components/kanban/KanbanCard'; import KanbanColumn from '../components/kanban/KanbanColumn'; import LeadInfoDrawer from '../components/kanban/LeadInfoDrawer'; import ColumnManagerModal from '../components/kanban/ColumnManagerModal'; // Campaign toast with countdown + Edit option function fireCampaignToast(lead, column, onEdit) { if (!column?.campaignMessage) return; const msg = column.campaignMessage.replace('{name}', lead.name.split(' ')[0]); // Sonner v2: toast.custom(fn) where fn receives the toast ID directly (string) toast.custom((toastId) => { const [secs, setSecs] = React.useState(20); React.useEffect(() => { const t = setInterval(() => setSecs(s => { if (s <= 1) { clearInterval(t); toast.dismiss(toastId); return 0; } return s - 1; }), 1000); return () => clearInterval(t); }, []); return (

Campaign Message

Sending in {secs}s

{msg}

); }, { duration: 20000, position: 'bottom-right' }); } // Campaign Edit Modal function CampaignEditModal({ message, lead, column, onClose }) { const [text, setText] = useState(message); return (
e.stopPropagation()} >

Edit Campaign Message

To: {lead?.name} · via {column?.name}