react-native-nami-sdk 2.0.5 → 3.0.9

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 (56) hide show
  1. package/.github/workflows/app_stg.yaml +203 -0
  2. package/.pre-commit-config.yaml +1 -1
  3. package/android/build.gradle +24 -13
  4. package/android/gradle/wrapper/gradle-wrapper.properties +5 -1
  5. package/android/src/main/java/com/nami/reactlibrary/NamiBridgeModule.kt +7 -51
  6. package/android/src/main/java/com/nami/reactlibrary/NamiBridgePackage.java +1 -0
  7. package/android/src/main/java/com/nami/reactlibrary/NamiCampaignManagerBridge.kt +136 -0
  8. package/android/src/main/java/com/nami/reactlibrary/NamiCustomerManagerBridge.kt +97 -18
  9. package/android/src/main/java/com/nami/reactlibrary/NamiEmitter.kt +24 -24
  10. package/android/src/main/java/com/nami/reactlibrary/NamiEntitlementManagerBridgeModule.kt +30 -129
  11. package/android/src/main/java/com/nami/reactlibrary/NamiPaywallManagerBridgeModule.kt +133 -149
  12. package/android/src/main/java/com/nami/reactlibrary/NamiPurchaseManagerBridge.kt +36 -38
  13. package/android/src/main/java/com/nami/reactlibrary/NamiUtil.kt +50 -180
  14. package/build-utils/get_version_code.py +140 -0
  15. package/index.d.ts +20 -0
  16. package/index.js +7 -6
  17. package/ios/Nami.m +9 -63
  18. package/ios/NamiBridgeUtil.h +4 -6
  19. package/ios/NamiBridgeUtil.m +16 -78
  20. package/ios/NamiCampaignManagerBridge.m +26 -0
  21. package/ios/NamiCampaignManagerBridge.swift +112 -0
  22. package/ios/NamiCustomerManager.m +22 -23
  23. package/ios/NamiCustomerManager.swift +132 -0
  24. package/ios/NamiEmitter.m +55 -65
  25. package/ios/NamiEntitlementManagerBridge.m +7 -107
  26. package/ios/NamiEntitlementManagerBridge.swift +74 -0
  27. package/ios/NamiMLManagerBridge.m +2 -2
  28. package/ios/NamiPaywallManagerBridge.m +22 -94
  29. package/ios/NamiPaywallManagerBridge.swift +93 -0
  30. package/ios/NamiPurchaseManagerBridge.m +38 -69
  31. package/ios/NamiPurchaseManagerBridge.swift +174 -0
  32. package/ios/Podfile +2 -2
  33. package/ios/RNNami-Bridging-Header.h +5 -0
  34. package/ios/RNNami.h +0 -1
  35. package/ios/RNNami.m +1 -1
  36. package/ios/RNNami.xcodeproj/project.pbxproj +83 -11
  37. package/ios/RNNami.xcodeproj/xcshareddata/xcschemes/RNNami.xcscheme +67 -0
  38. package/package.json +1 -1
  39. package/react-native-nami-sdk.podspec +3 -3
  40. package/src/Nami.d.ts +112 -0
  41. package/src/Nami.js +10 -0
  42. package/src/NamiCampaignManager.d.ts +57 -0
  43. package/src/NamiCampaignManager.js +54 -0
  44. package/src/NamiCustomerManager.d.ts +41 -0
  45. package/src/NamiCustomerManager.js +43 -0
  46. package/src/NamiEntitlementManager.d.ts +24 -0
  47. package/src/NamiEntitlementManager.js +23 -0
  48. package/src/NamiMLManager.d.ts +5 -0
  49. package/src/NamiMLManager.js +7 -0
  50. package/src/NamiPaywallManager.d.ts +82 -0
  51. package/src/NamiPaywallManager.js +37 -0
  52. package/src/NamiPurchaseManager.d.ts +57 -0
  53. package/src/NamiPurchaseManager.js +37 -0
  54. package/src/types.ts +36 -0
  55. package/android/src/main/java/com/nami/reactlibrary/NamiAnalyticsEmitter.kt +0 -121
  56. package/ios/NamiAnalyticsEmitter.m +0 -146
@@ -1,42 +1,121 @@
1
1
  package com.nami.reactlibrary
2
2
 
3
3
  import android.util.Log
4
- import com.facebook.react.bridge.Callback
5
- import com.facebook.react.bridge.ReactApplicationContext
6
- import com.facebook.react.bridge.ReactContextBaseJavaModule
7
- import com.facebook.react.bridge.ReactMethod
4
+ import com.facebook.react.bridge.*
8
5
  import com.facebook.react.modules.core.DeviceEventManagerModule
6
+ import com.namiml.campaign.NamiCampaignManager
9
7
  import com.namiml.customer.CustomerJourneyState
10
8
  import com.namiml.customer.NamiCustomerManager
11
9
 
10
+
12
11
  class NamiCustomerManagerBridgeModule(reactContext: ReactApplicationContext) :
13
12
  ReactContextBaseJavaModule(reactContext) {
14
13
 
15
14
  override fun getName(): String {
16
- return "NamiCustomerManagerBridge"
15
+ return "RNNamiCustomerManager"
16
+ }
17
+
18
+ private fun journeyStateToReadableMap(journeyState: CustomerJourneyState): ReadableMap {
19
+ val readableMap = Arguments.createMap()
20
+ readableMap.putBoolean("formerSubscriber", journeyState.formerSubscriber)
21
+ readableMap.putBoolean("inGracePeriodl", journeyState.inGracePeriod)
22
+ readableMap.putBoolean("inTrialPeriod", journeyState.inTrialPeriod)
23
+ readableMap.putBoolean("inIntroOfferPeriod", journeyState.inIntroOfferPeriod)
24
+ readableMap.putBoolean("isCancelled", journeyState.isCancelled)
25
+ readableMap.putBoolean("inPause", journeyState.inPause)
26
+ readableMap.putBoolean("inAccountHold", journeyState.inAccountHold)
27
+ return readableMap
28
+ }
29
+ @ReactMethod
30
+ fun setCustomerAttribute(key: String, value: String){
31
+ NamiCustomerManager.setCustomerAttribute(key, value)
17
32
  }
18
33
 
19
- init {
20
- NamiCustomerManager.registerCustomerJourneyChangedListener { customerJourneyState ->
21
- emitCustomerJourneyChanged(customerJourneyState)
34
+ @ReactMethod
35
+ fun getCustomerAttribute(key: String, promise: Promise){
36
+ val customerAttribute = NamiCustomerManager.getCustomerAttribute(key)
37
+ promise.resolve(customerAttribute)
38
+ }
39
+
40
+ @ReactMethod
41
+ fun clearCustomerAttribute(key: String){
42
+ NamiCustomerManager.clearCustomerAttribute(key)
43
+ }
44
+
45
+ @ReactMethod
46
+ fun clearAllCustomerAttributes(){
47
+ NamiCustomerManager.clearAllCustomerAttributes()
48
+ }
49
+
50
+ @ReactMethod
51
+ fun clearCustomerDataPlatformId(){
52
+ NamiCustomerManager.clearCustomerDataPlatformId()
53
+ }
54
+
55
+ @ReactMethod
56
+ fun setCustomerDataPlatformId(cdpId: String){
57
+ NamiCustomerManager.setCustomerDataPlatformId(cdpId)
58
+ }
59
+
60
+ @ReactMethod
61
+ fun journeyState(promise: Promise){
62
+ val journeyState = NamiCustomerManager.journeyState()
63
+ if (journeyState == null) {
64
+ promise.resolve(null)
65
+ } else {
66
+ val handledJourneyState = journeyStateToReadableMap(journeyState)
67
+ promise.resolve(handledJourneyState)
22
68
  }
69
+ }
70
+
71
+ @ReactMethod
72
+ fun isLoggedIn(promise: Promise){
73
+ val isLoggedIn = NamiCustomerManager.isLoggedIn()
74
+ promise.resolve(isLoggedIn)
75
+ }
76
+
77
+ @ReactMethod
78
+ fun loggedInId(promise: Promise){
79
+ val id = NamiCustomerManager.loggedInId()
80
+ promise.resolve(id)
81
+ }
82
+
83
+ @ReactMethod
84
+ fun deviceId(promise: Promise){
85
+ val id = NamiCustomerManager.deviceId()
86
+ promise.resolve(id)
23
87
  }
24
88
 
25
- private fun emitCustomerJourneyChanged(customerJourneyState: CustomerJourneyState) {
26
- Log.i(LOG_TAG, "Emitting CustomerJourneyState changed")
27
- try {
89
+ @ReactMethod
90
+ fun login(customerId: String){
91
+ NamiCustomerManager.login(customerId)
92
+ }
93
+
94
+ @ReactMethod
95
+ fun logout() {
96
+ NamiCustomerManager.logout()
97
+ }
98
+
99
+ @ReactMethod
100
+ fun registerJourneyStateHandler() {
101
+ NamiCustomerManager.registerJourneyStateHandler { journeyState ->
102
+ val handledJourneyState = journeyStateToReadableMap(journeyState)
28
103
  reactApplicationContext
29
- .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
30
- .emit("CustomerJourneyStateChanged", customerJourneyState.toDict())
31
- } catch (e: Exception) {
32
- Log.e(LOG_TAG, "Caught Exception: " + e.message)
104
+ .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
105
+ .emit("JourneyStateChanged", handledJourneyState)
33
106
  }
34
107
  }
35
108
 
36
109
  @ReactMethod
37
- fun currentCustomerJourneyState(resultsCallback: Callback) {
38
- reactApplicationContext.runOnUiQueueThread {
39
- resultsCallback.invoke(NamiCustomerManager.currentCustomerJourneyState().toDict())
110
+ fun registerAccountStateHandler() {
111
+ NamiCustomerManager.registerAccountStateHandler { action, success, error ->
112
+ val body = Arguments.createMap()
113
+ body.putString("action", action.toString())
114
+ body.putBoolean("success", success)
115
+ body.putString("error", error.toString())
116
+ reactApplicationContext
117
+ .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
118
+ .emit("AccountStateChanged", body)
40
119
  }
41
120
  }
42
121
  }
@@ -33,31 +33,31 @@ class NamiEmitter(reactContext: ReactApplicationContext) :
33
33
  }
34
34
 
35
35
  override fun initialize() {
36
- NamiPaywallManager.registerSignInListener { _, _, developerPaywallID ->
37
- Log.i(LOG_TAG, "Sign in clicked with developerPaywallID $developerPaywallID")
38
-
39
- emitSignInActivated(developerPaywallID)
40
- }
36
+ // NamiPaywallManager.registerSignInListener { _, _, developerPaywallID ->
37
+ // Log.i(LOG_TAG, "Sign in clicked with developerPaywallID $developerPaywallID")
38
+ //
39
+ // emitSignInActivated(developerPaywallID)
40
+ // }
41
41
 
42
42
  Log.i(LOG_TAG, "In Emitter Initialize()")
43
43
 
44
- NamiPaywallManager.registerPaywallRaiseListener { _, paywallData, products, developerPaywallId ->
45
- Log.i(
46
- LOG_TAG,
47
- "Products from registerPaywallRaiseListener callback are $products"
48
- )
49
-
50
- val sendProducts: List<NamiSKU> = products ?: ArrayList<NamiSKU>()
51
- emitPaywallRaise(paywallData, sendProducts, developerPaywallId)
52
- }
53
-
54
- NamiPurchaseManager.registerPurchasesChangedListener { list, namiPurchaseState, s ->
55
- emitPurchaseMade(list, namiPurchaseState, s)
56
- }
57
-
58
- NamiCustomerManager.registerCustomerJourneyChangedListener {
59
- emitCustomerJourneyChanged(it)
60
- }
44
+ // NamiPaywallManager.registerPaywallRaiseListener { _, paywallData, products, developerPaywallId ->
45
+ // Log.i(
46
+ // LOG_TAG,
47
+ // "Products from registerPaywallRaiseListener callback are $products"
48
+ // )
49
+ //
50
+ // val sendProducts: List<NamiSKU> = products ?: ArrayList<NamiSKU>()
51
+ // emitPaywallRaise(paywallData, sendProducts, developerPaywallId)
52
+ // }
53
+
54
+ // NamiPurchaseManager.registerPurchasesChangedListener { list, namiPurchaseState, s ->
55
+ // emitPurchaseMade(list, namiPurchaseState, s)
56
+ // }
57
+ //
58
+ // NamiCustomerManager.registerCustomerJourneyChangedListener {
59
+ // emitCustomerJourneyChanged(it)
60
+ // }
61
61
  }
62
62
 
63
63
  private fun emitCustomerJourneyChanged(customerJourneyState: CustomerJourneyState) {
@@ -126,8 +126,8 @@ class NamiEmitter(reactContext: ReactApplicationContext) :
126
126
  }
127
127
 
128
128
  // Populate paywall metadata map
129
- val paywallMap: WritableMap = namiPaywall.toNamiPaywallDict()
130
- map.putMap("paywallMetadata", paywallMap)
129
+ // val paywallMap: WritableMap = namiPaywall.toNamiPaywallDict()
130
+ // map.putMap("paywallMetadata", paywallMap)
131
131
 
132
132
  // Populate SKU details
133
133
  val skusArray: WritableArray = Arguments.createArray()
@@ -1,167 +1,68 @@
1
1
  package com.nami.reactlibrary
2
2
 
3
3
  import android.util.Log
4
- import com.facebook.react.bridge.Callback
5
- import com.facebook.react.bridge.ReactApplicationContext
6
- import com.facebook.react.bridge.ReactContextBaseJavaModule
7
- import com.facebook.react.bridge.ReactMethod
8
- import com.facebook.react.bridge.ReadableArray
9
- import com.facebook.react.bridge.ReadableMap
10
- import com.facebook.react.bridge.WritableArray
11
- import com.facebook.react.bridge.WritableMap
12
- import com.facebook.react.bridge.WritableNativeArray
13
- import com.facebook.react.bridge.WritableNativeMap
4
+ import com.facebook.react.bridge.*
14
5
  import com.facebook.react.modules.core.DeviceEventManagerModule
15
6
  import com.namiml.entitlement.NamiEntitlement
16
7
  import com.namiml.entitlement.NamiEntitlementManager
17
- import com.namiml.entitlement.NamiEntitlementSetter
8
+ //import com.namiml.entitlement.NamiEntitlementSetter
18
9
  import com.namiml.entitlement.NamiPlatformType
19
10
  import java.util.ArrayList
20
11
  import java.util.Date
12
+ import com.facebook.react.bridge.Callback
21
13
 
22
14
  class NamiEntitlementManagerBridgeModule(reactContext: ReactApplicationContext) :
23
15
  ReactContextBaseJavaModule(reactContext) {
24
16
 
25
- init {
26
- NamiEntitlementManager.registerEntitlementChangeListener {
27
- emitEntitlementsChanged(it)
28
- }
17
+ override fun getName(): String {
18
+ return "RNNamiEntitlementManager"
29
19
  }
30
20
 
31
- private fun emitEntitlementsChanged(activeEntitlements: List<NamiEntitlement>) {
32
- val map: WritableMap = WritableNativeMap()
21
+ @ReactMethod
22
+ fun isEntitlementActive(referenceId: String, promise: Promise){
23
+ val isEntitlementActive = NamiEntitlementManager.isEntitlementActive(referenceId)
24
+ promise.resolve(isEntitlementActive)
25
+ }
33
26
 
27
+ @ReactMethod
28
+ fun active(promise: Promise){
29
+ val nativeEntitlements = NamiEntitlementManager.active()
34
30
  val resultArray: WritableArray = WritableNativeArray()
35
- for (entitlement in activeEntitlements) {
31
+ for (entitlement in nativeEntitlements) {
36
32
  entitlement.toEntitlementDict()?.let { entitlementDict ->
37
33
  resultArray.pushMap(entitlementDict)
38
- }
39
- }
40
-
41
- map.putArray("activeEntitlements", resultArray)
42
- try {
43
- reactApplicationContext
44
- .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
45
- .emit("EntitlementsChanged", map)
46
- } catch (e: Exception) {
47
- Log.e(LOG_TAG, "Caught Exception: " + e.message)
34
+ }
48
35
  }
49
- }
50
-
51
- override fun getName(): String {
52
- return "NamiEntitlementManagerBridge"
36
+ promise.resolve(resultArray)
53
37
  }
54
38
 
55
39
  @ReactMethod
56
- fun isEntitlementActive(entitlementRefID: String, resultsCallback: Callback) {
57
- reactApplicationContext.runOnUiQueueThread {
58
- val isActive = NamiEntitlementManager.isEntitlementActive(entitlementRefID)
59
-
60
- Log.i(
61
- LOG_TAG,
62
- "Checking for $entitlementRefID entitlement active, result was $isActive"
63
- )
64
- resultsCallback.invoke(isActive)
65
- }
66
- }
67
-
68
- @ReactMethod
69
- fun activeEntitlements(resultsCallback: Callback) {
70
-
71
- reactApplicationContext.runOnUiQueueThread {
72
- val nativeEntitlements = NamiEntitlementManager.activeEntitlements()
73
-
40
+ fun refresh(callback: Callback){
41
+ NamiEntitlementManager.refresh { activeNativeEntitlements ->
74
42
  val resultArray: WritableArray = WritableNativeArray()
75
- for (entitlement in nativeEntitlements) {
76
- entitlement.toEntitlementDict()?.let { entitlementDict ->
77
- resultArray.pushMap(entitlementDict)
43
+ if (activeNativeEntitlements != null) {
44
+ for (entitlement in activeNativeEntitlements) {
45
+ entitlement.toEntitlementDict()?.let { entitlementDict ->
46
+ resultArray.pushMap(entitlementDict)
47
+ }
78
48
  }
79
49
  }
80
- resultsCallback.invoke(resultArray)
50
+ callback.invoke(resultArray)
81
51
  }
82
52
  }
83
53
 
84
54
  @ReactMethod
85
- fun getEntitlements(resultsCallback: Callback) {
86
-
87
- reactApplicationContext.runOnUiQueueThread {
88
- val nativeEntitlements = NamiEntitlementManager.getEntitlements()
89
-
90
- Log.i(LOG_TAG, "getEntitlements result is $nativeEntitlements")
91
-
55
+ fun registerActiveEntitlementsHandler() {
56
+ NamiEntitlementManager.registerActiveEntitlementsHandler { activeNativeEntitlements ->
92
57
  val resultArray: WritableArray = WritableNativeArray()
93
- for (entitlement in nativeEntitlements) {
58
+ for (entitlement in activeNativeEntitlements) {
94
59
  entitlement.toEntitlementDict()?.let { entitlementDict ->
95
60
  resultArray.pushMap(entitlementDict)
96
61
  }
97
62
  }
98
- resultsCallback.invoke(resultArray)
99
- }
100
- }
101
-
102
- @ReactMethod
103
- fun setEntitlements(entitlements: ReadableArray) {
104
- val entitlementsToSet = ArrayList<NamiEntitlementSetter>()
105
-
106
- val size = entitlements.size()
107
- var index = 0
108
- while (index < size) {
109
- val setterMap: ReadableMap? = entitlements.getMap(index)
110
- setterMap?.let {
111
- val entitlementSetter = entitlementSetterFromSetterMap(setterMap)
112
- entitlementSetter?.let {
113
- entitlementsToSet.add(entitlementSetter)
114
- }
115
- }
116
- index += 1
117
- }
118
-
119
- reactApplicationContext.runOnUiQueueThread {
120
- NamiEntitlementManager.setEntitlements(entitlementsToSet)
121
- }
122
- }
123
-
124
- @ReactMethod
125
- fun clearAllEntitlements() {
126
- reactApplicationContext.runOnUiQueueThread {
127
- NamiEntitlementManager.clearAllEntitlements()
128
- }
129
- }
130
-
131
- private fun entitlementSetterFromSetterMap(entitlementSetterMap: ReadableMap): NamiEntitlementSetter? {
132
- if (entitlementSetterMap.hasKey("referenceID")) {
133
- val referenceID = entitlementSetterMap.getString("referenceID").orEmpty()
134
- if (referenceID.isNotEmpty()) {
135
- val expires: Date? = null
136
-
137
- var purchasedSKUid: String? = null
138
- if (entitlementSetterMap.hasKey("purchasedSKUID")) {
139
- purchasedSKUid = entitlementSetterMap.getString("purchasedSKUid")
140
- }
141
-
142
- var platform: NamiPlatformType = NamiPlatformType.OTHER
143
- if (entitlementSetterMap.hasKey("platform")) {
144
- platform = when (entitlementSetterMap.getString("platform")) {
145
- "other" -> NamiPlatformType.OTHER
146
-
147
- "android" -> NamiPlatformType.ANDROID
148
-
149
- "apple" -> NamiPlatformType.APPLE
150
-
151
- "roku" -> NamiPlatformType.ROKU
152
-
153
- "web" -> NamiPlatformType.WEB
154
-
155
- else -> NamiPlatformType.OTHER
156
- }
157
- }
158
-
159
- //referenceId: kotlin.String, purchasedSKUid: kotlin.String?, expires: java.util.Date?, platform: com.namiml.entitlement.NamiPlatformType
160
- return NamiEntitlementSetter(referenceID, platform, purchasedSKUid, expires)
161
- }
63
+ reactApplicationContext
64
+ .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
65
+ .emit("EntitlementsChanged", resultArray)
162
66
  }
163
- Log.e(LOG_TAG, "Attempted to set entitlement with no referenceID $entitlementSetterMap")
164
-
165
- return null
166
67
  }
167
68
  }