react-native-nami-sdk 3.2.11 → 3.3.0-beta.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.
- package/.github/workflows/app_stg.yaml +6 -4
- package/android/src/main/java/com/nami/reactlibrary/NamiBridgeModule.kt +1 -1
- package/android/src/main/java/com/nami/reactlibrary/NamiBridgePackage.java +1 -0
- package/android/src/main/java/com/nami/reactlibrary/NamiFlowManagerBridge.kt +36 -0
- package/index.d.ts +1 -0
- package/index.ts +1 -0
- package/ios/Nami.m +1 -1
- package/ios/NamiCampaignManagerBridge.swift +1 -1
- package/ios/NamiFlowManagerBridge.m +19 -0
- package/ios/NamiFlowManagerBridge.swift +45 -0
- package/package.json +1 -1
- package/react-native-nami-sdk.podspec +1 -1
- package/src/NamiFlowManager.d.ts +8 -0
- package/src/NamiFlowManager.ts +59 -0
- package/src/types.d.ts +6 -5
|
@@ -210,10 +210,12 @@ jobs:
|
|
|
210
210
|
pod install --repo-update
|
|
211
211
|
working-directory: source/examples/Basic/ios
|
|
212
212
|
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
213
|
+
- name: Add initial config
|
|
214
|
+
run: |
|
|
215
|
+
echo $INITIAL_CONFIG_APPLE_STG > nami_initial_config_apple_stg.json
|
|
216
|
+
working-directory: source/examples/Basic
|
|
217
|
+
env:
|
|
218
|
+
INITIAL_CONFIG_APPLE_STG: '${{ secrets.INITIAL_CONFIG_APPLE_STG }}'
|
|
217
219
|
|
|
218
220
|
- name: Build resolve Swift dependencies
|
|
219
221
|
run: |
|
|
@@ -106,7 +106,7 @@ class NamiBridgeModule(reactContext: ReactApplicationContext) :
|
|
|
106
106
|
} else {
|
|
107
107
|
Arguments.createArray()
|
|
108
108
|
}
|
|
109
|
-
val settingsList = mutableListOf("extendedClientInfo:react-native:3.2
|
|
109
|
+
val settingsList = mutableListOf("extendedClientInfo:react-native:3.3.0-beta.2")
|
|
110
110
|
namiCommandsReact?.toArrayList()?.filterIsInstance<String>()?.let { commandsFromReact ->
|
|
111
111
|
settingsList.addAll(commandsFromReact)
|
|
112
112
|
}
|
|
@@ -27,6 +27,7 @@ public class NamiBridgePackage implements ReactPackage {
|
|
|
27
27
|
moduleList.add(new NamiManagerBridgeModule(reactContext));
|
|
28
28
|
moduleList.add(new NamiCustomerManagerBridgeModule(reactContext));
|
|
29
29
|
moduleList.add(new NamiCampaignManagerBridgeModule(reactContext));
|
|
30
|
+
moduleList.add(new NamiFlowManagerBridgeModule(reactContext));
|
|
30
31
|
|
|
31
32
|
return moduleList;
|
|
32
33
|
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
package com.nami.reactlibrary
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.*
|
|
4
|
+
import com.facebook.react.modules.core.DeviceEventManagerModule
|
|
5
|
+
//import com.namiml.customer.NamiFlowManager
|
|
6
|
+
|
|
7
|
+
class NamiFlowManagerBridgeModule(reactContext: ReactApplicationContext) :
|
|
8
|
+
ReactContextBaseJavaModule(reactContext) {
|
|
9
|
+
|
|
10
|
+
override fun getName(): String {
|
|
11
|
+
return "RNNamiFlowManager"
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
@ReactMethod
|
|
15
|
+
fun registerStepHandoff() {
|
|
16
|
+
//NamiFlowManager.registerStepHandoff { handoffTag, handoffData ->
|
|
17
|
+
// val payload = Arguments.createMap().apply {
|
|
18
|
+
// putString("handoffTag", handoffTag)
|
|
19
|
+
// putString("handoffData", handoffData)
|
|
20
|
+
// }
|
|
21
|
+
//
|
|
22
|
+
// sendEvent("RegisterStepHandoff", payload)
|
|
23
|
+
//}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
@ReactMethod
|
|
27
|
+
fun resume() {
|
|
28
|
+
//NamiFlowManager.resume()
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
private fun sendEvent(eventName: String, params: WritableMap?) {
|
|
32
|
+
reactApplicationContext
|
|
33
|
+
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
|
|
34
|
+
.emit(eventName, params)
|
|
35
|
+
}
|
|
36
|
+
}
|
package/index.d.ts
CHANGED
|
@@ -6,4 +6,5 @@ export { NamiEntitlementManager } from './src/NamiEntitlementManager';
|
|
|
6
6
|
export { NamiManager } from './src/NamiManager';
|
|
7
7
|
export { NamiPurchaseManager } from './src/NamiPurchaseManager';
|
|
8
8
|
export { NamiPaywallManager } from './src/NamiPaywallManager';
|
|
9
|
+
export { NamiFlowManager } from './src/NamiFlowManager';
|
|
9
10
|
export * from './src/types';
|
package/index.ts
CHANGED
|
@@ -6,4 +6,5 @@ export { NamiEntitlementManager } from './src/NamiEntitlementManager';
|
|
|
6
6
|
export { NamiManager } from './src/NamiManager';
|
|
7
7
|
export { NamiPurchaseManager } from './src/NamiPurchaseManager';
|
|
8
8
|
export { NamiPaywallManager } from './src/NamiPaywallManager';
|
|
9
|
+
export { NamiFlowManager } from './src/NamiFlowManager';
|
|
9
10
|
export * from './src/types';
|
package/ios/Nami.m
CHANGED
|
@@ -50,7 +50,7 @@ RCT_EXPORT_METHOD(configure: (NSDictionary *)configDict completion: (RCTResponse
|
|
|
50
50
|
}
|
|
51
51
|
|
|
52
52
|
// Start commands with header iformation for Nami to let them know this is a React client.
|
|
53
|
-
NSMutableArray *namiCommandStrings = [NSMutableArray arrayWithArray:@[@"extendedClientInfo:react-native:3.2
|
|
53
|
+
NSMutableArray *namiCommandStrings = [NSMutableArray arrayWithArray:@[@"extendedClientInfo:react-native:3.3.0-beta.2"]];
|
|
54
54
|
|
|
55
55
|
// Add additional namiCommands app may have sent in.
|
|
56
56
|
NSObject *appCommandStrings = configDict[@"namiCommands"];
|
|
@@ -266,7 +266,7 @@ class RNNamiCampaignManager: RCTEventEmitter {
|
|
|
266
266
|
isCampaignAvailable = NamiCampaignManager.isCampaignAvailable(label: source)
|
|
267
267
|
}
|
|
268
268
|
} else {
|
|
269
|
-
isCampaignAvailable =
|
|
269
|
+
isCampaignAvailable = false
|
|
270
270
|
}
|
|
271
271
|
resolve(isCampaignAvailable)
|
|
272
272
|
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
//
|
|
2
|
+
// NamiFlowManagerBridge.m
|
|
3
|
+
// RNNami
|
|
4
|
+
//
|
|
5
|
+
// Copyright © 2025 Nami ML Inc.. All rights reserved.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
#import <React/RCTBridgeModule.h>
|
|
9
|
+
#import <React/RCTEventEmitter.h>
|
|
10
|
+
|
|
11
|
+
@interface RCT_EXTERN_MODULE(RNNamiFlowManager, RCTEventEmitter)
|
|
12
|
+
RCT_EXTERN_METHOD(registerStepHandoff)
|
|
13
|
+
RCT_EXTERN_METHOD(resume)
|
|
14
|
+
|
|
15
|
+
+ (BOOL)requiresMainQueueSetup {
|
|
16
|
+
return YES;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
@end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
//
|
|
2
|
+
// NamiFlowManagerBridge.swift
|
|
3
|
+
// RNNami
|
|
4
|
+
//
|
|
5
|
+
// Copyright © 2025 Nami ML Inc.. All rights reserved.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
import NamiApple
|
|
10
|
+
import React
|
|
11
|
+
|
|
12
|
+
@objc(RNNamiFlowManager)
|
|
13
|
+
class RNNamiFlowManager: RCTEventEmitter {
|
|
14
|
+
public static var shared: RNNamiFlowManager?
|
|
15
|
+
|
|
16
|
+
override init() {
|
|
17
|
+
super.init()
|
|
18
|
+
RNNamiFlowManager.shared = self
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
override static func requiresMainQueueSetup() -> Bool {
|
|
22
|
+
return true
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
override func supportedEvents() -> [String]! {
|
|
26
|
+
return ["RegisterStepHandoff"]
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@objc func registerStepHandoff() {
|
|
30
|
+
NamiFlowManager.registerStepHandoff { tag, data in
|
|
31
|
+
let payload: [String: Any] = [
|
|
32
|
+
"handoffTag": tag,
|
|
33
|
+
"handoffData": data ?? "",
|
|
34
|
+
]
|
|
35
|
+
print("handoff native \(tag) \(data)")
|
|
36
|
+
RNNamiFlowManager.shared?.sendEvent(withName: "RegisterStepHandoff", body: payload)
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
@objc func resume() {
|
|
41
|
+
DispatchQueue.main.async {
|
|
42
|
+
NamiFlowManager.resume()
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-native-nami-sdk",
|
|
3
|
-
"version": "3.2
|
|
3
|
+
"version": "3.3.0-beta.2",
|
|
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.ts",
|
|
6
6
|
"types": "index.d.ts",
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export declare enum NamiFlowManagerEvents {
|
|
2
|
+
RegisterStepHandoff = "RegisterStepHandoff"
|
|
3
|
+
}
|
|
4
|
+
export interface INamiFlowManager {
|
|
5
|
+
registerStepHandoff: (callback: (handoffTag: string, handoffData?: string) => void) => () => void;
|
|
6
|
+
resume: () => void;
|
|
7
|
+
}
|
|
8
|
+
export declare const NamiFlowManager: INamiFlowManager;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import {
|
|
2
|
+
NativeModules,
|
|
3
|
+
NativeEventEmitter,
|
|
4
|
+
EmitterSubscription,
|
|
5
|
+
} from 'react-native';
|
|
6
|
+
|
|
7
|
+
const { RNNamiFlowManager } = NativeModules;
|
|
8
|
+
|
|
9
|
+
export enum NamiFlowManagerEvents {
|
|
10
|
+
RegisterStepHandoff = 'RegisterStepHandoff',
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
export interface INamiFlowManager {
|
|
14
|
+
registerStepHandoff: (
|
|
15
|
+
callback: (handoffTag: string, handoffData?: string) => void,
|
|
16
|
+
) => () => void;
|
|
17
|
+
resume: () => void;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
if (typeof RNNamiFlowManager?.addListener !== 'function') {
|
|
21
|
+
RNNamiFlowManager.addListener = () => {};
|
|
22
|
+
}
|
|
23
|
+
if (typeof RNNamiFlowManager?.removeListeners !== 'function') {
|
|
24
|
+
RNNamiFlowManager.removeListeners = () => {};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const flowEmitter = new NativeEventEmitter(RNNamiFlowManager);
|
|
28
|
+
|
|
29
|
+
export const NamiFlowManager: INamiFlowManager = {
|
|
30
|
+
registerStepHandoff: (callback) => {
|
|
31
|
+
console.log('[NamiFlowManager] Registering handoff listener...');
|
|
32
|
+
|
|
33
|
+
const subscription: EmitterSubscription = flowEmitter.addListener(
|
|
34
|
+
NamiFlowManagerEvents.RegisterStepHandoff,
|
|
35
|
+
(event: { handoffTag: string; handoffData?: string }) => {
|
|
36
|
+
console.log('[NamiFlowManager] Received handoff event:', event);
|
|
37
|
+
callback(event.handoffTag, event.handoffData);
|
|
38
|
+
}
|
|
39
|
+
);
|
|
40
|
+
|
|
41
|
+
if (RNNamiFlowManager?.registerStepHandoff) {
|
|
42
|
+
RNNamiFlowManager.registerStepHandoff();
|
|
43
|
+
} else {
|
|
44
|
+
console.warn('[NamiFlowManager] Native method registerStepHandoff is not available.');
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return () => {
|
|
48
|
+
subscription.remove();
|
|
49
|
+
};
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
resume: () => {
|
|
53
|
+
if (RNNamiFlowManager?.resume) {
|
|
54
|
+
RNNamiFlowManager.resume();
|
|
55
|
+
} else {
|
|
56
|
+
console.warn('[NamiFlowManager] Native method resume is not available.');
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
};
|
package/src/types.d.ts
CHANGED
|
@@ -56,17 +56,17 @@ export type NamiCampaign = {
|
|
|
56
56
|
form_factors: NamiFormFactor[];
|
|
57
57
|
external_segment: string | null;
|
|
58
58
|
};
|
|
59
|
-
type NamiFormFactor = {
|
|
60
|
-
form_factor: string;
|
|
61
|
-
supports_portrait?: boolean;
|
|
62
|
-
supports_landscape?: boolean;
|
|
63
|
-
}
|
|
64
59
|
export declare enum NamiCampaignRuleType {
|
|
65
60
|
DEFAULT = "default",
|
|
66
61
|
LABEL = "label",
|
|
67
62
|
UNKNOWN = "unknown",
|
|
68
63
|
URL = "url"
|
|
69
64
|
}
|
|
65
|
+
type NamiFormFactor = {
|
|
66
|
+
form_factor?: string;
|
|
67
|
+
supports_portrait?: boolean;
|
|
68
|
+
supports_landscape?: boolean;
|
|
69
|
+
};
|
|
70
70
|
export declare enum LaunchCampaignError {
|
|
71
71
|
DEFAULT_CAMPAIGN_NOT_FOUND = 0,
|
|
72
72
|
LABELED_CAMPAIGN_NOT_FOUND = 1,
|
|
@@ -205,3 +205,4 @@ export type NamiPaywallEventVideoMetadata = {
|
|
|
205
205
|
contentTimecode?: number;
|
|
206
206
|
contentDuration?: number;
|
|
207
207
|
};
|
|
208
|
+
export {};
|