react-native-nami-sdk 3.0.22 → 3.0.24
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.
- package/.github/workflows/app_prod.yaml +1 -1
- package/android/src/main/java/com/nami/reactlibrary/NamiBridgeModule.kt +1 -1
- package/android/src/main/java/com/nami/reactlibrary/NamiCampaignManagerBridge.kt +4 -0
- package/android/src/main/java/com/nami/reactlibrary/NamiPaywallManagerBridgeModule.kt +13 -0
- package/android/src/main/java/com/nami/reactlibrary/NamiUtil.kt +2 -0
- package/ios/Nami.m +1 -1
- package/ios/NamiCampaignManagerBridge.swift +32 -38
- package/ios/NamiPaywallManagerBridge.m +2 -0
- package/ios/NamiPaywallManagerBridge.swift +11 -3
- package/ios/NamiPurchaseManagerBridge.swift +5 -3
- package/package.json +1 -1
- package/react-native-nami-sdk.podspec +1 -1
- package/src/NamiCampaignManager.d.ts +26 -0
- package/src/NamiCampaignManager.js +6 -2
- package/src/NamiPaywallManager.d.ts +5 -0
- package/src/NamiPaywallManager.js +11 -0
- package/src/types.ts +2 -0
|
@@ -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.
|
|
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 }}"
|
|
@@ -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.
|
|
118
|
+
val settingsList = mutableListOf("extendedClientInfo:react-native:3.0.24")
|
|
119
119
|
namiCommandsReact?.toArrayList()?.filterIsInstance<String>()?.let { commandsFromReact ->
|
|
120
120
|
settingsList.addAll(commandsFromReact)
|
|
121
121
|
}
|
|
@@ -29,6 +29,8 @@ class NamiCampaignManagerBridgeModule(reactContext: ReactApplicationContext) :
|
|
|
29
29
|
const val CAMPAIGN_TYPE = "campaignType"
|
|
30
30
|
const val CAMPAIGN_URL = "campaignUrl"
|
|
31
31
|
const val PAYWALL_NAME = "paywallName"
|
|
32
|
+
const val COMPONENT_CHANGE_ID = "componentChangeId"
|
|
33
|
+
const val COMPONENT_CHANGE_NAME = "componentChangeName"
|
|
32
34
|
const val SEGMENT_ID = "segmentId"
|
|
33
35
|
const val EXTERNAL_SEGMENT_ID = "externalSegmentId"
|
|
34
36
|
const val DEEP_LINK_URL = "deeplinkUrl"
|
|
@@ -189,6 +191,8 @@ class NamiCampaignManagerBridgeModule(reactContext: ReactApplicationContext) :
|
|
|
189
191
|
putString(CAMPAIGN_TYPE, campaignType ?: "")
|
|
190
192
|
putString(CAMPAIGN_URL, campaignUrl ?: "")
|
|
191
193
|
putString(PAYWALL_NAME, paywallName ?: "")
|
|
194
|
+
putString(COMPONENT_CHANGE_ID, "")
|
|
195
|
+
putString(COMPONENT_CHANGE_NAME, "")
|
|
192
196
|
putString(SEGMENT_ID, segmentId ?: "")
|
|
193
197
|
putString(EXTERNAL_SEGMENT_ID, externalSegmentId ?: "")
|
|
194
198
|
putString(DEEP_LINK_URL, deeplinkUrl ?: "")
|
|
@@ -222,6 +222,19 @@ class NamiPaywallManagerBridgeModule(reactContext: ReactApplicationContext) :
|
|
|
222
222
|
}
|
|
223
223
|
}
|
|
224
224
|
|
|
225
|
+
@ReactMethod
|
|
226
|
+
fun registerRestoreHandler() {
|
|
227
|
+
NamiPaywallManager.registerRestoreHandler { activity ->
|
|
228
|
+
latestPaywallActivity = activity
|
|
229
|
+
val map = Arguments.createMap().apply {
|
|
230
|
+
putBoolean("paywallRestoreRequested", true)
|
|
231
|
+
}
|
|
232
|
+
reactApplicationContext
|
|
233
|
+
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
|
|
234
|
+
.emit("PaywallRestoreRequested", map)
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
225
238
|
@ReactMethod
|
|
226
239
|
fun show() {
|
|
227
240
|
// Do nothing on Android side
|
|
@@ -79,6 +79,8 @@ 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","")
|
|
83
|
+
productDict.putString("promoToken","")
|
|
82
84
|
|
|
83
85
|
return productDict
|
|
84
86
|
}
|
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.
|
|
55
|
+
NSMutableArray *namiCommandStrings = [NSMutableArray arrayWithArray:@[@"extendedClientInfo:react-native:3.0.24"]];
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
90
|
-
actionString = "
|
|
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
|
|
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":
|
|
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: {
|
|
160
|
-
self.handlePaywallAction(
|
|
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: {
|
|
174
|
-
self.handlePaywallAction(
|
|
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: {
|
|
189
|
-
self.handlePaywallAction(
|
|
182
|
+
paywallActionHandler: { paywallEvent in
|
|
183
|
+
self.handlePaywallAction(paywallEvent: paywallEvent)
|
|
190
184
|
})
|
|
191
185
|
}
|
|
192
186
|
}
|
|
@@ -19,7 +19,7 @@ class RNNamiPaywallManager: RCTEventEmitter {
|
|
|
19
19
|
}
|
|
20
20
|
|
|
21
21
|
override func supportedEvents() -> [String]! {
|
|
22
|
-
return ["RegisterBuySKU", "PaywallCloseRequested", "PaywallSignInRequested"]
|
|
22
|
+
return ["RegisterBuySKU", "PaywallCloseRequested", "PaywallSignInRequested", "PaywallRestoreRequested"]
|
|
23
23
|
}
|
|
24
24
|
|
|
25
25
|
@objc(buySkuComplete:)
|
|
@@ -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
|
|
44
|
+
let namiSku = NamiSKU(namiId: namiId, storeId: storeId, skuType: namiSkuType)
|
|
45
45
|
|
|
46
46
|
do {
|
|
47
47
|
let dateFormatter = DateFormatter()
|
|
@@ -103,6 +103,14 @@ class RNNamiPaywallManager: RCTEventEmitter {
|
|
|
103
103
|
}
|
|
104
104
|
}
|
|
105
105
|
|
|
106
|
+
@objc(registerRestoreHandler)
|
|
107
|
+
func registerRestoreHandler() {
|
|
108
|
+
NamiPaywallManager.registerRestoreHandler {
|
|
109
|
+
let dictionary = NSDictionary(dictionary: ["PaywallRestoreRequested": true].compactMapValues { $0 })
|
|
110
|
+
RNNamiPaywallManager.shared?.sendEvent(withName: "PaywallRestoreRequested", body: dictionary)
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
|
|
106
114
|
@objc(dismiss:)
|
|
107
115
|
func dismiss(animated: Bool) {
|
|
108
116
|
NamiPaywallManager.dismiss(animated: animated) {}
|
|
@@ -129,4 +137,4 @@ class RNNamiPaywallManager: RCTEventEmitter {
|
|
|
129
137
|
resolve(isHidden)
|
|
130
138
|
}
|
|
131
139
|
}
|
|
132
|
-
}
|
|
140
|
+
}
|
|
@@ -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.
|
|
30
|
-
"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,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
|
);
|
|
@@ -13,6 +13,7 @@ export const NamiPaywallManager: {
|
|
|
13
13
|
) => EmitterSubscription["remove"];
|
|
14
14
|
registerCloseHandler: (callback: () => void) => EmitterSubscription["remove"];
|
|
15
15
|
registerSignInHandler: (callback: () => void) => EmitterSubscription["remove"];
|
|
16
|
+
registerRestoreHandler: (callback: () => void) => EmitterSubscription["remove"];
|
|
16
17
|
show: () => void;
|
|
17
18
|
hide: () => void;
|
|
18
19
|
isHidden: () => Promise<boolean>;
|
|
@@ -65,4 +66,8 @@ export enum NamiPaywallAction {
|
|
|
65
66
|
PURCHASE_UNKNOWN = "PURCHASE_UNKNOWN",
|
|
66
67
|
PURCHASE_DEFERRED = "PURCHASE_DEFERRED",
|
|
67
68
|
DEEPLINK = "DEEPLINK",
|
|
69
|
+
TOGGLE_CHANGE = "TOGGLE_CHANGE",
|
|
70
|
+
PAGE_CHANGE = "PAGE_CHANGE",
|
|
71
|
+
SLIDE_CHANGE = "SLIDE_CHANGE",
|
|
72
|
+
UNKNOWN = "UNKNOWN"
|
|
68
73
|
}
|
|
@@ -47,6 +47,17 @@ export const NamiPaywallManager = {
|
|
|
47
47
|
RNNamiPaywallManager.registerSignInHandler();
|
|
48
48
|
return subscription.remove;
|
|
49
49
|
},
|
|
50
|
+
registerRestoreHandler(callback) {
|
|
51
|
+
var subscription;
|
|
52
|
+
subscription = this.paywallEmitter.addListener(
|
|
53
|
+
"PaywallRestoreRequested",
|
|
54
|
+
(body) => {
|
|
55
|
+
callback(body);
|
|
56
|
+
}
|
|
57
|
+
);
|
|
58
|
+
RNNamiPaywallManager.registerRestoreHandler();
|
|
59
|
+
return subscription.remove;
|
|
60
|
+
},
|
|
50
61
|
dismiss(animated) {
|
|
51
62
|
RNNamiPaywallManager.dismiss(animated ?? true);
|
|
52
63
|
},
|