Skip to content

Commit d048b72

Browse files
fix: GA setup for Register Now button
1 parent 43aafe6 commit d048b72

5 files changed

Lines changed: 94 additions & 12 deletions

File tree

src/components/landing/CTAReg.tsx

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { Terminal, ArrowRight, Radio } from 'lucide-react';
55
import Link from 'next/link';
66

77
import animation from '@/src/animation';
8+
import { trackRegisterClick } from '@/src/utils/trackRegisterClick';
89

910
const eventID = process.env.EVENT_ID || process.env.NEXT_PUBLIC_EVENT_ID;
1011
const data = require(`../../data/${eventID}/index.json`);
@@ -52,6 +53,14 @@ const LandingJoinMissionControl = ({ UTMSource }: { UTMSource?: string }) => {
5253
{/* Primary Action */}
5354
<a
5455
href={registerUrl}
56+
target="_blank"
57+
rel="noopener noreferrer"
58+
onClick={(event) =>
59+
trackRegisterClick(event, {
60+
ctaLocation: UTMSource ? `cta_reg_${UTMSource}` : 'cta_reg',
61+
url: registerUrl,
62+
})
63+
}
5564
className="group relative px-8 py-4 bg-sky-digital text-black font-bold font-heading text-lg tracking-wider uppercase overflow-hidden"
5665
>
5766
<div className="absolute inset-0 bg-white translate-y-full group-hover:translate-y-0 transition-transform duration-300"></div>

src/components/landing/Header.tsx

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ if (typeof window !== 'undefined') {
1414
import { AlertTriangle, Radio, Terminal, ChevronRight, Crosshair, Banknote, Users, ShieldCheck, Award, Zap } from 'lucide-react';
1515

1616
import animations from '../../animation';
17+
import { trackRegisterClick } from '../../utils/trackRegisterClick';
1718

1819
const eventID = process.env.EVENT_ID || process.env.NEXT_PUBLIC_EVENT_ID;
1920
const data = require(`../../data/${eventID}/index.json`);
@@ -356,8 +357,14 @@ const LandingHeader = () => {
356357
<a
357358
href="https://register.inctf.in"
358359
target="_blank"
360+
rel="noopener noreferrer"
359361
className="bg-red-950/40 hover:bg-red-600 text-alert-crimson hover:text-white font-mono text-sm sm:text-base font-bold tracking-wider px-9 py-3 sm:px-14 sm:py-3.5 rounded-md border-2 border-alert-crimson hover:border-red-600 shadow-[0_0_12px_rgba(244,63,94,0.3)] hover:shadow-[0_0_20px_rgba(244,63,94,0.6)] transition-all duration-300 flex items-center justify-center uppercase mt-1 register-btn opacity-70 hover:opacity-100"
360-
onClick={() => { if (typeof window !== 'undefined' && (window as any).gtag) (window as any).gtag('event', 'register_cta_click', { cta_location: 'countdown' }); }}
362+
onClick={(event) =>
363+
trackRegisterClick(event, {
364+
ctaLocation: 'countdown',
365+
url: 'https://register.inctf.in',
366+
})
367+
}
361368
>
362369
REGISTER NOW
363370
</a>

src/components/shared/TopBar/MobileMenu.tsx

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ import styled from '@emotion/styled';
33
import Link from 'next/link';
44

55
import SocialMediaLinks from '../SocialMediaLinks';
6+
import { trackRegisterClick } from '../../../utils/trackRegisterClick';
67
import { ChevronDown, ChevronUp, X } from 'lucide-react';
78

89
const SideBarMenu = styled.div`
@@ -120,10 +121,15 @@ const MobileMenu = ({ onClose, config }) => {
120121
{cta && (
121122
<Link
122123
href={cta.link || '#'}
123-
onClick={() => {
124+
target="_blank"
125+
rel="noopener noreferrer"
126+
onClick={(event) => {
124127
onClose?.();
125-
if (typeof window !== 'undefined' && (window as any).gtag) {
126-
(window as any).gtag('event', 'register_cta_click', { cta_location: 'mobile_nav' });
128+
if (cta.link) {
129+
trackRegisterClick(event, {
130+
ctaLocation: 'mobile_nav',
131+
url: cta.link,
132+
});
127133
}
128134
}}
129135
className="block w-full"

src/components/shared/TopBar/index.tsx

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import Modal from 'react-modal';
66
import { clearAllBodyScrollLocks } from 'body-scroll-lock';
77

88
import Logo from '../Logo';
9+
import { trackRegisterClick } from '../../../utils/trackRegisterClick';
910

1011
import MobileMenu from './MobileMenu';
1112
import TopBarSearch from './search';
@@ -312,10 +313,11 @@ const TopBar = ({ UTMSource = null }) => {
312313
<Link
313314
href={topbarConfig?.CTA?.link}
314315
target="_blank"
315-
onClick={() => {
316-
if (typeof window !== 'undefined' && (window as any).gtag) {
317-
(window as any).gtag('event', 'register_cta_click', { cta_location: 'top_bar' });
318-
}
316+
onClick={(event) => {
317+
trackRegisterClick(event, {
318+
ctaLocation: 'top_bar',
319+
url: topbarConfig?.CTA?.link,
320+
});
319321
}}
320322
>
321323
<span className="px-6 py-2 rounded-none border border-alert-crimson bg-alert-crimson/10 text-alert-crimson font-bold font-tactical uppercase tracking-wider hover:bg-alert-crimson hover:text-white transition-all duration-300 ml-3 shadow-[0_0_10px_rgba(244,63,94,0.25)] hover:shadow-[0_0_25px_rgba(244,63,94,0.6)] cursor-pointer inline-flex items-center">
@@ -353,10 +355,11 @@ const TopBar = ({ UTMSource = null }) => {
353355
href={topbarConfig.CTA.link}
354356
target="_blank"
355357
className="px-3 py-1 border border-alert-crimson bg-alert-crimson/10 text-alert-crimson font-bold uppercase tracking-wider text-xs rounded-none hover:bg-alert-crimson hover:text-white transition-all duration-300"
356-
onClick={() => {
357-
if (typeof window !== 'undefined' && (window as any).gtag) {
358-
(window as any).gtag('event', 'register_cta_click', { cta_location: 'top_bar_mobile' });
359-
}
358+
onClick={(event) => {
359+
trackRegisterClick(event, {
360+
ctaLocation: 'top_bar_mobile',
361+
url: topbarConfig.CTA.link,
362+
});
360363
}}
361364
>
362365
Register

src/utils/trackRegisterClick.ts

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
import type { MouseEvent } from 'react';
2+
3+
type RegisterClickOptions = {
4+
ctaLocation: string;
5+
url: string;
6+
target?: '_blank' | '_self';
7+
};
8+
9+
const NAVIGATION_FALLBACK_DELAY_MS = 500;
10+
11+
export function trackRegisterClick(
12+
event: MouseEvent<HTMLAnchorElement>,
13+
{ ctaLocation, url, target = '_blank' }: RegisterClickOptions,
14+
) {
15+
if (typeof window === 'undefined') {
16+
return;
17+
}
18+
19+
const isModifiedClick = event.metaKey || event.ctrlKey || event.shiftKey || event.altKey || event.button !== 0;
20+
if (isModifiedClick) {
21+
return;
22+
}
23+
24+
const navigate = () => {
25+
if (target === '_self') {
26+
window.location.assign(url);
27+
return;
28+
}
29+
30+
window.open(url, '_blank', 'noopener,noreferrer');
31+
};
32+
33+
if (typeof window.gtag !== 'function') {
34+
return;
35+
}
36+
37+
event.preventDefault();
38+
39+
let hasNavigated = false;
40+
41+
const navigateOnce = () => {
42+
if (hasNavigated) {
43+
return;
44+
}
45+
46+
hasNavigated = true;
47+
navigate();
48+
};
49+
50+
window.gtag('event', 'register_cta_click', {
51+
cta_location: ctaLocation,
52+
transport_type: 'beacon',
53+
event_callback: navigateOnce,
54+
});
55+
56+
window.setTimeout(navigateOnce, NAVIGATION_FALLBACK_DELAY_MS);
57+
}

0 commit comments

Comments
 (0)