import { SWRConfig } from "swr"; import Script from "next/script"; import NProgress from "nprogress"; import type { NextPage } from "next"; import { useRouter } from "next/router"; import type { AppProps } from "next/app"; import App, { AppContext } from "next/app"; import { ReactElement, ReactNode, useEffect, useMemo } from "react"; import { get } from "libs/http"; import { pageview } from "libs/gtag"; import { Context } from "libs/context"; import { GA_TRACKING_ID } from "libs/config"; import Layout from "components/common/Layout"; import { SeoHead, SeoHeadConfig } from "components/SeoHead"; import getSiteConfig, { SiteConfig } from "libs/getSiteConfig"; import "nprogress/nprogress.css"; import "styles/globals.scss"; export type NextPageWithLayout

= NextPage & { getLayout?: (page: ReactElement) => ReactNode; }; type AppPropsWithLayout = AppProps & { Component: NextPageWithLayout; pageProps: { fallback?: Docs; siteConfig: SiteConfig; }; }; const MyApp = ({ Component, pageProps }: AppPropsWithLayout) => { const { fallback, genre, siteConfig, ...otherProps } = pageProps; const router = useRouter(); const seoConfig: SeoHeadConfig = useMemo(() => { return { title: siteConfig.title, description: siteConfig.description, keywords: siteConfig.keywords, url: `https://${siteConfig.host}`, canonical: `https://${siteConfig.host}`, jsonLd: JSON.stringify(siteConfig.jsonLd), siteName: siteConfig.siteName, img: siteConfig.touchIcon, }; }, [ siteConfig.description, siteConfig.host, siteConfig.jsonLd, siteConfig.keywords, siteConfig.siteName, siteConfig.title, siteConfig.touchIcon, ]); useEffect(() => { const handleStart = () => { NProgress.start(); }; const handleStop = () => { NProgress.done(); }; const handleError = (url: string) => { pageview(url); handleStop(); }; router.events.on("routeChangeStart", handleStart); router.events.on("routeChangeComplete", handleStop); router.events.on("routeChangeError", handleError); return () => { router.events.off("routeChangeStart", handleStart); router.events.off("routeChangeComplete", handleStop); router.events.off("routeChangeError", handleError); }; }, [router]); return ( <>