_app.tsx 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  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. export type NextPageWithLayout<P = {}, IP = P> = NextPage<P, IP> & {
  14. getLayout?: (page: ReactElement) => ReactNode;
  15. };
  16. type AppPropsWithLayout = AppProps & {
  17. Component: NextPageWithLayout;
  18. pageProps: {
  19. fallback?: {
  20. [key: string]: any;
  21. };
  22. [key: string]: any;
  23. };
  24. };
  25. const MyApp = ({ Component, pageProps }: AppPropsWithLayout) => {
  26. const { fallback, genre, ...otherProps } = pageProps;
  27. const router = useRouter();
  28. useEffect(() => {
  29. const handleRouteChange = (url: string) => {
  30. pageview(url);
  31. };
  32. router.events.on("routeChangeComplete", handleRouteChange);
  33. router.events.on("hashChangeComplete", handleRouteChange);
  34. return () => {
  35. router.events.off("routeChangeComplete", handleRouteChange);
  36. router.events.off("hashChangeComplete", handleRouteChange);
  37. };
  38. }, [router.events]);
  39. return (
  40. <>
  41. <Script
  42. strategy="afterInteractive"
  43. src={`https://www.googletagmanager.com/gtag/js?id=${GA_TRACKING_ID}`}
  44. />
  45. <Context.Provider value={{ genre }}>
  46. <SWRConfig value={{ fallback, revalidateIfStale: false }}>
  47. {Component.getLayout ? (
  48. Component.getLayout(<Component {...otherProps} />)
  49. ) : (
  50. <Layout>
  51. <Component {...otherProps} />
  52. </Layout>
  53. )}
  54. </SWRConfig>
  55. </Context.Provider>
  56. </>
  57. );
  58. };
  59. MyApp.getInitialProps = async function (context: AppContext) {
  60. App.getInitialProps(context);
  61. const { data } = await fetch("https://novels.yergoo.com/api/genre/list").then(
  62. (res) => res.json()
  63. );
  64. return {
  65. pageProps: { genre: data },
  66. };
  67. };
  68. export default MyApp;