import { useCallback, useRef } from 'react' import { Box, Button, Drawer, IconButton, Typography } from '@mui/material' import { ArrowUpRight, HelpCircle, X } from 'lucide-react' import { useNavigate } from 'react-router' import { useTeamStore } from '../../stores/teamStore' import { useAgentWorkItem } from '../../hooks/useAgentWorkItems' import { useTeamAgents } from '../../hooks/useTeamAgents' import { AgentAvatar } from './AgentAvatar' import { WorkItemActions } from './WorkItemActions' import { DetailFieldList, DetailSectionTitle, MessageThread, SourceReferenceList } from './WorkItemDetailSections' import { PanelLoadingState } from '../ui' import { ROUTES } from '../../lib/constants' import { DS_BG, DS_BORDER, DS_SURFACE, DS_TEXT } from '../../lib/ds' import { formatTeamDateTime } from '../../lib/teamClock' /** Das Anfragencenter führt den vollständigen Schriftverkehr. */ const ANFRAGENCENTER_ROUTE = '/supply/anfragen' /** * Detailansicht eines Vorgangs. * * Bewusst schmal gehalten: Priorität, Status, Vorgangstyp, Verarbeitungsschritte * und Aktionshistorie sind entfallen. Sie beschrieben die Maschine, nicht den * Fall. Übrig bleibt, was für die Entscheidung zählt — worum es geht, was der * Mitarbeitende bisher hat, welche Nachricht es ausgelöst hat und woher die * Angaben stammen. */ export function WorkItemDetailDrawer() { const selectedId = useTeamStore(s => s.selectedWorkItemId) const setSelectedId = useTeamStore(s => s.setSelectedWorkItemId) const { data: item, isLoading } = useAgentWorkItem(selectedId) const { data: agents = [] } = useTeamAgents() const sourcesRef = useRef(null) const navigate = useNavigate() const agent = agents.find(a => a.id === item?.agentId) const close = useCallback(() => setSelectedId(null), [setSelectedId]) const scrollToSources = useCallback(() => { sourcesRef.current?.scrollIntoView({ behavior: 'smooth', block: 'start' }) }, []) // Vor die Callbacks gezogen: sonst steht `item` im Rumpf, aber nur // `item?.objectId` in den Abhängigkeiten — die Memoisierung wäre unhaltbar. const objectId = item?.objectId // Der Objektbezug führt in «Meine Objekte» — bestehende Route, bestehende ID. const openProperty = useCallback(() => { if (!objectId) return navigate(ROUTES.SUPPLY.PROPERTIES, { state: { propertyId: objectId } }) }, [navigate, objectId]) // Der ganze Verlauf gehört ins Anfragencenter, nicht in den Drawer. const openCorrespondence = useCallback(() => { navigate(ANFRAGENCENTER_ROUTE, { state: { objectId } }) }, [navigate, objectId]) const firstMessage = item?.messageThread?.slice(0, 1) ?? [] return ( {agent && } {agent ? `${agent.name} · ${agent.role}` : 'Vorgang'} {item ? (item.objectLabel ? `${item.title} – ${item.objectLabel}` : item.title) : 'Vorgang wird geladen'} {isLoading && } {item && ( {formatTeamDateTime(item.completedAt ?? item.createdAt)} {item.summary} {item.requiresDecision && (item.escalationReason || item.decisionQuestion) && ( Hierzu brauche ich Ihre Entscheidung {item.escalationReason && ( {item.escalationReason} )} {item.decisionQuestion && ( {item.decisionQuestion} )} )} {item.result.length > 0 && ( {item.requiresDecision ? 'Aktueller Stand' : 'Ergebnis'} )} {/* Nur die auslösende Nachricht — der Rest liegt im Anfragencenter. */} {firstMessage.length > 0 && ( Auslösende Nachricht )} {item.sourceReferences.length > 0 && ( Quellen )} {item.rejectionReason && ( Begründung der Zurückweisung {item.rejectionReason} )} )} {item && ( )} ) }