@metrone-io/react 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.esm.js +346 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +351 -0
- package/dist/index.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { createContext, useState, useEffect, useCallback, useContext } from 'react';
|
|
3
|
+
import { Metrone } from '@metrone-io/sdk';
|
|
4
|
+
|
|
5
|
+
// Create analytics context
|
|
6
|
+
const AnalyticsContext = createContext(null);
|
|
7
|
+
// Analytics Provider Component
|
|
8
|
+
function MetroneProvider({ config, children, trackRouteChanges = true, eventPrefix = '' }) {
|
|
9
|
+
const [analytics, setAnalytics] = useState(null);
|
|
10
|
+
const [isInitialized, setIsInitialized] = useState(false);
|
|
11
|
+
const [session, setSession] = useState(null);
|
|
12
|
+
const [device, setDevice] = useState(null);
|
|
13
|
+
const [location, setLocation] = useState(null);
|
|
14
|
+
// Initialize analytics
|
|
15
|
+
useEffect(() => {
|
|
16
|
+
try {
|
|
17
|
+
const analyticsInstance = new Metrone(config);
|
|
18
|
+
setAnalytics(analyticsInstance);
|
|
19
|
+
setIsInitialized(true);
|
|
20
|
+
// Set up session info
|
|
21
|
+
const sessionInfo = {
|
|
22
|
+
sessionId: analyticsInstance.getSessionId(),
|
|
23
|
+
startTime: new Date(),
|
|
24
|
+
lastActivity: new Date(),
|
|
25
|
+
duration: 0,
|
|
26
|
+
pageViews: 0,
|
|
27
|
+
eventCount: 0
|
|
28
|
+
};
|
|
29
|
+
setSession(sessionInfo);
|
|
30
|
+
// Set up device info
|
|
31
|
+
const deviceInfo = {
|
|
32
|
+
type: analyticsInstance.getScreenSize(),
|
|
33
|
+
width: window.screen.width,
|
|
34
|
+
height: window.screen.height,
|
|
35
|
+
browser: getBrowserName(),
|
|
36
|
+
os: getOSName(),
|
|
37
|
+
userAgent: navigator.userAgent
|
|
38
|
+
};
|
|
39
|
+
setDevice(deviceInfo);
|
|
40
|
+
// Set up location info (will be populated by API)
|
|
41
|
+
const locationInfo = {};
|
|
42
|
+
setLocation(locationInfo);
|
|
43
|
+
// Track route changes if enabled
|
|
44
|
+
if (trackRouteChanges) {
|
|
45
|
+
trackRouteChange();
|
|
46
|
+
}
|
|
47
|
+
// Set up event listeners
|
|
48
|
+
setupEventListeners(analyticsInstance);
|
|
49
|
+
// Cleanup on unmount
|
|
50
|
+
return () => {
|
|
51
|
+
analyticsInstance.destroy();
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
console.error('Failed to initialize Metrone Analytics:', error);
|
|
56
|
+
}
|
|
57
|
+
}, [config, trackRouteChanges]);
|
|
58
|
+
// Track route changes
|
|
59
|
+
const trackRouteChange = useCallback(() => {
|
|
60
|
+
if (!analytics)
|
|
61
|
+
return;
|
|
62
|
+
const handleRouteChange = () => {
|
|
63
|
+
analytics.pageview();
|
|
64
|
+
// Update session info
|
|
65
|
+
setSession(prev => prev ? {
|
|
66
|
+
...prev,
|
|
67
|
+
lastActivity: new Date(),
|
|
68
|
+
duration: Date.now() - prev.startTime.getTime(),
|
|
69
|
+
pageViews: prev.pageViews + 1
|
|
70
|
+
} : null);
|
|
71
|
+
};
|
|
72
|
+
// Listen for popstate events (back/forward navigation)
|
|
73
|
+
window.addEventListener('popstate', handleRouteChange);
|
|
74
|
+
// Listen for pushstate/replacestate (programmatic navigation)
|
|
75
|
+
const originalPushState = history.pushState;
|
|
76
|
+
const originalReplaceState = history.replaceState;
|
|
77
|
+
history.pushState = function (...args) {
|
|
78
|
+
originalPushState.apply(history, args);
|
|
79
|
+
handleRouteChange();
|
|
80
|
+
};
|
|
81
|
+
history.replaceState = function (...args) {
|
|
82
|
+
originalReplaceState.apply(history, args);
|
|
83
|
+
handleRouteChange();
|
|
84
|
+
};
|
|
85
|
+
return () => {
|
|
86
|
+
window.removeEventListener('popstate', handleRouteChange);
|
|
87
|
+
history.pushState = originalPushState;
|
|
88
|
+
history.replaceState = originalReplaceState;
|
|
89
|
+
};
|
|
90
|
+
}, [analytics]);
|
|
91
|
+
// Set up event listeners
|
|
92
|
+
const setupEventListeners = useCallback((analyticsInstance) => {
|
|
93
|
+
// Listen for custom analytics events
|
|
94
|
+
const handleAnalyticsEvent = (event) => {
|
|
95
|
+
if (event.type === 'metrone-update') {
|
|
96
|
+
console.log('📢 SDK update available:', event.detail);
|
|
97
|
+
}
|
|
98
|
+
else if (event.type === 'metrone-consent-request') {
|
|
99
|
+
// Handle consent request
|
|
100
|
+
const { resolve } = event.detail;
|
|
101
|
+
// You can implement your own consent UI here
|
|
102
|
+
resolve(true); // Default to accepting consent
|
|
103
|
+
}
|
|
104
|
+
else if (event.type === 'metrone-consent-revoked') {
|
|
105
|
+
console.log('🔒 Consent revoked');
|
|
106
|
+
}
|
|
107
|
+
else if (event.type === 'metrone-error') {
|
|
108
|
+
console.error('Analytics error:', event.detail);
|
|
109
|
+
}
|
|
110
|
+
else if (event.type === 'metrone-flush') {
|
|
111
|
+
console.log('📦 Events flushed:', event.detail.eventCount);
|
|
112
|
+
}
|
|
113
|
+
else if (event.type === 'metrone-online') {
|
|
114
|
+
console.log('🌐 Back online');
|
|
115
|
+
}
|
|
116
|
+
else if (event.type === 'metrone-offline') {
|
|
117
|
+
console.log('📴 Gone offline, queued events:', event.detail.queuedEvents);
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
window.addEventListener('metrone-update', handleAnalyticsEvent);
|
|
121
|
+
window.addEventListener('metrone-consent-request', handleAnalyticsEvent);
|
|
122
|
+
window.addEventListener('metrone-consent-revoked', handleAnalyticsEvent);
|
|
123
|
+
window.addEventListener('metrone-error', handleAnalyticsEvent);
|
|
124
|
+
window.addEventListener('metrone-flush', handleAnalyticsEvent);
|
|
125
|
+
window.addEventListener('metrone-online', handleAnalyticsEvent);
|
|
126
|
+
window.addEventListener('metrone-offline', handleAnalyticsEvent);
|
|
127
|
+
return () => {
|
|
128
|
+
window.removeEventListener('metrone-update', handleAnalyticsEvent);
|
|
129
|
+
window.removeEventListener('metrone-consent-request', handleAnalyticsEvent);
|
|
130
|
+
window.removeEventListener('metrone-consent-revoked', handleAnalyticsEvent);
|
|
131
|
+
window.removeEventListener('metrone-error', handleAnalyticsEvent);
|
|
132
|
+
window.removeEventListener('metrone-flush', handleAnalyticsEvent);
|
|
133
|
+
window.removeEventListener('metrone-online', handleAnalyticsEvent);
|
|
134
|
+
window.removeEventListener('metrone-offline', handleAnalyticsEvent);
|
|
135
|
+
};
|
|
136
|
+
}, []);
|
|
137
|
+
// Context value
|
|
138
|
+
const contextValue = {
|
|
139
|
+
analytics,
|
|
140
|
+
isInitialized,
|
|
141
|
+
session,
|
|
142
|
+
device,
|
|
143
|
+
location
|
|
144
|
+
};
|
|
145
|
+
return (jsx(AnalyticsContext.Provider, { value: contextValue, children: children }));
|
|
146
|
+
}
|
|
147
|
+
// Hook to use analytics
|
|
148
|
+
function useMetrone() {
|
|
149
|
+
const context = useContext(AnalyticsContext);
|
|
150
|
+
if (!context) {
|
|
151
|
+
throw new Error('useMetrone must be used within a MetroneProvider');
|
|
152
|
+
}
|
|
153
|
+
const { analytics, isInitialized } = context;
|
|
154
|
+
// Track page view
|
|
155
|
+
const trackPageView = useCallback((url, title, metadata) => {
|
|
156
|
+
if (analytics) {
|
|
157
|
+
analytics.pageview(url, title, metadata);
|
|
158
|
+
}
|
|
159
|
+
}, [analytics]);
|
|
160
|
+
// Track custom event
|
|
161
|
+
const trackEvent = useCallback((eventName, data) => {
|
|
162
|
+
if (analytics) {
|
|
163
|
+
analytics.track(eventName, data);
|
|
164
|
+
}
|
|
165
|
+
}, [analytics]);
|
|
166
|
+
// Track conversion
|
|
167
|
+
const trackConversion = useCallback((conversionType, value, data) => {
|
|
168
|
+
if (analytics) {
|
|
169
|
+
analytics.conversion(conversionType, value, data);
|
|
170
|
+
}
|
|
171
|
+
}, [analytics]);
|
|
172
|
+
// Track interaction
|
|
173
|
+
const trackInteraction = useCallback((action, element, data) => {
|
|
174
|
+
if (analytics) {
|
|
175
|
+
analytics.interaction(action, element, data);
|
|
176
|
+
}
|
|
177
|
+
}, [analytics]);
|
|
178
|
+
// Track campaign
|
|
179
|
+
const trackCampaign = useCallback((campaignData) => {
|
|
180
|
+
if (analytics) {
|
|
181
|
+
analytics.campaign(campaignData);
|
|
182
|
+
}
|
|
183
|
+
}, [analytics]);
|
|
184
|
+
// Track product view
|
|
185
|
+
const trackProductView = useCallback((productId, productName, price, metadata) => {
|
|
186
|
+
if (analytics) {
|
|
187
|
+
analytics.productView(productId, productName, price, metadata);
|
|
188
|
+
}
|
|
189
|
+
}, [analytics]);
|
|
190
|
+
// Track WhatsApp click
|
|
191
|
+
const trackWhatsAppClick = useCallback((productId, productName) => {
|
|
192
|
+
if (analytics) {
|
|
193
|
+
analytics.whatsAppClick(productId, productName);
|
|
194
|
+
}
|
|
195
|
+
}, [analytics]);
|
|
196
|
+
// Track AI call
|
|
197
|
+
const trackAICall = useCallback((data) => {
|
|
198
|
+
if (analytics) {
|
|
199
|
+
analytics.trackAICall(data);
|
|
200
|
+
}
|
|
201
|
+
}, [analytics]);
|
|
202
|
+
// Track AI chat
|
|
203
|
+
const trackAIChat = useCallback((data) => {
|
|
204
|
+
if (analytics) {
|
|
205
|
+
analytics.trackAIChat(data);
|
|
206
|
+
}
|
|
207
|
+
}, [analytics]);
|
|
208
|
+
// Track AI intent
|
|
209
|
+
const trackAIIntent = useCallback((data) => {
|
|
210
|
+
if (analytics) {
|
|
211
|
+
analytics.trackAIIntent(data);
|
|
212
|
+
}
|
|
213
|
+
}, [analytics]);
|
|
214
|
+
// Track AI session
|
|
215
|
+
const trackAISession = useCallback((data) => {
|
|
216
|
+
if (analytics) {
|
|
217
|
+
analytics.trackAISession(data);
|
|
218
|
+
}
|
|
219
|
+
}, [analytics]);
|
|
220
|
+
// Flush events
|
|
221
|
+
const flush = useCallback(() => {
|
|
222
|
+
if (analytics) {
|
|
223
|
+
analytics.flush();
|
|
224
|
+
}
|
|
225
|
+
}, [analytics]);
|
|
226
|
+
// Check consent
|
|
227
|
+
const hasConsent = useCallback(() => {
|
|
228
|
+
return analytics ? analytics.hasConsent() : false;
|
|
229
|
+
}, [analytics]);
|
|
230
|
+
// Request consent
|
|
231
|
+
const requestConsent = useCallback(async () => {
|
|
232
|
+
return analytics ? analytics.requestConsent() : false;
|
|
233
|
+
}, [analytics]);
|
|
234
|
+
// Revoke consent
|
|
235
|
+
const revokeConsent = useCallback(() => {
|
|
236
|
+
if (analytics) {
|
|
237
|
+
analytics.revokeConsent();
|
|
238
|
+
}
|
|
239
|
+
}, [analytics]);
|
|
240
|
+
return {
|
|
241
|
+
analytics,
|
|
242
|
+
isInitialized,
|
|
243
|
+
trackPageView,
|
|
244
|
+
trackEvent,
|
|
245
|
+
trackConversion,
|
|
246
|
+
trackInteraction,
|
|
247
|
+
trackCampaign,
|
|
248
|
+
trackProductView,
|
|
249
|
+
trackWhatsAppClick,
|
|
250
|
+
trackAICall,
|
|
251
|
+
trackAIChat,
|
|
252
|
+
trackAIIntent,
|
|
253
|
+
trackAISession,
|
|
254
|
+
flush,
|
|
255
|
+
hasConsent,
|
|
256
|
+
requestConsent,
|
|
257
|
+
revokeConsent
|
|
258
|
+
};
|
|
259
|
+
}
|
|
260
|
+
// Hook for analytics with options
|
|
261
|
+
function useAnalytics(options = {}) {
|
|
262
|
+
const analytics = useMetrone();
|
|
263
|
+
// Auto-track page views if enabled
|
|
264
|
+
useEffect(() => {
|
|
265
|
+
if (options.autoTrack && analytics.isInitialized) {
|
|
266
|
+
analytics.trackPageView();
|
|
267
|
+
}
|
|
268
|
+
}, [options.autoTrack, analytics.isInitialized]);
|
|
269
|
+
// Track route changes if enabled
|
|
270
|
+
useEffect(() => {
|
|
271
|
+
if (options.trackRouteChanges && analytics.isInitialized) {
|
|
272
|
+
const handleRouteChange = () => {
|
|
273
|
+
analytics.trackPageView();
|
|
274
|
+
};
|
|
275
|
+
window.addEventListener('popstate', handleRouteChange);
|
|
276
|
+
return () => {
|
|
277
|
+
window.removeEventListener('popstate', handleRouteChange);
|
|
278
|
+
};
|
|
279
|
+
}
|
|
280
|
+
}, [options.trackRouteChanges, analytics.isInitialized]);
|
|
281
|
+
return analytics;
|
|
282
|
+
}
|
|
283
|
+
// Higher-order component for analytics
|
|
284
|
+
function withMetrone(Component, options = {}) {
|
|
285
|
+
return function MetroneWrappedComponent(props) {
|
|
286
|
+
const analytics = useMetrone();
|
|
287
|
+
// Track page views if enabled
|
|
288
|
+
useEffect(() => {
|
|
289
|
+
if (options.trackPageViews && analytics.isInitialized) {
|
|
290
|
+
analytics.trackPageView();
|
|
291
|
+
}
|
|
292
|
+
}, [options.trackPageViews, analytics.isInitialized]);
|
|
293
|
+
// Track interactions if enabled
|
|
294
|
+
useEffect(() => {
|
|
295
|
+
if (options.trackInteractions && analytics.isInitialized) {
|
|
296
|
+
const handleClick = (event) => {
|
|
297
|
+
const target = event.target;
|
|
298
|
+
if (target) {
|
|
299
|
+
analytics.trackInteraction('click', target.tagName.toLowerCase(), {
|
|
300
|
+
id: target.id,
|
|
301
|
+
className: target.className,
|
|
302
|
+
text: target.textContent?.substring(0, 100)
|
|
303
|
+
});
|
|
304
|
+
}
|
|
305
|
+
};
|
|
306
|
+
document.addEventListener('click', handleClick);
|
|
307
|
+
return () => {
|
|
308
|
+
document.removeEventListener('click', handleClick);
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
}, [options.trackInteractions, analytics.isInitialized]);
|
|
312
|
+
return jsx(Component, { ...props });
|
|
313
|
+
};
|
|
314
|
+
}
|
|
315
|
+
// Utility functions
|
|
316
|
+
function getBrowserName() {
|
|
317
|
+
const userAgent = navigator.userAgent;
|
|
318
|
+
if (userAgent.includes('Chrome'))
|
|
319
|
+
return 'Chrome';
|
|
320
|
+
if (userAgent.includes('Firefox'))
|
|
321
|
+
return 'Firefox';
|
|
322
|
+
if (userAgent.includes('Safari'))
|
|
323
|
+
return 'Safari';
|
|
324
|
+
if (userAgent.includes('Edge'))
|
|
325
|
+
return 'Edge';
|
|
326
|
+
if (userAgent.includes('Opera'))
|
|
327
|
+
return 'Opera';
|
|
328
|
+
return 'Unknown';
|
|
329
|
+
}
|
|
330
|
+
function getOSName() {
|
|
331
|
+
const userAgent = navigator.userAgent;
|
|
332
|
+
if (userAgent.includes('Windows'))
|
|
333
|
+
return 'Windows';
|
|
334
|
+
if (userAgent.includes('Mac'))
|
|
335
|
+
return 'macOS';
|
|
336
|
+
if (userAgent.includes('Linux'))
|
|
337
|
+
return 'Linux';
|
|
338
|
+
if (userAgent.includes('Android'))
|
|
339
|
+
return 'Android';
|
|
340
|
+
if (userAgent.includes('iOS'))
|
|
341
|
+
return 'iOS';
|
|
342
|
+
return 'Unknown';
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
export { MetroneProvider, useAnalytics, useMetrone, withMetrone };
|
|
346
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/index.tsx"],"sourcesContent":["/**\n * Metrone React Integration\n * React components and hooks for easy analytics integration\n */\n\nimport React, { createContext, useContext, useEffect, useState, useCallback, ReactNode } from 'react'\nimport { Metrone, AnalyticsConfig, AnalyticsContextValue, UseAnalyticsReturn, EventData, CampaignData, SessionInfo, DeviceInfo, LocationInfo } from '@metrone-io/sdk'\n\n// Create analytics context\nconst AnalyticsContext = createContext<AnalyticsContextValue | null>(null)\n\n// Analytics Provider Props\nexport interface MetroneProviderProps {\n /** Analytics configuration */\n config: AnalyticsConfig\n /** Child components */\n children: ReactNode\n /** Whether to auto-track route changes */\n trackRouteChanges?: boolean\n /** Custom event prefix */\n eventPrefix?: string\n}\n\n// Analytics Provider Component\nexport function MetroneProvider({ \n config, \n children, \n trackRouteChanges = true,\n eventPrefix = ''\n}: MetroneProviderProps) {\n const [analytics, setAnalytics] = useState<Metrone | null>(null)\n const [isInitialized, setIsInitialized] = useState(false)\n const [session, setSession] = useState<SessionInfo | null>(null)\n const [device, setDevice] = useState<DeviceInfo | null>(null)\n const [location, setLocation] = useState<LocationInfo | null>(null)\n\n // Initialize analytics\n useEffect(() => {\n try {\n const analyticsInstance = new Metrone(config)\n setAnalytics(analyticsInstance)\n setIsInitialized(true)\n\n // Set up session info\n const sessionInfo: SessionInfo = {\n sessionId: analyticsInstance.getSessionId(),\n startTime: new Date(),\n lastActivity: new Date(),\n duration: 0,\n pageViews: 0,\n eventCount: 0\n }\n setSession(sessionInfo)\n\n // Set up device info\n const deviceInfo: DeviceInfo = {\n type: analyticsInstance.getScreenSize() as 'mobile' | 'tablet' | 'desktop',\n width: window.screen.width,\n height: window.screen.height,\n browser: getBrowserName(),\n os: getOSName(),\n userAgent: navigator.userAgent\n }\n setDevice(deviceInfo)\n\n // Set up location info (will be populated by API)\n const locationInfo: LocationInfo = {}\n setLocation(locationInfo)\n\n // Track route changes if enabled\n if (trackRouteChanges) {\n trackRouteChange()\n }\n\n // Set up event listeners\n setupEventListeners(analyticsInstance)\n\n // Cleanup on unmount\n return () => {\n analyticsInstance.destroy()\n }\n } catch (error) {\n console.error('Failed to initialize Metrone Analytics:', error)\n }\n }, [config, trackRouteChanges])\n\n // Track route changes\n const trackRouteChange = useCallback(() => {\n if (!analytics) return\n\n const handleRouteChange = () => {\n analytics.pageview()\n \n // Update session info\n setSession(prev => prev ? {\n ...prev,\n lastActivity: new Date(),\n duration: Date.now() - prev.startTime.getTime(),\n pageViews: prev.pageViews + 1\n } : null)\n }\n\n // Listen for popstate events (back/forward navigation)\n window.addEventListener('popstate', handleRouteChange)\n\n // Listen for pushstate/replacestate (programmatic navigation)\n const originalPushState = history.pushState\n const originalReplaceState = history.replaceState\n\n history.pushState = function(...args) {\n originalPushState.apply(history, args)\n handleRouteChange()\n }\n\n history.replaceState = function(...args) {\n originalReplaceState.apply(history, args)\n handleRouteChange()\n }\n\n return () => {\n window.removeEventListener('popstate', handleRouteChange)\n history.pushState = originalPushState\n history.replaceState = originalReplaceState\n }\n }, [analytics])\n\n // Set up event listeners\n const setupEventListeners = useCallback((analyticsInstance: Metrone) => {\n // Listen for custom analytics events\n const handleAnalyticsEvent = (event: CustomEvent) => {\n if (event.type === 'metrone-update') {\n console.log('📢 SDK update available:', event.detail)\n } else if (event.type === 'metrone-consent-request') {\n // Handle consent request\n const { resolve } = event.detail\n // You can implement your own consent UI here\n resolve(true) // Default to accepting consent\n } else if (event.type === 'metrone-consent-revoked') {\n console.log('🔒 Consent revoked')\n } else if (event.type === 'metrone-error') {\n console.error('Analytics error:', event.detail)\n } else if (event.type === 'metrone-flush') {\n console.log('📦 Events flushed:', event.detail.eventCount)\n } else if (event.type === 'metrone-online') {\n console.log('🌐 Back online')\n } else if (event.type === 'metrone-offline') {\n console.log('📴 Gone offline, queued events:', event.detail.queuedEvents)\n }\n }\n\n window.addEventListener('metrone-update', handleAnalyticsEvent as EventListener)\n window.addEventListener('metrone-consent-request', handleAnalyticsEvent as EventListener)\n window.addEventListener('metrone-consent-revoked', handleAnalyticsEvent as EventListener)\n window.addEventListener('metrone-error', handleAnalyticsEvent as EventListener)\n window.addEventListener('metrone-flush', handleAnalyticsEvent as EventListener)\n window.addEventListener('metrone-online', handleAnalyticsEvent as EventListener)\n window.addEventListener('metrone-offline', handleAnalyticsEvent as EventListener)\n\n return () => {\n window.removeEventListener('metrone-update', handleAnalyticsEvent as EventListener)\n window.removeEventListener('metrone-consent-request', handleAnalyticsEvent as EventListener)\n window.removeEventListener('metrone-consent-revoked', handleAnalyticsEvent as EventListener)\n window.removeEventListener('metrone-error', handleAnalyticsEvent as EventListener)\n window.removeEventListener('metrone-flush', handleAnalyticsEvent as EventListener)\n window.removeEventListener('metrone-online', handleAnalyticsEvent as EventListener)\n window.removeEventListener('metrone-offline', handleAnalyticsEvent as EventListener)\n }\n }, [])\n\n // Context value\n const contextValue: AnalyticsContextValue = {\n analytics,\n isInitialized,\n session,\n device,\n location\n }\n\n return (\n <AnalyticsContext.Provider value={contextValue}>\n {children}\n </AnalyticsContext.Provider>\n )\n}\n\n// Hook to use analytics\nexport function useMetrone(): UseAnalyticsReturn {\n const context = useContext(AnalyticsContext)\n \n if (!context) {\n throw new Error('useMetrone must be used within a MetroneProvider')\n }\n\n const { analytics, isInitialized } = context\n\n // Track page view\n const trackPageView = useCallback((url?: string, title?: string, metadata?: EventData) => {\n if (analytics) {\n analytics.pageview(url, title, metadata)\n }\n }, [analytics])\n\n // Track custom event\n const trackEvent = useCallback((eventName: string, data?: EventData) => {\n if (analytics) {\n analytics.track(eventName, data)\n }\n }, [analytics])\n\n // Track conversion\n const trackConversion = useCallback((conversionType: string, value?: number, data?: EventData) => {\n if (analytics) {\n analytics.conversion(conversionType, value, data)\n }\n }, [analytics])\n\n // Track interaction\n const trackInteraction = useCallback((action: string, element?: string, data?: EventData) => {\n if (analytics) {\n analytics.interaction(action, element, data)\n }\n }, [analytics])\n\n // Track campaign\n const trackCampaign = useCallback((campaignData: CampaignData) => {\n if (analytics) {\n analytics.campaign(campaignData)\n }\n }, [analytics])\n\n // Track product view\n const trackProductView = useCallback((productId: string, productName: string, price?: number, metadata?: EventData) => {\n if (analytics) {\n analytics.productView(productId, productName, price, metadata)\n }\n }, [analytics])\n\n // Track WhatsApp click\n const trackWhatsAppClick = useCallback((productId?: string, productName?: string) => {\n if (analytics) {\n analytics.whatsAppClick(productId, productName)\n }\n }, [analytics])\n\n // Track AI call\n const trackAICall = useCallback((data: {\n call_id: string\n provider?: string\n duration?: number\n intent?: string\n transcript_snippet?: string\n outcome?: string\n metadata?: EventData\n }) => {\n if (analytics) {\n analytics.trackAICall(data)\n }\n }, [analytics])\n\n // Track AI chat\n const trackAIChat = useCallback((data: {\n session_id: string\n provider?: string\n message_count?: number\n intent?: string\n resolved?: boolean\n duration?: number\n metadata?: EventData\n }) => {\n if (analytics) {\n analytics.trackAIChat(data)\n }\n }, [analytics])\n\n // Track AI intent\n const trackAIIntent = useCallback((data: {\n intent: string\n confidence?: number\n source?: 'voice' | 'chat' | 'assistant'\n metadata?: EventData\n }) => {\n if (analytics) {\n analytics.trackAIIntent(data)\n }\n }, [analytics])\n\n // Track AI session\n const trackAISession = useCallback((data: {\n session_id: string\n provider?: string\n action: 'start' | 'end' | 'timeout'\n duration?: number\n metadata?: EventData\n }) => {\n if (analytics) {\n analytics.trackAISession(data)\n }\n }, [analytics])\n\n // Flush events\n const flush = useCallback(() => {\n if (analytics) {\n analytics.flush()\n }\n }, [analytics])\n\n // Check consent\n const hasConsent = useCallback(() => {\n return analytics ? analytics.hasConsent() : false\n }, [analytics])\n\n // Request consent\n const requestConsent = useCallback(async () => {\n return analytics ? analytics.requestConsent() : false\n }, [analytics])\n\n // Revoke consent\n const revokeConsent = useCallback(() => {\n if (analytics) {\n analytics.revokeConsent()\n }\n }, [analytics])\n\n return {\n analytics,\n isInitialized,\n trackPageView,\n trackEvent,\n trackConversion,\n trackInteraction,\n trackCampaign,\n trackProductView,\n trackWhatsAppClick,\n trackAICall,\n trackAIChat,\n trackAIIntent,\n trackAISession,\n flush,\n hasConsent,\n requestConsent,\n revokeConsent\n }\n}\n\n// Hook for analytics with options\nexport function useAnalytics(options: {\n autoTrack?: boolean\n trackRouteChanges?: boolean\n eventPrefix?: string\n} = {}): UseAnalyticsReturn {\n const analytics = useMetrone()\n \n // Auto-track page views if enabled\n useEffect(() => {\n if (options.autoTrack && analytics.isInitialized) {\n analytics.trackPageView()\n }\n }, [options.autoTrack, analytics.isInitialized])\n\n // Track route changes if enabled\n useEffect(() => {\n if (options.trackRouteChanges && analytics.isInitialized) {\n const handleRouteChange = () => {\n analytics.trackPageView()\n }\n\n window.addEventListener('popstate', handleRouteChange)\n \n return () => {\n window.removeEventListener('popstate', handleRouteChange)\n }\n }\n }, [options.trackRouteChanges, analytics.isInitialized])\n\n return analytics\n}\n\n// Higher-order component for analytics\nexport function withMetrone<P extends object>(\n Component: React.ComponentType<P>,\n options: {\n trackPageViews?: boolean\n trackInteractions?: boolean\n eventPrefix?: string\n } = {}\n) {\n return function MetroneWrappedComponent(props: P) {\n const analytics = useMetrone()\n\n // Track page views if enabled\n useEffect(() => {\n if (options.trackPageViews && analytics.isInitialized) {\n analytics.trackPageView()\n }\n }, [options.trackPageViews, analytics.isInitialized])\n\n // Track interactions if enabled\n useEffect(() => {\n if (options.trackInteractions && analytics.isInitialized) {\n const handleClick = (event: MouseEvent) => {\n const target = event.target as HTMLElement\n if (target) {\n analytics.trackInteraction('click', target.tagName.toLowerCase(), {\n id: target.id,\n className: target.className,\n text: target.textContent?.substring(0, 100)\n })\n }\n }\n\n document.addEventListener('click', handleClick)\n \n return () => {\n document.removeEventListener('click', handleClick)\n }\n }\n }, [options.trackInteractions, analytics.isInitialized])\n\n return <Component {...props} />\n }\n}\n\n// Utility functions\nfunction getBrowserName(): string {\n const userAgent = navigator.userAgent\n \n if (userAgent.includes('Chrome')) return 'Chrome'\n if (userAgent.includes('Firefox')) return 'Firefox'\n if (userAgent.includes('Safari')) return 'Safari'\n if (userAgent.includes('Edge')) return 'Edge'\n if (userAgent.includes('Opera')) return 'Opera'\n \n return 'Unknown'\n}\n\nfunction getOSName(): string {\n const userAgent = navigator.userAgent\n \n if (userAgent.includes('Windows')) return 'Windows'\n if (userAgent.includes('Mac')) return 'macOS'\n if (userAgent.includes('Linux')) return 'Linux'\n if (userAgent.includes('Android')) return 'Android'\n if (userAgent.includes('iOS')) return 'iOS'\n \n return 'Unknown'\n}\n\n// Export types\nexport type {\n MetroneProviderProps,\n AnalyticsContextValue,\n UseAnalyticsReturn\n} from '@metrone-io/sdk'\n"],"names":["_jsx"],"mappings":"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"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,351 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
4
|
+
var react = require('react');
|
|
5
|
+
var sdk = require('@metrone-io/sdk');
|
|
6
|
+
|
|
7
|
+
// Create analytics context
|
|
8
|
+
const AnalyticsContext = react.createContext(null);
|
|
9
|
+
// Analytics Provider Component
|
|
10
|
+
function MetroneProvider({ config, children, trackRouteChanges = true, eventPrefix = '' }) {
|
|
11
|
+
const [analytics, setAnalytics] = react.useState(null);
|
|
12
|
+
const [isInitialized, setIsInitialized] = react.useState(false);
|
|
13
|
+
const [session, setSession] = react.useState(null);
|
|
14
|
+
const [device, setDevice] = react.useState(null);
|
|
15
|
+
const [location, setLocation] = react.useState(null);
|
|
16
|
+
// Initialize analytics
|
|
17
|
+
react.useEffect(() => {
|
|
18
|
+
try {
|
|
19
|
+
const analyticsInstance = new sdk.Metrone(config);
|
|
20
|
+
setAnalytics(analyticsInstance);
|
|
21
|
+
setIsInitialized(true);
|
|
22
|
+
// Set up session info
|
|
23
|
+
const sessionInfo = {
|
|
24
|
+
sessionId: analyticsInstance.getSessionId(),
|
|
25
|
+
startTime: new Date(),
|
|
26
|
+
lastActivity: new Date(),
|
|
27
|
+
duration: 0,
|
|
28
|
+
pageViews: 0,
|
|
29
|
+
eventCount: 0
|
|
30
|
+
};
|
|
31
|
+
setSession(sessionInfo);
|
|
32
|
+
// Set up device info
|
|
33
|
+
const deviceInfo = {
|
|
34
|
+
type: analyticsInstance.getScreenSize(),
|
|
35
|
+
width: window.screen.width,
|
|
36
|
+
height: window.screen.height,
|
|
37
|
+
browser: getBrowserName(),
|
|
38
|
+
os: getOSName(),
|
|
39
|
+
userAgent: navigator.userAgent
|
|
40
|
+
};
|
|
41
|
+
setDevice(deviceInfo);
|
|
42
|
+
// Set up location info (will be populated by API)
|
|
43
|
+
const locationInfo = {};
|
|
44
|
+
setLocation(locationInfo);
|
|
45
|
+
// Track route changes if enabled
|
|
46
|
+
if (trackRouteChanges) {
|
|
47
|
+
trackRouteChange();
|
|
48
|
+
}
|
|
49
|
+
// Set up event listeners
|
|
50
|
+
setupEventListeners(analyticsInstance);
|
|
51
|
+
// Cleanup on unmount
|
|
52
|
+
return () => {
|
|
53
|
+
analyticsInstance.destroy();
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
console.error('Failed to initialize Metrone Analytics:', error);
|
|
58
|
+
}
|
|
59
|
+
}, [config, trackRouteChanges]);
|
|
60
|
+
// Track route changes
|
|
61
|
+
const trackRouteChange = react.useCallback(() => {
|
|
62
|
+
if (!analytics)
|
|
63
|
+
return;
|
|
64
|
+
const handleRouteChange = () => {
|
|
65
|
+
analytics.pageview();
|
|
66
|
+
// Update session info
|
|
67
|
+
setSession(prev => prev ? {
|
|
68
|
+
...prev,
|
|
69
|
+
lastActivity: new Date(),
|
|
70
|
+
duration: Date.now() - prev.startTime.getTime(),
|
|
71
|
+
pageViews: prev.pageViews + 1
|
|
72
|
+
} : null);
|
|
73
|
+
};
|
|
74
|
+
// Listen for popstate events (back/forward navigation)
|
|
75
|
+
window.addEventListener('popstate', handleRouteChange);
|
|
76
|
+
// Listen for pushstate/replacestate (programmatic navigation)
|
|
77
|
+
const originalPushState = history.pushState;
|
|
78
|
+
const originalReplaceState = history.replaceState;
|
|
79
|
+
history.pushState = function (...args) {
|
|
80
|
+
originalPushState.apply(history, args);
|
|
81
|
+
handleRouteChange();
|
|
82
|
+
};
|
|
83
|
+
history.replaceState = function (...args) {
|
|
84
|
+
originalReplaceState.apply(history, args);
|
|
85
|
+
handleRouteChange();
|
|
86
|
+
};
|
|
87
|
+
return () => {
|
|
88
|
+
window.removeEventListener('popstate', handleRouteChange);
|
|
89
|
+
history.pushState = originalPushState;
|
|
90
|
+
history.replaceState = originalReplaceState;
|
|
91
|
+
};
|
|
92
|
+
}, [analytics]);
|
|
93
|
+
// Set up event listeners
|
|
94
|
+
const setupEventListeners = react.useCallback((analyticsInstance) => {
|
|
95
|
+
// Listen for custom analytics events
|
|
96
|
+
const handleAnalyticsEvent = (event) => {
|
|
97
|
+
if (event.type === 'metrone-update') {
|
|
98
|
+
console.log('📢 SDK update available:', event.detail);
|
|
99
|
+
}
|
|
100
|
+
else if (event.type === 'metrone-consent-request') {
|
|
101
|
+
// Handle consent request
|
|
102
|
+
const { resolve } = event.detail;
|
|
103
|
+
// You can implement your own consent UI here
|
|
104
|
+
resolve(true); // Default to accepting consent
|
|
105
|
+
}
|
|
106
|
+
else if (event.type === 'metrone-consent-revoked') {
|
|
107
|
+
console.log('🔒 Consent revoked');
|
|
108
|
+
}
|
|
109
|
+
else if (event.type === 'metrone-error') {
|
|
110
|
+
console.error('Analytics error:', event.detail);
|
|
111
|
+
}
|
|
112
|
+
else if (event.type === 'metrone-flush') {
|
|
113
|
+
console.log('📦 Events flushed:', event.detail.eventCount);
|
|
114
|
+
}
|
|
115
|
+
else if (event.type === 'metrone-online') {
|
|
116
|
+
console.log('🌐 Back online');
|
|
117
|
+
}
|
|
118
|
+
else if (event.type === 'metrone-offline') {
|
|
119
|
+
console.log('📴 Gone offline, queued events:', event.detail.queuedEvents);
|
|
120
|
+
}
|
|
121
|
+
};
|
|
122
|
+
window.addEventListener('metrone-update', handleAnalyticsEvent);
|
|
123
|
+
window.addEventListener('metrone-consent-request', handleAnalyticsEvent);
|
|
124
|
+
window.addEventListener('metrone-consent-revoked', handleAnalyticsEvent);
|
|
125
|
+
window.addEventListener('metrone-error', handleAnalyticsEvent);
|
|
126
|
+
window.addEventListener('metrone-flush', handleAnalyticsEvent);
|
|
127
|
+
window.addEventListener('metrone-online', handleAnalyticsEvent);
|
|
128
|
+
window.addEventListener('metrone-offline', handleAnalyticsEvent);
|
|
129
|
+
return () => {
|
|
130
|
+
window.removeEventListener('metrone-update', handleAnalyticsEvent);
|
|
131
|
+
window.removeEventListener('metrone-consent-request', handleAnalyticsEvent);
|
|
132
|
+
window.removeEventListener('metrone-consent-revoked', handleAnalyticsEvent);
|
|
133
|
+
window.removeEventListener('metrone-error', handleAnalyticsEvent);
|
|
134
|
+
window.removeEventListener('metrone-flush', handleAnalyticsEvent);
|
|
135
|
+
window.removeEventListener('metrone-online', handleAnalyticsEvent);
|
|
136
|
+
window.removeEventListener('metrone-offline', handleAnalyticsEvent);
|
|
137
|
+
};
|
|
138
|
+
}, []);
|
|
139
|
+
// Context value
|
|
140
|
+
const contextValue = {
|
|
141
|
+
analytics,
|
|
142
|
+
isInitialized,
|
|
143
|
+
session,
|
|
144
|
+
device,
|
|
145
|
+
location
|
|
146
|
+
};
|
|
147
|
+
return (jsxRuntime.jsx(AnalyticsContext.Provider, { value: contextValue, children: children }));
|
|
148
|
+
}
|
|
149
|
+
// Hook to use analytics
|
|
150
|
+
function useMetrone() {
|
|
151
|
+
const context = react.useContext(AnalyticsContext);
|
|
152
|
+
if (!context) {
|
|
153
|
+
throw new Error('useMetrone must be used within a MetroneProvider');
|
|
154
|
+
}
|
|
155
|
+
const { analytics, isInitialized } = context;
|
|
156
|
+
// Track page view
|
|
157
|
+
const trackPageView = react.useCallback((url, title, metadata) => {
|
|
158
|
+
if (analytics) {
|
|
159
|
+
analytics.pageview(url, title, metadata);
|
|
160
|
+
}
|
|
161
|
+
}, [analytics]);
|
|
162
|
+
// Track custom event
|
|
163
|
+
const trackEvent = react.useCallback((eventName, data) => {
|
|
164
|
+
if (analytics) {
|
|
165
|
+
analytics.track(eventName, data);
|
|
166
|
+
}
|
|
167
|
+
}, [analytics]);
|
|
168
|
+
// Track conversion
|
|
169
|
+
const trackConversion = react.useCallback((conversionType, value, data) => {
|
|
170
|
+
if (analytics) {
|
|
171
|
+
analytics.conversion(conversionType, value, data);
|
|
172
|
+
}
|
|
173
|
+
}, [analytics]);
|
|
174
|
+
// Track interaction
|
|
175
|
+
const trackInteraction = react.useCallback((action, element, data) => {
|
|
176
|
+
if (analytics) {
|
|
177
|
+
analytics.interaction(action, element, data);
|
|
178
|
+
}
|
|
179
|
+
}, [analytics]);
|
|
180
|
+
// Track campaign
|
|
181
|
+
const trackCampaign = react.useCallback((campaignData) => {
|
|
182
|
+
if (analytics) {
|
|
183
|
+
analytics.campaign(campaignData);
|
|
184
|
+
}
|
|
185
|
+
}, [analytics]);
|
|
186
|
+
// Track product view
|
|
187
|
+
const trackProductView = react.useCallback((productId, productName, price, metadata) => {
|
|
188
|
+
if (analytics) {
|
|
189
|
+
analytics.productView(productId, productName, price, metadata);
|
|
190
|
+
}
|
|
191
|
+
}, [analytics]);
|
|
192
|
+
// Track WhatsApp click
|
|
193
|
+
const trackWhatsAppClick = react.useCallback((productId, productName) => {
|
|
194
|
+
if (analytics) {
|
|
195
|
+
analytics.whatsAppClick(productId, productName);
|
|
196
|
+
}
|
|
197
|
+
}, [analytics]);
|
|
198
|
+
// Track AI call
|
|
199
|
+
const trackAICall = react.useCallback((data) => {
|
|
200
|
+
if (analytics) {
|
|
201
|
+
analytics.trackAICall(data);
|
|
202
|
+
}
|
|
203
|
+
}, [analytics]);
|
|
204
|
+
// Track AI chat
|
|
205
|
+
const trackAIChat = react.useCallback((data) => {
|
|
206
|
+
if (analytics) {
|
|
207
|
+
analytics.trackAIChat(data);
|
|
208
|
+
}
|
|
209
|
+
}, [analytics]);
|
|
210
|
+
// Track AI intent
|
|
211
|
+
const trackAIIntent = react.useCallback((data) => {
|
|
212
|
+
if (analytics) {
|
|
213
|
+
analytics.trackAIIntent(data);
|
|
214
|
+
}
|
|
215
|
+
}, [analytics]);
|
|
216
|
+
// Track AI session
|
|
217
|
+
const trackAISession = react.useCallback((data) => {
|
|
218
|
+
if (analytics) {
|
|
219
|
+
analytics.trackAISession(data);
|
|
220
|
+
}
|
|
221
|
+
}, [analytics]);
|
|
222
|
+
// Flush events
|
|
223
|
+
const flush = react.useCallback(() => {
|
|
224
|
+
if (analytics) {
|
|
225
|
+
analytics.flush();
|
|
226
|
+
}
|
|
227
|
+
}, [analytics]);
|
|
228
|
+
// Check consent
|
|
229
|
+
const hasConsent = react.useCallback(() => {
|
|
230
|
+
return analytics ? analytics.hasConsent() : false;
|
|
231
|
+
}, [analytics]);
|
|
232
|
+
// Request consent
|
|
233
|
+
const requestConsent = react.useCallback(async () => {
|
|
234
|
+
return analytics ? analytics.requestConsent() : false;
|
|
235
|
+
}, [analytics]);
|
|
236
|
+
// Revoke consent
|
|
237
|
+
const revokeConsent = react.useCallback(() => {
|
|
238
|
+
if (analytics) {
|
|
239
|
+
analytics.revokeConsent();
|
|
240
|
+
}
|
|
241
|
+
}, [analytics]);
|
|
242
|
+
return {
|
|
243
|
+
analytics,
|
|
244
|
+
isInitialized,
|
|
245
|
+
trackPageView,
|
|
246
|
+
trackEvent,
|
|
247
|
+
trackConversion,
|
|
248
|
+
trackInteraction,
|
|
249
|
+
trackCampaign,
|
|
250
|
+
trackProductView,
|
|
251
|
+
trackWhatsAppClick,
|
|
252
|
+
trackAICall,
|
|
253
|
+
trackAIChat,
|
|
254
|
+
trackAIIntent,
|
|
255
|
+
trackAISession,
|
|
256
|
+
flush,
|
|
257
|
+
hasConsent,
|
|
258
|
+
requestConsent,
|
|
259
|
+
revokeConsent
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
// Hook for analytics with options
|
|
263
|
+
function useAnalytics(options = {}) {
|
|
264
|
+
const analytics = useMetrone();
|
|
265
|
+
// Auto-track page views if enabled
|
|
266
|
+
react.useEffect(() => {
|
|
267
|
+
if (options.autoTrack && analytics.isInitialized) {
|
|
268
|
+
analytics.trackPageView();
|
|
269
|
+
}
|
|
270
|
+
}, [options.autoTrack, analytics.isInitialized]);
|
|
271
|
+
// Track route changes if enabled
|
|
272
|
+
react.useEffect(() => {
|
|
273
|
+
if (options.trackRouteChanges && analytics.isInitialized) {
|
|
274
|
+
const handleRouteChange = () => {
|
|
275
|
+
analytics.trackPageView();
|
|
276
|
+
};
|
|
277
|
+
window.addEventListener('popstate', handleRouteChange);
|
|
278
|
+
return () => {
|
|
279
|
+
window.removeEventListener('popstate', handleRouteChange);
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
}, [options.trackRouteChanges, analytics.isInitialized]);
|
|
283
|
+
return analytics;
|
|
284
|
+
}
|
|
285
|
+
// Higher-order component for analytics
|
|
286
|
+
function withMetrone(Component, options = {}) {
|
|
287
|
+
return function MetroneWrappedComponent(props) {
|
|
288
|
+
const analytics = useMetrone();
|
|
289
|
+
// Track page views if enabled
|
|
290
|
+
react.useEffect(() => {
|
|
291
|
+
if (options.trackPageViews && analytics.isInitialized) {
|
|
292
|
+
analytics.trackPageView();
|
|
293
|
+
}
|
|
294
|
+
}, [options.trackPageViews, analytics.isInitialized]);
|
|
295
|
+
// Track interactions if enabled
|
|
296
|
+
react.useEffect(() => {
|
|
297
|
+
if (options.trackInteractions && analytics.isInitialized) {
|
|
298
|
+
const handleClick = (event) => {
|
|
299
|
+
const target = event.target;
|
|
300
|
+
if (target) {
|
|
301
|
+
analytics.trackInteraction('click', target.tagName.toLowerCase(), {
|
|
302
|
+
id: target.id,
|
|
303
|
+
className: target.className,
|
|
304
|
+
text: target.textContent?.substring(0, 100)
|
|
305
|
+
});
|
|
306
|
+
}
|
|
307
|
+
};
|
|
308
|
+
document.addEventListener('click', handleClick);
|
|
309
|
+
return () => {
|
|
310
|
+
document.removeEventListener('click', handleClick);
|
|
311
|
+
};
|
|
312
|
+
}
|
|
313
|
+
}, [options.trackInteractions, analytics.isInitialized]);
|
|
314
|
+
return jsxRuntime.jsx(Component, { ...props });
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
// Utility functions
|
|
318
|
+
function getBrowserName() {
|
|
319
|
+
const userAgent = navigator.userAgent;
|
|
320
|
+
if (userAgent.includes('Chrome'))
|
|
321
|
+
return 'Chrome';
|
|
322
|
+
if (userAgent.includes('Firefox'))
|
|
323
|
+
return 'Firefox';
|
|
324
|
+
if (userAgent.includes('Safari'))
|
|
325
|
+
return 'Safari';
|
|
326
|
+
if (userAgent.includes('Edge'))
|
|
327
|
+
return 'Edge';
|
|
328
|
+
if (userAgent.includes('Opera'))
|
|
329
|
+
return 'Opera';
|
|
330
|
+
return 'Unknown';
|
|
331
|
+
}
|
|
332
|
+
function getOSName() {
|
|
333
|
+
const userAgent = navigator.userAgent;
|
|
334
|
+
if (userAgent.includes('Windows'))
|
|
335
|
+
return 'Windows';
|
|
336
|
+
if (userAgent.includes('Mac'))
|
|
337
|
+
return 'macOS';
|
|
338
|
+
if (userAgent.includes('Linux'))
|
|
339
|
+
return 'Linux';
|
|
340
|
+
if (userAgent.includes('Android'))
|
|
341
|
+
return 'Android';
|
|
342
|
+
if (userAgent.includes('iOS'))
|
|
343
|
+
return 'iOS';
|
|
344
|
+
return 'Unknown';
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
exports.MetroneProvider = MetroneProvider;
|
|
348
|
+
exports.useAnalytics = useAnalytics;
|
|
349
|
+
exports.useMetrone = useMetrone;
|
|
350
|
+
exports.withMetrone = withMetrone;
|
|
351
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/index.tsx"],"sourcesContent":["/**\n * Metrone React Integration\n * React components and hooks for easy analytics integration\n */\n\nimport React, { createContext, useContext, useEffect, useState, useCallback, ReactNode } from 'react'\nimport { Metrone, AnalyticsConfig, AnalyticsContextValue, UseAnalyticsReturn, EventData, CampaignData, SessionInfo, DeviceInfo, LocationInfo } from '@metrone-io/sdk'\n\n// Create analytics context\nconst AnalyticsContext = createContext<AnalyticsContextValue | null>(null)\n\n// Analytics Provider Props\nexport interface MetroneProviderProps {\n /** Analytics configuration */\n config: AnalyticsConfig\n /** Child components */\n children: ReactNode\n /** Whether to auto-track route changes */\n trackRouteChanges?: boolean\n /** Custom event prefix */\n eventPrefix?: string\n}\n\n// Analytics Provider Component\nexport function MetroneProvider({ \n config, \n children, \n trackRouteChanges = true,\n eventPrefix = ''\n}: MetroneProviderProps) {\n const [analytics, setAnalytics] = useState<Metrone | null>(null)\n const [isInitialized, setIsInitialized] = useState(false)\n const [session, setSession] = useState<SessionInfo | null>(null)\n const [device, setDevice] = useState<DeviceInfo | null>(null)\n const [location, setLocation] = useState<LocationInfo | null>(null)\n\n // Initialize analytics\n useEffect(() => {\n try {\n const analyticsInstance = new Metrone(config)\n setAnalytics(analyticsInstance)\n setIsInitialized(true)\n\n // Set up session info\n const sessionInfo: SessionInfo = {\n sessionId: analyticsInstance.getSessionId(),\n startTime: new Date(),\n lastActivity: new Date(),\n duration: 0,\n pageViews: 0,\n eventCount: 0\n }\n setSession(sessionInfo)\n\n // Set up device info\n const deviceInfo: DeviceInfo = {\n type: analyticsInstance.getScreenSize() as 'mobile' | 'tablet' | 'desktop',\n width: window.screen.width,\n height: window.screen.height,\n browser: getBrowserName(),\n os: getOSName(),\n userAgent: navigator.userAgent\n }\n setDevice(deviceInfo)\n\n // Set up location info (will be populated by API)\n const locationInfo: LocationInfo = {}\n setLocation(locationInfo)\n\n // Track route changes if enabled\n if (trackRouteChanges) {\n trackRouteChange()\n }\n\n // Set up event listeners\n setupEventListeners(analyticsInstance)\n\n // Cleanup on unmount\n return () => {\n analyticsInstance.destroy()\n }\n } catch (error) {\n console.error('Failed to initialize Metrone Analytics:', error)\n }\n }, [config, trackRouteChanges])\n\n // Track route changes\n const trackRouteChange = useCallback(() => {\n if (!analytics) return\n\n const handleRouteChange = () => {\n analytics.pageview()\n \n // Update session info\n setSession(prev => prev ? {\n ...prev,\n lastActivity: new Date(),\n duration: Date.now() - prev.startTime.getTime(),\n pageViews: prev.pageViews + 1\n } : null)\n }\n\n // Listen for popstate events (back/forward navigation)\n window.addEventListener('popstate', handleRouteChange)\n\n // Listen for pushstate/replacestate (programmatic navigation)\n const originalPushState = history.pushState\n const originalReplaceState = history.replaceState\n\n history.pushState = function(...args) {\n originalPushState.apply(history, args)\n handleRouteChange()\n }\n\n history.replaceState = function(...args) {\n originalReplaceState.apply(history, args)\n handleRouteChange()\n }\n\n return () => {\n window.removeEventListener('popstate', handleRouteChange)\n history.pushState = originalPushState\n history.replaceState = originalReplaceState\n }\n }, [analytics])\n\n // Set up event listeners\n const setupEventListeners = useCallback((analyticsInstance: Metrone) => {\n // Listen for custom analytics events\n const handleAnalyticsEvent = (event: CustomEvent) => {\n if (event.type === 'metrone-update') {\n console.log('📢 SDK update available:', event.detail)\n } else if (event.type === 'metrone-consent-request') {\n // Handle consent request\n const { resolve } = event.detail\n // You can implement your own consent UI here\n resolve(true) // Default to accepting consent\n } else if (event.type === 'metrone-consent-revoked') {\n console.log('🔒 Consent revoked')\n } else if (event.type === 'metrone-error') {\n console.error('Analytics error:', event.detail)\n } else if (event.type === 'metrone-flush') {\n console.log('📦 Events flushed:', event.detail.eventCount)\n } else if (event.type === 'metrone-online') {\n console.log('🌐 Back online')\n } else if (event.type === 'metrone-offline') {\n console.log('📴 Gone offline, queued events:', event.detail.queuedEvents)\n }\n }\n\n window.addEventListener('metrone-update', handleAnalyticsEvent as EventListener)\n window.addEventListener('metrone-consent-request', handleAnalyticsEvent as EventListener)\n window.addEventListener('metrone-consent-revoked', handleAnalyticsEvent as EventListener)\n window.addEventListener('metrone-error', handleAnalyticsEvent as EventListener)\n window.addEventListener('metrone-flush', handleAnalyticsEvent as EventListener)\n window.addEventListener('metrone-online', handleAnalyticsEvent as EventListener)\n window.addEventListener('metrone-offline', handleAnalyticsEvent as EventListener)\n\n return () => {\n window.removeEventListener('metrone-update', handleAnalyticsEvent as EventListener)\n window.removeEventListener('metrone-consent-request', handleAnalyticsEvent as EventListener)\n window.removeEventListener('metrone-consent-revoked', handleAnalyticsEvent as EventListener)\n window.removeEventListener('metrone-error', handleAnalyticsEvent as EventListener)\n window.removeEventListener('metrone-flush', handleAnalyticsEvent as EventListener)\n window.removeEventListener('metrone-online', handleAnalyticsEvent as EventListener)\n window.removeEventListener('metrone-offline', handleAnalyticsEvent as EventListener)\n }\n }, [])\n\n // Context value\n const contextValue: AnalyticsContextValue = {\n analytics,\n isInitialized,\n session,\n device,\n location\n }\n\n return (\n <AnalyticsContext.Provider value={contextValue}>\n {children}\n </AnalyticsContext.Provider>\n )\n}\n\n// Hook to use analytics\nexport function useMetrone(): UseAnalyticsReturn {\n const context = useContext(AnalyticsContext)\n \n if (!context) {\n throw new Error('useMetrone must be used within a MetroneProvider')\n }\n\n const { analytics, isInitialized } = context\n\n // Track page view\n const trackPageView = useCallback((url?: string, title?: string, metadata?: EventData) => {\n if (analytics) {\n analytics.pageview(url, title, metadata)\n }\n }, [analytics])\n\n // Track custom event\n const trackEvent = useCallback((eventName: string, data?: EventData) => {\n if (analytics) {\n analytics.track(eventName, data)\n }\n }, [analytics])\n\n // Track conversion\n const trackConversion = useCallback((conversionType: string, value?: number, data?: EventData) => {\n if (analytics) {\n analytics.conversion(conversionType, value, data)\n }\n }, [analytics])\n\n // Track interaction\n const trackInteraction = useCallback((action: string, element?: string, data?: EventData) => {\n if (analytics) {\n analytics.interaction(action, element, data)\n }\n }, [analytics])\n\n // Track campaign\n const trackCampaign = useCallback((campaignData: CampaignData) => {\n if (analytics) {\n analytics.campaign(campaignData)\n }\n }, [analytics])\n\n // Track product view\n const trackProductView = useCallback((productId: string, productName: string, price?: number, metadata?: EventData) => {\n if (analytics) {\n analytics.productView(productId, productName, price, metadata)\n }\n }, [analytics])\n\n // Track WhatsApp click\n const trackWhatsAppClick = useCallback((productId?: string, productName?: string) => {\n if (analytics) {\n analytics.whatsAppClick(productId, productName)\n }\n }, [analytics])\n\n // Track AI call\n const trackAICall = useCallback((data: {\n call_id: string\n provider?: string\n duration?: number\n intent?: string\n transcript_snippet?: string\n outcome?: string\n metadata?: EventData\n }) => {\n if (analytics) {\n analytics.trackAICall(data)\n }\n }, [analytics])\n\n // Track AI chat\n const trackAIChat = useCallback((data: {\n session_id: string\n provider?: string\n message_count?: number\n intent?: string\n resolved?: boolean\n duration?: number\n metadata?: EventData\n }) => {\n if (analytics) {\n analytics.trackAIChat(data)\n }\n }, [analytics])\n\n // Track AI intent\n const trackAIIntent = useCallback((data: {\n intent: string\n confidence?: number\n source?: 'voice' | 'chat' | 'assistant'\n metadata?: EventData\n }) => {\n if (analytics) {\n analytics.trackAIIntent(data)\n }\n }, [analytics])\n\n // Track AI session\n const trackAISession = useCallback((data: {\n session_id: string\n provider?: string\n action: 'start' | 'end' | 'timeout'\n duration?: number\n metadata?: EventData\n }) => {\n if (analytics) {\n analytics.trackAISession(data)\n }\n }, [analytics])\n\n // Flush events\n const flush = useCallback(() => {\n if (analytics) {\n analytics.flush()\n }\n }, [analytics])\n\n // Check consent\n const hasConsent = useCallback(() => {\n return analytics ? analytics.hasConsent() : false\n }, [analytics])\n\n // Request consent\n const requestConsent = useCallback(async () => {\n return analytics ? analytics.requestConsent() : false\n }, [analytics])\n\n // Revoke consent\n const revokeConsent = useCallback(() => {\n if (analytics) {\n analytics.revokeConsent()\n }\n }, [analytics])\n\n return {\n analytics,\n isInitialized,\n trackPageView,\n trackEvent,\n trackConversion,\n trackInteraction,\n trackCampaign,\n trackProductView,\n trackWhatsAppClick,\n trackAICall,\n trackAIChat,\n trackAIIntent,\n trackAISession,\n flush,\n hasConsent,\n requestConsent,\n revokeConsent\n }\n}\n\n// Hook for analytics with options\nexport function useAnalytics(options: {\n autoTrack?: boolean\n trackRouteChanges?: boolean\n eventPrefix?: string\n} = {}): UseAnalyticsReturn {\n const analytics = useMetrone()\n \n // Auto-track page views if enabled\n useEffect(() => {\n if (options.autoTrack && analytics.isInitialized) {\n analytics.trackPageView()\n }\n }, [options.autoTrack, analytics.isInitialized])\n\n // Track route changes if enabled\n useEffect(() => {\n if (options.trackRouteChanges && analytics.isInitialized) {\n const handleRouteChange = () => {\n analytics.trackPageView()\n }\n\n window.addEventListener('popstate', handleRouteChange)\n \n return () => {\n window.removeEventListener('popstate', handleRouteChange)\n }\n }\n }, [options.trackRouteChanges, analytics.isInitialized])\n\n return analytics\n}\n\n// Higher-order component for analytics\nexport function withMetrone<P extends object>(\n Component: React.ComponentType<P>,\n options: {\n trackPageViews?: boolean\n trackInteractions?: boolean\n eventPrefix?: string\n } = {}\n) {\n return function MetroneWrappedComponent(props: P) {\n const analytics = useMetrone()\n\n // Track page views if enabled\n useEffect(() => {\n if (options.trackPageViews && analytics.isInitialized) {\n analytics.trackPageView()\n }\n }, [options.trackPageViews, analytics.isInitialized])\n\n // Track interactions if enabled\n useEffect(() => {\n if (options.trackInteractions && analytics.isInitialized) {\n const handleClick = (event: MouseEvent) => {\n const target = event.target as HTMLElement\n if (target) {\n analytics.trackInteraction('click', target.tagName.toLowerCase(), {\n id: target.id,\n className: target.className,\n text: target.textContent?.substring(0, 100)\n })\n }\n }\n\n document.addEventListener('click', handleClick)\n \n return () => {\n document.removeEventListener('click', handleClick)\n }\n }\n }, [options.trackInteractions, analytics.isInitialized])\n\n return <Component {...props} />\n }\n}\n\n// Utility functions\nfunction getBrowserName(): string {\n const userAgent = navigator.userAgent\n \n if (userAgent.includes('Chrome')) return 'Chrome'\n if (userAgent.includes('Firefox')) return 'Firefox'\n if (userAgent.includes('Safari')) return 'Safari'\n if (userAgent.includes('Edge')) return 'Edge'\n if (userAgent.includes('Opera')) return 'Opera'\n \n return 'Unknown'\n}\n\nfunction getOSName(): string {\n const userAgent = navigator.userAgent\n \n if (userAgent.includes('Windows')) return 'Windows'\n if (userAgent.includes('Mac')) return 'macOS'\n if (userAgent.includes('Linux')) return 'Linux'\n if (userAgent.includes('Android')) return 'Android'\n if (userAgent.includes('iOS')) return 'iOS'\n \n return 'Unknown'\n}\n\n// Export types\nexport type {\n MetroneProviderProps,\n AnalyticsContextValue,\n UseAnalyticsReturn\n} from '@metrone-io/sdk'\n"],"names":["createContext","useState","useEffect","Metrone","useCallback","_jsx","useContext"],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@metrone-io/react",
|
|
3
|
+
"version": "1.1.0",
|
|
4
|
+
"description": "Metrone React integration - Privacy-first analytics for React",
|
|
5
|
+
"main": "dist/index.js",
|
|
6
|
+
"module": "dist/index.esm.js",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"files": [
|
|
9
|
+
"dist",
|
|
10
|
+
"README.md"
|
|
11
|
+
],
|
|
12
|
+
"scripts": {
|
|
13
|
+
"build": "rollup -c",
|
|
14
|
+
"build:watch": "rollup -c -w",
|
|
15
|
+
"dev": "rollup -c -w",
|
|
16
|
+
"test": "jest",
|
|
17
|
+
"test:watch": "jest --watch",
|
|
18
|
+
"lint": "eslint src --ext .ts,.tsx",
|
|
19
|
+
"lint:fix": "eslint src --ext .ts,.tsx --fix",
|
|
20
|
+
"type-check": "tsc --noEmit",
|
|
21
|
+
"clean": "rimraf dist",
|
|
22
|
+
"prepublishOnly": "npm run clean && npm run build"
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"analytics",
|
|
26
|
+
"privacy",
|
|
27
|
+
"first-party",
|
|
28
|
+
"react",
|
|
29
|
+
"metrone",
|
|
30
|
+
"tracking"
|
|
31
|
+
],
|
|
32
|
+
"author": "Metrone",
|
|
33
|
+
"license": "MIT",
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "https://github.com/metrone/metrone.git",
|
|
37
|
+
"directory": "packages/react"
|
|
38
|
+
},
|
|
39
|
+
"bugs": {
|
|
40
|
+
"url": "https://github.com/metrone/metrone/issues"
|
|
41
|
+
},
|
|
42
|
+
"homepage": "https://metrone.io",
|
|
43
|
+
"engines": {
|
|
44
|
+
"node": ">=16.0.0"
|
|
45
|
+
},
|
|
46
|
+
"peerDependencies": {
|
|
47
|
+
"@metrone-io/sdk": "^1.0.0",
|
|
48
|
+
"react": ">=16.8.0"
|
|
49
|
+
},
|
|
50
|
+
"devDependencies": {
|
|
51
|
+
"@rollup/plugin-commonjs": "^25.0.7",
|
|
52
|
+
"@rollup/plugin-node-resolve": "^15.2.3",
|
|
53
|
+
"@rollup/plugin-typescript": "^11.1.5",
|
|
54
|
+
"@types/jest": "^29.5.8",
|
|
55
|
+
"@types/react": "^18.2.37",
|
|
56
|
+
"@typescript-eslint/eslint-plugin": "^6.12.0",
|
|
57
|
+
"@typescript-eslint/parser": "^6.12.0",
|
|
58
|
+
"eslint": "^8.54.0",
|
|
59
|
+
"eslint-plugin-react": "^7.33.2",
|
|
60
|
+
"eslint-plugin-react-hooks": "^4.6.0",
|
|
61
|
+
"jest": "^29.7.0",
|
|
62
|
+
"react": "^18.2.0",
|
|
63
|
+
"rimraf": "^5.0.5",
|
|
64
|
+
"rollup": "^4.6.1",
|
|
65
|
+
"rollup-plugin-terser": "^7.0.2",
|
|
66
|
+
"ts-jest": "^29.1.1",
|
|
67
|
+
"typescript": "^5.3.2"
|
|
68
|
+
},
|
|
69
|
+
"publishConfig": {
|
|
70
|
+
"access": "public"
|
|
71
|
+
}
|
|
72
|
+
}
|