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
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,10 @@
1
+ import { NativeModules } from "react-native";
2
+
3
+ export const { NamiBridge } = NativeModules;
4
+
5
+ export const Nami = {
6
+ ...NamiBridge,
7
+ configure(configureObj, resultCallback) {
8
+ NamiBridge.configure(configureObj, resultCallback ?? (() => {}));
9
+ },
10
+ };
@@ -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,5 @@
1
+ export const NamiMLManager: {
2
+ coreAction: (label: string) => void;
3
+ enterCoreContent: (label: string | string[]) => void;
4
+ exitCoreContent: (label: string | string[]) => void;
5
+ };
@@ -0,0 +1,7 @@
1
+ import { NativeModules } from "react-native";
2
+
3
+ export const { NamiMLManagerBridge } = NativeModules;
4
+
5
+ export const NamiMLManager = {
6
+ ...NamiMLManagerBridge
7
+ };
@@ -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
+ };