import { useEffect, useState } from 'react'; import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'; import { faSparkles, faUser } from '@fortawesome/pro-duotone-svg-icons'; import { AiChatPanel } from './ai-chat-panel'; import { Badge } from '@/components/base/badges/badges'; import { formatPhone, formatShortDate } from '@/lib/format'; import { cx } from '@/utils/cx'; import type { Lead, LeadActivity } from '@/types/entities'; type ContextTab = 'ai' | 'lead360'; interface ContextPanelProps { selectedLead: Lead | null; activities: LeadActivity[]; callerPhone?: string; } export const ContextPanel = ({ selectedLead, activities, callerPhone }: ContextPanelProps) => { const [activeTab, setActiveTab] = useState('ai'); // Auto-switch to lead 360 when a lead is selected useEffect(() => { if (selectedLead) { setActiveTab('lead360'); } }, [selectedLead?.id]); const callerContext = selectedLead ? { callerPhone: selectedLead.contactPhone?.[0]?.number ?? callerPhone, leadId: selectedLead.id, leadName: `${selectedLead.contactName?.firstName ?? ''} ${selectedLead.contactName?.lastName ?? ''}`.trim(), } : callerPhone ? { callerPhone } : undefined; return (
{/* Tab bar */}
{/* Tab content */}
{activeTab === 'ai' && (
)} {activeTab === 'lead360' && ( )}
); }; const Lead360Tab = ({ lead, activities }: { lead: Lead | null; activities: LeadActivity[] }) => { if (!lead) { return (

Select a lead from the worklist to see their full profile.

); } const firstName = lead.contactName?.firstName ?? ''; const lastName = lead.contactName?.lastName ?? ''; const fullName = `${firstName} ${lastName}`.trim() || 'Unknown'; const phone = lead.contactPhone?.[0]; const email = lead.contactEmail?.[0]?.address; const leadActivities = activities .filter((a) => a.leadId === lead.id) .sort((a, b) => new Date(b.occurredAt ?? b.createdAt ?? '').getTime() - new Date(a.occurredAt ?? a.createdAt ?? '').getTime()) .slice(0, 10); return (
{/* Profile */}

{fullName}

{phone &&

{formatPhone(phone)}

} {email &&

{email}

}
{lead.leadStatus && {lead.leadStatus}} {lead.leadSource && {lead.leadSource}} {lead.priority && lead.priority !== 'NORMAL' && ( {lead.priority} )}
{lead.interestedService && (

Interested in: {lead.interestedService}

)} {lead.leadScore !== null && lead.leadScore !== undefined && (

Lead score: {lead.leadScore}

)}
{/* AI Insight */} {(lead.aiSummary || lead.aiSuggestedAction) && (
AI Insight
{lead.aiSummary &&

{lead.aiSummary}

} {lead.aiSuggestedAction && (

{lead.aiSuggestedAction}

)}
)} {/* Activity timeline */} {leadActivities.length > 0 && (

Activity

{leadActivities.map((a) => (

{a.summary}

{a.activityType}{a.occurredAt ? ` ยท ${formatShortDate(a.occurredAt)}` : ''}

))}
)}
); };