bazarr/frontend/src/App/Header.tsx

133 lines
3.6 KiB
TypeScript
Raw Normal View History

import { useSystem, useSystemSettings } from "@/apis/hooks";
import { ActionButton, SearchBar } from "@/components";
import { setSidebar } from "@/modules/redux/actions";
import { useIsOffline } from "@/modules/redux/hooks";
import { useReduxAction } from "@/modules/redux/hooks/base";
2022-03-18 18:16:23 +00:00
import { Environment, useGotoHomepage, useIsMobile } from "@/utilities";
2021-03-25 14:22:43 +00:00
import {
faBars,
faHeart,
faNetworkWired,
faUser,
} from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { FunctionComponent, useMemo } from "react";
2021-03-25 14:22:43 +00:00
import {
Button,
Col,
Container,
Dropdown,
Image,
Navbar,
Row,
} from "react-bootstrap";
import { Helmet } from "react-helmet";
import NotificationCenter from "./Notification";
2021-03-25 14:22:43 +00:00
const Header: FunctionComponent = () => {
const { data: settings } = useSystemSettings();
2021-03-25 14:22:43 +00:00
const hasLogout = (settings?.auth.type ?? "none") === "form";
2021-03-25 14:22:43 +00:00
const changeSidebar = useReduxAction(setSidebar);
2021-03-25 14:22:43 +00:00
const offline = useIsOffline();
const isMobile = useIsMobile();
const { shutdown, restart, logout } = useSystem();
const serverActions = useMemo(
2021-03-25 14:22:43 +00:00
() => (
<Dropdown alignRight>
<Dropdown.Toggle className="hide-arrow" as={Button}>
2021-03-25 14:22:43 +00:00
<FontAwesomeIcon icon={faUser}></FontAwesomeIcon>
</Dropdown.Toggle>
<Dropdown.Menu>
<Dropdown.Item
onClick={() => {
restart();
2021-03-25 14:22:43 +00:00
}}
>
Restart
</Dropdown.Item>
<Dropdown.Item
onClick={() => {
shutdown();
2021-03-25 14:22:43 +00:00
}}
>
Shutdown
</Dropdown.Item>
<Dropdown.Divider hidden={!hasLogout}></Dropdown.Divider>
2021-03-25 14:22:43 +00:00
<Dropdown.Item
hidden={!hasLogout}
2021-03-25 14:22:43 +00:00
onClick={() => {
logout();
2021-03-25 14:22:43 +00:00
}}
>
Logout
</Dropdown.Item>
</Dropdown.Menu>
</Dropdown>
),
[hasLogout, logout, restart, shutdown]
2021-03-25 14:22:43 +00:00
);
const goHome = useGotoHomepage();
2021-03-25 14:22:43 +00:00
return (
<Navbar bg="primary" className="flex-grow-1 px-0">
<Helmet>
<meta name="theme-color" content="#911f93" />
</Helmet>
2021-03-25 14:22:43 +00:00
<div className="header-icon px-3 m-0 d-none d-md-block">
<Image
alt="brand"
2022-03-18 18:16:23 +00:00
src={`${Environment.baseUrl}/static/logo64.png`}
width="32"
height="32"
onClick={goHome}
2022-03-20 04:12:56 +00:00
role="button"
></Image>
2021-03-25 14:22:43 +00:00
</div>
2021-08-31 16:08:47 +00:00
<Button
className="mx-2 m-0 d-md-none"
onClick={() => changeSidebar(true)}
>
2021-03-25 14:22:43 +00:00
<FontAwesomeIcon icon={faBars}></FontAwesomeIcon>
</Button>
<Container fluid>
<Row noGutters className="flex-grow-1">
<Col xs={4} sm={6} className="d-flex align-items-center">
<SearchBar></SearchBar>
2021-03-25 14:22:43 +00:00
</Col>
<Col className="d-flex flex-row align-items-center justify-content-end pr-2">
<NotificationCenter></NotificationCenter>
2021-03-25 14:22:43 +00:00
<Button
href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=XHHRWXT9YB7WE&source=url"
target="_blank"
>
<FontAwesomeIcon icon={faHeart}></FontAwesomeIcon>
</Button>
{offline ? (
<ActionButton
loading
alwaysShowText
2021-03-25 14:22:43 +00:00
className="ml-2"
variant="warning"
icon={faNetworkWired}
>
{isMobile ? "" : "Connecting..."}
2021-03-25 14:22:43 +00:00
</ActionButton>
) : (
serverActions
2021-03-25 14:22:43 +00:00
)}
</Col>
</Row>
</Container>
</Navbar>
);
};
export default Header;