-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathMetaPixel.tsx
More file actions
111 lines (102 loc) · 3.11 KB
/
Copy pathMetaPixel.tsx
File metadata and controls
111 lines (102 loc) · 3.11 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
'use client'
import Script from 'next/script'
export interface MetaPixelProps {
/** Meta (Facebook) Pixel ID (e.g., '1234567890123456') */
pixelId: string
/** Load strategy (default: 'afterInteractive') */
strategy?: 'afterInteractive' | 'lazyOnload' | 'beforeInteractive'
/** Disable automatic PageView tracking (default: false) */
disablePageView?: boolean
}
const PIXEL_ID_PATTERN = /^\d{15,16}$/
export function MetaPixel({
pixelId,
strategy = 'afterInteractive',
disablePageView = false
}: MetaPixelProps) {
// Don't render if no pixel ID or invalid format
if (!pixelId || !PIXEL_ID_PATTERN.test(pixelId)) {
return null
}
const pageViewScript = disablePageView ? '' : `fbq('track', 'PageView');`
return (
<>
<Script id="meta-pixel-init" strategy={strategy}>
{`
!function(f,b,e,v,n,t,s)
{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s)}(window, document,'script',
'https://connect.facebook.net/en_US/fbevents.js');
fbq('init', '${pixelId}');
${pageViewScript}
`}
</Script>
{!disablePageView && (
<noscript>
<img
height="1"
width="1"
style={{ display: 'none' }}
src={`https://www.facebook.com/tr?id=${pixelId}&ev=PageView&noscript=1`}
alt=""
/>
</noscript>
)}
</>
)
}
/**
* Track a standard Meta Pixel event
* Use this for Facebook's predefined standard events
*
* @see https://developers.facebook.com/docs/meta-pixel/reference#standard-events
*
* @example
* trackMetaEvent('Lead')
* trackMetaEvent('Purchase', { value: 99.99, currency: 'USD' })
* trackMetaEvent('AddToCart', { content_ids: ['SKU123'], value: 29.99 })
*/
export function trackMetaEvent(
eventName: string,
params?: Record<string, unknown>
) {
if (typeof window !== 'undefined' && typeof window.fbq === 'function') {
window.fbq('track', eventName, params)
}
}
/**
* Track a custom Meta Pixel event
* Use this for your own custom events (not Facebook's standard events)
*
* @see https://developers.facebook.com/docs/meta-pixel/reference#custom-events
*
* @example
* trackMetaCustomEvent('StartTrial')
* trackMetaCustomEvent('ShareContent', { content_type: 'article' })
*/
export function trackMetaCustomEvent(
eventName: string,
params?: Record<string, unknown>
) {
if (typeof window !== 'undefined' && typeof window.fbq === 'function') {
window.fbq('trackCustom', eventName, params)
}
}
// Extend Window interface for TypeScript
declare global {
interface Window {
fbq: {
(action: 'init', pixelId: string, options?: Record<string, unknown>): void
(
action: 'track' | 'trackCustom',
eventName: string,
params?: Record<string, unknown>
): void
(action: string, ...args: unknown[]): void
}
}
}