import { useMemo } from 'react'; import { Avatar } from '@/components/base/avatar/avatar'; import { BadgeWithDot } from '@/components/base/badges/badges'; import { cx } from '@/utils/cx'; import type { Lead, Call, Agent } from '@/types/entities'; interface TeamScoreboardProps { leads: Lead[]; calls: Call[]; agents: Agent[]; } type AgentStats = { agent: Agent; leadsProcessed: number; callsMade: number; appointmentsBooked: number; }; export const TeamScoreboard = ({ leads, calls, agents }: TeamScoreboardProps) => { const agentStats = useMemo((): AgentStats[] => { return agents.map((agent) => { const agentName = agent.name; const leadsProcessed = leads.filter((lead) => lead.assignedAgent === agentName).length; const agentCalls = calls.filter((call) => call.agentName === agentName); const callsMade = agentCalls.length; const appointmentsBooked = agentCalls.filter( (call) => call.disposition === 'APPOINTMENT_BOOKED', ).length; return { agent, leadsProcessed, callsMade, appointmentsBooked }; }); }, [leads, calls, agents]); const bestPerformerId = useMemo(() => { let bestId = ''; let maxAppointments = -1; for (const stat of agentStats) { if (stat.appointmentsBooked > maxAppointments) { maxAppointments = stat.appointmentsBooked; bestId = stat.agent.id; } } return bestId; }, [agentStats]); return (
{agentStats.map(({ agent, leadsProcessed, callsMade, appointmentsBooked }) => { const isBest = agent.id === bestPerformerId; return (
{agent.name} {agent.isOnShift ? 'On Shift' : 'Off Shift'}
{isBest && ( Top )}
Leads {leadsProcessed}
Calls {callsMade}
Appointments {appointmentsBooked}
Avg Response {agent.avgResponseHours ?? '—'}h
); })}
); };