import { useMemo } from "react"; import { faCircleCheck, faClock, faEnvelope, faPhone, faPhoneArrowDown, faStars } from "@fortawesome/pro-duotone-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; import { Avatar } from "@/components/base/avatar/avatar"; import { Badge } from "@/components/base/badges/badges"; import { AgeIndicator } from "@/components/shared/age-indicator"; import { SourceTag } from "@/components/shared/source-tag"; import { formatPhone, formatShortDate, getInitials } from "@/lib/format"; import type { CallDisposition, Campaign, Lead, LeadActivity } from "@/types/entities"; import { DispositionForm } from "./disposition-form"; 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...

); };