aboutsummaryrefslogtreecommitdiff
path: root/FrontEnd/src/views/common/AppBar.tsx
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2021-06-15 14:14:28 +0800
committercrupest <crupest@outlook.com>2021-06-15 14:14:28 +0800
commit47587812b809fee2a95c76266d9d0e42fc4ac1ca (patch)
treebfaa7320c838e21edf88b5a037263f89a8012222 /FrontEnd/src/views/common/AppBar.tsx
parentda26373c7fc13cded47428b27638b349b0432437 (diff)
downloadtimeline-47587812b809fee2a95c76266d9d0e42fc4ac1ca.tar.gz
timeline-47587812b809fee2a95c76266d9d0e42fc4ac1ca.tar.bz2
timeline-47587812b809fee2a95c76266d9d0e42fc4ac1ca.zip
...
Diffstat (limited to 'FrontEnd/src/views/common/AppBar.tsx')
-rw-r--r--FrontEnd/src/views/common/AppBar.tsx80
1 files changed, 80 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..91dfbee9
--- /dev/null
+++ b/FrontEnd/src/views/common/AppBar.tsx
@@ -0,0 +1,80 @@
+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";
+
+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;