import { memo } from 'react' import { Box, Button, Skeleton, Typography } from '@mui/material' import { Inbox } from 'lucide-react' import type { UnifiedLead } from '../../domain/unifiedLead' import { LeadChannelBadge } from './LeadChannelBadge' import { DS_SLATE, DS_TEXT } from '../../lib/ds' /** Spaltenraster im Stil der übrigen Agentenlisten (Livia, Bruno). */ const COLS = '120px 1.5fr 1.4fr 150px' const COLUMN_LABELS = ['Kanal', 'Interessent', 'Anliegen', 'Eingang'] function formatDate(iso: string): string { return new Date(iso).toLocaleDateString('de-CH', { day: '2-digit', month: '2-digit', year: 'numeric' }) } const LeadRow = memo(function LeadRow({ lead, selected, onSelect, }: { lead: UnifiedLead selected: boolean onSelect: (lead: UnifiedLead) => void }) { return ( onSelect(lead)} role="button" tabIndex={0} onKeyDown={e => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onSelect(lead) } }} sx={{ display: 'grid', gridTemplateColumns: COLS, alignItems: 'center', gap: 1, px: 2, py: 1.5, borderBottom: '1px solid #f1f5f9', bgcolor: selected ? DS_SLATE[50] : 'white', cursor: 'pointer', '&:hover': { bgcolor: DS_SLATE[50] }, '&:focus-visible': { outline: '2px solid', outlineColor: DS_SLATE[400], outlineOffset: -2 }, transition: 'background-color 0.1s', }} > {lead.title} {lead.meta} {lead.subtitle} {formatDate(lead.receivedAt)} ) }) export interface UnifiedLeadListProps { leads: UnifiedLead[] isLoading: boolean selectedId: string | null onSelect: (lead: UnifiedLead) => void /** Nur gesetzt, wenn ein Filter aktiv ist — dann bietet der Leerzustand die Rücksetzung an. */ onResetFilter?: () => void } /** * Gemeinsame Leadliste aller drei Kanäle (Runde 5, §12). * * Ersetzt die beiden getrennten Reiterlisten. Jede Zeile trägt ihr * Kanalkennzeichen ganz links — die Herkunft ist die erste Information, die * beim Überfliegen zählt, weil sie bestimmt, wie belastbar der Lead ist. */ export function UnifiedLeadList({ leads, isLoading, selectedId, onSelect, onResetFilter }: UnifiedLeadListProps) { return ( {/* Kopfzeile */} {COLUMN_LABELS.map(label => ( {label} ))} {isLoading ? [1, 2, 3, 4].map(i => ( )) : leads.length === 0 ? ( Für diesen Kanaltyp liegen derzeit keine Leads vor. {onResetFilter && ( )} ) : leads.map(lead => ( ))} ) }