import * as React from 'react'; import { AnalyticsData, Visitor, Conversation } from '../types'; import { format, parseISO } from 'date-fns'; import { Icon } from './ui/Icon'; import { useTranslation } from '../hooks/useI18n'; interface CRMProps { analyticsData: AnalyticsData; } export const CRM: React.FC = ({ analyticsData }) => { const { t } = useTranslation(); const [sortConfig, setSortConfig] = React.useState<{ key: keyof Visitor; direction: 'asc' | 'desc' } | null>({ key: 'lastSeen', direction: 'desc' }); const visitors = React.useMemo((): Visitor[] => { const visitorMap = new Map; conversationCount: number }>(); analyticsData.conversations.forEach(conv => { if (!visitorMap.has(conv.visitorId)) { visitorMap.set(conv.visitorId, { lastSeen: new Date(0), visits: new Set(), conversationCount: 0 }); } const data = visitorMap.get(conv.visitorId)!; const convDate = new Date(conv.timestamp); if (convDate > data.lastSeen) { data.lastSeen = convDate; } data.visits.add(conv.timestamp); data.conversationCount += 1; }); const visitorList = Array.from(visitorMap.entries()).map(([id, data]) => ({ id, lastSeen: data.lastSeen.toISOString(), visitCount: data.visits.size, conversationCount: data.conversationCount, })); return visitorList; }, [analyticsData.conversations]); const sortedVisitors = React.useMemo(() => { const sortableItems = [...visitors]; if (sortConfig !== null) { sortableItems.sort((a, b) => { if (a[sortConfig.key] < b[sortConfig.key]) { return sortConfig.direction === 'asc' ? -1 : 1; } if (a[sortConfig.key] > b[sortConfig.key]) { return sortConfig.direction === 'asc' ? 1 : -1; } return 0; }); } return sortableItems; }, [visitors, sortConfig]); const requestSort = (key: keyof Visitor) => { let direction: 'asc' | 'desc' = 'asc'; if (sortConfig && sortConfig.key === key && sortConfig.direction === 'asc') { direction = 'desc'; } setSortConfig({ key, direction }); }; const SortableHeader: React.FC<{ sortKey: keyof Visitor; children?: React.ReactNode }> = ({ sortKey, children }) => { const isSorted = sortConfig?.key === sortKey; const directionIcon = sortConfig?.direction === 'asc' ? '▲' : '▼'; return ( // FIX: The className was truncated. It has been completed. requestSort(sortKey)}>
{children} {isSorted && {directionIcon}}
); }; // FIX: The component was not returning any JSX, causing a type error. A return statement with a table has been added. return (

{t('analytics.crm.title')}

{t('analytics.crm.visitor_id')}{t('analytics.crm.last_seen')}{t('analytics.crm.visits')}{t('analytics.interactions.conversations')} {sortedVisitors.map((visitor) => ( ))}
{visitor.id} {format(parseISO(visitor.lastSeen), 'MMM d, yyyy h:mm a')} {visitor.visitCount} {visitor.conversationCount}
); };