import { h } from 'preact'; import Button from './Button'; import LinkedLogo from './LinkedLogo'; import Menu, { MenuItem, MenuSeparator } from './Menu'; import MenuIcon from '../icons/Menu'; import MoreIcon from '../icons/More'; import AutoAwesomeIcon from '../icons/AutoAwesome'; import LightModeIcon from '../icons/LightMode'; import DarkModeIcon from '../icons/DarkMode'; import { useDarkMode, useSidebar } from '../context'; import { useLayoutEffect, useCallback, useRef, useState } from 'preact/hooks'; // We would typically preserve these in component state // But need to avoid too many re-renders let ticking = false; let lastScrollY = window.scrollY; export default function AppBar({ title }) { const [show, setShow] = useState(true); const [atZero, setAtZero] = useState(window.scrollY === 0); const [sidebarVisible, setSidebarVisible] = useState(true); const [showMoreMenu, setShowMoreMenu] = useState(false); const { currentMode, persistedMode, setDarkMode } = useDarkMode(); const { showSidebar, setShowSidebar } = useSidebar(); const handleSelectDarkMode = useCallback( (value, label) => { setDarkMode(value); setShowMoreMenu(false); }, [setDarkMode, setShowMoreMenu] ); const moreRef = useRef(null); const scrollListener = useCallback( (event) => { const scrollY = window.scrollY; // if (!ticking) { window.requestAnimationFrame(() => { setShow(scrollY <= 0 || lastScrollY > scrollY); setAtZero(scrollY === 0); ticking = false; lastScrollY = scrollY; }); ticking = true; // } }, [setShow] ); useLayoutEffect(() => { document.addEventListener('scroll', scrollListener); return () => { document.removeEventListener('scroll', scrollListener); }; }, []); const handleShowMenu = useCallback(() => { setShowMoreMenu(true); }, [setShowMoreMenu]); const handleDismissMoreMenu = useCallback(() => { setShowMoreMenu(false); }, [setShowMoreMenu]); const handleShowSidebar = useCallback(() => { setShowSidebar(true); }, [setShowSidebar]); return (