/* GoToSocial Copyright (C) GoToSocial Authors admin@gotosocial.org SPDX-License-Identifier: AGPL-3.0-or-later This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ const React = require("react"); const { Link, Route, Redirect, Switch, useLocation, useRouter } = require("wouter"); const syncpipe = require("syncpipe"); const { RoleContext, useHasPermission, checkPermission, BaseUrlContext } = require("./util"); const ActiveRouteCtx = React.createContext(); function useActiveRoute() { return React.useContext(ActiveRouteCtx); } function Sidebar(menuTree, routing) { const components = menuTree.map((m) => m.MenuEntry); return function SidebarComponent() { const router = useRouter(); const [location] = useLocation(); let activeRoute = routing.find((l) => { let [match] = router.matcher(l.routingUrl, location); return match; })?.routingUrl; return ( ); }; } function ViewRouter(routing, defaultRoute) { return function ViewRouterComponent() { const permissions = React.useContext(RoleContext); const filteredRoutes = React.useMemo(() => { return syncpipe(routing, [ (_) => _.filter((route) => checkPermission(route.permissions, permissions)), (_) => _.map((route) => { return ( {/* FIXME: implement reset */} {route.view} ); }) ]); }, [permissions]); return ( {filteredRoutes} ); }; } function MenuComponent({ type, name, url, icon, permissions, links, level, children }) { const activeRoute = useActiveRoute(); if (!useHasPermission(permissions)) { return null; } const classes = [type]; if (level == 0) { classes.push("top-level"); } else if (level == 1) { classes.push("expanding"); } else { classes.push("nested"); } const isActive = links.includes(activeRoute); if (isActive) { classes.push("active"); } const className = classes.join(" "); return (
  • {icon &&