import { Box, Button, Chip, Divider, Paper, Typography } from '@mui/material' import { ArrowRight, Building2, TrendingUp, Zap } from 'lucide-react' import { useNavigate } from 'react-router' import { useSupplyDashboard } from '../../hooks/useSupplyDashboard' import { useSessionStore } from '../../stores/sessionStore' import { UserRole } from '../../domain/enums' import { DashboardHeader, ReviewTaskWidget, DashboardSkeleton } from '../../components/supply' import { DS_BG, DS_BORDER, DS_SURFACE, DS_TEXT } from '../../lib/ds' export default function SupplyDashboard() { const { data, isLoading, isError, refetch } = useSupplyDashboard() const { currentUser } = useSessionStore() const navigate = useNavigate() const role = currentUser?.role ?? UserRole.DEMAND_USER const isReviewer = role === UserRole.REVIEWER if (isLoading) return if (isError) { return ( Dashboard konnte nicht geladen werden Der Service ist vorübergehend nicht verfügbar. ) } if (!data || data.totalProperties === 0) { return ( Noch keine Objekte vorhanden Fügen Sie Ihr erstes Objekt hinzu — wir matchen es sofort mit aktiven Suchanfragen. ) } const strongMatchCount = data.strongMatchCount ?? 0 const topMatches = data.strongMatches ?? [] const futureSignalCount = data.futureSignals?.total ?? 0 return ( {/* ── Hero: Nachfrage-Intelligence ── */} {/* KPI strip */} {/* Starke Matches */} 0 ? DS_SURFACE.success.bg : 'white' }}> 0 ? DS_TEXT.success : DS_TEXT.muted} /> 0 ? DS_TEXT.success : DS_TEXT.muted, fontWeight: 700, lineHeight: 1 }}> Starke Match-Anfragen 0 ? DS_TEXT.success : DS_TEXT.disabled, lineHeight: 1 }}> {strongMatchCount} qualifizierte Interessenten ≥ 80% {/* Aktive Objekte */} navigate('/supply/properties')}> Aktive Objekte {data.activeProperties} / {data.totalProperties} verfügbar · im Bestand {/* Zukunftssignale */} 0 ? '#faf5ff' : 'white' }}> 0 ? '#7c3aed' : DS_TEXT.muted} /> 0 ? '#7c3aed' : DS_TEXT.muted, fontWeight: 700, lineHeight: 1 }}> Zukunftssignale 0 ? '#7c3aed' : DS_TEXT.disabled, lineHeight: 1 }}> {futureSignalCount} vorqualifizierte Nachfrage-Signale {/* ── Top matches list ── */} {topMatches.length > 0 && ( <> Stärkste Interessenten {topMatches.slice(0, 4).map((m, i) => ( 0 ? `1px solid ${DS_BORDER.muted}` : undefined, cursor: 'pointer', '&:hover': { bgcolor: DS_BG.subtle }, }} onClick={() => navigate('/supply/match-center')} > = 80 ? DS_SURFACE.success.bg : DS_SURFACE.warning.bg, border: `1px solid ${m.matchScore >= 80 ? DS_SURFACE.success.border : DS_SURFACE.warning.border}`, display: 'flex', alignItems: 'center', justifyContent: 'center', }}> = 80 ? DS_TEXT.success : DS_TEXT.warning }}> {m.matchScore}% {m.propertyTitle} {m.topReason} ))} )} {/* ── Datenpflege (sekundär, collapsed) ── */} {(data.dataQuality?.critical ?? 0) > 0 && ( {data.dataQuality!.critical} Objekte mit Datenlücken Vollständige Daten verbessern die Match-Qualität erheblich. )} {isReviewer && data.reviewTasks !== null && ( navigate('/ops/review-queue')} /> )} ) }