_app.tsx 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. import { SWRConfig } from "swr";
  2. import Script from "next/script";
  3. import type { NextPage } from "next";
  4. import { useRouter } from "next/router";
  5. import type { AppProps } from "next/app";
  6. import App, { AppContext } from "next/app";
  7. import { ReactElement, ReactNode, useEffect } from "react";
  8. import { Context } from "../libs/context";
  9. import Layout from "../components/common/Layout";
  10. import "../styles/globals.scss";
  11. import { pageview } from "../libs/gtag";
  12. import { GA_TRACKING_ID } from "../libs/config";
  13. import { get } from "../utils/http";
  14. export type NextPageWithLayout<P = {}, IP = P> = NextPage<P, IP> & {
  15. getLayout?: (page: ReactElement) => ReactNode;
  16. };
  17. type AppPropsWithLayout = AppProps & {
  18. Component: NextPageWithLayout;
  19. pageProps: {
  20. fallback?: {
  21. [key: string]: any;
  22. };
  23. [key: string]: any;
  24. };
  25. };
  26. const MyApp = ({ Component, pageProps }: AppPropsWithLayout) => {
  27. const { fallback, genre, ...otherProps } = pageProps;
  28. const router = useRouter();
  29. useEffect(() => {
  30. const handleRouteChange = (url: string) => {
  31. pageview(url);
  32. };
  33. router.events.on("routeChangeComplete", handleRouteChange);
  34. router.events.on("hashChangeComplete", handleRouteChange);
  35. return () => {
  36. router.events.off("routeChangeComplete", handleRouteChange);
  37. router.events.off("hashChangeComplete", handleRouteChange);
  38. };
  39. }, [router.events]);
  40. return (
  41. <>
  42. <Script
  43. strategy="afterInteractive"
  44. src={`https://www.googletagmanager.com/gtag/js?id=${GA_TRACKING_ID}`}
  45. />
  46. <Context.Provider value={{ genre }}>
  47. <SWRConfig value={{ fallback, revalidateIfStale: false }}>
  48. {Component.getLayout ? (
  49. Component.getLayout(<Component {...otherProps} />)
  50. ) : (
  51. <Layout>
  52. <Component {...otherProps} />
  53. </Layout>
  54. )}
  55. </SWRConfig>
  56. </Context.Provider>
  57. </>
  58. );
  59. };
  60. MyApp.getInitialProps = async function (context: AppContext) {
  61. App.getInitialProps(context);
  62. const { data } = await get("/api/genre/list");
  63. return {
  64. pageProps: { genre: data },
  65. };
  66. };
  67. export default MyApp;