aboutsummaryrefslogtreecommitdiff
path: root/FrontEnd/src/views/common/AppBar.tsx
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2021-06-15 18:25:17 +0800
committerGitHub <noreply@github.com>2021-06-15 18:25:17 +0800
commit4645761c2090aeaf8c26789155b342c048f44535 (patch)
tree1aab5ce94549f3f8b3fd1a31c84fb2dd8b6b2511 /FrontEnd/src/views/common/AppBar.tsx
parent485ef185153890b7c6ac4ed9798a3f2db80c8845 (diff)
parentb6afd5e8161126522bdfff876f5483fa97e94797 (diff)
downloadtimeline-4645761c2090aeaf8c26789155b342c048f44535.tar.gz
timeline-4645761c2090aeaf8c26789155b342c048f44535.tar.bz2
timeline-4645761c2090aeaf8c26789155b342c048f44535.zip
Merge pull request #620 from crupest/vite
Migrate to vite!
Diffstat (limited to 'FrontEnd/src/views/common/AppBar.tsx')
-rw-r--r--FrontEnd/src/views/common/AppBar.tsx82
1 files changed, 82 insertions, 0 deletions
diff --git a/FrontEnd/src/views/common/AppBar.tsx b/FrontEnd/src/views/common/AppBar.tsx
new file mode 100644
index 00000000..ebc8bf0c
--- /dev/null
+++ b/FrontEnd/src/views/common/AppBar.tsx
@@ -0,0 +1,82 @@
+import React from "react";
+import { useTranslation } from "react-i18next";
+import { Link, NavLink } from "react-router-dom";
+import classnames from "classnames";
+import { useMediaQuery } from "react-responsive";
+
+import { useUser } from "@/services/user";
+
+import TimelineLogo from "./TimelineLogo";
+import UserAvatar from "./user/UserAvatar";
+
+import "./index.css";
+
+const AppBar: React.FC = (_) => {
+ const { t } = useTranslation();
+
+ const user = useUser();
+ const hasAdministrationPermission = user && user.hasAdministrationPermission;
+
+ const isSmallScreen = useMediaQuery({ maxWidth: 576 });
+
+ const [expand, setExpand] = React.useState<boolean>(false);
+ const collapse = (): void => setExpand(false);
+ const toggleExpand = (): void => setExpand(!expand);
+
+ const createLink = (
+ link: string,
+ label: React.ReactNode,
+ className?: string
+ ): React.ReactNode => (
+ <NavLink
+ to={link}
+ activeClassName="active"
+ onClick={collapse}
+ className={className}
+ >
+ {label}
+ </NavLink>
+ );
+
+ return (
+ <nav className={classnames("app-bar", isSmallScreen && "small-screen")}>
+ <Link to="/" className="app-bar-brand active">
+ <TimelineLogo className="app-bar-brand-icon" />
+ Timeline
+ </Link>
+
+ {isSmallScreen && (
+ <i className="bi-list app-bar-toggler" onClick={toggleExpand} />
+ )}
+
+ <div
+ className={classnames(
+ "app-bar-main-area",
+ !expand && "app-bar-collapse"
+ )}
+ >
+ <div className="app-bar-link-area">
+ {createLink("/settings", t("nav.settings"))}
+ {createLink("/about", t("nav.about"))}
+ {hasAdministrationPermission &&
+ createLink("/admin", t("nav.administration"))}
+ </div>
+
+ <div className="app-bar-user-area">
+ {user != null
+ ? createLink(
+ "/",
+ <UserAvatar
+ username={user.username}
+ className="avatar small rounded-circle bg-white cursor-pointer ml-auto"
+ />,
+ "app-bar-avatar"
+ )
+ : createLink("/login", t("nav.login"))}
+ </div>
+ </div>
+ </nav>
+ );
+};
+
+export default AppBar;