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.
- package/.github/workflows/app_stg.yaml +203 -0
- package/.pre-commit-config.yaml +1 -1
- package/android/build.gradle +24 -13
- package/android/gradle/wrapper/gradle-wrapper.properties +5 -1
- package/android/src/main/java/com/nami/reactlibrary/NamiBridgeModule.kt +7 -51
- package/android/src/main/java/com/nami/reactlibrary/NamiBridgePackage.java +1 -0
- package/android/src/main/java/com/nami/reactlibrary/NamiCampaignManagerBridge.kt +136 -0
- package/android/src/main/java/com/nami/reactlibrary/NamiCustomerManagerBridge.kt +97 -18
- package/android/src/main/java/com/nami/reactlibrary/NamiEmitter.kt +24 -24
- package/android/src/main/java/com/nami/reactlibrary/NamiEntitlementManagerBridgeModule.kt +30 -129
- package/android/src/main/java/com/nami/reactlibrary/NamiPaywallManagerBridgeModule.kt +133 -149
- package/android/src/main/java/com/nami/reactlibrary/NamiPurchaseManagerBridge.kt +36 -38
- package/android/src/main/java/com/nami/reactlibrary/NamiUtil.kt +50 -180
- package/build-utils/get_version_code.py +140 -0
- package/index.d.ts +20 -0
- package/index.js +7 -6
- package/ios/Nami.m +9 -63
- package/ios/NamiBridgeUtil.h +4 -6
- package/ios/NamiBridgeUtil.m +16 -78
- package/ios/NamiCampaignManagerBridge.m +26 -0
- package/ios/NamiCampaignManagerBridge.swift +112 -0
- package/ios/NamiCustomerManager.m +22 -23
- package/ios/NamiCustomerManager.swift +132 -0
- package/ios/NamiEmitter.m +55 -65
- package/ios/NamiEntitlementManagerBridge.m +7 -107
- package/ios/NamiEntitlementManagerBridge.swift +74 -0
- package/ios/NamiMLManagerBridge.m +2 -2
- package/ios/NamiPaywallManagerBridge.m +22 -94
- package/ios/NamiPaywallManagerBridge.swift +93 -0
- package/ios/NamiPurchaseManagerBridge.m +38 -69
- package/ios/NamiPurchaseManagerBridge.swift +174 -0
- package/ios/Podfile +2 -2
- package/ios/RNNami-Bridging-Header.h +5 -0
- package/ios/RNNami.h +0 -1
- package/ios/RNNami.m +1 -1
- package/ios/RNNami.xcodeproj/project.pbxproj +83 -11
- package/ios/RNNami.xcodeproj/xcshareddata/xcschemes/RNNami.xcscheme +67 -0
- package/package.json +1 -1
- package/react-native-nami-sdk.podspec +3 -3
- package/src/Nami.d.ts +112 -0
- package/src/Nami.js +10 -0
- package/src/NamiCampaignManager.d.ts +57 -0
- package/src/NamiCampaignManager.js +54 -0
- package/src/NamiCustomerManager.d.ts +41 -0
- package/src/NamiCustomerManager.js +43 -0
- package/src/NamiEntitlementManager.d.ts +24 -0
- package/src/NamiEntitlementManager.js +23 -0
- package/src/NamiMLManager.d.ts +5 -0
- package/src/NamiMLManager.js +7 -0
- package/src/NamiPaywallManager.d.ts +82 -0
- package/src/NamiPaywallManager.js +37 -0
- package/src/NamiPurchaseManager.d.ts +57 -0
- package/src/NamiPurchaseManager.js +37 -0
- package/src/types.ts +36 -0
- package/android/src/main/java/com/nami/reactlibrary/NamiAnalyticsEmitter.kt +0 -121
- package/ios/NamiAnalyticsEmitter.m +0 -146
package/src/Nami.d.ts
ADDED
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
export const Nami: {
|
|
2
|
+
configure: (
|
|
3
|
+
config: NamiConfiguration,
|
|
4
|
+
resultCallback?: (resultObject: { success: boolean }) => void
|
|
5
|
+
) => void;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export type NamiConfiguration = {
|
|
9
|
+
"appPlatformID-apple": string;
|
|
10
|
+
"appPlatformID-android": string;
|
|
11
|
+
logLevel: string;
|
|
12
|
+
namiLanguageCode?: NamiLanguageCodes;
|
|
13
|
+
bypassStore?: boolean;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export type NamiLanguageCodes =
|
|
17
|
+
| "af"
|
|
18
|
+
| "ar"
|
|
19
|
+
| "ar-dz"
|
|
20
|
+
| "ast"
|
|
21
|
+
| "az"
|
|
22
|
+
| "bg"
|
|
23
|
+
| "be"
|
|
24
|
+
| "bn"
|
|
25
|
+
| "br"
|
|
26
|
+
| "bs"
|
|
27
|
+
| "ca"
|
|
28
|
+
| "cs"
|
|
29
|
+
| "cy"
|
|
30
|
+
| "da"
|
|
31
|
+
| "de"
|
|
32
|
+
| "dsb"
|
|
33
|
+
| "el"
|
|
34
|
+
| "en"
|
|
35
|
+
| "en-au"
|
|
36
|
+
| "en-gb"
|
|
37
|
+
| "eo"
|
|
38
|
+
| "es"
|
|
39
|
+
| "es-ar"
|
|
40
|
+
| "es-co"
|
|
41
|
+
| "es-mx"
|
|
42
|
+
| "es-ni"
|
|
43
|
+
| "es-ve"
|
|
44
|
+
| "et"
|
|
45
|
+
| "eu"
|
|
46
|
+
| "fa"
|
|
47
|
+
| "fi"
|
|
48
|
+
| "fr"
|
|
49
|
+
| "fy"
|
|
50
|
+
| "ga"
|
|
51
|
+
| "gd"
|
|
52
|
+
| "gl"
|
|
53
|
+
| "he"
|
|
54
|
+
| "hi"
|
|
55
|
+
| "hr"
|
|
56
|
+
| "hsb"
|
|
57
|
+
| "hu"
|
|
58
|
+
| "hy"
|
|
59
|
+
| "ia"
|
|
60
|
+
| "id"
|
|
61
|
+
| "ig"
|
|
62
|
+
| "io"
|
|
63
|
+
| "is"
|
|
64
|
+
| "it"
|
|
65
|
+
| "ja"
|
|
66
|
+
| "ka"
|
|
67
|
+
| "kab"
|
|
68
|
+
| "kk"
|
|
69
|
+
| "km"
|
|
70
|
+
| "kn"
|
|
71
|
+
| "ko"
|
|
72
|
+
| "ky"
|
|
73
|
+
| "lb"
|
|
74
|
+
| "lt"
|
|
75
|
+
| "lv"
|
|
76
|
+
| "mk"
|
|
77
|
+
| "ml"
|
|
78
|
+
| "mn"
|
|
79
|
+
| "mr"
|
|
80
|
+
| "my"
|
|
81
|
+
| "nb"
|
|
82
|
+
| "ne"
|
|
83
|
+
| "nl"
|
|
84
|
+
| "nn"
|
|
85
|
+
| "os"
|
|
86
|
+
| "pa"
|
|
87
|
+
| "pl"
|
|
88
|
+
| "pt"
|
|
89
|
+
| "pt-br"
|
|
90
|
+
| "ro"
|
|
91
|
+
| "ru"
|
|
92
|
+
| "sk"
|
|
93
|
+
| "sl"
|
|
94
|
+
| "sq"
|
|
95
|
+
| "sr"
|
|
96
|
+
| "sr-latn"
|
|
97
|
+
| "sv"
|
|
98
|
+
| "sw"
|
|
99
|
+
| "ta"
|
|
100
|
+
| "te"
|
|
101
|
+
| "tg"
|
|
102
|
+
| "th"
|
|
103
|
+
| "tk"
|
|
104
|
+
| "tr"
|
|
105
|
+
| "tt"
|
|
106
|
+
| "udm"
|
|
107
|
+
| "uk"
|
|
108
|
+
| "ur"
|
|
109
|
+
| "uz"
|
|
110
|
+
| "vi"
|
|
111
|
+
| "zh-hans"
|
|
112
|
+
| "zh-hant";
|
package/src/Nami.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { EmitterSubscription } from "react-native";
|
|
2
|
+
import { NamiPurchase } from "./NamiPurchaseManager";
|
|
3
|
+
import { NamiPaywallAction } from "./NamiPaywallManager";
|
|
4
|
+
|
|
5
|
+
export const NamiCampaignManager: {
|
|
6
|
+
allCampaigns: () => Promise<Array<NamiCampaign>>;
|
|
7
|
+
isCampaignAvailable: (label?: string) => boolean;
|
|
8
|
+
launch: (
|
|
9
|
+
label?: string,
|
|
10
|
+
resultCallback?: (success: boolean, error?: LaunchCampaignError) => void,
|
|
11
|
+
actionCallback?: (
|
|
12
|
+
action: NamiPaywallAction,
|
|
13
|
+
skuId?: string,
|
|
14
|
+
purchaseError?: string,
|
|
15
|
+
purchases?: NamiPurchase[],
|
|
16
|
+
campaignId?: string,
|
|
17
|
+
campaignLabel?: string,
|
|
18
|
+
paywallId?: string
|
|
19
|
+
) => void
|
|
20
|
+
) => void;
|
|
21
|
+
refresh: () => void;
|
|
22
|
+
registerAvailableCampaignsHandler: (
|
|
23
|
+
callback: (availableCampaigns: NamiCampaign[]) => void
|
|
24
|
+
) => EmitterSubscription["remove"];
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
export type NamiCampaign = {
|
|
28
|
+
id: string;
|
|
29
|
+
rule: string;
|
|
30
|
+
segment: string;
|
|
31
|
+
paywall: string;
|
|
32
|
+
type: NamiCampaignRuleType;
|
|
33
|
+
value?: string | null;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export enum NamiCampaignRuleType {
|
|
37
|
+
DEFAULT = "default",
|
|
38
|
+
LABEL = "label",
|
|
39
|
+
UNKNOWN = "unknown",
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
export enum LaunchCampaignError {
|
|
43
|
+
DEFAULT_CAMPAIGN_NOT_FOUND = 0,
|
|
44
|
+
LABELED_CAMPAIGN_NOT_FOUND = 1,
|
|
45
|
+
CAMPAIGN_DATA_NOT_FOUND = 2,
|
|
46
|
+
PAYWALL_ALREADY_DISPLAYED = 3,
|
|
47
|
+
SDK_NOT_INITIALIZED = 4,
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export enum LaunchCampaignResultAction {
|
|
51
|
+
FAILURE = "FAILURE",
|
|
52
|
+
SUCCESS = "SUCCESS",
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export type FailureResultObject = {
|
|
56
|
+
error: string;
|
|
57
|
+
};
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { NativeModules, NativeEventEmitter } from "react-native";
|
|
2
|
+
|
|
3
|
+
export const { RNNamiCampaignManager } = NativeModules;
|
|
4
|
+
|
|
5
|
+
export const NamiCampaignManager = {
|
|
6
|
+
launchSubscription: undefined,
|
|
7
|
+
emitter: new NativeEventEmitter(RNNamiCampaignManager),
|
|
8
|
+
...RNNamiCampaignManager,
|
|
9
|
+
launch(label, resultCallback, actionCallback) {
|
|
10
|
+
this.launchSubscription?.remove();
|
|
11
|
+
this.launchSubscription = this.emitter.addListener(
|
|
12
|
+
"ResultCampaign",
|
|
13
|
+
(body) => {
|
|
14
|
+
var action = body.action;
|
|
15
|
+
|
|
16
|
+
if (action.startsWith("NAMI_")) {
|
|
17
|
+
action = action.substring(5, action.length);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
var skuId = body.skuId;
|
|
21
|
+
var purchaseError = body.purchaseError;
|
|
22
|
+
var purchases = body.purchases;
|
|
23
|
+
var campaignId = body.campaignId;
|
|
24
|
+
var campaignLabel = body.campaignLabel;
|
|
25
|
+
var paywallId = body.paywallId;
|
|
26
|
+
actionCallback(
|
|
27
|
+
action,
|
|
28
|
+
skuId,
|
|
29
|
+
purchaseError,
|
|
30
|
+
purchases,
|
|
31
|
+
campaignId,
|
|
32
|
+
campaignLabel,
|
|
33
|
+
paywallId
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
);
|
|
37
|
+
RNNamiCampaignManager.launch(
|
|
38
|
+
label ?? null,
|
|
39
|
+
resultCallback ?? (() => {}),
|
|
40
|
+
actionCallback ?? (() => {})
|
|
41
|
+
);
|
|
42
|
+
},
|
|
43
|
+
isCampaignAvailable: (label) => {
|
|
44
|
+
return RNNamiCampaignManager.isCampaignAvailable(label ?? null);
|
|
45
|
+
},
|
|
46
|
+
registerAvailableCampaignsHandler(callback) {
|
|
47
|
+
const subscription = this.emitter.addListener(
|
|
48
|
+
"AvailableCampaignsChanged",
|
|
49
|
+
callback
|
|
50
|
+
);
|
|
51
|
+
RNNamiCampaignManager.registerAvailableCampaignsHandler();
|
|
52
|
+
return subscription.remove;
|
|
53
|
+
},
|
|
54
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { EmitterSubscription } from "react-native";
|
|
2
|
+
|
|
3
|
+
export const NamiCustomerManager: {
|
|
4
|
+
setCustomerAttribute: (key: string, value: string) => void;
|
|
5
|
+
getCustomerAttribute: (key: string) => Promise<string | undefined>;
|
|
6
|
+
clearCustomerAttribute: (key: string) => void;
|
|
7
|
+
clearAllCustomerAttributes: () => void;
|
|
8
|
+
journeyState: () => Promise<CustomerJourneyState | undefined>;
|
|
9
|
+
isLoggedIn: () => Promise<boolean>;
|
|
10
|
+
loggedInId: () => Promise<string | undefined>;
|
|
11
|
+
deviceId: () => Promise<string>;
|
|
12
|
+
login: (
|
|
13
|
+
customerId: string,
|
|
14
|
+
callback?: (success: boolean, error?: number) => void
|
|
15
|
+
) => void;
|
|
16
|
+
logout: (callback?: (success: boolean, error?: number) => void) => void;
|
|
17
|
+
registerJourneyStateHandler: (
|
|
18
|
+
callback: (journeyState: CustomerJourneyState) => void
|
|
19
|
+
) => EmitterSubscription["remove"];
|
|
20
|
+
registerAccountStateHandler: (
|
|
21
|
+
callback: (
|
|
22
|
+
action: AccountStateAction,
|
|
23
|
+
success: boolean,
|
|
24
|
+
error?: number
|
|
25
|
+
) => void
|
|
26
|
+
) => EmitterSubscription["remove"];
|
|
27
|
+
clearCustomerDataPlatformId: () => void;
|
|
28
|
+
setCustomerDataPlatformId: (platformId: string) => void;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export type CustomerJourneyState = {
|
|
32
|
+
formerSubscriber: boolean;
|
|
33
|
+
inGracePeriod: boolean;
|
|
34
|
+
inTrialPeriod: boolean;
|
|
35
|
+
inIntroOfferPeriod: boolean;
|
|
36
|
+
isCancelled: boolean;
|
|
37
|
+
inPause: boolean;
|
|
38
|
+
inAccountHold: boolean;
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export type AccountStateAction = "login" | "logout";
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { NativeModules, NativeEventEmitter, Platform } from "react-native";
|
|
2
|
+
|
|
3
|
+
export const { RNNamiCustomerManager } = NativeModules;
|
|
4
|
+
|
|
5
|
+
export const NamiCustomerManager = {
|
|
6
|
+
emitter: new NativeEventEmitter(RNNamiCustomerManager),
|
|
7
|
+
...RNNamiCustomerManager,
|
|
8
|
+
login: (customerId, callback) => {
|
|
9
|
+
if (Platform.OS === "ios") {
|
|
10
|
+
RNNamiCustomerManager.login(customerId, callback ?? (() => {}));
|
|
11
|
+
} else {
|
|
12
|
+
RNNamiCustomerManager.login(customerId);
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
logout: (callback) => {
|
|
16
|
+
if (Platform.OS === "ios") {
|
|
17
|
+
RNNamiCustomerManager.logout(callback ?? (() => {}));
|
|
18
|
+
} else {
|
|
19
|
+
RNNamiCustomerManager.logout();
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
registerJourneyStateHandler(callback) {
|
|
23
|
+
const subscription = this.emitter.addListener(
|
|
24
|
+
"JourneyStateChanged",
|
|
25
|
+
callback
|
|
26
|
+
);
|
|
27
|
+
RNNamiCustomerManager.registerJourneyStateHandler();
|
|
28
|
+
return subscription.remove;
|
|
29
|
+
},
|
|
30
|
+
registerAccountStateHandler(callback) {
|
|
31
|
+
const subscription = this.emitter.addListener(
|
|
32
|
+
"AccountStateChanged",
|
|
33
|
+
(body) => {
|
|
34
|
+
var action = body.action.toLowerCase();
|
|
35
|
+
var error = body.error;
|
|
36
|
+
var success = body.success;
|
|
37
|
+
callback(action, success, error);
|
|
38
|
+
}
|
|
39
|
+
);
|
|
40
|
+
RNNamiCustomerManager.registerAccountStateHandler();
|
|
41
|
+
return subscription.remove;
|
|
42
|
+
},
|
|
43
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { EmitterSubscription } from "react-native";
|
|
2
|
+
import { NamiPurchase } from "./NamiPurchaseManager";
|
|
3
|
+
import { NamiSKU } from "./types";
|
|
4
|
+
|
|
5
|
+
export const NamiEntitlementManager: {
|
|
6
|
+
active: () => Promise<Array<NamiEntitlement>>;
|
|
7
|
+
isEntitlementActive: (label?: string) => boolean;
|
|
8
|
+
refresh: (
|
|
9
|
+
resultCallback?: (entitlements?: NamiEntitlement[]) => void
|
|
10
|
+
) => void;
|
|
11
|
+
registerActiveEntitlementsHandler: (
|
|
12
|
+
callback: (activeEntitlements: NamiEntitlement[]) => void
|
|
13
|
+
) => EmitterSubscription["remove"];
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export type NamiEntitlement = {
|
|
17
|
+
activePurchases: NamiPurchase[];
|
|
18
|
+
desc: string;
|
|
19
|
+
name: string;
|
|
20
|
+
namiId: string;
|
|
21
|
+
purchasedSkus: NamiSKU[];
|
|
22
|
+
referenceId: string;
|
|
23
|
+
relatedSkus: NamiSKU[];
|
|
24
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { NativeModules, NativeEventEmitter, Platform } from "react-native";
|
|
2
|
+
|
|
3
|
+
export const { RNNamiEntitlementManager } = NativeModules;
|
|
4
|
+
|
|
5
|
+
export const NamiEntitlementManager = {
|
|
6
|
+
emitter: new NativeEventEmitter(RNNamiEntitlementManager),
|
|
7
|
+
...RNNamiEntitlementManager,
|
|
8
|
+
refresh(resultCallback) {
|
|
9
|
+
if (Platform.OS === "android") {
|
|
10
|
+
RNNamiEntitlementManager.refresh(resultCallback ?? (() => {}));
|
|
11
|
+
} else {
|
|
12
|
+
RNNamiEntitlementManager.refresh();
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
registerActiveEntitlementsHandler(callback) {
|
|
16
|
+
const subscription = this.emitter.addListener(
|
|
17
|
+
"EntitlementsChanged",
|
|
18
|
+
callback
|
|
19
|
+
);
|
|
20
|
+
RNNamiEntitlementManager.registerActiveEntitlementsHandler();
|
|
21
|
+
return subscription.remove;
|
|
22
|
+
},
|
|
23
|
+
};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { EmitterSubscription } from "react-native";
|
|
2
|
+
import { NamiSKU } from "./types";
|
|
3
|
+
|
|
4
|
+
export const NamiPaywallManager: {
|
|
5
|
+
buySkuCompleteIos: (purchaseSuccess: PurchaseSuccessIos) => void;
|
|
6
|
+
buySkuCompleteAmazon: (purchaseSuccess: PurchaseSuccessAmazon) => void;
|
|
7
|
+
buySkuCompleteGooglePlay: (
|
|
8
|
+
purchaseSuccess: PurchaseSuccessGooglePlay
|
|
9
|
+
) => void;
|
|
10
|
+
dismiss: (animated: boolean, callback: () => void) => void;
|
|
11
|
+
displayedViewController: () => void;
|
|
12
|
+
renderCustomUiHandler: () => any;
|
|
13
|
+
registerBuySkuHandler: (
|
|
14
|
+
callback: (sku: NamiSKU) => void
|
|
15
|
+
) => EmitterSubscription["remove"];
|
|
16
|
+
registerCloseHandler: (
|
|
17
|
+
blockDismiss: boolean,
|
|
18
|
+
callback: (resultObject: { blockingPaywallClosed: boolean }) => void
|
|
19
|
+
) => EmitterSubscription["remove"];
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export type PurchaseSuccessIos = {
|
|
23
|
+
product: PurchaseSuccessProduct;
|
|
24
|
+
transactionID: string;
|
|
25
|
+
originalTransactionID: string;
|
|
26
|
+
originalPurchaseDate: number;
|
|
27
|
+
purchaseDate: number;
|
|
28
|
+
expiresDate?: number;
|
|
29
|
+
price: string;
|
|
30
|
+
currencyCode: string;
|
|
31
|
+
locale: string;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
export type PurchaseSuccessGooglePlay = {
|
|
35
|
+
product: PurchaseSuccessProduct;
|
|
36
|
+
orderId: string;
|
|
37
|
+
purchaseDate: number;
|
|
38
|
+
expiresDate?: number;
|
|
39
|
+
purchaseToken: string;
|
|
40
|
+
purchaseSource: "CAMPAIGN" | "MARKETPLACE" | "UNKNOWN";
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export type PurchaseSuccessAmazon = {
|
|
44
|
+
product: PurchaseSuccessProduct;
|
|
45
|
+
purchaseDate: number;
|
|
46
|
+
expiresDate?: number;
|
|
47
|
+
purchaseSource: "CAMPAIGN" | "MARKETPLACE" | "UNKNOWN";
|
|
48
|
+
receiptId: string;
|
|
49
|
+
localizedPrice: string;
|
|
50
|
+
userId: string;
|
|
51
|
+
marketplace: string;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export type PurchaseSuccessProduct = {
|
|
55
|
+
id: string;
|
|
56
|
+
platformID: string;
|
|
57
|
+
skuId: string;
|
|
58
|
+
languageCode: string;
|
|
59
|
+
name: string;
|
|
60
|
+
featured: boolean;
|
|
61
|
+
storeId: string;
|
|
62
|
+
type: number;
|
|
63
|
+
isFeatured: boolean;
|
|
64
|
+
namiID: string;
|
|
65
|
+
};
|
|
66
|
+
|
|
67
|
+
export enum NamiPaywallAction {
|
|
68
|
+
BUY_SKU = "BUY_SKU",
|
|
69
|
+
SELECT_SKU = "SELECT_SKU",
|
|
70
|
+
RESTORE_PURCHASES = "RESTORE_PURCHASES",
|
|
71
|
+
SIGN_IN = "SIGN_IN",
|
|
72
|
+
CLOSE_PAYWALL = "CLOSE_PAYWALL",
|
|
73
|
+
SHOW_PAYWALL = "SHOW_PAYWALL",
|
|
74
|
+
PURCHASE_SELECTED_SKU = "PURCHASE_SELECTED_SKU",
|
|
75
|
+
PURCHASE_SUCCESS = "PURCHASE_SUCCESS",
|
|
76
|
+
PURCHASE_FAILED = "PURCHASE_FAILED",
|
|
77
|
+
PURCHASE_CANCELLED = "PURCHASE_CANCELLED",
|
|
78
|
+
PURCHASE_PENDING = "PURCHASE_PENDING",
|
|
79
|
+
PURCHASE_UNKNOWN = "PURCHASE_UNKNOWN",
|
|
80
|
+
PURCHASE_DEFERRED = "PURCHASE_DEFERRED",
|
|
81
|
+
SHOW_PAYWALL = "SHOW_PAYWALL",
|
|
82
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { NativeModules, NativeEventEmitter } from "react-native";
|
|
2
|
+
|
|
3
|
+
const { NamiPaywallManagerBridge, RNNamiPaywallManager } = NativeModules;
|
|
4
|
+
|
|
5
|
+
export const NamiPaywallManager = {
|
|
6
|
+
paywallEmitter: new NativeEventEmitter(RNNamiPaywallManager),
|
|
7
|
+
...RNNamiPaywallManager,
|
|
8
|
+
...NamiPaywallManagerBridge,
|
|
9
|
+
buySkuCompleteIos(purchaseSuccess) {
|
|
10
|
+
RNNamiPaywallManager.buySkuComplete(purchaseSuccess);
|
|
11
|
+
},
|
|
12
|
+
buySkuCompleteAmazon(purchaseSuccess) {
|
|
13
|
+
RNNamiPaywallManager.buySkuComplete(purchaseSuccess, "Amazon");
|
|
14
|
+
},
|
|
15
|
+
buySkuCompleteGooglePlay(purchaseSuccess) {
|
|
16
|
+
RNNamiPaywallManager.buySkuComplete(purchaseSuccess, "GooglePlay");
|
|
17
|
+
},
|
|
18
|
+
registerBuySkuHandler(callback) {
|
|
19
|
+
var subscription = this.paywallEmitter.addListener(
|
|
20
|
+
"RegisterBuySKU",
|
|
21
|
+
callback
|
|
22
|
+
);
|
|
23
|
+
RNNamiPaywallManager.registerBuySkuHandler();
|
|
24
|
+
return subscription.remove;
|
|
25
|
+
},
|
|
26
|
+
registerCloseHandler(blockDismiss, callback) {
|
|
27
|
+
var subscription;
|
|
28
|
+
subscription = this.paywallEmitter.addListener(
|
|
29
|
+
"BlockingPaywallClosed",
|
|
30
|
+
() => {
|
|
31
|
+
subscription.remove();
|
|
32
|
+
callback();
|
|
33
|
+
}
|
|
34
|
+
);
|
|
35
|
+
RNNamiPaywallManager.registerCloseHandler(blockDismiss);
|
|
36
|
+
},
|
|
37
|
+
};
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { EmitterSubscription } from "react-native";
|
|
2
|
+
import { NamiSKU } from "./types";
|
|
3
|
+
import { NamiEntitlement } from "./NamiEntitlementManager";
|
|
4
|
+
|
|
5
|
+
export const NamiPurchaseManager: {
|
|
6
|
+
allPurchases: () => NamiPurchase[];
|
|
7
|
+
anySkuPurchased: (skuIds: string[]) => boolean;
|
|
8
|
+
consumePurchasedSku: (skuId: string) => void;
|
|
9
|
+
clearBypassStorePurchases: () => void;
|
|
10
|
+
presentCodeRedemptionSheet: () => void;
|
|
11
|
+
restorePurchases: () => void;
|
|
12
|
+
skuPurchased: (skuId: string) => boolean;
|
|
13
|
+
registerPurchasesChangedHandler: (
|
|
14
|
+
callback: (
|
|
15
|
+
purchaseState: NamiPurchasesState,
|
|
16
|
+
purchases: NamiPurchase[],
|
|
17
|
+
error: string
|
|
18
|
+
) => void
|
|
19
|
+
) => EmitterSubscription["remove"];
|
|
20
|
+
registerRestorePurchasesHandler: (
|
|
21
|
+
callback: (
|
|
22
|
+
state: NamiRestorePurchasesState,
|
|
23
|
+
newPurchases: NamiPurchase[],
|
|
24
|
+
oldPurchases: NamiPurchase[]
|
|
25
|
+
) => void
|
|
26
|
+
) => EmitterSubscription["remove"];
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export type NamiPurchase = {
|
|
30
|
+
sku?: NamiSKU;
|
|
31
|
+
skuId: string;
|
|
32
|
+
transactionIdentifier?: string;
|
|
33
|
+
expires?: Date;
|
|
34
|
+
purchaseInitiatedTimestamp: Date;
|
|
35
|
+
purchaseSource?: "CAMPAIGN" | "MARKETPLACE" | "UNKNOWN";
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export enum NamiPurchaseState {
|
|
39
|
+
PURCHASED = "PURCHASED",
|
|
40
|
+
FAILED = "FAILED",
|
|
41
|
+
CANCELLED = "CANCELLEDd",
|
|
42
|
+
PENDING = "PENDING",
|
|
43
|
+
UNKNOWN = "UNKNOWN",
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export type NamiRestorePurchasesState = "started" | "finished" | "error";
|
|
47
|
+
|
|
48
|
+
export type NamiPurchasesState =
|
|
49
|
+
| "pending"
|
|
50
|
+
| "purchased"
|
|
51
|
+
| "consumed"
|
|
52
|
+
| "resubscribed"
|
|
53
|
+
| "unsubscribed"
|
|
54
|
+
| "deferred"
|
|
55
|
+
| "failed"
|
|
56
|
+
| "cancelled"
|
|
57
|
+
| "unknown";
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { NativeModules, NativeEventEmitter, Platform } from "react-native";
|
|
2
|
+
|
|
3
|
+
const { NamiPurchaseManagerBridge, RNNamiPurchaseManager } = NativeModules;
|
|
4
|
+
|
|
5
|
+
export const NamiPurchaseManager = {
|
|
6
|
+
emitter: new NativeEventEmitter(RNNamiPurchaseManager),
|
|
7
|
+
...NamiPurchaseManagerBridge,
|
|
8
|
+
...RNNamiPurchaseManager,
|
|
9
|
+
registerPurchasesChangedHandler(callback) {
|
|
10
|
+
const subscription = this.emitter.addListener(
|
|
11
|
+
"PurchasesChanged",
|
|
12
|
+
(body) => {
|
|
13
|
+
var purchases = body.purchases;
|
|
14
|
+
var purchaseState = body.purchaseState.toLowerCase();
|
|
15
|
+
var error = body.error;
|
|
16
|
+
callback(purchaseState, purchases, error);
|
|
17
|
+
}
|
|
18
|
+
);
|
|
19
|
+
RNNamiPurchaseManager.registerPurchasesChangedHandler();
|
|
20
|
+
return subscription.remove;
|
|
21
|
+
},
|
|
22
|
+
registerRestorePurchasesHandler(callback) {
|
|
23
|
+
if (Platform.OS === "ios") {
|
|
24
|
+
const subscription = this.emitter.addListener(
|
|
25
|
+
"RestorePurchasesStateChanged",
|
|
26
|
+
(body) => {
|
|
27
|
+
var state = body.state.toLowerCase();
|
|
28
|
+
var newPurchases = body.newPurchases;
|
|
29
|
+
var oldPurchases = body.oldPurchases;
|
|
30
|
+
callback(state, newPurchases, oldPurchases);
|
|
31
|
+
}
|
|
32
|
+
);
|
|
33
|
+
RNNamiPurchaseManager.registerRestorePurchasesHandler();
|
|
34
|
+
return subscription.remove;
|
|
35
|
+
}
|
|
36
|
+
},
|
|
37
|
+
};
|
package/src/types.ts
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export type NamiSKU = {
|
|
2
|
+
name: string;
|
|
3
|
+
skuId: string;
|
|
4
|
+
product?: SKProduct;
|
|
5
|
+
type: NamiSKUType;
|
|
6
|
+
};
|
|
7
|
+
|
|
8
|
+
export enum NamiPurchaseState {
|
|
9
|
+
PENDING = "pending",
|
|
10
|
+
PURCHASED = "purchased",
|
|
11
|
+
CONSUMED = "consumed",
|
|
12
|
+
RESUBSCRIBED = "resubscribed",
|
|
13
|
+
UNSUBSCRIBED = "unsubscribed",
|
|
14
|
+
DEFERRED = "deferred",
|
|
15
|
+
FAILED = "failed",
|
|
16
|
+
CANCELLED = "cancelled",
|
|
17
|
+
UNKNOWN = "unknown",
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export enum NamiRestorePurchasesState {
|
|
21
|
+
STARTED = "started",
|
|
22
|
+
FINISHED = "finished",
|
|
23
|
+
ERROR = "error",
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
export type NamiSKUType = "unknown" | "one_time_purchase" | "subscription";
|
|
27
|
+
|
|
28
|
+
export type SKProduct = {
|
|
29
|
+
localizedDescription: string;
|
|
30
|
+
localizedMultipliedPrice: string;
|
|
31
|
+
localizedPrice: string;
|
|
32
|
+
localizedTitle: string;
|
|
33
|
+
price: string;
|
|
34
|
+
priceCurrency: string;
|
|
35
|
+
priceLanguage: string;
|
|
36
|
+
};
|