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} )} 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 ( de Aa 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 de Aa Archiefassistent {/* NA Logo */} Een dienst van het Nationaal Archief {/* Navigation Bar */}
{/* Main Content */} } /> } /> } /> } /> } /> } /> } /> {/* Footer Toggle Button - Always visible at bottom center */} {/* Toggle Footer - Hidden by default, shown on button click */}
{/* Column 1 */} de Aa de Aa Archiefassistent Uw digitale helper voor archiefonderzoek en erfgoedvragen, aangedreven door het Nationaal Archief. {/* Column 2 */} Contact Nationaal Archief
Prins Willem-Alexanderhof 20
2595 BE Den Haag
070 - 331 54 00
{/* Column 3 */} Links {[ { label: 'nationaalarchief.nl', url: 'https://www.nationaalarchief.nl' }, { label: 'Archieven.nl', url: 'https://www.archieven.nl' }, { label: 'Gahetna.nl', url: 'https://www.gahetna.nl' }, ].map((link) => ( {link.label} ))}
{/* Copyright */} © {new Date().getFullYear()} Nationaal Archief. Alle rechten voorbehouden.
) } function App() { return ( ) } export default App