bazarr/frontend/src/App/index.tsx

79 lines
2.3 KiB
TypeScript
Raw Permalink Normal View History

2024-06-08 00:49:40 +00:00
import { FunctionComponent, useEffect, useState } from "react";
import { Outlet, useNavigate } from "react-router-dom";
import { AppShell } from "@mantine/core";
import { useWindowEvent } from "@mantine/hooks";
import { showNotification } from "@mantine/notifications";
2022-05-31 15:49:04 +00:00
import AppNavbar from "@/App/Navbar";
import ErrorBoundary from "@/components/ErrorBoundary";
2022-05-31 15:49:04 +00:00
import NavbarProvider from "@/contexts/Navbar";
import OnlineProvider from "@/contexts/Online";
import { notification } from "@/modules/task";
2023-02-10 17:21:09 +00:00
import CriticalError from "@/pages/errors/CriticalError";
2024-06-08 00:49:40 +00:00
import { RouterNames } from "@/Router/RouterNames";
import { Environment } from "@/utilities";
2022-05-31 15:49:04 +00:00
import AppHeader from "./Header";
2024-06-07 03:00:42 +00:00
import styleVars from "@/assets/_variables.module.scss";
2021-03-25 14:22:43 +00:00
const App: FunctionComponent = () => {
2022-05-31 15:49:04 +00:00
const navigate = useNavigate();
2021-03-25 14:22:43 +00:00
2022-05-31 15:49:04 +00:00
const [criticalError, setCriticalError] = useState<string | null>(null);
const [navbar, setNavbar] = useState(false);
const [online, setOnline] = useState(true);
useWindowEvent("app-critical-error", ({ detail }) => {
setCriticalError(detail.message);
});
2022-08-23 15:13:46 +00:00
useWindowEvent("app-auth-changed", (ev) => {
if (!ev.detail.authenticated) {
navigate(RouterNames.Auth);
2022-08-23 15:13:46 +00:00
}
2022-05-31 15:49:04 +00:00
});
2021-03-25 14:22:43 +00:00
2022-05-31 15:49:04 +00:00
useWindowEvent("app-online-status", ({ detail }) => {
setOnline(detail.online);
});
2021-03-25 14:22:43 +00:00
2022-05-31 15:49:04 +00:00
useEffect(() => {
if (Environment.hasUpdate) {
2022-05-31 15:49:04 +00:00
showNotification(
notification.info(
"Update available",
"A new version of Bazarr is ready, restart is required",
),
2022-05-31 15:49:04 +00:00
);
2021-03-25 14:22:43 +00:00
}
2022-05-31 15:49:04 +00:00
}, []);
if (criticalError !== null) {
return <CriticalError message={criticalError}></CriticalError>;
2021-03-25 14:22:43 +00:00
}
2021-08-16 16:46:10 +00:00
return (
<ErrorBoundary>
2022-05-31 15:49:04 +00:00
<NavbarProvider value={{ showed: navbar, show: setNavbar }}>
<OnlineProvider value={{ online, setOnline }}>
<AppShell
2024-06-07 03:00:42 +00:00
navbar={{
width: styleVars.navBarWidth,
breakpoint: "sm",
collapsed: { mobile: !navbar },
}}
header={{ height: { base: styleVars.headerHeight } }}
2022-05-31 15:49:04 +00:00
padding={0}
>
2024-06-07 03:00:42 +00:00
<AppHeader></AppHeader>
<AppNavbar></AppNavbar>
<AppShell.Main>
<Outlet></Outlet>
</AppShell.Main>
2022-05-31 15:49:04 +00:00
</AppShell>
</OnlineProvider>
</NavbarProvider>
2021-08-16 16:46:10 +00:00
</ErrorBoundary>
);
2021-03-25 14:22:43 +00:00
};
export default App;