/* * Copyright (c) 2026 by Christian Kellner. * Licensed under Apache-2.0 with Commons Clause and Attribution/Naming Clause */ import { useEffect, useState } from 'react'; import { Nav } from '@douyinfe/semi-ui-19'; import { IconStar, IconSetting, IconTerminal, IconHistogram, IconSidebar } from '@douyinfe/semi-icons'; import logoWhite from '../../assets/logo_white.png'; import heart from '../../assets/heart.png'; import Logout from '../logout/Logout.jsx'; import { useLocation, useNavigate } from 'react-router-dom'; import './Navigate.less'; import { useScreenWidth } from '../../hooks/screenWidth.js'; import { useTranslation } from '../../services/i18n/i18n.jsx'; export default function Navigation({ isAdmin }) { const t = useTranslation(); const navigate = useNavigate(); const location = useLocation(); const width = useScreenWidth(); const [collapsed, setCollapsed] = useState(width <= 850); useEffect(() => { if (width <= 850) { setCollapsed(true); } }, [width]); const items = [ { itemKey: '/dashboard', text: t('nav.dashboard'), icon: }, { itemKey: '/jobs', text: t('nav.jobs'), icon: }, { itemKey: 'listings', text: t('nav.listings'), icon: , items: [ { itemKey: '/listings', text: t('nav.listingsOverview') }, { itemKey: '/map', text: t('nav.mapView') }, { itemKey: '/listings/watchlist', text: t('nav.watchlist') }, ], }, ]; if (isAdmin) { items.push({ itemKey: 'settings', text: t('nav.settings'), icon: , items: [ { itemKey: '/users', text: t('nav.userManagement') }, { itemKey: '/generalSettings', text: t('nav.settingsPage') }, ], }); } else { items.push({ itemKey: 'settings', text: t('nav.settings'), icon: , items: [{ itemKey: '/generalSettings', text: t('nav.settingsPage') }], }); } function parsePathName(name) { // Collect every leaf itemKey that looks like a route (starts with '/'). // Prefer the longest exact-prefix match so nested routes like // '/listings/watchlist' resolve to themselves instead of being collapsed // to '/listings'. const allKeys = []; const collect = (nodes) => { for (const n of nodes) { if (typeof n.itemKey === 'string' && n.itemKey.startsWith('/')) allKeys.push(n.itemKey); if (Array.isArray(n.items)) collect(n.items); } }; collect(items); const longestMatch = allKeys .filter((k) => name === k || name.startsWith(k + '/')) .sort((a, b) => b.length - a.length)[0]; if (longestMatch) return longestMatch; const split = name.split('/').filter((s) => s.length !== 0); return '/' + split[0]; } const sidebarWidth = collapsed ? '60px' : '220px'; return (