import React, { useState, useEffect } from 'react'; import { createPortal } from 'react-dom'; import { X, UserPlus, Phone, CheckCircle, Calendar, Clock, MapPin, ArrowRight, Shield } from 'lucide-react'; import { useMockStore } from '../../data/mockStore'; import { AgentSelectionModal } from './AgentSelectionModal'; import { toast } from 'sonner'; export const ActionDetailDrawer = ({ isOpen, onClose, viewType, data }) => { const { assignAgent, markLeadContacted, sendReminder } = useMockStore(); const [selectedItem, setSelectedItem] = useState(null); const [isAgentModalOpen, setIsAgentModalOpen] = useState(false); const [contactPopover, setContactPopover] = useState(null); // ID of item showing contact info // Prevent body scroll when open useEffect(() => { if (isOpen) { document.body.style.overflow = 'hidden'; } else { document.body.style.overflow = 'unset'; } return () => { document.body.style.overflow = 'unset'; }; }, [isOpen]); if (!isOpen) return null; const getHeader = () => { switch (viewType) { case 'UNASSIGNED': return { title: 'Unassigned Leads', icon: UserPlus, color: 'text-blue-600', bg: 'bg-blue-100' }; case 'HOT': return { title: 'Hot Leads - Action Needed', icon: Phone, color: 'text-orange-600', bg: 'bg-orange-100' }; case 'RESCHEDULE': return { title: 'Reschedule Required', icon: Calendar, color: 'text-rose-600', bg: 'bg-rose-100' }; case 'SIGNATURE': return { title: 'Pending Signatures', icon: CheckCircle, color: 'text-purple-600', bg: 'bg-purple-100' }; default: return { title: 'Details', icon: Shield, color: 'text-gray-600', bg: 'bg-gray-100' }; } }; const header = getHeader(); const Icon = header.icon; // Handlers const handleAssignClick = (item) => { setSelectedItem(item); setIsAgentModalOpen(true); }; const handleAgentSelected = (agentId) => { if (selectedItem) { // Check if selectedItem is a wrapper or direct property const propId = selectedItem.id || selectedItem.propertyData?.propertyId; const success = assignAgent(propId, agentId); if (success) { setIsAgentModalOpen(false); setSelectedItem(null); } } }; const handleMarkContacted = (e, item) => { e.stopPropagation(); const propId = item.id || item.propertyData?.propertyId; markLeadContacted(propId); }; const handleSendReminder = (item) => { const propId = item.id || item.propertyData?.propertyId; sendReminder(propId); }; // Render Lists const renderContent = () => { if (viewType === 'UNASSIGNED') { return data.unassignedLeads.map(item => (
Lead {item.propertyData.propertyAddress.split(',')[0]}
Plano, TX Est. ${item.propertyData.currentEstimatedMarketValue.toLocaleString()}
)); } if (viewType === 'HOT') { return data.hotLeads.map(item => (

{item.propertyData.propertyAddress.split(',')[0]}

Last Contact: {item.lastContactDate ? new Date(item.lastContactDate).toLocaleDateString() : 'Never'}

Value ${item.propertyData.currentEstimatedMarketValue.toLocaleString()}
{/* Simple Popover */} {contactPopover === item.id && (
Owner Info

{item.ownerData.fullName}

{item.ownerData.primaryPhoneNumber} {item.ownerData.emailAddress}
)}
)); } if (viewType === 'RESCHEDULE') { return data.rescheduleMeets.map(item => (

{item.customerName}

Original: {new Date(item.date).toLocaleDateString()} at {item.time}

{item.status}
)); } if (viewType === 'SIGNATURE') { return data.pendingSignatures.map(item => (

{item.ownerData.fullName}

${item.proposalValue?.toLocaleString()}
Sent: {item.proposalSentDate ? new Date(item.proposalSentDate).toLocaleDateString() : 'N/A'} {item.propertyData.propertyAddress.split(',')[0]}
)); } }; return createPortal( <> {/* Backdrop */}
{/* Drawer */}
{/* Header */}

{header.title}

{/* Content */}
{renderContent()} {/* Empty State */} {((viewType === 'UNASSIGNED' && data.unassignedLeads.length === 0) || (viewType === 'HOT' && data.hotLeads.length === 0) || (viewType === 'RESCHEDULE' && data.rescheduleMeets.length === 0) || (viewType === 'SIGNATURE' && data.pendingSignatures.length === 0)) && (

All caught up! No actions required.

)}
{/* Nested Modal */} setIsAgentModalOpen(false)} onSelect={handleAgentSelected} /> , document.body ); };