summaryrefslogtreecommitdiff
path: root/web/source/settings/lib/navigation/components.jsx
diff options
context:
space:
mode:
Diffstat (limited to 'web/source/settings/lib/navigation/components.jsx')
-rw-r--r--web/source/settings/lib/navigation/components.jsx201
1 files changed, 0 insertions, 201 deletions
diff --git a/web/source/settings/lib/navigation/components.jsx b/web/source/settings/lib/navigation/components.jsx
deleted file mode 100644
index 64ed160b6..000000000
--- a/web/source/settings/lib/navigation/components.jsx
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- 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 <http://www.gnu.org/licenses/>.
-*/
-
-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 (
- <nav className="menu-tree">
- <ul className="top-level">
- <ActiveRouteCtx.Provider value={activeRoute}>
- {components}
- </ActiveRouteCtx.Provider>
- </ul>
- </nav>
- );
- };
-}
-
-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 (
- <Route path={route.routingUrl} key={route.key}>
- <ErrorBoundary>
- {/* FIXME: implement reset */}
- <BaseUrlContext.Provider value={route.url}>
- {route.view}
- </BaseUrlContext.Provider>
- </ErrorBoundary>
- </Route>
- );
- })
- ]);
- }, [permissions]);
-
- return (
- <Switch>
- {filteredRoutes}
- <Redirect to={defaultRoute} />
- </Switch>
- );
- };
-}
-
-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 (
- <li className={className}>
- <Link href={url}>
- <a tabIndex={level == 0 ? "-1" : null} className="title">
- {icon && <i className={`icon fa fa-fw ${icon}`} aria-hidden="true" />}
- {name}
- </a>
- </Link>
- {(type == "category" && (level == 0 || isActive) && children?.length > 0) &&
- <ul>
- {children}
- </ul>
- }
- </li>
- );
-}
-
-class ErrorBoundary extends React.Component {
-
- constructor() {
- super();
- this.state = {};
-
- this.resetErrorBoundary = () => {
- this.setState({});
- };
- }
-
- static getDerivedStateFromError(error) {
- return { hadError: true, error };
- }
-
- componentDidCatch(_e, info) {
- this.setState({
- ...this.state,
- componentStack: info.componentStack
- });
- }
-
- render() {
- if (this.state.hadError) {
- return (
- <ErrorFallback
- error={this.state.error}
- componentStack={this.state.componentStack}
- resetErrorBoundary={this.resetErrorBoundary}
- />
- );
- } else {
- return this.props.children;
- }
- }
-}
-
-function ErrorFallback({ error, componentStack, resetErrorBoundary }) {
- return (
- <div className="error">
- <p>
- {"An error occured, please report this on the "}
- <a href="https://github.com/superseriousbusiness/gotosocial/issues">GoToSocial issue tracker</a>
- {" or "}
- <a href="https://matrix.to/#/#gotosocial-help:superseriousbusiness.org">Matrix support room</a>.
- <br />Include the details below:
- </p>
- <div className="details">
- <pre>
- {error.name}: {error.message}
-
- {componentStack && [
- "\n\nComponent trace:",
- componentStack
- ]}
- {["\n\nError trace: ", error.stack]}
- </pre>
- </div>
- <p>
- <button onClick={resetErrorBoundary}>Try again</button> or <a href="">refresh the page</a>
- </p>
- </div>
- );
-}
-
-module.exports = {
- Sidebar,
- ViewRouter,
- MenuComponent
-}; \ No newline at end of file