import { useEffect, useState } from 'react' import { BrowserRouter, Link, Route, Routes, useLocation } from 'react-router-dom' import { Container, NavDropdown } from 'react-bootstrap' import { AuthProvider, useAuth } from './context/AuthContext' import Home from './pages/Home' import ForumView from './pages/ForumView' import ThreadView from './pages/ThreadView' import Login from './pages/Login' import Register from './pages/Register' import Acp from './pages/Acp' import BoardIndex from './pages/BoardIndex' import Ucp from './pages/Ucp' import { useTranslation } from 'react-i18next' import { fetchSetting, fetchVersion, getForum, getThread } from './api/client' function PortalHeader({ userMenu, isAuthenticated, forumName, logoUrl, showHeaderName }) { const { t } = useTranslation() const location = useLocation() const [crumbs, setCrumbs] = useState([]) useEffect(() => { let active = true const parseForumId = (parent) => { if (!parent) return null if (typeof parent === 'string') { const parts = parent.split('/') return parts[parts.length - 1] || null } if (typeof parent === 'object' && parent.id) { return parent.id } return null } const buildForumChain = async (forum) => { const chain = [] let cursor = forum while (cursor) { chain.unshift({ label: cursor.name, to: `/forum/${cursor.id}` }) const parentId = parseForumId(cursor.parent) if (!parentId) break cursor = await getForum(parentId) } return chain } const buildCrumbs = async () => { const base = [ { label: t('portal.portal'), to: '/' }, { label: t('portal.board_index'), to: '/forums' }, ] if (location.pathname === '/') { setCrumbs([{ ...base[0], current: true }, { ...base[1] }]) return } if (location.pathname === '/forums') { setCrumbs([{ ...base[0] }, { ...base[1], current: true }]) return } if (location.pathname.startsWith('/forum/')) { const forumId = location.pathname.split('/')[2] if (forumId) { const forum = await getForum(forumId) const chain = await buildForumChain(forum) if (!active) return setCrumbs([...base, ...chain.map((crumb, idx) => ({ ...crumb, current: idx === chain.length - 1, }))]) return } } if (location.pathname.startsWith('/thread/')) { const threadId = location.pathname.split('/')[2] if (threadId) { const thread = await getThread(threadId) const forumId = thread?.forum?.split('/').pop() if (forumId) { const forum = await getForum(forumId) const chain = await buildForumChain(forum) if (!active) return const chainWithCurrent = chain.map((crumb, index) => ({ ...crumb, current: index === chain.length - 1, })) setCrumbs([...base, ...chainWithCurrent]) return } } } setCrumbs([{ ...base[0] }, { ...base[1], current: true }]) } buildCrumbs() return () => { active = false } }, [location.pathname, t]) return (
{logoUrl && ( {forumName )} {(showHeaderName || !logoUrl) && (
{forumName || '24unix.net'}
)}