import { useMemo } from 'react'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faPhone, faPhoneArrowDown, faCircleCheck, faEnvelope, faClock, faStars } from '@fortawesome/pro-duotone-svg-icons'; import { Avatar } from '@/components/base/avatar/avatar'; import { Badge } from '@/components/base/badges/badges'; import { SourceTag } from '@/components/shared/source-tag'; import { AgeIndicator } from '@/components/shared/age-indicator'; import { DispositionForm } from './disposition-form'; import { formatPhone, formatShortDate, getInitials } from '@/lib/format'; import type { Lead, LeadActivity, CallDisposition, Campaign } from '@/types/entities'; type CallState = 'idle' | 'ringing' | 'active' | 'completed'; interface IncomingCallCardProps { callState: CallState; lead: Lead | null; activities: LeadActivity[]; campaigns: Campaign[]; onDisposition: (disposition: CallDisposition, notes: string) => void; completedDisposition?: CallDisposition | null; } const activityTypeIcons: Record = { CALL_MADE: 'phone', CALL_RECEIVED: 'phone', WHATSAPP_SENT: 'message', WHATSAPP_RECEIVED: 'message', SMS_SENT: 'message', EMAIL_SENT: 'email', EMAIL_RECEIVED: 'email', NOTE_ADDED: 'note', ASSIGNED: 'assign', STATUS_CHANGE: 'status', APPOINTMENT_BOOKED: 'calendar', FOLLOW_UP_CREATED: 'clock', CONVERTED: 'check', MARKED_SPAM: 'alert', DUPLICATE_DETECTED: 'alert', }; const ActivityIcon = ({ type }: { type: string }) => { const iconType = activityTypeIcons[type] ?? 'note'; const baseClass = 'size-3.5 shrink-0 text-fg-quaternary'; if (iconType === 'phone') return ; if (iconType === 'email') return ; if (iconType === 'clock') return ; if (iconType === 'check') return ; return ; }; const dispositionLabels: Record = { APPOINTMENT_BOOKED: 'Appointment Booked', FOLLOW_UP_SCHEDULED: 'Follow-up Needed', INFO_PROVIDED: 'Info Provided', NO_ANSWER: 'No Answer', WRONG_NUMBER: 'Wrong Number', CALLBACK_REQUESTED: 'Not Interested', }; export const IncomingCallCard = ({ callState, lead, activities, campaigns, onDisposition, completedDisposition }: IncomingCallCardProps) => { if (callState === 'idle') { return ; } if (callState === 'ringing') { return ; } if (callState === 'active' && lead !== null) { return ; } if (callState === 'completed') { return ; } return null; }; const IdleState = () => (

Waiting for incoming call...

); const RingingState = ({ lead }: { lead: Lead | null }) => { const phoneDisplay = lead?.contactPhone?.[0] ? formatPhone(lead.contactPhone[0]) : '+91 98765 43210'; return (
Incoming Call {phoneDisplay}
); }; const ActiveState = ({ lead, activities, campaigns, onDisposition, }: { lead: Lead; activities: LeadActivity[]; campaigns: Campaign[]; onDisposition: (disposition: CallDisposition, notes: string) => void; }) => { const leadActivities = useMemo( () => activities .filter((a) => a.leadId === lead.id) .sort((a, b) => { const dateA = a.occurredAt ?? a.createdAt ?? ''; const dateB = b.occurredAt ?? b.createdAt ?? ''; return new Date(dateB).getTime() - new Date(dateA).getTime(); }) .slice(0, 3), [activities, lead.id], ); const campaignName = useMemo(() => { if (lead.campaignId === null) return null; const campaign = campaigns.find((c) => c.id === lead.campaignId); return campaign?.campaignName ?? null; }, [campaigns, lead.campaignId]); const firstName = lead.contactName?.firstName ?? ''; const lastName = lead.contactName?.lastName ?? ''; const fullName = `${firstName} ${lastName}`.trim() || 'Unknown Lead'; const initials = firstName && lastName ? getInitials(firstName, lastName) : 'UL'; const phoneDisplay = lead.contactPhone?.[0] ? formatPhone(lead.contactPhone[0]) : 'No phone'; const emailDisplay = lead.contactEmail?.[0]?.address ?? null; return (
{/* Left section: lead details */}

{fullName}

{phoneDisplay}
{emailDisplay !== null && (
{emailDisplay}
)}
{lead.leadSource !== null && ( )} {campaignName !== null && ( {campaignName} )}
{lead.interestedService !== null && (

Interested in: {lead.interestedService}

)} {lead.createdAt !== null && (
Lead age:
)}
{/* AI Insight panel */}
AI Insight
{lead.aiSummary !== null ? ( <>

{lead.aiSummary}

{lead.aiSuggestedAction !== null && ( {lead.aiSuggestedAction} )} ) : (

No AI insights available for this lead

)}
{/* Previous interactions */}

Recent Activity

{leadActivities.length > 0 ? (
{leadActivities.map((activity) => (
{activity.summary} {activity.occurredAt !== null ? formatShortDate(activity.occurredAt) : ''}
))}
) : (

No previous interactions

)}
{/* Right section: disposition form */}
); }; const CompletedState = ({ disposition }: { disposition: CallDisposition | null }) => { const label = disposition !== null ? dispositionLabels[disposition] : 'Unknown'; return (

Call Logged

{disposition !== null && ( {label} )}

Returning to call desk...

); };