react-native-nami-sdk 3.0.23 → 3.0.25

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.
@@ -254,7 +254,7 @@ jobs:
254
254
  pip3 install PyJWT
255
255
  echo "1.0" > $RUNNER_TEMP/.current_version
256
256
  export CURRENT_VERSION=`cat $RUNNER_TEMP/.current_version`
257
- python3 get_next_build.py com.namiml.stg.testreactnative --prerelease --platform=TV_OS > $RUNNER_TEMP/.next_build_number
257
+ python3 get_next_build.py com.namiml.app.testreactnative --prerelease --platform=TV_OS > $RUNNER_TEMP/.next_build_number
258
258
  working-directory: appstoreconnect-build-tools
259
259
  env:
260
260
  APPSTORE_API_KEY_ID: "${{ secrets.APPSTORE_API_KEY_ID }}"
@@ -84,7 +84,7 @@ dependencies {
84
84
  implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
85
85
 
86
86
  implementation 'com.github.jeziellago:compose-markdown:0.3.0'
87
- implementation "com.namiml:sdk-android:3.0.24"
87
+ implementation "com.namiml:sdk-android:3.1.0"
88
88
 
89
89
  implementation 'com.facebook.react:react-native:+' // From node_modules
90
90
  coreLibraryDesugaring "com.android.tools:desugar_jdk_libs:1.1.5"
@@ -115,7 +115,7 @@ class NamiBridgeModule(reactContext: ReactApplicationContext) :
115
115
  } else {
116
116
  Arguments.createArray()
117
117
  }
118
- val settingsList = mutableListOf("extendedClientInfo:react-native:3.0.23")
118
+ val settingsList = mutableListOf("extendedClientInfo:react-native:3.0.25")
119
119
  namiCommandsReact?.toArrayList()?.filterIsInstance<String>()?.let { commandsFromReact ->
120
120
  settingsList.addAll(commandsFromReact)
121
121
  }
@@ -10,9 +10,8 @@ import com.namiml.billing.NamiPurchase
10
10
  import com.namiml.campaign.LaunchCampaignResult
11
11
  import com.namiml.campaign.NamiCampaign
12
12
  import com.namiml.campaign.NamiCampaignManager
13
- import com.namiml.paywall.NamiSKU
14
- import com.namiml.paywall.model.NamiPaywallAction
15
13
  import com.namiml.paywall.model.PaywallLaunchContext
14
+ import com.namiml.paywall.model.NamiPaywallEvent
16
15
 
17
16
  class NamiCampaignManagerBridgeModule(reactContext: ReactApplicationContext) :
18
17
  ReactContextBaseJavaModule(reactContext), ActivityEventListener {
@@ -29,6 +28,8 @@ class NamiCampaignManagerBridgeModule(reactContext: ReactApplicationContext) :
29
28
  const val CAMPAIGN_TYPE = "campaignType"
30
29
  const val CAMPAIGN_URL = "campaignUrl"
31
30
  const val PAYWALL_NAME = "paywallName"
31
+ const val COMPONENT_CHANGE_ID = "componentChangeId"
32
+ const val COMPONENT_CHANGE_NAME = "componentChangeName"
32
33
  const val SEGMENT_ID = "segmentId"
33
34
  const val EXTERNAL_SEGMENT_ID = "externalSegmentId"
34
35
  const val DEEP_LINK_URL = "deeplinkUrl"
@@ -90,42 +91,16 @@ class NamiCampaignManagerBridgeModule(reactContext: ReactApplicationContext) :
90
91
  } else {
91
92
  paywallLaunchContext = PaywallLaunchContext(null, customAttributes)
92
93
  }
93
-
94
94
  }
95
95
 
96
96
  if (theActivity != null) {
97
97
  reactApplicationContext.runOnUiQueueThread {
98
98
  val paywallActionCallback = {
99
- campaignId: String,
100
- campaignName: String?,
101
- campaignType: String?,
102
- campaignLabel: String?,
103
- campaignUrl: String?,
104
- paywallId: String,
105
- paywallName: String?,
106
- segmentId: String?,
107
- externalSegmentId: String?,
108
- action: NamiPaywallAction,
109
- sku: NamiSKU?,
110
- purchaseError: String?,
111
- purchases: List<NamiPurchase>?,
112
- deeplinkUrl: String? ->
99
+ paywallEvent: NamiPaywallEvent ->
113
100
  handlePaywallCallback(
114
- campaignId,
115
- campaignName,
116
- campaignType,
117
- campaignLabel,
118
- campaignUrl,
119
- paywallId,
120
- paywallName,
121
- segmentId,
122
- externalSegmentId,
123
- action,
124
- sku,
125
- purchaseError,
126
- purchases,
127
- deeplinkUrl,
128
- actionCallback)
101
+ paywallEvent,
102
+ actionCallback,
103
+ )
129
104
  }
130
105
 
131
106
  val uriObject: Uri? = if (withUrl != null) Uri.parse(withUrl) else null
@@ -152,46 +127,34 @@ class NamiCampaignManagerBridgeModule(reactContext: ReactApplicationContext) :
152
127
  }
153
128
  }
154
129
  }
155
-
156
130
  }
157
131
 
158
132
  private fun handlePaywallCallback(
159
- campaignId: String,
160
- campaignName: String?,
161
- campaignType: String?,
162
- campaignLabel: String?,
163
- campaignUrl: String?,
164
- paywallId: String,
165
- paywallName: String?,
166
- segmentId: String?,
167
- externalSegmentId: String?,
168
- action: NamiPaywallAction,
169
- sku: NamiSKU?,
170
- purchaseError: String?,
171
- purchases: List<NamiPurchase>?,
172
- deeplinkUrl: String?,
173
- actionCallback: Callback
133
+ paywallEvent: NamiPaywallEvent,
134
+ actionCallback: Callback,
174
135
  ) {
175
- val actionString = action.toString()
176
- val skuString = sku?.skuId ?: ""
136
+ val actionString = paywallEvent.action.toString()
137
+ val skuString = paywallEvent.sku?.skuId ?: ""
177
138
 
178
- val purchasesArray = createPurchaseArray(purchases)
139
+ val purchasesArray = createPurchaseArray(paywallEvent.purchases)
179
140
 
180
141
  val resultMap = Arguments.createMap().apply {
181
- putString(CAMPAIGN_ID, campaignId)
182
- putString(CAMPAIGN_LABEL, campaignLabel ?: "")
183
- putString(PAYWALL_ID, paywallId)
142
+ putString(CAMPAIGN_ID, paywallEvent.campaignId)
143
+ putString(CAMPAIGN_LABEL, paywallEvent.campaignLabel ?: "")
144
+ putString(PAYWALL_ID, paywallEvent.paywallId)
184
145
  putString(ACTION, actionString)
185
146
  putString(SKU_ID, skuString)
186
- putString(PURCHASE_ERROR, purchaseError ?: "")
147
+ putString(PURCHASE_ERROR, paywallEvent.purchaseError ?: "")
187
148
  putArray(PURCHASES, purchasesArray)
188
- putString(CAMPAIGN_NAME, campaignName ?: "")
189
- putString(CAMPAIGN_TYPE, campaignType ?: "")
190
- putString(CAMPAIGN_URL, campaignUrl ?: "")
191
- putString(PAYWALL_NAME, paywallName ?: "")
192
- putString(SEGMENT_ID, segmentId ?: "")
193
- putString(EXTERNAL_SEGMENT_ID, externalSegmentId ?: "")
194
- putString(DEEP_LINK_URL, deeplinkUrl ?: "")
149
+ putString(CAMPAIGN_NAME, paywallEvent.campaignName ?: "")
150
+ putString(CAMPAIGN_TYPE, paywallEvent.campaignType ?: "")
151
+ putString(CAMPAIGN_URL, paywallEvent.campaignUrl ?: "")
152
+ putString(PAYWALL_NAME, paywallEvent.paywallName ?: "")
153
+ putString(COMPONENT_CHANGE_ID, paywallEvent?.componentChange?.id ?: "")
154
+ putString(COMPONENT_CHANGE_NAME, paywallEvent?.componentChange?.name ?: "")
155
+ putString(SEGMENT_ID, paywallEvent.segmentId ?: "")
156
+ putString(EXTERNAL_SEGMENT_ID, paywallEvent.externalSegmentId ?: "")
157
+ putString(DEEP_LINK_URL, paywallEvent.deeplinkUrl ?: "")
195
158
  }
196
159
 
197
160
  emitEvent(_RESULT_CAMPAIGN, resultMap)
@@ -108,7 +108,7 @@ class NamiPaywallManagerBridgeModule(reactContext: ReactApplicationContext) :
108
108
  if (productId != null && skuId != null && skuType != null) {
109
109
  val namiSku = NamiSKU(
110
110
  skuId = skuId,
111
- skuDetails = null,
111
+ productDetails = null,
112
112
  amazonProduct = null,
113
113
  id = productId,
114
114
  type = skuType,
@@ -79,6 +79,7 @@ fun NamiSKU.toSkuDict(): WritableMap {
79
79
  productDict.putString("skuId", this.skuId)
80
80
  productDict.putString("id", this.id)
81
81
  productDict.putString("type", this.type.toString())
82
+ productDict.putString("promoId", this.promoId)
82
83
 
83
84
  return productDict
84
85
  }
package/ios/Nami.m CHANGED
@@ -52,7 +52,7 @@ RCT_EXPORT_METHOD(configure: (NSDictionary *)configDict completion: (RCTResponse
52
52
  }
53
53
 
54
54
  // Start commands with header iformation for Nami to let them know this is a React client.
55
- NSMutableArray *namiCommandStrings = [NSMutableArray arrayWithArray:@[@"extendedClientInfo:react-native:3.0.23"]];
55
+ NSMutableArray *namiCommandStrings = [NSMutableArray arrayWithArray:@[@"extendedClientInfo:react-native:3.0.25"]];
56
56
 
57
57
  // Add additional namiCommands app may have sent in.
58
58
  NSObject *appCommandStrings = configDict[@"namiCommands"];
@@ -43,23 +43,10 @@ class RNNamiCampaignManager: RCTEventEmitter {
43
43
  }
44
44
 
45
45
  func handlePaywallAction(
46
- campaignId: String?,
47
- campaignName: String?,
48
- campaignType: String?,
49
- campaignLabel: String?,
50
- campaignUrl: String?,
51
- paywallId: String?,
52
- paywallName: String?,
53
- segmentId: String?,
54
- externalSegmentId: String?,
55
- action: NamiApple.NamiPaywallAction,
56
- sku: NamiApple.NamiSKU?,
57
- purchaseError: Error?,
58
- purchases: [NamiApple.NamiPurchase],
59
- deeplinkUrl: String?
46
+ paywallEvent: NamiPaywallEvent
60
47
  ) {
61
- let actionString: String
62
- switch action {
48
+ var actionString: String
49
+ switch paywallEvent.action {
63
50
  case .show_paywall:
64
51
  actionString = "SHOW_PAYWALL"
65
52
  case .close_paywall:
@@ -86,29 +73,36 @@ class RNNamiCampaignManager: RCTEventEmitter {
86
73
  actionString = "PURCHASE_UNKNOWN"
87
74
  case .deeplink:
88
75
  actionString = "DEEPLINK"
89
- @unknown default:
90
- actionString = "PURCHASE_UNKNOWN"
76
+ case .toggle_change:
77
+ actionString = "TOGGLE_CHANGE"
78
+ case .page_change:
79
+ actionString = "PAGE_CHANGE"
80
+ case .slide_change:
81
+ actionString = "SLIDE_CHANGE"
82
+ default:
83
+ actionString = "UNKNOWN"
91
84
  }
92
- let skuId = sku?.skuId
93
- let errorSting = purchaseError?.localizedDescription
85
+ let errorSting = paywallEvent.purchaseError?.localizedDescription
94
86
 
95
- let dictionaries = purchases.map { purchase in RNNamiPurchaseManager.purchaseToPurchaseDict(purchase) }
87
+ let dictionaries = paywallEvent.purchases.map { purchase in RNNamiPurchaseManager.purchaseToPurchaseDict(purchase) }
96
88
 
97
89
  let payload: [String: Any?] = [
98
- "campaignId": campaignId,
99
- "campaignName": campaignName,
100
- "campaignType": campaignType,
101
- "campaignLabel": campaignLabel,
102
- "campaignUrl": campaignUrl,
103
- "paywallId": paywallId,
104
- "paywallName": paywallName,
105
- "segmentId": segmentId,
106
- "externalSegmentId": externalSegmentId,
90
+ "campaignId": paywallEvent.campaignId,
91
+ "campaignName": paywallEvent.campaignName,
92
+ "campaignType": paywallEvent.campaignType,
93
+ "campaignLabel": paywallEvent.campaignLabel,
94
+ "campaignUrl": paywallEvent.campaignUrl,
95
+ "paywallId": paywallEvent.paywallId,
96
+ "paywallName": paywallEvent.paywallName,
97
+ "segmentId": paywallEvent.segmentId,
98
+ "externalSegmentId": paywallEvent.externalSegmentId,
107
99
  "action": actionString,
108
- "skuId": skuId,
100
+ "skuId": paywallEvent.sku?.id,
109
101
  "purchaseError": errorSting,
110
102
  "purchases": dictionaries,
111
- "deeplinkUrl": deeplinkUrl,
103
+ "deeplinkUrl": paywallEvent.deeplinkUrl,
104
+ "componentChangeId": paywallEvent.componentChange?.id,
105
+ "componentChangeName": paywallEvent.componentChange?.name,
112
106
  ]
113
107
 
114
108
  RNNamiCampaignManager.shared?.sendEvent(withName: "ResultCampaign", body: payload)
@@ -156,8 +150,8 @@ class RNNamiCampaignManager: RCTEventEmitter {
156
150
  error: error
157
151
  )
158
152
  },
159
- paywallActionHandler: { campaignId, campaignName, campaignType, campaignLabel, campaignUrl, paywallId, paywallName, segmentId, externalSegmentId, _, action, sku, purchaseError, purchases, deeplinkUrl in
160
- self.handlePaywallAction(campaignId: campaignId, campaignName: campaignName, campaignType: campaignType, campaignLabel: campaignLabel, campaignUrl: campaignUrl, paywallId: paywallId, paywallName: paywallName, segmentId: segmentId, externalSegmentId: externalSegmentId, action: action, sku: sku, purchaseError: purchaseError, purchases: purchases, deeplinkUrl: deeplinkUrl)
153
+ paywallActionHandler: { paywallEvent in
154
+ self.handlePaywallAction(paywallEvent: paywallEvent)
161
155
  })
162
156
  }
163
157
  } else if let label = label {
@@ -170,8 +164,8 @@ class RNNamiCampaignManager: RCTEventEmitter {
170
164
  error: error
171
165
  )
172
166
  },
173
- paywallActionHandler: { campaignId, campaignName, campaignType, campaignLabel, campaignUrl, paywallId, paywallName, segmentId, externalSegmentId, _, action, sku, purchaseError, purchases, deeplinkUrl in
174
- self.handlePaywallAction(campaignId: campaignId, campaignName: campaignName, campaignType: campaignType, campaignLabel: campaignLabel, campaignUrl: campaignUrl, paywallId: paywallId, paywallName: paywallName, segmentId: segmentId, externalSegmentId: externalSegmentId, action: action, sku: sku, purchaseError: purchaseError, purchases: purchases, deeplinkUrl: deeplinkUrl)
167
+ paywallActionHandler: { paywallEvent in
168
+ self.handlePaywallAction(paywallEvent: paywallEvent)
175
169
  })
176
170
  }
177
171
  } else {
@@ -185,8 +179,8 @@ class RNNamiCampaignManager: RCTEventEmitter {
185
179
  error: error
186
180
  )
187
181
  },
188
- paywallActionHandler: { campaignId, campaignName, campaignType, campaignLabel, campaignUrl, paywallId, paywallName, segmentId, externalSegmentId, _, action, sku, purchaseError, purchases, deeplinkUrl in
189
- self.handlePaywallAction(campaignId: campaignId, campaignName: campaignName, campaignType: campaignType, campaignLabel: campaignLabel, campaignUrl: campaignUrl, paywallId: paywallId, paywallName: paywallName, segmentId: segmentId, externalSegmentId: externalSegmentId, action: action, sku: sku, purchaseError: purchaseError, purchases: purchases, deeplinkUrl: deeplinkUrl)
182
+ paywallActionHandler: { paywallEvent in
183
+ self.handlePaywallAction(paywallEvent: paywallEvent)
190
184
  })
191
185
  }
192
186
  }
@@ -41,7 +41,7 @@ class RNNamiPaywallManager: RCTEventEmitter {
41
41
  namiSkuType = .unknown
42
42
  }
43
43
 
44
- let namiSku = NamiSKU(namiId: namiId, storeId: storeId, skuType: namiSkuType, product: nil)
44
+ let namiSku = NamiSKU(namiId: namiId, storeId: storeId, skuType: namiSkuType)
45
45
 
46
46
  do {
47
47
  let dateFormatter = DateFormatter()
@@ -26,8 +26,8 @@ class RNNamiPurchaseManager: RCTEventEmitter {
26
26
  let productDict: [String: Any?] = [
27
27
  "localizedTitle": product.localizedTitle,
28
28
  "localizedDescription": product.localizedDescription,
29
- "localizedPrice": product.localizedPrice,
30
- "localizedMultipliedPrice": product.localizedMultipliedPrice,
29
+ "localizedPrice": product.price,
30
+ "localizedMultipliedPrice": "",
31
31
  "price": product.price.stringValue,
32
32
  "priceLanguage": product.priceLocale.languageCode,
33
33
  "priceCurrency": product.priceLocale.currencyCode,
@@ -37,7 +37,7 @@ class RNNamiPurchaseManager: RCTEventEmitter {
37
37
 
38
38
  static func skuToSKUDict(_ sku: NamiSKU) -> NSDictionary {
39
39
  var productDict: NSDictionary?
40
- if let product = sku.product {
40
+ if let product = sku.product as? SKProduct {
41
41
  productDict = productToDict(product)
42
42
  }
43
43
 
@@ -58,6 +58,8 @@ class RNNamiPurchaseManager: RCTEventEmitter {
58
58
  "skuId": sku.skuId,
59
59
  "type": typeString,
60
60
  "appleProduct": productDict,
61
+ "promoId": sku.promoId,
62
+ "promoToken": "",
61
63
  ]
62
64
 
63
65
  return NSDictionary(dictionary: skuDict.compactMapValues { $0 })
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-native-nami-sdk",
3
- "version": "3.0.23",
3
+ "version": "3.0.25",
4
4
  "description": "React Native Module for Nami - Easy subscriptions & in-app purchases, with powerful built-in paywalls and A/B testing.",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -20,7 +20,7 @@ Pod::Spec.new do |s|
20
20
  s.source_files = "ios/**/*.{h,m,swift}"
21
21
  s.requires_arc = true
22
22
 
23
- s.dependency 'Nami', '3.0.25'
23
+ s.dependency 'Nami', '3.1.2'
24
24
  s.dependency 'React'
25
25
 
26
26
  end
@@ -1,6 +1,7 @@
1
1
  import { EmitterSubscription } from "react-native";
2
2
  import { NamiPurchase } from "./NamiPurchaseManager";
3
3
  import { NamiPaywallAction } from "./NamiPaywallManager";
4
+ import { NamiSKU } from "./types";
4
5
 
5
6
  export const NamiCampaignManager: {
6
7
  allCampaigns: () => Promise<Array<NamiCampaign>>;
@@ -23,6 +24,8 @@ export const NamiCampaignManager: {
23
24
  externalSegmentId?: string,
24
25
  deeplinkUrl?: string,
25
26
  skuId?: string,
27
+ componentChangeId?: string,
28
+ componentChangeName?: string,
26
29
  purchaseError?: string,
27
30
  purchases?: NamiPurchase[]
28
31
  ) => void
@@ -72,3 +75,26 @@ export type PaywallLaunchContext = {
72
75
  [key: string]: string;
73
76
  };
74
77
  };
78
+
79
+ export type NamiPaywallEvent = {
80
+ action: NamiPaywallAction;
81
+ campaignId?: string;
82
+ campaignName?: string;
83
+ campaignType?: string;
84
+ campaignLabel?: string;
85
+ campaignUrl?: string;
86
+ paywallId?: string;
87
+ paywallName?: string;
88
+ componentChange?: NamiPaywallComponentChange;
89
+ segmentId?: string;
90
+ externalSegmentId?: string;
91
+ deeplinkUrl?: string;
92
+ sku?: NamiSKU;
93
+ purchaseError?: string;
94
+ purchases?: NamiPurchase[];
95
+ };
96
+
97
+ export type NamiPaywallComponentChange = {
98
+ id?: string;
99
+ name?: string;
100
+ };
@@ -19,15 +19,17 @@ export const NamiCampaignManager = {
19
19
  action,
20
20
  campaignId,
21
21
  paywallId,
22
- campaignLabel,
23
22
  campaignName,
24
23
  campaignType,
24
+ campaignLabel,
25
25
  campaignUrl,
26
26
  paywallName,
27
27
  segmentId,
28
28
  externalSegmentId,
29
29
  deeplinkUrl,
30
30
  skuId,
31
+ componentChangeId,
32
+ componentChangeName,
31
33
  purchaseError,
32
34
  purchases
33
35
  } = body;
@@ -35,15 +37,17 @@ export const NamiCampaignManager = {
35
37
  action,
36
38
  campaignId,
37
39
  paywallId,
38
- campaignLabel,
39
40
  campaignName,
40
41
  campaignType,
42
+ campaignLabel,
41
43
  campaignUrl,
42
44
  paywallName,
43
45
  segmentId,
44
46
  externalSegmentId,
45
47
  deeplinkUrl,
46
48
  skuId,
49
+ componentChangeId,
50
+ componentChangeName,
47
51
  purchaseError,
48
52
  purchases,
49
53
  );
@@ -66,4 +66,8 @@ export enum NamiPaywallAction {
66
66
  PURCHASE_UNKNOWN = "PURCHASE_UNKNOWN",
67
67
  PURCHASE_DEFERRED = "PURCHASE_DEFERRED",
68
68
  DEEPLINK = "DEEPLINK",
69
+ TOGGLE_CHANGE = "TOGGLE_CHANGE",
70
+ PAGE_CHANGE = "PAGE_CHANGE",
71
+ SLIDE_CHANGE = "SLIDE_CHANGE",
72
+ UNKNOWN = "UNKNOWN"
69
73
  }
package/src/types.ts CHANGED
@@ -6,6 +6,8 @@ export type NamiSKU = {
6
6
  googleProduct?: GoogleProduct;
7
7
  amazonProduct?: AmazonProduct;
8
8
  type: NamiSKUType;
9
+ promoId?: string;
10
+ promoToken?: string;
9
11
  };
10
12
 
11
13
  export enum NamiPurchaseState {