@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.
@@ -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
+ }