import { useState, useRef, useEffect } from 'react'
import { BrowserRouter, Routes, Route, Link, useLocation } from 'react-router-dom'
import { Box, Container, Typography, Button } from '@mui/material'
import LogoutIcon from '@mui/icons-material/Logout'
import LockIcon from '@mui/icons-material/Lock'
import KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp'
import ChatPage from './pages/ChatPage'
import MapPage from './pages/MapPage'
import BrowsePage from './pages/BrowsePage'
import StatsPage from './pages/StatsPage'
import OntologyPage from './pages/OntologyPage'
import RulesPage from './pages/RulesPage'
import LoginPage from './pages/LoginPage'
import ChangePasswordDialog from './components/ChangePasswordDialog'
import { AuthProvider, useAuth } from './context/AuthContext'
// NA Color palette
const naColors = {
primary: '#007bc7',
red: '#d52b1e',
orange: '#e17000',
green: '#39870c',
cream: '#f7f5f3',
darkBlue: '#154273',
}
// Navigation items
const navItems = [
{ label: 'Chat', path: '/' },
{ label: 'Kaart', path: '/map' },
{ label: 'Verkennen', path: '/browse' },
{ label: 'Statistieken', path: '/stats' },
{ label: 'Ontologie', path: '/ontology' },
{ label: 'Regels', path: '/rules' },
]
function NavBar() {
const location = useLocation()
const { logout, user } = useAuth()
const [passwordDialogOpen, setPasswordDialogOpen] = useState(false)
return (
<>
{navItems.map((item) => {
const isActive = location.pathname === item.path ||
(item.path === '/' && location.pathname === '')
return (
{item.label}
)
})}
{/* User info and actions */}
{user && (
{user.email}
)}
}
sx={{
color: '#fff',
fontSize: '0.875rem',
textTransform: 'none',
opacity: 0.9,
'&:hover': {
opacity: 1,
bgcolor: 'rgba(255,255,255,0.1)',
},
}}
>
Uitloggen
setPasswordDialogOpen(false)}
/>
>
)
}
function AppContent() {
const { isAuthenticated, isLoading } = useAuth()
const [footerOpen, setFooterOpen] = useState(false)
const footerRef = useRef(null)
const [footerHeight, setFooterHeight] = useState(0)
// Header collapse state
const [isCollapsed, setIsCollapsed] = useState(false)
// Helper to set collapsed state
const setCollapsedWithTransition = (collapsed: boolean) => {
if (collapsed === isCollapsed) return
setIsCollapsed(collapsed)
}
// Measure footer height when it opens
useEffect(() => {
if (footerOpen && footerRef.current) {
setFooterHeight(footerRef.current.offsetHeight)
}
}, [footerOpen])
// Scroll/wheel event listeners for header collapse
useEffect(() => {
let lastScrollY = 0
let ticking = false
// Very low threshold - collapse almost immediately on scroll down
const WHEEL_THRESHOLD = 15
const SCROLL_UP_THRESHOLD = -30 // Need to scroll up a bit to restore
const handleWheel = (e: WheelEvent) => {
// Don't collapse when interacting with footer toggle
if (e.target instanceof Element && e.target.closest('.footer-toggle-btn')) return
if (e.deltaY > WHEEL_THRESHOLD) {
// Scrolling down - collapse header
setCollapsedWithTransition(true)
} else if (e.deltaY < SCROLL_UP_THRESHOLD) {
// Scrolling up significantly - restore header
setCollapsedWithTransition(false)
}
}
// Also handle touch scrolling on mobile
const handleTouchMove = () => {
if (ticking) return
ticking = true
requestAnimationFrame(() => {
const currentScrollY = window.scrollY
if (currentScrollY > lastScrollY + 10) {
setCollapsedWithTransition(true)
} else if (currentScrollY < lastScrollY - 30) {
setCollapsedWithTransition(false)
}
lastScrollY = currentScrollY
ticking = false
})
}
document.addEventListener('wheel', handleWheel, { passive: true })
document.addEventListener('touchmove', handleTouchMove, { passive: true })
return () => {
document.removeEventListener('wheel', handleWheel)
document.removeEventListener('touchmove', handleTouchMove)
}
}, [isCollapsed])
// Show loading state while checking auth
if (isLoading) {
return (
Laden...
)
}
// Show login if not authenticated
if (!isAuthenticated) {
return
}
// Show main app if authenticated
return (
{/* Small floating logo - appears when header is collapsed */}
{/* Collapsible Header Section */}
{/* Top utility bar */}
Over het NA
Contact
Zoeken in NA
{/* Main Header with Logo */}
{/* Site Title with de Aa logo */}
de Aa
Archiefassistent
{/* NA Logo */}
Een dienst van het
{/* Navigation Bar */}
{/* Main Content */}
} />
} />
} />
} />
} />
} />
} />
{/* Footer Toggle Button - Always visible at bottom center */}
{/* Toggle Footer - Hidden by default, shown on button click */}