import React, { useState, useEffect } from 'react'; import { Customer, Contact } from '../types'; import { supabase, TABLES } from '../lib/supabase'; interface CustomersProps { customers: Customer[]; refreshData: () => Promise; } export const Customers: React.FC = ({ customers, refreshData }) => { const [selectedCustomerId, setSelectedCustomerId] = useState(null); const [isModalOpen, setIsModalOpen] = useState(false); const [editingCustomer, setEditingCustomer] = useState(null); const [isSaving, setIsSaving] = useState(false); const [customerToDeleteId, setCustomerToDeleteId] = useState(null); const [customerForm, setCustomerForm] = useState({ company: '', name: '', logo: '', notes: '' }); const [contactsForm, setContactsForm] = useState[]>([]); useEffect(() => { if (!selectedCustomerId && customers.length > 0) { setSelectedCustomerId(customers[0].id); } }, [customers, selectedCustomerId]); const activeCustomer = customers.find(c => c.id === selectedCustomerId) || customers[0]; const handleOpenCreate = () => { setEditingCustomer(null); setCustomerForm({ company: '', name: '', logo: '', notes: '' }); setContactsForm([{ name: '', role: '', email: '', phone: '', avatar: '' }]); setIsModalOpen(true); }; const handleOpenEdit = (customer: Customer) => { setEditingCustomer(customer); setCustomerForm({ company: customer.company || '', name: customer.name || '', logo: customer.logo || '', notes: customer.notes || '' }); setContactsForm(customer.contacts && customer.contacts.length > 0 ? customer.contacts : [{ name: '', role: '', email: '', phone: '', avatar: '' }] ); setIsModalOpen(true); }; const handleLogoUpload = (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (file) { const reader = new FileReader(); reader.onloadend = () => setCustomerForm(prev => ({ ...prev, logo: reader.result as string })); reader.readAsDataURL(file); } }; const addContactRow = () => { setContactsForm([...contactsForm, { name: '', role: '', email: '', phone: '', avatar: '' }]); }; const removeContactRow = (index: number) => { setContactsForm(contactsForm.filter((_, i) => i !== index)); }; const updateContactField = (index: number, field: keyof Contact, value: string) => { const newContacts = [...contactsForm]; newContacts[index] = { ...newContacts[index], [field]: value }; setContactsForm(newContacts); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!customerForm.company.trim()) { alert("Bitte geben Sie einen Firmennamen an."); return; } setIsSaving(true); try { let finalCustomerId = editingCustomer?.id; if (editingCustomer) { const { error } = await supabase.from(TABLES.CUSTOMERS).update(customerForm).eq('id', editingCustomer.id); if (error) throw error; } else { const { data, error } = await supabase.from(TABLES.CUSTOMERS).insert([customerForm]).select(); if (error) throw error; finalCustomerId = data[0].id; } if (finalCustomerId) { await supabase.from(TABLES.CONTACTS).delete().eq('customer_id', finalCustomerId); const contactsToInsert = contactsForm .filter(c => c.name && c.name.trim() !== '') .map(c => { const { id, ...cleanContact } = c as any; return { ...cleanContact, customer_id: finalCustomerId }; }); if (contactsToInsert.length > 0) { const { error: cError } = await supabase.from(TABLES.CONTACTS).insert(contactsToInsert); if (cError) throw cError; } } setIsModalOpen(false); await refreshData(); if (!editingCustomer && finalCustomerId) setSelectedCustomerId(finalCustomerId); } catch (error: any) { console.error('Save error:', error); alert('Fehler beim Speichern: ' + (error.message || 'Unbekannter Datenbankfehler')); } finally { setIsSaving(false); } }; const confirmDeleteCustomer = async () => { if (!customerToDeleteId) return; try { await supabase.from(TABLES.CUSTOMERS).delete().eq('id', customerToDeleteId); if (selectedCustomerId === customerToDeleteId) setSelectedCustomerId(null); await refreshData(); } catch (error) { console.error('Delete error:', error); } finally { setCustomerToDeleteId(null); } }; return (
{/* Sidebar: Firmenliste */}

Kundenstamm

{customers.map(c => (
setSelectedCustomerId(c.id)} className={`p-5 cursor-pointer transition-all flex items-center justify-between group ${selectedCustomerId === c.id ? 'bg-brand-50/50 dark:bg-brand-500/10' : 'hover:bg-slate-50 dark:hover:bg-slate-800'}`} >
{c.logo ? ( {c.company} ) : ( {c.company.charAt(0)} )}

{c.company}

{c.contacts?.length || 0} Personen

))}
{activeCustomer ? (
{activeCustomer.logo ? ( {activeCustomer.company} ) : ( activeCustomer.company.charAt(0) )}

{activeCustomer.company}

PREMIUM KUNDE

Unternehmensprofil & Insights

{activeCustomer.notes || 'Keine Firmennotizen hinterlegt.'}

Ansprechpartner ({activeCustomer.contacts?.length || 0})

{activeCustomer.contacts?.map(contact => (
{contact.avatar ? ( {contact.name} ) : (
{contact.name.charAt(0)}
)}

{contact.name}

{contact.role || 'Mitarbeiter'}

{contact.email || 'N/A'}
{contact.phone || 'N/A'}
))}
) : (

Bereit zur Auswahl

Wählen Sie ein Unternehmen aus der Liste links aus.

)}
{isModalOpen && (

{editingCustomer ? 'Firma aktualisieren' : 'Neues Unternehmen anlegen'}

{/* Logo & Basic Info */}
{customerForm.logo ? ( Preview ) : (
)}

Firmenlogo (optional)

setCustomerForm({...customerForm, company: e.target.value})} className="w-full px-6 py-4 bg-slate-100 dark:bg-slate-800 border-2 border-transparent focus:border-brand-500 rounded-2xl outline-none font-bold text-slate-900 dark:text-white transition-all shadow-inner" placeholder="Z.B. Acme Corp" />
setCustomerForm({...customerForm, name: e.target.value})} className="w-full px-6 py-4 bg-slate-100 dark:bg-slate-800 border-2 border-transparent focus:border-brand-500 rounded-2xl outline-none font-bold text-slate-900 dark:text-white transition-all shadow-inner" placeholder="Z.B. Max Mustermann" />