diff --git a/.env.example b/.env.example index 0b3a692..d8fb460 100644 --- a/.env.example +++ b/.env.example @@ -10,6 +10,9 @@ # Optional (for fathom analytics) #NEXT_PUBLIC_FATHOM_ID= +# Optional (for PostHog analytics) +#NEXT_PUBLIC_POSTHOG_ID= + # Optional (for rendering tweets more efficiently) #TWITTER_ACCESS_TOKEN= @@ -18,4 +21,4 @@ #REDIS_HOST= #REDIS_PASSWORD= #REDIS_USER='default' -#REDIS_NAMESPACE='preview-images' \ No newline at end of file +#REDIS_NAMESPACE='preview-images' diff --git a/lib/config.ts b/lib/config.ts index 1de837f..9cf5d36 100644 --- a/lib/config.ts +++ b/lib/config.ts @@ -6,8 +6,10 @@ */ import { parsePageId } from 'notion-utils' -import { getSiteConfig, getEnv } from './get-config-value' -import { PageUrlOverridesMap, PageUrlOverridesInverseMap } from './types' +import posthog from 'posthog-js' +import { getEnv, getSiteConfig } from './get-config-value' +import { PageUrlOverridesInverseMap, PageUrlOverridesMap } from './types' +import Config = posthog.Config export const rootNotionPageId: string = parsePageId( getSiteConfig('rootNotionPageId'), @@ -119,13 +121,23 @@ export const api = { // ---------------------------------------------------------------------------- export const fathomId = isDev ? null : process.env.NEXT_PUBLIC_FATHOM_ID - export const fathomConfig = fathomId ? { excludedDomains: ['localhost', 'localhost:3000'] } : undefined +// PostHog automatically filters events coming from localhost +export const postHogId = process.env.NEXT_PUBLIC_POSTHOG_ID +export const postHogConfig: Config = { + // See https://posthog.com/docs/integrate/client/js#config + api_host: 'https://app.posthog.com', + loaded: (posthog_instance) => { + console.debug(`PostHog loaded`, posthog_instance) + // posthog_instance.identify(unique user id) + } +} + function cleanPageUrlMap( pageUrlMap: PageUrlOverridesMap, { diff --git a/package.json b/package.json index f78f778..95f6d9e 100644 --- a/package.json +++ b/package.json @@ -42,6 +42,7 @@ "notion-utils": "^6.7.0-alpha.1", "p-map": "^5.3.0", "p-memoize": "^6.0.1", + "posthog-js": "^1.20.2", "react": "^17.0.2", "react-body-classname": "^1.3.1", "react-dom": "^17.0.2", diff --git a/pages/_app.tsx b/pages/_app.tsx index bc6fece..dd36c2c 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -30,7 +30,9 @@ import React from 'react' import { useRouter } from 'next/router' import { bootstrap } from 'lib/bootstrap-client' import { fathomId, fathomConfig } from 'lib/config' +import { postHogId, postHogConfig } from 'lib/config' import * as Fathom from 'fathom-client' +import posthog from 'posthog-js' if (typeof window !== 'undefined') { bootstrap() @@ -41,17 +43,28 @@ export default function App({ Component, pageProps }) { React.useEffect(() => { function onRouteChangeComplete() { - Fathom.trackPageview() + if (fathomId) { + Fathom.trackPageview() + } + if (postHogId) { + posthog.capture('$pageview') + } } if (fathomId) { Fathom.load(fathomId, fathomConfig) + } + if (postHogId) { + posthog.init(postHogId, postHogConfig) + } + if(!fathomId && !postHogId) { + console.debug('No Analytics id provided.') + } - router.events.on('routeChangeComplete', onRouteChangeComplete) + router.events.on('routeChangeComplete', onRouteChangeComplete) - return () => { - router.events.off('routeChangeComplete', onRouteChangeComplete) - } + return () => { + router.events.off('routeChangeComplete', onRouteChangeComplete) } }, [router.events]) diff --git a/readme.md b/readme.md index 6ab1c0f..f7e47a0 100644 --- a/readme.md +++ b/readme.md @@ -107,7 +107,7 @@ Every notion block gets its own unique classname, so you can target individual b ## Dark Mode
-
+