zustand auf server wiederhergestellt

This commit is contained in:
2026-01-09 08:43:18 +01:00
parent 1010fe7d11
commit f2f9e02fb2
30 changed files with 6403 additions and 139 deletions

View File

@@ -4,10 +4,10 @@ import { getServers, getAllDisplaySettings } from '../api'
import { useUser } from '../context/UserContext'
import ServerCard from '../components/ServerCard'
import UserManagement from '../components/UserManagement'
import LoginModal from '../components/LoginModal'
import ActivityLog from '../components/ActivityLog'
import LoginModal from '../components/LoginModal'
export default function Dashboard({ onLogin, onLogout }) {
export default function Dashboard({ onLogout }) {
const navigate = useNavigate()
const { user, token, loading: userLoading, isSuperadmin, role } = useUser()
const [servers, setServers] = useState([])
@@ -15,10 +15,12 @@ export default function Dashboard({ onLogin, onLogout }) {
const [loading, setLoading] = useState(true)
const [error, setError] = useState('')
const [showUserMgmt, setShowUserMgmt] = useState(false)
const [showLogin, setShowLogin] = useState(false)
const [showActivityLog, setShowActivityLog] = useState(false)
const [showLogin, setShowLogin] = useState(false)
const [mobileMenuOpen, setMobileMenuOpen] = useState(false)
const isGuest = user?.isGuest || role === 'guest'
const isAuthenticated = !!token
const fetchServers = async () => {
@@ -93,39 +95,53 @@ export default function Dashboard({ onLogin, onLogout }) {
<>
{/* Desktop Navigation */}
<div className="hidden md:flex items-center gap-6">
{user?.avatar && user?.discordId && (
<img
src={`https://cdn.discordapp.com/avatars/${user.discordId}/${user.avatar}.png?size=64`}
alt="Avatar"
className="w-8 h-8 rounded-full"
/>
)}
<div className="text-right mr-2">
<div className="text-sm text-white">{user?.username}</div>
<div className="text-xs text-neutral-500">{roleLabels[role]}</div>
</div>
{isSuperadmin && (
{isGuest ? (
<>
<span className="text-sm text-neutral-400">Gast</span>
<button
onClick={() => setShowUserMgmt(true)}
className="btn btn-ghost"
onClick={() => setShowLogin(true)}
className="btn btn-primary"
>
Benutzer
Anmelden
</button>
</>
) : (
<>
{user?.avatar && user?.discordId && (
<img
src={`https://cdn.discordapp.com/avatars/${user.discordId}/${user.avatar}.png?size=64`}
alt="Avatar"
className="w-8 h-8 rounded-full"
/>
)}
<div className="text-right mr-2">
<div className="text-sm text-white">{user?.username}</div>
<div className="text-xs text-neutral-500">{roleLabels[role]}</div>
</div>
{isSuperadmin && (
<>
<button
onClick={() => setShowUserMgmt(true)}
className="btn btn-ghost"
>
Benutzer
</button>
<button
onClick={() => setShowActivityLog(true)}
className="btn btn-ghost"
>
Logs
</button>
</>
)}
<button
onClick={() => setShowActivityLog(true)}
className="btn btn-ghost"
onClick={onLogout}
className="btn btn-outline"
>
Logs
Abmelden
</button>
</>
)}
<button
onClick={onLogout}
className="btn btn-outline"
>
Abmelden
</button>
</div>
{/* Mobile Burger Button */}
@@ -147,7 +163,7 @@ export default function Dashboard({ onLogin, onLogout }) {
</>
) : (
<button
onClick={() => setShowLogin(true)}
onClick={() => navigate('/login')}
className="btn btn-primary"
>
Anmelden
@@ -161,7 +177,7 @@ export default function Dashboard({ onLogin, onLogout }) {
<div className="md:hidden border-t border-neutral-800 py-4 mt-4 animate-slideDown">
<div className="flex items-center justify-between mb-3 px-1">
<div className="flex items-center gap-3">
{user?.avatar && user?.discordId && (
{!isGuest && user?.avatar && user?.discordId && (
<img
src={`https://cdn.discordapp.com/avatars/${user.discordId}/${user.avatar}.png?size=64`}
alt="Avatar"
@@ -169,8 +185,8 @@ export default function Dashboard({ onLogin, onLogout }) {
/>
)}
<div>
<div className="text-sm text-white">{user?.username}</div>
<div className="text-xs text-neutral-500">{roleLabels[role]}</div>
<div className="text-sm text-white">{isGuest ? 'Gast' : user?.username}</div>
{!isGuest && <div className="text-xs text-neutral-500">{roleLabels[role]}</div>}
</div>
</div>
<div className="text-sm text-neutral-400 text-right">
@@ -179,28 +195,39 @@ export default function Dashboard({ onLogin, onLogout }) {
</div>
</div>
<div className="flex flex-col gap-2">
{isSuperadmin && (
{isGuest ? (
<button
onClick={() => { setShowLogin(true); setMobileMenuOpen(false); }}
className="btn btn-primary justify-start"
>
Mit Discord anmelden
</button>
) : (
<>
{isSuperadmin && (
<>
<button
onClick={() => { setShowUserMgmt(true); setMobileMenuOpen(false); }}
className="btn btn-ghost justify-start"
>
Benutzer
</button>
<button
onClick={() => { setShowActivityLog(true); setMobileMenuOpen(false); }}
className="btn btn-ghost justify-start"
>
Logs
</button>
</>
)}
<button
onClick={() => { setShowUserMgmt(true); setMobileMenuOpen(false); }}
className="btn btn-ghost justify-start"
onClick={() => { onLogout(); setMobileMenuOpen(false); }}
className="btn btn-outline justify-start"
>
Benutzer
</button>
<button
onClick={() => { setShowActivityLog(true); setMobileMenuOpen(false); }}
className="btn btn-ghost justify-start"
>
Logs
Abmelden
</button>
</>
)}
<button
onClick={() => { onLogout(); setMobileMenuOpen(false); }}
className="btn btn-outline justify-start"
>
Abmelden
</button>
</div>
</div>
)}
@@ -274,7 +301,7 @@ export default function Dashboard({ onLogin, onLogout }) {
<ActivityLog onClose={() => setShowActivityLog(false)} />
)}
{showLogin && (
<LoginModal onLogin={onLogin} onClose={() => setShowLogin(false)} />
<LoginModal onClose={() => setShowLogin(false)} />
)}
</div>
)