51 lines
1.5 KiB
TypeScript
51 lines
1.5 KiB
TypeScript
import "../styles/globals.css";
|
|
import type { ReactElement, ReactNode } from "react";
|
|
import type { NextPage } from "next";
|
|
import type { AppProps } from "next/app";
|
|
import { AnimatePresence, domAnimation, LazyMotion } from "framer-motion";
|
|
import { Router } from "next/router";
|
|
import { SessionProvider } from "next-auth/react";
|
|
|
|
export type NextPageWithLayout<P = {}, IP = P> = NextPage<P, IP> & {
|
|
getLayout?: (page: ReactElement) => ReactNode;
|
|
};
|
|
|
|
type AppPropsWithLayout = AppProps & {
|
|
Component: NextPageWithLayout;
|
|
};
|
|
|
|
const routeChange = () => {
|
|
// Temporary fix to avoid flash of unstyled content
|
|
// during route transitions. Keep an eye on this
|
|
// issue and remove this code when resolved:
|
|
// https://github.com/vercel/next.js/issues/17464
|
|
|
|
const tempFix = () => {
|
|
const allStyleElems = document.querySelectorAll('style[media="x"]');
|
|
allStyleElems.forEach((elem) => {
|
|
elem.removeAttribute("media");
|
|
});
|
|
};
|
|
tempFix();
|
|
};
|
|
|
|
Router.events.on("routeChangeComplete", routeChange);
|
|
Router.events.on("routeChangeStart", routeChange);
|
|
|
|
export default function App({
|
|
Component,
|
|
pageProps: { session, ...pageProps },
|
|
}: AppPropsWithLayout) {
|
|
// Use the layout defined at the page level, if available
|
|
const getLayout = Component.getLayout ?? ((page) => page);
|
|
|
|
return (
|
|
<SessionProvider session={session}>
|
|
<LazyMotion features={domAnimation}>
|
|
<AnimatePresence mode="wait" initial={false}>
|
|
{getLayout(<Component {...pageProps} />)}
|
|
</AnimatePresence>
|
|
</LazyMotion>
|
|
</SessionProvider>
|
|
);
|
|
}
|