import { useState } from 'react'; import { Search, FileText } from 'lucide-react'; import Modal from '../ui/Modal'; import Button from '../ui/Button'; import { contractApi, cachedEmailApi, CachedEmail } from '../../services/api'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; interface AssignToContractModalProps { isOpen: boolean; onClose: () => void; email: CachedEmail; customerId: number; onSuccess?: () => void; } export default function AssignToContractModal({ isOpen, onClose, email, customerId, onSuccess, }: AssignToContractModalProps) { const [search, setSearch] = useState(''); const [selectedContractId, setSelectedContractId] = useState(null); const queryClient = useQueryClient(); // Verträge des Kunden laden const { data: contractsData, isLoading } = useQuery({ queryKey: ['contracts', 'customer', customerId], queryFn: () => contractApi.getAll({ customerId }), enabled: isOpen, }); const contracts = contractsData?.data || []; // Gefilterte Verträge const filteredContracts = contracts.filter((contract) => { if (!search) return true; const searchLower = search.toLowerCase(); return ( contract.contractNumber.toLowerCase().includes(searchLower) || contract.contractCategory?.name?.toLowerCase().includes(searchLower) || contract.provider?.name?.toLowerCase().includes(searchLower) ); }); const assignMutation = useMutation({ mutationFn: (contractId: number) => cachedEmailApi.assignToContract(email.id, contractId), onSuccess: (_data, contractId) => { queryClient.invalidateQueries({ queryKey: ['emails'] }); queryClient.invalidateQueries({ queryKey: ['email', email.id] }); // Contract folder counts aktualisieren queryClient.invalidateQueries({ queryKey: ['contract-folder-counts', contractId] }); onSuccess?.(); handleClose(); }, }); const handleClose = () => { setSearch(''); setSelectedContractId(null); onClose(); }; const handleAssign = () => { if (selectedContractId) { assignMutation.mutate(selectedContractId); } }; const formatDate = (dateStr?: string) => { if (!dateStr) return '-'; return new Date(dateStr).toLocaleDateString('de-DE'); }; return (
{/* Email Info */}

Betreff:{' '} {email.subject || '(Kein Betreff)'}

Von: {email.fromAddress}

{/* Search */}
setSearch(e.target.value)} placeholder="Vertrag suchen..." className="w-full pl-10 pr-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-blue-500 focus:border-transparent" />
{/* Contract List */}
{isLoading ? (
) : filteredContracts.length === 0 ? (

Keine Verträge gefunden

) : (
{filteredContracts.map((contract) => (
setSelectedContractId(contract.id)} className={` flex items-center gap-3 p-3 cursor-pointer transition-colors ${selectedContractId === contract.id ? 'bg-blue-50 border-l-2 border-l-blue-500' : 'hover:bg-gray-50'} `} >
{contract.contractNumber} {contract.status}
{contract.contractCategory?.name} {contract.provider && ` - ${contract.provider.name}`}
Start: {formatDate(contract.startDate)}
))}
)}
{/* Actions */}
); }