Next.js template
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

_app.js 2.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import {
  2. Hydrate,
  3. QueryClient,
  4. QueryClientProvider,
  5. } from '@tanstack/react-query';
  6. import { ReactQueryDevtools } from '@tanstack/react-query-devtools';
  7. import { SessionProvider } from 'next-auth/react';
  8. import { appWithTranslation } from 'next-i18next';
  9. import Head from 'next/head';
  10. import { useState } from 'react';
  11. import Layout from '../components/layout/base-layout/Layout';
  12. import '../styles/globals.css';
  13. import { useRouter } from 'next/router';
  14. import { useEffect } from 'react';
  15. const LoadingSpinner = () => {
  16. const router = useRouter();
  17. const [loading, setLoading] = useState(false);
  18. useEffect(() => {
  19. const handleStart = (url) => url !== router.asPath && setLoading(true);
  20. const handleComplete = (url) => url === router.asPath && setLoading(false);
  21. router.events.on('routeChangeStart', handleStart);
  22. router.events.on('routeChangeComplete', handleComplete);
  23. router.events.on('routeChangeError', handleComplete);
  24. return () => {
  25. router.events.off('routeChangeStart', handleStart);
  26. router.events.off('routeChangeComplete', handleComplete);
  27. router.events.off('routeChangeError', handleComplete);
  28. };
  29. });
  30. return (
  31. loading && (
  32. <div className="spinner-wrapper">
  33. <div className="spinner"></div>
  34. </div>
  35. )
  36. );
  37. };
  38. function MyApp({ Component, pageProps: { session, ...pageProps } }) {
  39. const [queryClient] = useState(() => new QueryClient());
  40. return (
  41. <QueryClientProvider client={queryClient}>
  42. <Hydrate state={pageProps.dehydratedState}>
  43. <SessionProvider session={session}>
  44. <Layout>
  45. <Head>
  46. <title>NextJS template</title>
  47. <meta name="description" content="NextJS template" />
  48. <meta
  49. name="viewport"
  50. content="width=device-width, initial-scale=1"
  51. />
  52. </Head>
  53. <LoadingSpinner />
  54. <Component {...pageProps} />
  55. </Layout>
  56. </SessionProvider>
  57. <ReactQueryDevtools initialIsOpen={false} />
  58. </Hydrate>
  59. </QueryClientProvider>
  60. );
  61. }
  62. MyApp.getInitialProps = async ({ Component, ctx }) => {
  63. let pageProps = {};
  64. if (Component.getInitialProps) {
  65. pageProps = await Component.getInitialProps(ctx);
  66. }
  67. return {
  68. pageProps,
  69. };
  70. };
  71. export default appWithTranslation(MyApp);