Download frontend/src/components/Layout.jsx from MoBkr/dosemate: direct link, hf CLI and curl.
- Browser
- Download file 1.12 kB
-
https://huggingface.co/spaces/MoBkr/dosemate/resolve/main/frontend/src/components/Layout.jsx
- Command line
-
hf download hf://spaces/MoBkr/dosemate/frontend/src/components/Layout.jsx
-
curl -L -o Layout.jsx https://huggingface.co/spaces/MoBkr/dosemate/resolve/main/frontend/src/components/Layout.jsx
1.12 kB
| import { useEffect } from "react" | |
| import { Outlet, useNavigate } from "react-router-dom" | |
| import Sidebar from "./Sidebar" | |
| import { useIsMobile } from "../useMediaQuery" | |
| // Shared shell for the non-chat authenticated pages: Sidebar + page content. | |
| export default function Layout() { | |
| const navigate = useNavigate() | |
| const isMobile = useIsMobile() | |
| // Let the service worker deep-link us (e.g. notification click -> /today). | |
| useEffect(() => { | |
| if (!("serviceWorker" in navigator)) return | |
| const handler = (event) => { | |
| if (event.data?.type === "navigate" && event.data.url) navigate(event.data.url) | |
| } | |
| navigator.serviceWorker.addEventListener("message", handler) | |
| return () => navigator.serviceWorker.removeEventListener("message", handler) | |
| }, [navigate]) | |
| return ( | |
| <div style={{ width: "100%", height: "100vh", display: "flex", overflow: "hidden" }}> | |
| <Sidebar /> | |
| <div style={{ | |
| flex: 1, display: "flex", flexDirection: "column", background: "#f5f7fa", | |
| overflowY: "auto", paddingTop: isMobile ? 52 : 0, | |
| }}> | |
| <Outlet /> | |
| </div> | |
| </div> | |
| ) | |
| } | |