import { useEffect } from "react"; import { useRouter } from "next/router"; import { ThemeProvider } from "next-themes"; import { DefaultSeo, SocialProfileJsonLd } from "next-seo"; import * as Fathom from "fathom-client"; import Layout from "../components/Layout"; import * as config from "../lib/config"; import type { AppProps } from "next/app"; import faviconIco from "../public/static/favicons/favicon.ico"; import faviconPng from "../public/static/favicons/favicon.png"; import appleTouchIconPng from "../public/static/favicons/apple-touch-icon.png"; import meJpg from "../public/static/images/me.jpg"; // global styles import "modern-normalize/modern-normalize.css"; import "../styles/colors.scss"; import "../styles/typography.scss"; import "../styles/highlight.scss"; import "../styles/index.scss"; const App = ({ Component, pageProps }: AppProps) => { const router = useRouter(); // get this page's URL with full domain, and hack around query parameters and anchors // NOTE: this assumes trailing slashes are enabled in next.config.js const canonical = `${config.baseUrl}${router.pathname === "/" ? "" : router.pathname}/`; useEffect(() => { // https://usefathom.com/docs/integrations/next // https://vercel.com/guides/deploying-nextjs-using-fathom-analytics-with-vercel Fathom.load(config.fathomSiteId, { // optional custom domain: https://usefathom.com/docs/script/custom-domains url: config.fathomCustomScript || "https://cdn.usefathom.com/script.js", // don't track branch/deploy previews and localhost includedDomains: [config.siteDomain], }); const onRouteChangeComplete = () => { Fathom.trackPageview(); }; // needs to be triggered manually on link clicks (the page doesn't actually change) router.events.on("routeChangeComplete", onRouteChangeComplete); return () => { // unassign event listener router.events.off("routeChangeComplete", onRouteChangeComplete); }; }, []); // eslint-disable-line react-hooks/exhaustive-deps return ( <> {/* @ts-ignore */} ); }; export default App;