diff --git a/web/src/App.jsx b/web/src/App.jsx index 01923ff36..95d66c36f 100644 --- a/web/src/App.jsx +++ b/web/src/App.jsx @@ -4,7 +4,6 @@ import AppBar from './components/AppBar'; import Camera from './Camera'; import CameraMap from './CameraMap'; import Cameras from './Cameras'; -import { DarkModeProvider } from './context'; import Debug from './Debug'; import Event from './Event'; import Events from './Events'; @@ -12,34 +11,37 @@ import { Router } from 'preact-router'; import Sidebar from './Sidebar'; import StyleGuide from './StyleGuide'; import Api, { FetchStatus, useConfig } from './api'; +import { DarkModeProvider, SidebarProvider } from './context'; export default function App() { const { data, status } = useConfig(); return ( -
- - {status !== FetchStatus.LOADED ? ( -
- -
- ) : ( -
- -
- - - - - - - {import.meta.env.SNOWPACK_MODE !== 'development' ? : null} - - + +
+ + {status !== FetchStatus.LOADED ? ( +
+
-
- )} -
+ ) : ( +
+ +
+ + + + + + + {import.meta.env.SNOWPACK_MODE !== 'development' ? : null} + + +
+
+ )} +
+ ); } diff --git a/web/src/Sidebar.jsx b/web/src/Sidebar.jsx index cd7b313fe..6821a946c 100644 --- a/web/src/Sidebar.jsx +++ b/web/src/Sidebar.jsx @@ -1,10 +1,11 @@ -import { h } from 'preact'; +import { h, Fragment } from 'preact'; import Link from './components/Link'; import LinkedLogo from './components/LinkedLogo'; import { Link as RouterLink } from 'preact-router/match'; import { useCallback, useState } from 'preact/hooks'; +import { useSidebar } from './context'; -function NavLink({ className = '', href, text }) { +function NavLink({ className = '', href, text, ...other }) { const external = href.startsWith('http'); const El = external ? Link : RouterLink; const props = external ? { rel: 'noopener nofollow', target: '_blank' } : {}; @@ -13,6 +14,7 @@ function NavLink({ className = '', href, text }) { activeClassName="bg-gray-200 dark:bg-gray-700 dark:hover:bg-gray-600 dark:focus:bg-gray-600 dark:focus:text-white dark:hover:text-white dark:text-gray-200" className={`block px-4 py-2 mt-2 text-sm font-semibold text-gray-900 bg-transparent rounded-lg dark:bg-transparent dark:hover:bg-gray-600 dark:focus:bg-gray-600 dark:focus:text-white dark:hover:text-white dark:text-gray-200 hover:text-gray-900 focus:text-gray-900 hover:bg-gray-200 focus:bg-gray-200 focus:outline-none focus:shadow-outline self-end ${className}`} href={href} + {...other} {...props} > {text} @@ -21,21 +23,34 @@ function NavLink({ className = '', href, text }) { } export default function Sidebar() { + const { showSidebar, setShowSidebar } = useSidebar(); + + const handleDismiss = useCallback(() => { + setShowSidebar(false); + }, [setShowSidebar]); + return ( -
-
-
- + + {showSidebar ?
: ''} +
+
+
+ +
+
- -
+
); } diff --git a/web/src/components/AppBar.jsx b/web/src/components/AppBar.jsx index 4c9d16558..adfb1359d 100644 --- a/web/src/components/AppBar.jsx +++ b/web/src/components/AppBar.jsx @@ -4,7 +4,7 @@ import LinkedLogo from './LinkedLogo'; import Menu, { MenuItem } from './Menu'; import MenuIcon from '../icons/Menu'; import MoreIcon from '../icons/More'; -import { useDarkMode } from '../context'; +import { useDarkMode, useSidebar } from '../context'; import { useLayoutEffect, useCallback, useRef, useState } from 'preact/hooks'; // We would typically preserve these in component state @@ -18,6 +18,7 @@ export default function AppBar({ title }) { const [sidebarVisible, setSidebarVisible] = useState(true); const [showMoreMenu, setShowMoreMenu] = useState(false); const { currentMode, persistedMode, setDarkMode } = useDarkMode(); + const { showSidebar, setShowSidebar } = useSidebar(); const handleSelectDarkMode = useCallback( (value, label) => { @@ -61,6 +62,10 @@ export default function AppBar({ title }) { setShowMoreMenu(false); }, [setShowMoreMenu]); + const handleShowSidebar = useCallback(() => { + setShowSidebar(true); + }, [setShowSidebar]); + return (
-
diff --git a/web/src/components/Card.jsx b/web/src/components/Card.jsx index 00475526a..5fde64c78 100644 --- a/web/src/components/Card.jsx +++ b/web/src/components/Card.jsx @@ -20,7 +20,7 @@ export default function Box({
{media} -
{header ? {header} : null}
+
{header ? {header} : null}
{buttons.length || content ? (
diff --git a/web/src/context/index.jsx b/web/src/context/index.jsx index 213177084..06ae4dfaf 100644 --- a/web/src/context/index.jsx +++ b/web/src/context/index.jsx @@ -64,3 +64,15 @@ export function DarkModeProvider({ children }) { export function useDarkMode() { return useContext(DarkMode); } + +const Sidebar = createContext(null); + +export function SidebarProvider({ children }) { + const [showSidebar, setShowSidebar] = useState(false); + + return {children}; +} + +export function useSidebar() { + return useContext(Sidebar); +}