Files
swiss-datashare/frontend/src/pages/_app.tsx

132 lines
4.0 KiB
TypeScript
Raw Normal View History

2022-04-25 15:15:17 +02:00
import {
ColorScheme,
2022-12-24 23:58:31 +01:00
ColorSchemeProvider,
2022-04-25 15:15:17 +02:00
Container,
MantineProvider,
} from "@mantine/core";
2022-10-10 22:30:04 +02:00
import { useColorScheme } from "@mantine/hooks";
2022-04-25 15:15:17 +02:00
import { ModalsProvider } from "@mantine/modals";
import { NotificationsProvider } from "@mantine/notifications";
import axios from "axios";
import { getCookie, setCookie } from "cookies-next";
import { GetServerSidePropsContext } from "next";
2022-04-25 15:15:17 +02:00
import type { AppProps } from "next/app";
import { useEffect, useState } from "react";
import Header from "../components/navBar/NavBar";
2022-12-24 23:58:31 +01:00
import { ConfigContext } from "../hooks/config.hook";
import usePreferences from "../hooks/usePreferences";
import { UserContext } from "../hooks/user.hook";
import authService from "../services/auth.service";
import configService from "../services/config.service";
import userService from "../services/user.service";
2022-05-16 13:11:51 +02:00
import GlobalStyle from "../styles/global.style";
import globalStyle from "../styles/mantine.style";
import Config from "../types/config.type";
import { CurrentUser } from "../types/user.type";
2022-04-25 15:15:17 +02:00
function App({ Component, pageProps }: AppProps) {
const systemTheme = useColorScheme(pageProps.colorScheme);
const [colorScheme, setColorScheme] = useState<ColorScheme>(systemTheme);
2022-12-24 23:58:31 +01:00
const preferences = usePreferences();
2022-05-02 08:22:53 +02:00
const [user, setUser] = useState<CurrentUser | null>(pageProps.user);
const [configVariables, setConfigVariables] = useState<Config[]>(
pageProps.configVariables
);
2022-10-10 22:30:04 +02:00
2022-04-25 15:15:17 +02:00
useEffect(() => {
setInterval(async () => await authService.refreshAccessToken(), 30 * 1000);
2022-04-25 15:15:17 +02:00
}, []);
2022-10-10 22:30:04 +02:00
useEffect(() => {
const colorScheme =
2022-12-24 23:58:31 +01:00
preferences.get("colorScheme") == "system"
? systemTheme
: preferences.get("colorScheme");
toggleColorScheme(colorScheme);
2022-10-10 22:30:04 +02:00
}, [systemTheme]);
const toggleColorScheme = (value: ColorScheme) => {
setColorScheme(value ?? "light");
setCookie("mantine-color-scheme", value ?? "light", {
sameSite: "lax",
});
};
2022-04-25 15:15:17 +02:00
return (
2022-10-10 22:30:04 +02:00
<MantineProvider
withGlobalStyles
withNormalizeCSS
theme={{ colorScheme, ...globalStyle }}
>
2022-12-24 23:58:31 +01:00
<ColorSchemeProvider
colorScheme={colorScheme}
toggleColorScheme={toggleColorScheme}
2022-12-24 23:58:31 +01:00
>
<GlobalStyle />
<NotificationsProvider>
<ModalsProvider>
<ConfigContext.Provider
value={{
configVariables,
refresh: async () => {
setConfigVariables(await configService.list());
},
}}
>
<UserContext.Provider
value={{
user,
refreshUser: async () => {
const user = await userService.getCurrentUser();
setUser(user);
return user;
},
}}
>
<Header />
<Container>
<Component {...pageProps} />
</Container>
</UserContext.Provider>
</ConfigContext.Provider>
2022-12-24 23:58:31 +01:00
</ModalsProvider>
</NotificationsProvider>
</ColorSchemeProvider>
2022-04-25 15:15:17 +02:00
</MantineProvider>
);
}
// Fetch user and config variables on server side when the first request is made
// These will get passed as a page prop to the App component and stored in the contexts
App.getInitialProps = async ({ ctx }: { ctx: GetServerSidePropsContext }) => {
let pageProps: {
user?: CurrentUser;
configVariables?: Config[];
colorScheme: ColorScheme;
} = {
colorScheme:
(getCookie("mantine-color-scheme", ctx) as ColorScheme) ?? "light",
};
if (ctx.req) {
const cookieHeader = ctx.req.headers.cookie;
pageProps.user = await axios(`http://localhost:8080/api/users/me`, {
headers: { cookie: cookieHeader },
})
.then((res) => res.data)
.catch(() => null);
pageProps.configVariables = (
await axios(`http://localhost:8080/api/configs`)
).data;
}
return { pageProps };
};
2022-04-25 15:15:17 +02:00
export default App;