@datalyr/react-native 1.4.9 → 1.6.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.
Files changed (38) hide show
  1. package/CHANGELOG.md +39 -0
  2. package/README.md +17 -127
  3. package/android/build.gradle +0 -7
  4. package/android/src/main/java/com/datalyr/reactnative/DatalyrNativeModule.java +2 -380
  5. package/android/src/main/java/com/datalyr/reactnative/DatalyrPackage.java +1 -1
  6. package/datalyr-react-native.podspec +3 -7
  7. package/expo-module.config.json +4 -1
  8. package/ios/DatalyrNativeModule.swift +0 -266
  9. package/lib/datalyr-sdk.d.ts +8 -4
  10. package/lib/datalyr-sdk.js +83 -143
  11. package/lib/http-client.js +2 -2
  12. package/lib/index.d.ts +1 -1
  13. package/lib/index.js +1 -1
  14. package/lib/integrations/index.d.ts +3 -4
  15. package/lib/integrations/index.js +3 -4
  16. package/lib/native/DatalyrNativeBridge.d.ts +6 -22
  17. package/lib/native/DatalyrNativeBridge.js +6 -147
  18. package/lib/native/index.d.ts +1 -1
  19. package/lib/native/index.js +1 -1
  20. package/lib/types.d.ts +1 -19
  21. package/package.json +3 -5
  22. package/src/datalyr-sdk-expo.ts +6 -141
  23. package/src/datalyr-sdk.ts +96 -173
  24. package/src/http-client.ts +2 -2
  25. package/src/index.ts +1 -1
  26. package/src/integrations/index.ts +3 -4
  27. package/src/native/DatalyrNativeBridge.ts +6 -241
  28. package/src/native/index.ts +0 -2
  29. package/src/types.ts +2 -25
  30. package/src/utils-expo.ts +2 -2
  31. package/ios/DatalyrObjCExceptionCatcher.h +0 -14
  32. package/ios/DatalyrObjCExceptionCatcher.m +0 -30
  33. package/lib/integrations/meta-integration.d.ts +0 -77
  34. package/lib/integrations/meta-integration.js +0 -219
  35. package/lib/integrations/tiktok-integration.d.ts +0 -83
  36. package/lib/integrations/tiktok-integration.js +0 -360
  37. package/src/integrations/meta-integration.ts +0 -239
  38. package/src/integrations/tiktok-integration.ts +0 -363
@@ -1,10 +1,12 @@
1
1
  /**
2
- * Native Bridge for Meta, TikTok, Apple Search Ads, and Play Install Referrer
3
- * Uses bundled native modules instead of separate npm packages
2
+ * Native Bridge for Apple Search Ads, Play Install Referrer, and Advertiser Info
3
+ *
4
+ * Conversion event routing to ad platforms (Meta, TikTok, Google) is handled
5
+ * server-side via the postback system — no client-side ad SDKs needed.
4
6
  *
5
7
  * Supported Platforms:
6
- * - iOS: Meta SDK, TikTok SDK, Apple Search Ads (AdServices)
7
- * - Android: Meta SDK, TikTok SDK, Play Install Referrer
8
+ * - iOS: Apple Search Ads (AdServices), IDFA/ATT
9
+ * - Android: Play Install Referrer, GAID
8
10
  */
9
11
 
10
12
  import { NativeModules, Platform } from 'react-native';
@@ -48,48 +50,6 @@ export interface PlayInstallReferrerData {
48
50
  }
49
51
 
50
52
  interface DatalyrNativeModule {
51
- // Meta SDK Methods
52
- initializeMetaSDK(
53
- appId: string,
54
- clientToken: string | null,
55
- advertiserTrackingEnabled: boolean
56
- ): Promise<boolean>;
57
- fetchDeferredAppLink(): Promise<string | null>;
58
- logMetaEvent(
59
- eventName: string,
60
- valueToSum: number | null,
61
- parameters: Record<string, any> | null
62
- ): Promise<boolean>;
63
- logMetaPurchase(
64
- amount: number,
65
- currency: string,
66
- parameters: Record<string, any> | null
67
- ): Promise<boolean>;
68
- setMetaUserData(userData: Record<string, string | undefined>): Promise<boolean>;
69
- clearMetaUserData(): Promise<boolean>;
70
- updateMetaTrackingAuthorization(enabled: boolean): Promise<boolean>;
71
-
72
- // TikTok SDK Methods
73
- initializeTikTokSDK(
74
- appId: string,
75
- tiktokAppId: string,
76
- accessToken: string | null,
77
- debug: boolean
78
- ): Promise<boolean>;
79
- trackTikTokEvent(
80
- eventName: string,
81
- eventId: string | null,
82
- properties: Record<string, any> | null
83
- ): Promise<boolean>;
84
- identifyTikTokUser(
85
- externalId: string,
86
- externalUserName: string,
87
- phoneNumber: string,
88
- email: string
89
- ): Promise<boolean>;
90
- logoutTikTok(): Promise<boolean>;
91
- updateTikTokTrackingAuthorization(enabled: boolean): Promise<boolean>;
92
-
93
53
  // Advertiser Info (IDFA, IDFV, GAID, ATT Status)
94
54
  getAdvertiserInfo(): Promise<{
95
55
  idfa?: string;
@@ -104,8 +64,6 @@ interface DatalyrNativeModule {
104
64
 
105
65
  // SDK Availability
106
66
  getSDKAvailability(): Promise<{
107
- meta: boolean;
108
- tiktok: boolean;
109
67
  appleSearchAds: boolean;
110
68
  playInstallReferrer?: boolean;
111
69
  }>;
@@ -146,14 +104,10 @@ export const isNativeModuleAvailable = (): boolean => {
146
104
  * Get SDK availability status for all platforms
147
105
  */
148
106
  export const getSDKAvailability = async (): Promise<{
149
- meta: boolean;
150
- tiktok: boolean;
151
107
  appleSearchAds: boolean;
152
108
  playInstallReferrer: boolean;
153
109
  }> => {
154
110
  const defaultAvailability = {
155
- meta: false,
156
- tiktok: false,
157
111
  appleSearchAds: false,
158
112
  playInstallReferrer: false,
159
113
  };
@@ -174,195 +128,6 @@ export const getSDKAvailability = async (): Promise<{
174
128
  }
175
129
  };
176
130
 
177
- // MARK: - Meta SDK Bridge
178
-
179
- export const MetaNativeBridge = {
180
- async initialize(
181
- appId: string,
182
- clientToken?: string,
183
- advertiserTrackingEnabled: boolean = false
184
- ): Promise<boolean> {
185
- if (!DatalyrNative) return false;
186
-
187
- try {
188
- return await DatalyrNative.initializeMetaSDK(
189
- appId,
190
- clientToken || null,
191
- advertiserTrackingEnabled
192
- );
193
- } catch (error) {
194
- console.error('[Datalyr/MetaNative] Initialize failed:', error);
195
- return false;
196
- }
197
- },
198
-
199
- async fetchDeferredAppLink(): Promise<string | null> {
200
- if (!DatalyrNative) return null;
201
-
202
- try {
203
- return await DatalyrNative.fetchDeferredAppLink();
204
- } catch {
205
- return null;
206
- }
207
- },
208
-
209
- async logEvent(
210
- eventName: string,
211
- valueToSum?: number,
212
- parameters?: Record<string, any>
213
- ): Promise<boolean> {
214
- if (!DatalyrNative) return false;
215
-
216
- try {
217
- return await DatalyrNative.logMetaEvent(
218
- eventName,
219
- valueToSum ?? null,
220
- parameters || null
221
- );
222
- } catch (error) {
223
- console.error('[Datalyr/MetaNative] Log event failed:', error);
224
- return false;
225
- }
226
- },
227
-
228
- async logPurchase(
229
- amount: number,
230
- currency: string,
231
- parameters?: Record<string, any>
232
- ): Promise<boolean> {
233
- if (!DatalyrNative) return false;
234
-
235
- try {
236
- return await DatalyrNative.logMetaPurchase(amount, currency, parameters || null);
237
- } catch (error) {
238
- console.error('[Datalyr/MetaNative] Log purchase failed:', error);
239
- return false;
240
- }
241
- },
242
-
243
- async setUserData(userData: Record<string, string | undefined>): Promise<boolean> {
244
- if (!DatalyrNative) return false;
245
-
246
- try {
247
- return await DatalyrNative.setMetaUserData(userData);
248
- } catch (error) {
249
- console.error('[Datalyr/MetaNative] Set user data failed:', error);
250
- return false;
251
- }
252
- },
253
-
254
- async clearUserData(): Promise<boolean> {
255
- if (!DatalyrNative) return false;
256
-
257
- try {
258
- return await DatalyrNative.clearMetaUserData();
259
- } catch (error) {
260
- console.error('[Datalyr/MetaNative] Clear user data failed:', error);
261
- return false;
262
- }
263
- },
264
-
265
- async updateTrackingAuthorization(enabled: boolean): Promise<boolean> {
266
- if (!DatalyrNative) return false;
267
-
268
- try {
269
- return await DatalyrNative.updateMetaTrackingAuthorization(enabled);
270
- } catch (error) {
271
- console.error('[Datalyr/MetaNative] Update tracking failed:', error);
272
- return false;
273
- }
274
- },
275
- };
276
-
277
- // MARK: - TikTok SDK Bridge
278
-
279
- export const TikTokNativeBridge = {
280
- async initialize(
281
- appId: string,
282
- tiktokAppId: string,
283
- accessToken?: string,
284
- debug: boolean = false
285
- ): Promise<boolean> {
286
- if (!DatalyrNative) return false;
287
-
288
- try {
289
- return await DatalyrNative.initializeTikTokSDK(
290
- appId,
291
- tiktokAppId,
292
- accessToken || null,
293
- debug
294
- );
295
- } catch (error) {
296
- console.error('[Datalyr/TikTokNative] Initialize failed:', error);
297
- return false;
298
- }
299
- },
300
-
301
- async trackEvent(
302
- eventName: string,
303
- eventId?: string,
304
- properties?: Record<string, any>
305
- ): Promise<boolean> {
306
- if (!DatalyrNative) return false;
307
-
308
- try {
309
- return await DatalyrNative.trackTikTokEvent(
310
- eventName,
311
- eventId || null,
312
- properties || null
313
- );
314
- } catch (error) {
315
- console.error('[Datalyr/TikTokNative] Track event failed:', error);
316
- return false;
317
- }
318
- },
319
-
320
- async identify(
321
- externalId?: string,
322
- email?: string,
323
- phone?: string
324
- ): Promise<boolean> {
325
- if (!DatalyrNative) return false;
326
-
327
- // Only call if we have at least one value
328
- if (!externalId && !email && !phone) return false;
329
-
330
- try {
331
- return await DatalyrNative.identifyTikTokUser(
332
- externalId || '',
333
- '', // externalUserName - not typically available
334
- phone || '',
335
- email || ''
336
- );
337
- } catch (error) {
338
- console.error('[Datalyr/TikTokNative] Identify failed:', error);
339
- return false;
340
- }
341
- },
342
-
343
- async logout(): Promise<boolean> {
344
- if (!DatalyrNative) return false;
345
-
346
- try {
347
- return await DatalyrNative.logoutTikTok();
348
- } catch (error) {
349
- console.error('[Datalyr/TikTokNative] Logout failed:', error);
350
- return false;
351
- }
352
- },
353
-
354
- async updateTrackingAuthorization(enabled: boolean): Promise<boolean> {
355
- if (!DatalyrNative) return false;
356
-
357
- try {
358
- return await DatalyrNative.updateTikTokTrackingAuthorization(enabled);
359
- } catch (error) {
360
- console.error('[Datalyr/TikTokNative] Update tracking failed:', error);
361
- return false;
362
- }
363
- },
364
- };
365
-
366
131
  // MARK: - Apple Search Ads Bridge (iOS only)
367
132
 
368
133
  export const AppleSearchAdsNativeBridge = {
@@ -6,8 +6,6 @@ export { SKAdNetworkBridge } from './SKAdNetworkBridge';
6
6
  export {
7
7
  isNativeModuleAvailable,
8
8
  getSDKAvailability,
9
- MetaNativeBridge,
10
- TikTokNativeBridge,
11
9
  AdvertiserInfoBridge,
12
10
  } from './DatalyrNativeBridge';
13
11
  export type { AdvertiserInfo } from './DatalyrNativeBridge';
package/src/types.ts CHANGED
@@ -7,29 +7,13 @@ export interface AutoEventConfig {
7
7
  sessionTimeoutMs?: number;
8
8
  }
9
9
 
10
- // Meta (Facebook) SDK Configuration
11
- export interface MetaConfig {
12
- appId: string; // Facebook App ID
13
- clientToken?: string; // Client Token for advanced features
14
- enableDeferredDeepLink?: boolean; // Default: true
15
- enableAppEvents?: boolean; // Default: true
16
- advertiserTrackingEnabled?: boolean; // iOS ATT status (auto-detected if not set)
17
- }
18
-
19
- // TikTok SDK Configuration
20
- export interface TikTokConfig {
21
- appId: string; // Your App ID (for Datalyr)
22
- tiktokAppId: string; // TikTok App ID
23
- accessToken?: string; // Access Token for Events API
24
- enableAppEvents?: boolean; // Default: true
25
- }
26
-
27
- // Deferred Deep Link Result (from platform SDKs)
10
+ // Deferred Deep Link Result (from Play Install Referrer on Android)
28
11
  export interface DeferredDeepLinkResult {
29
12
  url?: string;
30
13
  source?: string;
31
14
  fbclid?: string;
32
15
  ttclid?: string;
16
+ gclid?: string;
33
17
  utmSource?: string;
34
18
  utmMedium?: string;
35
19
  utmCampaign?: string;
@@ -51,8 +35,6 @@ export interface DeferredDeepLinkResult {
51
35
  * enableAutoEvents: true,
52
36
  * enableAttribution: true,
53
37
  * skadTemplate: 'ecommerce',
54
- * meta: { appId: 'FB_APP_ID' },
55
- * tiktok: { appId: 'APP_ID', tiktokAppId: 'TIKTOK_APP_ID' },
56
38
  * });
57
39
  * ```
58
40
  */
@@ -135,11 +117,6 @@ export interface DatalyrConfig {
135
117
  /** SKAdNetwork template for automatic conversion value encoding (iOS only) */
136
118
  skadTemplate?: 'ecommerce' | 'gaming' | 'subscription';
137
119
 
138
- /** Meta (Facebook) SDK Configuration */
139
- meta?: MetaConfig;
140
-
141
- /** TikTok SDK Configuration */
142
- tiktok?: TikTokConfig;
143
120
  }
144
121
  // Event Types
145
122
  export interface EventData {
package/src/utils-expo.ts CHANGED
@@ -319,8 +319,8 @@ export const validateEventName = (eventName: string): boolean => {
319
319
  return false;
320
320
  }
321
321
 
322
- // Allow letters, numbers, underscores, and hyphens
323
- const validPattern = /^[a-zA-Z0-9_-]+$/;
322
+ // Allow letters, numbers, underscores, hyphens, and $ prefix (for system events like $identify)
323
+ const validPattern = /^\$?[a-zA-Z0-9_-]+$/;
324
324
  return validPattern.test(eventName);
325
325
  };
326
326
 
@@ -1,14 +0,0 @@
1
- #import <Foundation/Foundation.h>
2
-
3
- NS_ASSUME_NONNULL_BEGIN
4
-
5
- /// Catches ObjC NSExceptions (from Meta/TikTok SDKs) and converts them to NSErrors.
6
- /// Swift's do/try/catch cannot catch NSExceptions — they propagate through Hermes
7
- /// and cause EXC_BAD_ACCESS (SIGSEGV) crashes.
8
- @interface DatalyrObjCExceptionCatcher : NSObject
9
-
10
- + (BOOL)tryBlock:(void(NS_NOESCAPE ^)(void))block error:(NSError *_Nullable *_Nullable)error;
11
-
12
- @end
13
-
14
- NS_ASSUME_NONNULL_END
@@ -1,30 +0,0 @@
1
- #import "DatalyrObjCExceptionCatcher.h"
2
-
3
- @implementation DatalyrObjCExceptionCatcher
4
-
5
- + (BOOL)tryBlock:(void(NS_NOESCAPE ^)(void))block error:(NSError **)error {
6
- @try {
7
- block();
8
- return YES;
9
- }
10
- @catch (NSException *exception) {
11
- if (error) {
12
- NSString *description = exception.reason ?: exception.name;
13
- NSDictionary *userInfo = @{
14
- NSLocalizedDescriptionKey: description,
15
- @"ExceptionName": exception.name ?: @"Unknown",
16
- };
17
- if (exception.userInfo) {
18
- NSMutableDictionary *merged = [userInfo mutableCopy];
19
- [merged addEntriesFromDictionary:exception.userInfo];
20
- userInfo = merged;
21
- }
22
- *error = [NSError errorWithDomain:@"com.datalyr.objc-exception"
23
- code:-1
24
- userInfo:userInfo];
25
- }
26
- return NO;
27
- }
28
- }
29
-
30
- @end
@@ -1,77 +0,0 @@
1
- /**
2
- * Meta (Facebook) SDK Integration
3
- * Uses bundled native iOS SDK for deferred deep linking, event forwarding, and Advanced Matching
4
- */
5
- import { MetaConfig, DeferredDeepLinkResult } from '../types';
6
- /**
7
- * Meta Integration class for handling Facebook SDK operations
8
- * Uses native iOS SDK bundled via CocoaPods (no additional npm packages required)
9
- */
10
- export declare class MetaIntegration {
11
- private config;
12
- private initialized;
13
- private available;
14
- private debug;
15
- private deferredDeepLinkData;
16
- /**
17
- * Initialize Meta SDK with configuration
18
- * Supported on both iOS and Android via native modules
19
- */
20
- initialize(config: MetaConfig, debug?: boolean): Promise<void>;
21
- /**
22
- * Update tracking authorization status (call after ATT prompt)
23
- */
24
- updateTrackingAuthorization(enabled: boolean): Promise<void>;
25
- /**
26
- * Fetch deferred deep link from Meta SDK
27
- * This captures fbclid for installs that went through App Store
28
- */
29
- fetchDeferredDeepLink(): Promise<DeferredDeepLinkResult | null>;
30
- /**
31
- * Parse deep link URL to extract attribution parameters
32
- */
33
- private parseDeepLinkUrl;
34
- /**
35
- * Log purchase event to Meta
36
- */
37
- logPurchase(value: number, currency: string, parameters?: Record<string, any>): Promise<void>;
38
- /**
39
- * Log custom event to Meta
40
- */
41
- logEvent(eventName: string, valueToSum?: number, parameters?: Record<string, any>): Promise<void>;
42
- /**
43
- * Set user data for Advanced Matching (improves conversion attribution)
44
- * Note: Meta's Advanced Matching uses these specific fields - externalId is not supported
45
- */
46
- setUserData(userData: {
47
- email?: string;
48
- firstName?: string;
49
- lastName?: string;
50
- phone?: string;
51
- dateOfBirth?: string;
52
- gender?: string;
53
- city?: string;
54
- state?: string;
55
- zip?: string;
56
- country?: string;
57
- }): Promise<void>;
58
- /**
59
- * Clear user data (call on logout)
60
- */
61
- clearUserData(): Promise<void>;
62
- /**
63
- * Get cached deferred deep link data
64
- */
65
- getDeferredDeepLinkData(): DeferredDeepLinkResult | null;
66
- /**
67
- * Check if Meta SDK is available and initialized
68
- */
69
- isAvailable(): boolean;
70
- /**
71
- * Check if Meta SDK native module is installed
72
- */
73
- isInstalled(): boolean;
74
- private log;
75
- private logError;
76
- }
77
- export declare const metaIntegration: MetaIntegration;
@@ -1,219 +0,0 @@
1
- /**
2
- * Meta (Facebook) SDK Integration
3
- * Uses bundled native iOS SDK for deferred deep linking, event forwarding, and Advanced Matching
4
- */
5
- import { Platform } from 'react-native';
6
- import { MetaNativeBridge, isNativeModuleAvailable } from '../native/DatalyrNativeBridge';
7
- /**
8
- * Meta Integration class for handling Facebook SDK operations
9
- * Uses native iOS SDK bundled via CocoaPods (no additional npm packages required)
10
- */
11
- export class MetaIntegration {
12
- constructor() {
13
- this.config = null;
14
- this.initialized = false;
15
- this.available = false;
16
- this.debug = false;
17
- this.deferredDeepLinkData = null;
18
- }
19
- /**
20
- * Initialize Meta SDK with configuration
21
- * Supported on both iOS and Android via native modules
22
- */
23
- async initialize(config, debug = false) {
24
- var _a;
25
- this.debug = debug;
26
- this.config = config;
27
- // Only available on iOS and Android via native modules
28
- if (Platform.OS !== 'ios' && Platform.OS !== 'android') {
29
- this.log('Meta SDK only available on iOS and Android');
30
- return;
31
- }
32
- this.available = isNativeModuleAvailable();
33
- if (!this.available) {
34
- this.log('Meta native module not available');
35
- return;
36
- }
37
- try {
38
- const success = await MetaNativeBridge.initialize(config.appId, config.clientToken, (_a = config.advertiserTrackingEnabled) !== null && _a !== void 0 ? _a : false);
39
- if (success) {
40
- this.initialized = true;
41
- this.log(`Meta SDK initialized with App ID: ${config.appId}`);
42
- }
43
- }
44
- catch (error) {
45
- this.logError('Failed to initialize Meta SDK:', error);
46
- }
47
- }
48
- /**
49
- * Update tracking authorization status (call after ATT prompt)
50
- */
51
- async updateTrackingAuthorization(enabled) {
52
- if (!this.available || !this.initialized)
53
- return;
54
- try {
55
- await MetaNativeBridge.updateTrackingAuthorization(enabled);
56
- this.log(`Meta ATT status updated: ${enabled ? 'authorized' : 'not authorized'}`);
57
- }
58
- catch (error) {
59
- this.logError('Failed to update Meta tracking authorization:', error);
60
- }
61
- }
62
- /**
63
- * Fetch deferred deep link from Meta SDK
64
- * This captures fbclid for installs that went through App Store
65
- */
66
- async fetchDeferredDeepLink() {
67
- var _a;
68
- if (!this.available || !this.initialized) {
69
- return null;
70
- }
71
- if (((_a = this.config) === null || _a === void 0 ? void 0 : _a.enableDeferredDeepLink) === false) {
72
- return null;
73
- }
74
- try {
75
- const url = await MetaNativeBridge.fetchDeferredAppLink();
76
- if (!url) {
77
- this.log('No deferred deep link available from Meta');
78
- return null;
79
- }
80
- // Parse the URL for attribution parameters
81
- const result = this.parseDeepLinkUrl(url);
82
- this.deferredDeepLinkData = result;
83
- this.log(`Meta deferred deep link fetched: ${url}`);
84
- return result;
85
- }
86
- catch (error) {
87
- // This is expected to fail in some scenarios - log but don't treat as error
88
- this.log('Could not fetch Meta deferred deep link (may not be available)');
89
- return null;
90
- }
91
- }
92
- /**
93
- * Parse deep link URL to extract attribution parameters
94
- */
95
- parseDeepLinkUrl(urlString) {
96
- const result = {
97
- url: urlString,
98
- source: 'meta',
99
- };
100
- try {
101
- const url = new URL(urlString);
102
- const params = url.searchParams;
103
- // Extract known parameters
104
- if (params.get('fbclid'))
105
- result.fbclid = params.get('fbclid');
106
- if (params.get('utm_source'))
107
- result.utmSource = params.get('utm_source');
108
- if (params.get('utm_medium'))
109
- result.utmMedium = params.get('utm_medium');
110
- if (params.get('utm_campaign'))
111
- result.utmCampaign = params.get('utm_campaign');
112
- if (params.get('utm_content'))
113
- result.utmContent = params.get('utm_content');
114
- if (params.get('utm_term'))
115
- result.utmTerm = params.get('utm_term');
116
- if (params.get('campaign_id'))
117
- result.campaignId = params.get('campaign_id');
118
- if (params.get('adset_id'))
119
- result.adsetId = params.get('adset_id');
120
- if (params.get('ad_id'))
121
- result.adId = params.get('ad_id');
122
- }
123
- catch (error) {
124
- this.logError('Failed to parse deep link URL:', error);
125
- }
126
- return result;
127
- }
128
- /**
129
- * Log purchase event to Meta
130
- */
131
- async logPurchase(value, currency, parameters) {
132
- var _a;
133
- if (!this.available || !this.initialized)
134
- return;
135
- if (((_a = this.config) === null || _a === void 0 ? void 0 : _a.enableAppEvents) === false)
136
- return;
137
- try {
138
- await MetaNativeBridge.logPurchase(value, currency, parameters);
139
- this.log(`Meta purchase event logged: ${value} ${currency}`);
140
- }
141
- catch (error) {
142
- this.logError('Failed to log Meta purchase:', error);
143
- }
144
- }
145
- /**
146
- * Log custom event to Meta
147
- */
148
- async logEvent(eventName, valueToSum, parameters) {
149
- var _a;
150
- if (!this.available || !this.initialized)
151
- return;
152
- if (((_a = this.config) === null || _a === void 0 ? void 0 : _a.enableAppEvents) === false)
153
- return;
154
- try {
155
- await MetaNativeBridge.logEvent(eventName, valueToSum, parameters);
156
- this.log(`Meta event logged: ${eventName}`);
157
- }
158
- catch (error) {
159
- this.logError('Failed to log Meta event:', error);
160
- }
161
- }
162
- /**
163
- * Set user data for Advanced Matching (improves conversion attribution)
164
- * Note: Meta's Advanced Matching uses these specific fields - externalId is not supported
165
- */
166
- async setUserData(userData) {
167
- if (!this.available || !this.initialized)
168
- return;
169
- try {
170
- await MetaNativeBridge.setUserData(userData);
171
- this.log('Meta user data set for Advanced Matching');
172
- }
173
- catch (error) {
174
- this.logError('Failed to set Meta user data:', error);
175
- }
176
- }
177
- /**
178
- * Clear user data (call on logout)
179
- */
180
- async clearUserData() {
181
- if (!this.available || !this.initialized)
182
- return;
183
- try {
184
- await MetaNativeBridge.clearUserData();
185
- this.log('Meta user data cleared');
186
- }
187
- catch (error) {
188
- this.logError('Failed to clear Meta user data:', error);
189
- }
190
- }
191
- /**
192
- * Get cached deferred deep link data
193
- */
194
- getDeferredDeepLinkData() {
195
- return this.deferredDeepLinkData;
196
- }
197
- /**
198
- * Check if Meta SDK is available and initialized
199
- */
200
- isAvailable() {
201
- return this.available && this.initialized;
202
- }
203
- /**
204
- * Check if Meta SDK native module is installed
205
- */
206
- isInstalled() {
207
- return this.available;
208
- }
209
- log(message, data) {
210
- if (this.debug) {
211
- console.log(`[Datalyr/Meta] ${message}`, data || '');
212
- }
213
- }
214
- logError(message, error) {
215
- console.error(`[Datalyr/Meta] ${message}`, error);
216
- }
217
- }
218
- // Export singleton instance
219
- export const metaIntegration = new MetaIntegration();