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 => (
))}
)
}