import React, { useState } from 'react'; import { Expert } from '../types'; import { supabase, TABLES } from '../lib/supabase'; interface ExpertsProps { experts: Expert[]; setExperts: React.Dispatch>; refreshData: () => Promise; } export const Experts: React.FC = ({ experts, refreshData }) => { const [isModalOpen, setIsModalOpen] = useState(false); const [editingExpert, setEditingExpert] = useState(null); const [searchTerm, setSearchTerm] = useState(''); const [expertToDeleteId, setExpertToDeleteId] = useState(null); const [tagInput, setTagInput] = useState(''); const [formState, setFormState] = useState({ name: '', role: '', email: '', phone: '', linkedin: '', status: 'Verfügbar' as Expert['status'], avatar: '', bio: '', tags: [] as string[] }); const filteredExperts = experts.filter(e => e.name.toLowerCase().includes(searchTerm.toLowerCase()) || e.role.toLowerCase().includes(searchTerm.toLowerCase()) || e.tags?.some(tag => tag.toLowerCase().includes(searchTerm.toLowerCase())) ); const openEditModal = (expert: Expert) => { setEditingExpert(expert); setFormState({ name: expert.name, role: expert.role, email: expert.email || '', phone: expert.phone || '', linkedin: expert.linkedin || '', status: expert.status, avatar: expert.avatar || '', bio: expert.bio || '', tags: expert.tags || [] }); setTagInput(''); setIsModalOpen(true); }; const openCreateModal = () => { setEditingExpert(null); setFormState({ name: '', role: '', email: '', phone: '', linkedin: '', status: 'Verfügbar', avatar: '', bio: '', tags: [] }); setTagInput(''); setIsModalOpen(true); }; const handleAddTag = (e?: React.FormEvent) => { if (e) e.preventDefault(); const tag = tagInput.trim(); if (tag && !formState.tags.includes(tag)) { setFormState({ ...formState, tags: [...formState.tags, tag] }); setTagInput(''); } }; const removeTag = (tagToRemove: string) => { setFormState({ ...formState, tags: formState.tags.filter(t => t !== tagToRemove) }); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (editingExpert) { const { error } = await supabase .from(TABLES.EXPERTS) .update(formState) .eq('id', editingExpert.id); if (error) console.error(error); } else { const { error } = await supabase.from(TABLES.EXPERTS).insert([formState]); if (error) console.error(error); } setIsModalOpen(false); refreshData(); }; const confirmDeleteExpert = async () => { if (!expertToDeleteId) return; try { await supabase.from(TABLES.EXPERTS).delete().eq('id', expertToDeleteId); await refreshData(); } catch (error) { console.error('Delete error:', error); } finally { setExpertToDeleteId(null); } }; const handleImageUpload = (e: React.ChangeEvent) => { const file = e.target.files?.[0]; if (file) { const reader = new FileReader(); reader.onloadend = () => { setFormState({ ...formState, avatar: reader.result as string }); }; reader.readAsDataURL(file); } }; return (
setSearchTerm(e.target.value)} className="w-full pl-12 pr-6 py-4 bg-white dark:bg-slate-900 border-none rounded-2xl shadow-sm focus:ring-2 focus:ring-brand-500 transition-all text-lg dark:text-white" />
{filteredExperts.map((expert) => (
{expert.avatar ? ( {expert.name} ) : (
{expert.name.charAt(0)}
)}

{expert.name}

{expert.role}

{expert.bio || "Keine zusätzlichen Informationen hinterlegt."}

{/* Tags Display moved below bio Box */} {expert.tags && expert.tags.length > 0 && (
{expert.tags.slice(0, 4).map(tag => ( {tag} ))} {expert.tags.length > 4 && ( +{expert.tags.length - 4} )}
)}
{expert.email || 'n/a'}
{expert.phone || 'n/a'}
))} {filteredExperts.length === 0 && (

Keine Experten gefunden.

)}
{isModalOpen && (

{editingExpert ? 'Profil bearbeiten' : 'Neuer Experte'}

{formState.avatar ? ( Preview ) : (
)}

Foto hochladen

setFormState({...formState, name: e.target.value})} className="w-full px-5 py-4 bg-slate-50 dark:bg-slate-800 border-none rounded-2xl outline-none focus:ring-2 focus:ring-brand-500 transition-all dark:text-white" />
setFormState({...formState, role: e.target.value})} className="w-full px-5 py-4 bg-slate-50 dark:bg-slate-800 border-none rounded-2xl outline-none focus:ring-2 focus:ring-brand-500 transition-all dark:text-white" />
setFormState({...formState, email: e.target.value})} className="w-full px-5 py-4 bg-slate-50 dark:bg-slate-800 border-none rounded-2xl outline-none focus:ring-2 focus:ring-brand-500 transition-all dark:text-white" />
setFormState({...formState, phone: e.target.value})} className="w-full px-5 py-4 bg-slate-50 dark:bg-slate-800 border-none rounded-2xl outline-none focus:ring-2 focus:ring-brand-500 transition-all dark:text-white" />
{/* Tags Input Section */}
{formState.tags.map(tag => ( {tag} ))}
setTagInput(e.target.value)} onKeyDown={(e) => { if (e.key === 'Enter') handleAddTag(e); }} placeholder="Tag eingeben (z.B. Cloud Computing)..." className="flex-1 px-5 py-4 bg-slate-50 dark:bg-slate-800 border-none rounded-2xl outline-none focus:ring-2 focus:ring-brand-500 transition-all dark:text-white text-sm" />