import { useState } from 'react'; import { useParams, Link, useNavigate } from 'react-router-dom'; import { useDeal, usePipeline, useDeleteDeal } from '../hooks'; import { DealFormModal } from './DealFormModal'; import { Modal } from '../../components/Modal'; import type { DealStatus } from '../types'; import styles from './DealDetailPage.module.css'; const STATUS_COLORS: Record = { OPEN: { bg: '#dbeafe', color: '#1e40af' }, WON: { bg: '#d1fae5', color: '#065f46' }, LOST: { bg: '#fee2e2', color: '#991b1b' }, }; const STATUS_LABELS: Record = { OPEN: 'Offen', WON: 'Gewonnen', LOST: 'Verloren', }; const currencyFormatter = new Intl.NumberFormat('de-DE', { style: 'currency', currency: 'EUR', }); function formatDate(iso: string): string { return new Date(iso).toLocaleDateString('de-DE', { day: '2-digit', month: '2-digit', year: 'numeric', }); } export function DealDetailPage() { const { id } = useParams<{ id: string }>(); const navigate = useNavigate(); const { data, isLoading, error } = useDeal(id!); const deleteMutation = useDeleteDeal(); const deal = data?.data; // Pipeline mit allen Stages laden fuer Fortschrittsbalken const { data: pipelineData } = usePipeline(deal?.pipelineId ?? ''); const pipelineStages = pipelineData?.data?.stages ? [...pipelineData.data.stages].sort((a, b) => a.sortOrder - b.sortOrder) : []; const [isEditOpen, setEditOpen] = useState(false); const [isDeleteOpen, setDeleteOpen] = useState(false); if (isLoading) return

Laden...

; if (error || !deal) return (

Deal konnte nicht geladen werden

); const contactName = deal.contact ? deal.contact.companyName || [deal.contact.firstName, deal.contact.lastName] .filter(Boolean) .join(' ') || 'Kontakt' : null; return (
{/* Zurück */} Zurück zu Deals {/* Header */}

{deal.title}

{STATUS_LABELS[deal.status]}
{/* Stage-Fortschrittsbalken */} {pipelineStages.length > 0 && (
{pipelineStages.map((stage) => { const isActive = stage.id === deal.stageId; return (
{stage.name}
); })}
)} {/* Info Card */}

Deal-Details

Wert {deal.value ? currencyFormatter.format(parseFloat(deal.value)) : '—'} Pipeline {deal.pipeline?.name ?? '—'} Stage {deal.stage && ( {deal.stage.name} )} Kontakt {deal.contact ? ( {contactName} ) : ( '—' )} Erw. Abschluss {deal.expectedCloseDate ? formatDate(deal.expectedCloseDate) : '—'} {deal.closedAt && ( <> Abgeschlossen am {formatDate(deal.closedAt)} )} Erstellt am {formatDate(deal.createdAt)}
{deal.notes && (

{deal.notes}

)}
{/* Modals */} setEditOpen(false)} deal={deal} onSuccess={() => setEditOpen(false)} /> setDeleteOpen(false)} title="Deal löschen" maxWidth="420px" >

Soll der Deal {deal.title} wirklich gelöscht werden?

); }