@purchasely/cordova-plugin-purchasely 4.1.0 → 4.2.2

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.
@@ -19,7 +19,7 @@
19
19
  },
20
20
  "..": {
21
21
  "name": "@purchasely/cordova-plugin-purchasely",
22
- "version": "4.1.0",
22
+ "version": "4.2.2",
23
23
  "dev": true,
24
24
  "license": "ISC",
25
25
  "engines": {
@@ -33,7 +33,7 @@
33
33
  },
34
34
  "../../purchasely-google": {
35
35
  "name": "@purchasely/cordova-plugin-puchasely-google",
36
- "version": "4.1.0",
36
+ "version": "4.2.2",
37
37
  "dev": true,
38
38
  "license": "ISC"
39
39
  },
@@ -105,9 +105,9 @@
105
105
  }
106
106
  },
107
107
  "node_modules/android-versions": {
108
- "version": "1.8.2",
109
- "resolved": "https://registry.npmjs.org/android-versions/-/android-versions-1.8.2.tgz",
110
- "integrity": "sha512-2MT/Y/mR3BLSbR9E3ugwvE/aA4k84XtjG2Iusu4pRKt4FwfpEvIEAHzm7ZBhL3/aTVNdx3PzZ+sAiK+Dbc4r9A==",
108
+ "version": "1.9.0",
109
+ "resolved": "https://registry.npmjs.org/android-versions/-/android-versions-1.9.0.tgz",
110
+ "integrity": "sha512-13O2B6PQMEM4ej9n13ePRQeckrCoKbZrvuzlLvK+9s2QmncpHDbYzZxhgapN32sJNoifN6VAHexLnd/6CYrs7Q==",
111
111
  "dev": true,
112
112
  "dependencies": {
113
113
  "semver": "^7.5.2"
@@ -462,6 +462,15 @@
462
462
  "dev": true,
463
463
  "license": "ISC"
464
464
  },
465
+ "node_modules/function-bind": {
466
+ "version": "1.1.2",
467
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
468
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
469
+ "dev": true,
470
+ "funding": {
471
+ "url": "https://github.com/sponsors/ljharb"
472
+ }
473
+ },
465
474
  "node_modules/get-stream": {
466
475
  "version": "6.0.1",
467
476
  "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
@@ -509,13 +518,16 @@
509
518
  "dev": true,
510
519
  "license": "ISC"
511
520
  },
512
- "node_modules/has": {
513
- "version": "1.0.4",
514
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz",
515
- "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==",
521
+ "node_modules/hasown": {
522
+ "version": "2.0.0",
523
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
524
+ "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
516
525
  "dev": true,
526
+ "dependencies": {
527
+ "function-bind": "^1.1.2"
528
+ },
517
529
  "engines": {
518
- "node": ">= 0.4.0"
530
+ "node": ">= 0.4"
519
531
  }
520
532
  },
521
533
  "node_modules/human-signals": {
@@ -596,12 +608,12 @@
596
608
  }
597
609
  },
598
610
  "node_modules/is-core-module": {
599
- "version": "2.13.0",
600
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz",
601
- "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==",
611
+ "version": "2.13.1",
612
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
613
+ "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
602
614
  "dev": true,
603
615
  "dependencies": {
604
- "has": "^1.0.3"
616
+ "hasown": "^2.0.0"
605
617
  },
606
618
  "funding": {
607
619
  "url": "https://github.com/sponsors/ljharb"
@@ -1309,9 +1321,9 @@
1309
1321
  "dev": true
1310
1322
  },
1311
1323
  "android-versions": {
1312
- "version": "1.8.2",
1313
- "resolved": "https://registry.npmjs.org/android-versions/-/android-versions-1.8.2.tgz",
1314
- "integrity": "sha512-2MT/Y/mR3BLSbR9E3ugwvE/aA4k84XtjG2Iusu4pRKt4FwfpEvIEAHzm7ZBhL3/aTVNdx3PzZ+sAiK+Dbc4r9A==",
1324
+ "version": "1.9.0",
1325
+ "resolved": "https://registry.npmjs.org/android-versions/-/android-versions-1.9.0.tgz",
1326
+ "integrity": "sha512-13O2B6PQMEM4ej9n13ePRQeckrCoKbZrvuzlLvK+9s2QmncpHDbYzZxhgapN32sJNoifN6VAHexLnd/6CYrs7Q==",
1315
1327
  "dev": true,
1316
1328
  "requires": {
1317
1329
  "semver": "^7.5.2"
@@ -1576,6 +1588,12 @@
1576
1588
  "version": "1.0.0",
1577
1589
  "dev": true
1578
1590
  },
1591
+ "function-bind": {
1592
+ "version": "1.1.2",
1593
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
1594
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
1595
+ "dev": true
1596
+ },
1579
1597
  "get-stream": {
1580
1598
  "version": "6.0.1",
1581
1599
  "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
@@ -1605,11 +1623,14 @@
1605
1623
  "version": "4.2.6",
1606
1624
  "dev": true
1607
1625
  },
1608
- "has": {
1609
- "version": "1.0.4",
1610
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz",
1611
- "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==",
1612
- "dev": true
1626
+ "hasown": {
1627
+ "version": "2.0.0",
1628
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz",
1629
+ "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==",
1630
+ "dev": true,
1631
+ "requires": {
1632
+ "function-bind": "^1.1.2"
1633
+ }
1613
1634
  },
1614
1635
  "human-signals": {
1615
1636
  "version": "2.1.0",
@@ -1671,12 +1692,12 @@
1671
1692
  }
1672
1693
  },
1673
1694
  "is-core-module": {
1674
- "version": "2.13.0",
1675
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz",
1676
- "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==",
1695
+ "version": "2.13.1",
1696
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz",
1697
+ "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==",
1677
1698
  "dev": true,
1678
1699
  "requires": {
1679
- "has": "^1.0.3"
1700
+ "hasown": "^2.0.0"
1680
1701
  }
1681
1702
  },
1682
1703
  "is-extglob": {
@@ -197,7 +197,7 @@ function onPuchaselySdkReady() {
197
197
 
198
198
  function openPresentation() {
199
199
  Purchasely.presentPresentationForPlacement(
200
- 'onboarding', //placementId
200
+ 'ONBOARDING', //placementId
201
201
  null, //contentId
202
202
  true, //fullscreen
203
203
  (callback) => {
@@ -250,7 +250,10 @@ function processToPayment() {
250
250
  // Call this method open paywall again
251
251
  Purchasely.showPresentation();
252
252
 
253
- // Call this method to process to payment
253
+ // Call this method in paywallObserver mode to synchronize purchases with Purchasely
254
+ // Purchasely.synchronize();
255
+
256
+ // Call this method to process to payment or false if you handled it
254
257
  Purchasely.onProcessAction(true);
255
258
  }
256
259
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@purchasely/cordova-plugin-purchasely",
3
- "version": "4.1.0",
3
+ "version": "4.2.2",
4
4
  "description": "Purchasely is a solution to ease the integration and boost your In-App Purchases & Subscriptions on the App Store, Google Play Store, Amazon Appstore and Huawei App Gallery.",
5
5
  "cordova": {
6
6
  "id": "@purchasely/cordova-plugin-purchasely",
package/plugin.xml CHANGED
@@ -1,5 +1,5 @@
1
1
  <?xml version='1.0' encoding='utf-8'?>
2
- <plugin id="@purchasely/cordova-plugin-purchasely" version="4.1.0" xmlns="http://apache.org/cordova/ns/plugins/1.0" xmlns:android="http://schemas.android.com/apk/res/android">
2
+ <plugin id="@purchasely/cordova-plugin-purchasely" version="4.2.2" xmlns="http://apache.org/cordova/ns/plugins/1.0" xmlns:android="http://schemas.android.com/apk/res/android">
3
3
  <name>Purchasely</name>
4
4
  <js-module name="Purchasely" src="www/Purchasely.js">
5
5
  <clobbers target="Purchasely" />
@@ -36,7 +36,7 @@
36
36
  <source url="https://github.com/CocoaPods/Specs.git"/>
37
37
  </config>
38
38
  <pods use-frameworks="true">
39
- <pod name="Purchasely" spec="4.1.4"/>
39
+ <pod name="Purchasely" spec="4.2.2"/>
40
40
  </pods>
41
41
  </podspec>
42
42
  </platform>
@@ -61,7 +61,7 @@
61
61
  android:theme="@style/Theme.AppCompat.Light.NoActionBar">
62
62
  </activity>
63
63
  </config-file>
64
- <framework src="io.purchasely:core:4.1.1" />
64
+ <framework src="io.purchasely:core:4.2.2" />
65
65
  <source-file src="src/android/PurchaselyPlugin.kt" target-dir="java/cordova/plugin/purchasely" />
66
66
  <source-file src="src/android/PLYProductActivity.kt" target-dir="java/cordova/plugin/purchasely" />
67
67
  <source-file src="src/android/PLYSubscriptionsActivity.java" target-dir="src/cordova/plugin/purchasely" />
@@ -34,6 +34,7 @@ import io.purchasely.models.PLYPlan
34
34
  import io.purchasely.models.PLYPresentationPlan
35
35
  import io.purchasely.models.PLYProduct
36
36
  import io.purchasely.models.PLYSubscriptionData
37
+ import io.purchasely.views.presentation.PLYThemeMode
37
38
  import org.apache.cordova.CallbackContext
38
39
  import org.apache.cordova.CordovaInterface
39
40
  import org.apache.cordova.CordovaPlugin
@@ -81,6 +82,7 @@ class PurchaselyPlugin : CordovaPlugin() {
81
82
  "userLogout" -> userLogout()
82
83
  "setLanguage" -> setLanguage(getStringFromJson(args.getString(0)))
83
84
  "setLogLevel" -> setLogLevel(args.getInt(0))
85
+ "setThemeMode" -> setThemeMode(args.getInt(0))
84
86
  "setAttribute" -> setAttribute(args.getInt(0), getStringFromJson(args.getString(1)))
85
87
  "setDefaultPresentationResultHandler" -> setDefaultPresentationResultHandler(
86
88
  callbackContext
@@ -321,6 +323,10 @@ class PurchaselyPlugin : CordovaPlugin() {
321
323
  Purchasely.readyToOpenDeeplink = isReadyToPurchase
322
324
  }
323
325
 
326
+ private fun setThemeMode(mode: Int) {
327
+ Purchasely.setThemeMode(PLYThemeMode.values()[mode])
328
+ }
329
+
324
330
  private fun setAttribute(attribute: Int, value: String?) {
325
331
  if(value == null) return
326
332
 
@@ -502,32 +508,35 @@ class PurchaselyPlugin : CordovaPlugin() {
502
508
  }
503
509
 
504
510
  private fun userSubscriptions(callbackContext: CallbackContext) {
505
- Purchasely.userSubscriptions(object : SubscriptionsListener {
506
- override fun onSuccess(list: List<PLYSubscriptionData>) {
507
- val result = JSONArray()
508
- for (i in list.indices) {
509
- val data = list[i]
510
- val map = HashMap(data.toMap())
511
- map["plan"] = transformPlanToMap(data.plan)
512
- map["product"] = data.product.toMap()
513
- if (data.data.storeType == StoreType.GOOGLE_PLAY_STORE) {
514
- map["subscriptionSource"] = StoreType.GOOGLE_PLAY_STORE.ordinal
515
- } else if (data.data.storeType == StoreType.AMAZON_APP_STORE) {
516
- map["subscriptionSource"] = StoreType.AMAZON_APP_STORE.ordinal
517
- } else if (data.data.storeType == StoreType.HUAWEI_APP_GALLERY) {
518
- map["subscriptionSource"] = StoreType.HUAWEI_APP_GALLERY.ordinal
519
- } else if (data.data.storeType == StoreType.APPLE_APP_STORE) {
520
- map["subscriptionSource"] = StoreType.APPLE_APP_STORE.ordinal
511
+ Purchasely.userSubscriptions(
512
+ false,
513
+ object : SubscriptionsListener {
514
+ override fun onSuccess(list: List<PLYSubscriptionData>) {
515
+ val result = JSONArray()
516
+ for (i in list.indices) {
517
+ val data = list[i]
518
+ val map = HashMap(data.toMap())
519
+ map["plan"] = transformPlanToMap(data.plan)
520
+ map["product"] = data.product.toMap()
521
+ if (data.data.storeType == StoreType.GOOGLE_PLAY_STORE) {
522
+ map["subscriptionSource"] = StoreType.GOOGLE_PLAY_STORE.ordinal
523
+ } else if (data.data.storeType == StoreType.AMAZON_APP_STORE) {
524
+ map["subscriptionSource"] = StoreType.AMAZON_APP_STORE.ordinal
525
+ } else if (data.data.storeType == StoreType.HUAWEI_APP_GALLERY) {
526
+ map["subscriptionSource"] = StoreType.HUAWEI_APP_GALLERY.ordinal
527
+ } else if (data.data.storeType == StoreType.APPLE_APP_STORE) {
528
+ map["subscriptionSource"] = StoreType.APPLE_APP_STORE.ordinal
529
+ }
530
+ result.put(JSONObject(map))
521
531
  }
522
- result.put(JSONObject(map))
532
+ callbackContext.success(result)
523
533
  }
524
- callbackContext.success(result)
525
- }
526
534
 
527
- override fun onFailure(throwable: Throwable) {
528
- callbackContext.error(throwable.message)
535
+ override fun onFailure(throwable: Throwable) {
536
+ callbackContext.error(throwable.message)
537
+ }
529
538
  }
530
- })
539
+ )
531
540
  }
532
541
 
533
542
  private fun isDeeplinkHandled(deeplink: String?, callbackContext: CallbackContext) {
@@ -40,6 +40,7 @@
40
40
  - (void)purchaseWithPlanVendorId:(CDVInvokedUrlCommand*)command;
41
41
  - (void)restoreAllProducts:(CDVInvokedUrlCommand*)command;
42
42
  - (void)silentRestoreAllProducts:(CDVInvokedUrlCommand*)command;
43
+ - (void)synchronize:(CDVInvokedUrlCommand*)command;
43
44
  - (void)purchasedSubscription:(CDVInvokedUrlCommand*)command;
44
45
  - (void)allProducts:(CDVInvokedUrlCommand*)command;
45
46
  - (void)productWithIdentifier:(CDVInvokedUrlCommand*)command;
@@ -65,5 +66,6 @@
65
66
  - (void)presentPresentation:(CDVInvokedUrlCommand*)command;
66
67
  - (void)signPromotionalOffer:(CDVInvokedUrlCommand*)command;
67
68
  - (void)isEligibleForIntroOffer:(CDVInvokedUrlCommand*)command;
69
+ - (void)setThemeMode:(CDVInvokedUrlCommand*)command;
68
70
 
69
71
  @end
@@ -65,6 +65,12 @@
65
65
  [Purchasely userLogout];
66
66
  }
67
67
 
68
+ - (void)setThemeMode:(CDVInvokedUrlCommand *)command {
69
+ NSInteger mode = [[command argumentAtIndex:0] intValue];
70
+
71
+ [Purchasely setThemeMode:(enum PLYThemeMode) mode];
72
+ }
73
+
68
74
  - (void)setAttribute:(CDVInvokedUrlCommand*)command {
69
75
  NSInteger attribute = [[command argumentAtIndex:0] intValue];
70
76
  NSString *value = [command argumentAtIndex:1];
@@ -210,12 +216,12 @@
210
216
  NSString *planVendorId = [command argumentAtIndex:0];
211
217
  NSString *offerId = [command argumentAtIndex:1];
212
218
  NSString *contentId = [command argumentAtIndex:2];
213
-
219
+
214
220
  [Purchasely planWith:planVendorId
215
221
  success:^(PLYPlan * _Nonnull plan) {
216
-
222
+
217
223
  if (@available(iOS 12.2, macOS 12.0, tvOS 15.0, watchOS 8.0, *)) {
218
-
224
+
219
225
  NSString *storeOfferId = nil;
220
226
  for (PLYPromoOffer *promoOffer in plan.promoOffers) {
221
227
  if ([promoOffer.vendorId isEqualToString:offerId]) {
@@ -223,7 +229,7 @@
223
229
  break;
224
230
  }
225
231
  }
226
-
232
+
227
233
  if (storeOfferId) {
228
234
  [Purchasely purchaseWithPromotionalOfferWithPlan:plan
229
235
  contentId:contentId
@@ -272,6 +278,12 @@
272
278
  }];
273
279
  }
274
280
 
281
+ - (void)synchronize:(CDVInvokedUrlCommand*)command {
282
+ [Purchasely synchronizeWithSuccess:^{
283
+ } failure:^(NSError * _Nonnull error) {
284
+ }];
285
+ }
286
+
275
287
  - (void)purchasedSubscription:(CDVInvokedUrlCommand*)command {
276
288
  self.purchasedCommand = command;
277
289
  [[NSNotificationCenter defaultCenter] addObserver:self
@@ -321,14 +333,15 @@
321
333
  }
322
334
 
323
335
  - (void)userSubscriptions:(CDVInvokedUrlCommand*)command {
324
- [Purchasely userSubscriptionsWithSuccess:^(NSArray<PLYSubscription *> * _Nullable subscriptions) {
336
+ [Purchasely userSubscriptions:false
337
+ success:^(NSArray<PLYSubscription *> * _Nullable subscriptions) {
325
338
  NSMutableArray *result = [NSMutableArray new];
326
339
  for (PLYSubscription *subscription in subscriptions) {
327
340
  [result addObject:subscription.asDictionary];
328
341
  }
329
342
  [self successFor:command resultArray:result];
330
343
  }
331
- failure:^(NSError * _Nonnull error) {
344
+ failure:^(NSError * _Nonnull error) {
332
345
  [self failureFor:command resultString:error.localizedDescription];
333
346
  }];
334
347
  }
@@ -364,7 +377,7 @@
364
377
  - (void)signPromotionalOffer:(CDVInvokedUrlCommand*)command {
365
378
  NSString *storeProductId = [command argumentAtIndex:0];
366
379
  NSString *storeOfferId = [command argumentAtIndex:1];
367
-
380
+
368
381
  dispatch_async(dispatch_get_main_queue(), ^{
369
382
  if (@available(iOS 12.2, *)) {
370
383
  [Purchasely signPromotionalOfferWithStoreProductId:storeProductId storeOfferId:storeOfferId success:^(PLYOfferSignature * _Nonnull signature) {
@@ -381,7 +394,7 @@
381
394
 
382
395
  - (void)isEligibleForIntroOffer:(CDVInvokedUrlCommand*)command {
383
396
  NSString *planVendorId = [command argumentAtIndex:0];
384
-
397
+
385
398
  [Purchasely planWith:planVendorId
386
399
  success:^(PLYPlan * _Nonnull plan) {
387
400
  [plan isUserEligibleForIntroductoryOfferWithCompletion:^(BOOL isEligible) {
@@ -695,7 +708,7 @@
695
708
  }
696
709
 
697
710
  self.shouldReopenPaywall = NO;
698
-
711
+
699
712
  [Purchasely closeDisplayedPresentation];
700
713
  self.presentedPresentationViewController = presentationLoaded.controller;
701
714
  dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.5 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
@@ -732,13 +745,13 @@
732
745
  [dict setObject:signature.identifier forKey:@"identifier"];
733
746
  [dict setObject:signature.signature forKey:@"signature"];
734
747
  [dict setObject:signature.keyIdentifier forKey:@"keyIdentifier"];
735
-
748
+
736
749
  NSString *nonceString = [signature.nonce UUIDString];
737
750
  NSObject *nonce = (NSObject *)nonceString;
738
751
  if (nonce != nil) {
739
752
  [dict setObject:nonce forKey:@"nonce"];
740
753
  }
741
-
754
+
742
755
  NSNumber *timestamp = [NSNumber numberWithDouble:signature.timestamp];
743
756
  if (timestamp != nil) {
744
757
  [dict setObject:timestamp forKey:@"timestamp"];
package/www/Purchasely.js CHANGED
@@ -5,7 +5,7 @@ var defaultError = (e) => { console.log(e); }
5
5
  exports.start = function (apiKey, stores, storekit1, userId, logLevel, runningMode, success, error) {
6
6
  var cordovaSdkVersion = cordova.define.moduleMap['cordova/plugin_list'].exports['metadata']['cordova-plugin-purchasely']
7
7
  if(!cordovaSdkVersion) {
8
- cordovaSdkVersion = "4.1.0" //fallback if we cannot find version from metadata
8
+ cordovaSdkVersion = "4.2.2";
9
9
  }
10
10
  exec(success, error, 'Purchasely', 'start', [apiKey, stores, storekit1, userId, logLevel, runningMode, cordovaSdkVersion]);
11
11
  };
@@ -186,6 +186,10 @@ exports.signPromotionalOffer = function (storeProductId, storeOfferId, success,
186
186
  exec(success, error, 'Purchasely', 'signPromotionalOffer', [storeProductId, storeOfferId]);
187
187
  };
188
188
 
189
+ exports.setThemeMode = function (mode) {
190
+ exec(() => {}, defaultError, 'Purchasely', 'setThemeMode', [mode]);
191
+ };
192
+
189
193
  exports.LogLevel = {
190
194
  DEBUG: 0,
191
195
  INFO: 1,
@@ -214,7 +218,8 @@ exports.Attribute = {
214
218
  AMPLITUDE_USER_ID: 17,
215
219
  AMPLITUDE_DEVICE_ID: 18,
216
220
  MOENGAGE_UNIQUE_ID: 19,
217
- ONESIGNAL_EXTERNAL_ID: 20
221
+ ONESIGNAL_EXTERNAL_ID: 20,
222
+ BATCH_CUSTOM_USER_ID: 21,
218
223
  }
219
224
 
220
225
  exports.PurchaseResult = {
@@ -255,3 +260,9 @@ exports.PaywallAction = {
255
260
  open_presentation: 'open_placement',
256
261
  promo_code: 'promo_code',
257
262
  }
263
+
264
+ exports.ThemeMode = {
265
+ light: 0,
266
+ dark: 1,
267
+ system: 2
268
+ }