import React, { useState, useEffect } from 'react';
import LoginPage from './pages/LoginPage';
import { ConfigProvider, theme, Spin, Alert, Layout, App as AntApp, Tabs } from 'antd';
import { LoadingOutlined } from '@ant-design/icons';
import { getCurrentUser } from './services/api';
import UserMenu from './components/UserMenu';
import AdminDashboard from './pages/AdminDashboard';
import ClientProjects from './pages/ClientProjects';
import { BrowserRouter as Router, Routes, Route, Navigate } from 'react-router-dom';
import ProjectDetail from './pages/ProjectDetail';
import SmartProjectRoute from './components/SmartProjectRoute';
function App() {
const [user, setUser] = useState(null);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
const [darkMode, setDarkMode] = useState(() => {
const stored = localStorage.getItem('darkMode');
return stored === 'true';
});
// Set initial background colors immediately on component mount
useEffect(() => {
const htmlElement = document.documentElement;
const bodyElement = document.body;
// Set initial colors based on current darkMode state
const bgColor = darkMode ? '#181818' : '#f5f5f5';
htmlElement.style.backgroundColor = bgColor;
bodyElement.style.backgroundColor = bgColor;
if (darkMode) {
htmlElement.classList.add('dark-mode');
} else {
htmlElement.classList.remove('dark-mode');
}
}, []); // Run only once on mount
// Update HTML class and background color when darkMode changes
useEffect(() => {
const htmlElement = document.documentElement;
const bodyElement = document.body;
if (darkMode) {
htmlElement.classList.add('dark-mode');
// Set dark mode background colors to prevent white overscroll areas
htmlElement.style.backgroundColor = '#181818';
bodyElement.style.backgroundColor = '#181818';
} else {
htmlElement.classList.remove('dark-mode');
// Set light mode background colors
htmlElement.style.backgroundColor = '#ebebeb';
bodyElement.style.backgroundColor = '#f5f5f5';
}
}, [darkMode]);
useEffect(() => {
const token = localStorage.getItem('jwt');
if (token && !user) {
getCurrentUser().then(res => {
if (res.success) {
setUser(res.user);
} else {
setError(res.error?.message || 'Fehler beim Laden der Userdaten');
localStorage.removeItem('jwt');
}
}).catch(() => setError('Serverfehler')).finally(() => setLoading(false));
} else {
setLoading(false);
}
}, [user]);
if (!user) {
return (
{loading ? (
} size="large" tip="Lade Preview..." fullscreen />
) : (
<>
{error && }
setUser(null)} />
>
)}
);
}
const handleLogout = () => {
// Entferne alle ads-overview-Caches beim Logout
Object.keys(localStorage).forEach(key => {
if (key.startsWith('ads-overview-')) {
localStorage.removeItem(key);
}
});
localStorage.removeItem('jwt');
setUser(null);
};
const handleToggleDarkMode = () => {
setDarkMode((prev) => {
localStorage.setItem('darkMode', !prev);
return !prev;
});
};
return (
{user.role === 'admin' ? (
<>
} />
{/* Smart URL Resolution für Admin-Zugriff auf Client-URLs - MUSS VOR der 3-Parameter Route stehen */}
} />
} />
} />
>
) : (
<>
} />
setUser(null)} />} />
} />
{/* Catch-All-Route für nicht gefundene Pfade */}
} />
>
)}
);
}
export default App;