import { useEffect, useState } from 'react' import { Link, useLocation, useNavigate } from 'react-router-dom' import { useAuth } from '../context/AuthContext' import { IconTicket, IconUsers, IconTargetArrow, IconReportMoney, IconScale, IconActivityHeartbeat, IconFolders, IconLayoutGrid, IconCalendar, IconSettings, IconLogout, IconLayoutSidebarLeftCollapse, IconLayoutSidebarLeftExpand, IconMessages, IconReceiptRefund, IconDiscount, IconMailCog, } from '@tabler/icons-react' import { serverpulsApi } from '../lib/serverpulsApi' import { startsCollapsed } from '../lib/sidebar' import { buildNavLinks } from '../lib/navLinks' import { useSidebarCounts } from '../hooks/useSidebarCounts' const ICONS = { tickets: , planboard: , projects: , services: , customers: , chat: , gutschriften: , angebote: , speicher: , leads: , finance: , legal: , serverpuls: , admin: , } export default function Sidebar() { const { user, logout, isAdmin } = useAuth() const navigate = useNavigate() const location = useLocation() const [collapsed, setCollapsed] = useState(() => startsCollapsed()) const [pulseLevel, setPulseLevel] = useState('ok') const counts = useSidebarCounts() // Serverpuls-Punkt: nur Admins, beim Laden und alle 5 Minuten; Fehler bleiben still useEffect(() => { if (!isAdmin) { setPulseLevel('ok'); return undefined } let dead = false const load = () => { serverpulsApi.overview() .then((o) => { if (!dead) setPulseLevel(o?.level || 'ok') }) .catch(() => { if (!dead) setPulseLevel('ok') }) } load() const iv = setInterval(load, 5 * 60 * 1000) return () => { dead = true; clearInterval(iv) } }, [isAdmin]) const handleLogout = async () => { await logout() navigate('/login') } // Eintraege und Unterpunkte (Kunden -> Chat) aus lib/navLinks.js, Icons ueber key const links = buildNavLinks({ isAdmin, pulseLevel, counts }) const isActive = (href) => location.pathname === href || location.pathname.startsWith(href + '/') // Finanzen bleibt auch auf der Rueckkehrseite der Bankfreigabe (/finanzen/...) markiert const isLinkActive = (link) => isActive(link.href) || (link.also ? isActive(link.also) : false) return ( ) }