import { useEffect, useState } from 'react' import api from '../api/client' import { copyToClipboard } from '../utils/clipboard' import { Plus, Trash2, Edit2, X, Check, ChevronDown, ChevronRight, Copy, Key } from 'lucide-react' const PERM_LABELS = { agent: { label: 'Agent', color: 'text-blue-400 bg-blue-900/30 border-blue-700/50' }, read: { label: 'Read-only', color: 'text-green-400 bg-green-900/30 border-green-700/50' }, write: { label: 'Write', color: 'text-yellow-400 bg-yellow-900/30 border-yellow-700/50' }, admin: { label: 'Admin', color: 'text-orange-400 bg-orange-900/30 border-orange-700/50' }, } export default function Customers() { const [customers, setCustomers] = useState([]) const [loading, setLoading] = useState(true) const [showAdd, setShowAdd] = useState(false) const [editId, setEditId] = useState(null) const [form, setForm] = useState({ number: '', name: '' }) const [expandedId, setExpandedId] = useState(null) const reload = () => { api.getCustomers().then((c) => setCustomers(c || [])).finally(() => setLoading(false)) } useEffect(() => { reload() }, []) const handleAdd = async () => { if (!form.number || !form.name) return await api.createCustomer(form.number, form.name) setForm({ number: '', name: '' }) setShowAdd(false) reload() } const handleUpdate = async (id) => { await api.updateCustomer(id, form.number, form.name) setEditId(null) reload() } const handleDelete = async (id) => { if (!confirm('Kunde wirklich loeschen?')) return await api.deleteCustomer(id) reload() } const toggleExpand = (id) => { setExpandedId(prev => prev === id ? null : id) } return (

Kunden

{showAdd && ( )} {customers.map((c) => ( <> {editId === c.id ? ( ) : ( toggleExpand(c.id)} > )} {expandedId === c.id && ( )} ))}
Nummer Name Erstellt
setForm({ ...form, number: e.target.value })} className="w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-white text-sm focus:outline-none focus:border-orange-500" autoFocus /> setForm({ ...form, name: e.target.value })} className="w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-white text-sm focus:outline-none focus:border-orange-500" onKeyDown={(e) => e.key === 'Enter' && handleAdd()} />
setForm({ ...form, number: e.target.value })} className="w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-white text-sm focus:outline-none focus:border-orange-500" /> setForm({ ...form, name: e.target.value })} className="w-full bg-gray-800 border border-gray-700 rounded px-2 py-1 text-white text-sm focus:outline-none focus:border-orange-500" />
{expandedId === c.id ? : } {c.number} {c.name} {new Date(c.created_at).toLocaleDateString('de-DE')} e.stopPropagation()}>
{!loading && customers.length === 0 && !showAdd && (
Keine Kunden angelegt
)}
) } function CustomerKeyPanel({ customerId }) { const [keys, setKeys] = useState(null) const [copied, setCopied] = useState(null) useEffect(() => { api.getCustomerAPIKeys(customerId).then(setKeys) }, [customerId]) const copyKey = (key, id) => { copyToClipboard(key) setCopied(id) setTimeout(() => setCopied(null), 2000) } if (keys === null) { return
Laden...
} if (keys.length === 0) { return (
Keine API-Keys fuer diesen Kunden
) } return (
API-Keys
{keys.map((k) => { const perm = PERM_LABELS[k.permissions] || PERM_LABELS.read return (
{perm.label} {k.name} {k.key.substring(0, 8)}...{k.key.substring(k.key.length - 4)}
) })}
) }