import React, { useMemo } from 'react'; import { Modal } from '../ui/Modal'; import { UserAvatar } from '../ui/UserAvatar'; import { formatEventRange, parseSqlDateTime } from './calendarUtils'; import { leadFullName, userColor, type AppUser, type CalendarEvent, type Lead, } from '../../types'; interface UserDetailModalProps { user: AppUser; leads: Lead[]; events: CalendarEvent[]; onClose: () => void; onOpenLead: (leadId: number) => void; } /** Detailfenster fuer einen im Kalender markierten Benutzer. */ export const UserDetailModal: React.FC = ({ user, leads, events, onClose, onOpenLead, }) => { const color = userColor(user); const ownedLeads = useMemo( () => leads .filter((lead) => lead.owner_id === user.id) .sort((a, b) => leadFullName(a).localeCompare(leadFullName(b), 'de')), [leads, user.id] ); // Die naechsten Termine, an denen der Benutzer beteiligt ist (Ersteller // oder Teilnehmer). const upcoming = useMemo(() => { const now = Date.now(); return events .filter( (event) => (event.created_by === user.id || event.participants.some((participant) => participant.id === user.id)) && parseSqlDateTime(event.ends_at).getTime() >= now ) .sort( (a, b) => parseSqlDateTime(a.starts_at).getTime() - parseSqlDateTime(b.starts_at).getTime() ) .slice(0, 5); }, [events, user.id]); return ( Schliessen } >

{user.name}

{user.email || 'Keine E-Mail hinterlegt'}

Kalenderfarbe

Naechste Termine

{upcoming.length === 0 ? (

Keine anstehenden Termine.

) : (
    {upcoming.map((event) => (
  • {event.title}

    {parseSqlDateTime(event.starts_at).toLocaleDateString('de-DE', { weekday: 'short', day: '2-digit', month: '2-digit', })}{' '} · {formatEventRange(event)}

  • ))}
)}

Zustaendig fuer {ownedLeads.length} {ownedLeads.length === 1 ? 'Kontakt' : 'Kontakte'}

{ownedLeads.length === 0 ? (

Aktuell keine Kontakte zugeordnet.

) : (
    {ownedLeads.map((lead) => (
  • ))}
)}
); };