import React, { useState, useEffect } from 'react'; import { Sidebar } from './components/Sidebar'; import { Header } from './components/Header'; import { Dashboard } from './components/Dashboard'; import { KanbanBoard } from './components/KanbanBoard'; import { Tenders } from './components/Tenders'; import { Customers } from './components/Customers'; import { Experts } from './components/Experts'; import { Projects } from './components/Projects'; import { OrgChart } from './components/OrgChart'; import { Settings } from './components/Settings'; import { ViewState, Tender, Expert, Customer, Project } from './types'; import { supabase, TABLES } from './lib/supabase'; const App: React.FC = () => { const [currentView, setCurrentView] = useState('Dashboard'); const [isDarkMode, setIsDarkMode] = useState(true); const [isSidebarOpen, setIsSidebarOpen] = useState(true); const [tenders, setTenders] = useState([]); const [customers, setCustomers] = useState([]); const [experts, setExperts] = useState([]); const [projects, setProjects] = useState([]); const [isInitialLoading, setIsInitialLoading] = useState(true); const [isRefreshing, setIsRefreshing] = useState(false); const fetchData = async (showRefreshIndicator = false) => { if (showRefreshIndicator) setIsRefreshing(true); try { const { data: customersData } = await supabase .from(TABLES.CUSTOMERS) .select('*, icon_contacts(*)'); const formattedCustomers = (customersData || []).map(c => ({ ...c, contacts: c.icon_contacts || [] })); setCustomers(formattedCustomers); const { data: expertsData } = await supabase.from(TABLES.EXPERTS).select('*'); setExperts(expertsData || []); const { data: projectsData } = await supabase.from(TABLES.PROJECTS).select('*'); setProjects(projectsData || []); const { data: tendersData } = await supabase .from(TABLES.TENDERS) .select(` *, selectedCustomer:icon_customers(*), selectedExperts:icon_tender_experts(icon_experts(*)) `) .neq('status', 'Archiviert'); if (tendersData) { const formattedTenders: Tender[] = tendersData.map(t => ({ id: t.id, title: t.title, source: t.source, link: t.link, details: t.details, notes: t.notes, status: t.status, kanbanStatus: t.kanban_status, selectedCustomer: t.selectedCustomer, selectedExperts: t.selectedExperts?.map((se: any) => se.icon_experts) || [], applicantsCount: t.selectedExperts?.length || 0 })); setTenders(formattedTenders); } } catch (error) { console.error('Error fetching data:', error); } finally { setIsInitialLoading(false); setIsRefreshing(false); } }; useEffect(() => { fetchData(); }, []); useEffect(() => { if (isDarkMode) { document.documentElement.classList.add('dark'); } else { document.documentElement.classList.remove('dark'); } }, [isDarkMode]); const toggleDarkMode = () => setIsDarkMode(!isDarkMode); if (isInitialLoading) { return (

ICON DATABASE CONNECTING...

); } const renderContent = () => { switch (currentView) { case 'Dashboard': return ; case 'Live!': return fetchData(true)} />; case 'Ausschreibungen': return fetchData(true)} />; case 'Kunden': return fetchData(true)} />; case 'Experten': return fetchData(true)} />; case 'Laufende Projekte': return fetchData(true)} />; case 'Organigramm': return ; case 'Einstellungen': return ; default: return ; } }; return (
setIsSidebarOpen(!isSidebarOpen)} />
setIsSidebarOpen(!isSidebarOpen)} />
{isRefreshing && (
Synchronisiere...
)} {renderContent()}
); }; export default App;