'use client' import React, { useState, useEffect, useCallback } from 'react' import { Communication, COMM_CHANNELS, apiFetch, formatDateTime } from './types' import { Skeleton, Modal, Badge, FormLabel, FormInput, FormTextarea, FormSelect, PrimaryButton, SecondaryButton, ErrorState, EmptyState, IconMail, IconPlus, IconInbound, IconOutbound, } from './ui-primitives' const CHANNEL_COLORS: Record = { 'E-Mail': 'bg-blue-100 text-blue-700 border-blue-200', 'Telefon': 'bg-green-100 text-green-700 border-green-200', 'Besprechung': 'bg-purple-100 text-purple-700 border-purple-200', 'Portal': 'bg-indigo-100 text-indigo-700 border-indigo-200', 'Brief': 'bg-orange-100 text-orange-700 border-orange-200', } export function KommunikationTab({ assignmentId, addToast, }: { assignmentId: string addToast: (msg: string, type?: 'success' | 'error') => void }) { const [comms, setComms] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState('') const [showModal, setShowModal] = useState(false) const [saving, setSaving] = useState(false) const [formDirection, setFormDirection] = useState('outbound') const [formChannel, setFormChannel] = useState(COMM_CHANNELS[0]) const [formSubject, setFormSubject] = useState('') const [formContent, setFormContent] = useState('') const [formParticipants, setFormParticipants] = useState('') const fetchComms = useCallback(async () => { setLoading(true); setError('') try { const data = await apiFetch( `/api/sdk/v1/dsb/assignments/${assignmentId}/communications`, ) setComms(data) } catch (e: unknown) { setError(e instanceof Error ? e.message : 'Fehler beim Laden der Kommunikation') } finally { setLoading(false) } }, [assignmentId]) useEffect(() => { fetchComms() }, [fetchComms]) const handleCreate = async (e: React.FormEvent) => { e.preventDefault(); setSaving(true) try { await apiFetch(`/api/sdk/v1/dsb/assignments/${assignmentId}/communications`, { method: 'POST', body: JSON.stringify({ direction: formDirection, channel: formChannel, subject: formSubject, content: formContent, participants: formParticipants, }), }) addToast('Kommunikation erfasst'); setShowModal(false) setFormDirection('outbound'); setFormChannel(COMM_CHANNELS[0]) setFormSubject(''); setFormContent(''); setFormParticipants('') fetchComms() } catch (e: unknown) { addToast(e instanceof Error ? e.message : 'Fehler', 'error') } finally { setSaving(false) } } return (
{/* Toolbar */}

Kommunikations-Protokoll

setShowModal(true)} className="flex items-center gap-1.5"> Kommunikation erfassen
{loading ? (
{Array.from({ length: 3 }).map((_, i) => )}
) : error ? ( ) : comms.length === 0 ? ( } title="Keine Kommunikation" description="Erfassen Sie die erste Kommunikation mit dem Mandanten." /> ) : (
{comms.map((comm) => (
{comm.direction === 'inbound' ? : }
{comm.subject} {comm.direction === 'inbound' ? 'Eingehend' : 'Ausgehend'}
{comm.content &&

{comm.content}

}
{formatDateTime(comm.created_at)} {comm.participants && Teilnehmer: {comm.participants}}
))}
)} {/* Create communication modal */} setShowModal(false)} title="Kommunikation erfassen">
Richtung
Kanal ({ value: c, label: c }))} />
Betreff *
Inhalt
Teilnehmer
setShowModal(false)}>Abbrechen {saving ? 'Speichere...' : 'Kommunikation erfassen'}
) }