From 2ede158f59e8550cf5a4e4b88b3ecbb64ab0968d Mon Sep 17 00:00:00 2001 From: Rorry Date: Thu, 2 Nov 2023 10:54:24 -0300 Subject: [PATCH] [SWA-198][INFRA] - Track click events on Landing page "Launch App" buttons (#130) * infra(STK-198): apply click tracking to Launch App buttons * infra(STK-198): update FAQ section structure to support QA abstraction and FA events --- packages/landing/.env.example | 1 + packages/landing/analytics/constants.ts | 32 ++++ packages/landing/analytics/index.ts | 2 + packages/landing/analytics/types.ts | 25 ++++ packages/landing/app/layout.tsx | 21 ++- packages/landing/app/page.tsx | 137 +----------------- .../components/QAndAAccordion/index.ts | 1 - .../TryStacklyBanner/TryStacklyBanner.tsx | 24 --- packages/landing/components/index.ts | 3 +- .../landing/components/navbar/MobileMenu.tsx | 9 +- packages/landing/components/navbar/Navbar.tsx | 15 +- .../landing/components/sections/FAQ/FAQ.tsx | 37 +++++ .../FAQ}/QAndAAccordion.tsx | 29 ++-- .../components/sections/FAQ/constants.ts | 70 +++++++++ .../landing/components/sections/FAQ/index.ts | 1 + .../sections/HeroBanner/HeroBanner.tsx | 96 ++++++++++++ .../components/sections/HeroBanner/index.ts | 1 + .../TryStacklyBanner/TryStacklyBanner.tsx | 50 +++++++ .../{ => sections}/TryStacklyBanner/index.ts | 0 packages/landing/components/sections/index.ts | 3 + .../landing/contexts/AnalyticsContext.tsx | 46 ++++++ packages/landing/contexts/index.ts | 1 + packages/landing/providers/Providers.tsx | 9 ++ packages/landing/providers/index.ts | 1 + packages/landing/ui/buttons/ButtonLink.tsx | 2 + packages/landing/ui/buttons/base.ts | 2 +- 26 files changed, 442 insertions(+), 176 deletions(-) create mode 100644 packages/landing/.env.example create mode 100644 packages/landing/analytics/constants.ts create mode 100644 packages/landing/analytics/index.ts create mode 100644 packages/landing/analytics/types.ts delete mode 100644 packages/landing/components/QAndAAccordion/index.ts delete mode 100644 packages/landing/components/TryStacklyBanner/TryStacklyBanner.tsx create mode 100644 packages/landing/components/sections/FAQ/FAQ.tsx rename packages/landing/components/{QAndAAccordion => sections/FAQ}/QAndAAccordion.tsx (70%) create mode 100644 packages/landing/components/sections/FAQ/constants.ts create mode 100644 packages/landing/components/sections/FAQ/index.ts create mode 100644 packages/landing/components/sections/HeroBanner/HeroBanner.tsx create mode 100644 packages/landing/components/sections/HeroBanner/index.ts create mode 100644 packages/landing/components/sections/TryStacklyBanner/TryStacklyBanner.tsx rename packages/landing/components/{ => sections}/TryStacklyBanner/index.ts (100%) create mode 100644 packages/landing/components/sections/index.ts create mode 100644 packages/landing/contexts/AnalyticsContext.tsx create mode 100644 packages/landing/contexts/index.ts create mode 100644 packages/landing/providers/Providers.tsx create mode 100644 packages/landing/providers/index.ts diff --git a/packages/landing/.env.example b/packages/landing/.env.example new file mode 100644 index 00000000..f712a32a --- /dev/null +++ b/packages/landing/.env.example @@ -0,0 +1 @@ +NEXT_PUBLIC_FATHOM_SITE_ID= diff --git a/packages/landing/analytics/constants.ts b/packages/landing/analytics/constants.ts new file mode 100644 index 00000000..4f4c7930 --- /dev/null +++ b/packages/landing/analytics/constants.ts @@ -0,0 +1,32 @@ +const LAUNCH_APP = "click/launch-app"; +const LAUNCH_APP_NAVBAR = `${LAUNCH_APP}-navbar`; +const FAQ = "click/faq"; +const FAQ_WHAT_IS = `${FAQ}-what-is`; +const FAQ_HOW = `${FAQ}-how`; + +export const EVENTS = { + NAVBAR: { + DESKTOP: { + LAUNCH_APP_CLICK: `${LAUNCH_APP_NAVBAR}-desktop`, + }, + MOBILE: { + LAUNCH_APP_CLICK: `${LAUNCH_APP_NAVBAR}-mobile`, + }, + }, + SECTIONS: { + FAQ: { + HOW_CANCEL_STACK: `${FAQ_HOW}-cancel-stack`, + HOW_STACKLY_WORKS: `${FAQ_HOW}-stackly-works`, + WHAT_IS_STACKLY_CLICK: `${FAQ_WHAT_IS}-stackly`, + WHAT_IS_STACK_CLICK: `${FAQ_WHAT_IS}-stack`, + WHAT_IS_DCA: `${FAQ_WHAT_IS}-dca`, + WHY_TO_DCA: `${FAQ}-why-to-dca`, + }, + HERO_BANNER: { + STACK_NOW_CLICK: `${LAUNCH_APP}-hero-banner`, + }, + TRY_STACKLY_BANNER: { + TRY_STACKLY_NOW_CLICK: `${LAUNCH_APP}-try-stackly-banner`, + }, + }, +}; diff --git a/packages/landing/analytics/index.ts b/packages/landing/analytics/index.ts new file mode 100644 index 00000000..e6869b19 --- /dev/null +++ b/packages/landing/analytics/index.ts @@ -0,0 +1,2 @@ +export * from "./constants"; +export * from "./types"; diff --git a/packages/landing/analytics/types.ts b/packages/landing/analytics/types.ts new file mode 100644 index 00000000..1fd3214c --- /dev/null +++ b/packages/landing/analytics/types.ts @@ -0,0 +1,25 @@ +type PageViewOptions = { + referrer?: string; + url?: string; +}; + +export type EventName = string; + +export type EventOptions = { + _site_id?: string; + _value?: number; +}; + +export interface Fathom { + blockTrackingForMe: () => void; + enableTrackingForMe: () => void; + setSite: (siteId: string) => void; + trackEvent(eventId: string, opts?: EventOptions): void; + trackPageview: (opts?: PageViewOptions) => void; +} + +declare global { + interface Window { + fathom: Fathom; + } +} diff --git a/packages/landing/app/layout.tsx b/packages/landing/app/layout.tsx index 599ffcfd..aead01e2 100644 --- a/packages/landing/app/layout.tsx +++ b/packages/landing/app/layout.tsx @@ -1,8 +1,11 @@ -import { Metadata } from "next"; import localFont from "next/font/local"; +import { Metadata } from "next"; +import Script from "next/script"; import { Navbar } from "@/components"; +import { Providers } from "@/providers"; import { STACKLY_LANDING_URL } from "@/constants"; + import "@/styles/global.css"; const stabilGrotesk = localFont({ @@ -34,6 +37,8 @@ export const metadata: Metadata = { "Stackly is a simple, non-custodial tool that uses the CoW protocol to place recurring swaps based on DCA", }; +const siteId = process.env.NEXT_PUBLIC_FATHOM_SITE_ID; + export default function RootLayout({ children, }: { @@ -42,8 +47,18 @@ export default function RootLayout({ return ( - - {children} +