react-native-nami-sdk 3.3.0-beta.8 → 3.3.0
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/.prettierrc +4 -0
- package/README.md +9 -9
- package/android/README.md +3 -2
- package/android/build.gradle +27 -19
- package/android/gradle/wrapper/gradle-wrapper.properties +1 -1
- package/android/gradlew +0 -0
- package/android/src/main/AndroidManifest.xml +1 -1
- package/android/src/main/java/com/namiml/reactnative/Constants.kt +3 -0
- package/android/src/main/java/com/namiml/reactnative/NamiBridgeModule.kt +91 -0
- package/android/src/main/java/com/namiml/reactnative/NamiBridgePackage.java +140 -0
- package/android/src/main/java/com/{nami/reactlibrary → namiml/reactnative}/NamiCampaignManagerBridge.kt +24 -30
- package/android/src/main/java/com/{nami/reactlibrary → namiml/reactnative}/NamiCustomerManagerBridge.kt +14 -6
- package/android/src/main/java/com/{nami/reactlibrary/NamiEntitlementManagerBridgeModule.kt → namiml/reactnative/NamiEntitlementManagerBridge.kt} +18 -8
- package/android/src/main/java/com/namiml/reactnative/NamiFlowManagerBridge.kt +67 -0
- package/android/src/main/java/com/namiml/reactnative/NamiPaywallManagerBridgeModule.kt +196 -0
- package/android/src/main/java/com/namiml/reactnative/NamiPurchaseManagerBridge.kt +114 -0
- package/android/src/main/java/com/{nami/reactlibrary → namiml/reactnative}/NamiUtil.kt +26 -23
- package/{index.d.ts → dist/index.d.ts} +0 -2
- package/dist/specs/NativeNami.d.ts +15 -0
- package/dist/specs/NativeNamiCampaignManager.d.ts +82 -0
- package/dist/specs/NativeNamiCustomerManager.d.ts +29 -0
- package/dist/specs/NativeNamiEntitlementManager.d.ts +45 -0
- package/dist/specs/NativeNamiFlowManager.d.ts +8 -0
- package/dist/specs/NativeNamiPaywallManager.d.ts +71 -0
- package/dist/specs/NativeNamiPurchaseManager.d.ts +28 -0
- package/dist/src/Nami.d.ts +5 -0
- package/dist/src/NamiCampaignManager.d.ts +29 -0
- package/{src → dist/src}/NamiCustomerManager.d.ts +11 -13
- package/dist/src/NamiEntitlementManager.d.ts +13 -0
- package/dist/src/NamiFlowManager.d.ts +11 -0
- package/dist/src/NamiPaywallManager.d.ts +30 -0
- package/dist/src/NamiPurchaseManager.d.ts +17 -0
- package/dist/src/transformers.d.ts +3 -0
- package/{src → dist/src}/types.d.ts +35 -6
- package/dist/src/version.d.ts +5 -0
- package/index.ts +0 -2
- package/ios/Nami.m +8 -88
- package/ios/Nami.swift +85 -0
- package/ios/NamiCampaignManagerBridge.m +3 -3
- package/ios/NamiCampaignManagerBridge.swift +49 -61
- package/ios/NamiCustomerManager.m +2 -2
- package/ios/NamiCustomerManager.swift +13 -3
- package/ios/NamiEntitlementManagerBridge.m +2 -3
- package/ios/NamiEntitlementManagerBridge.swift +48 -39
- package/ios/NamiFlowManagerBridge.m +2 -2
- package/ios/NamiFlowManagerBridge.swift +10 -6
- package/ios/NamiPaywallManagerBridge.m +3 -3
- package/ios/NamiPaywallManagerBridge.swift +16 -6
- package/ios/NamiPurchaseManagerBridge.m +3 -2
- package/ios/NamiPurchaseManagerBridge.swift +15 -10
- package/ios/RNNami-Bridging-Header.h +1 -3
- package/package.json +20 -8
- package/react-native-config.js +9 -0
- package/react-native-nami-sdk.podspec +11 -3
- package/scripts/generate-version.ts +18 -0
- package/specs/NativeNami.ts +16 -0
- package/specs/NativeNamiCampaignManager.ts +94 -0
- package/specs/NativeNamiCustomerManager.ts +37 -0
- package/specs/NativeNamiEntitlementManager.ts +54 -0
- package/specs/NativeNamiFlowManager.ts +12 -0
- package/specs/NativeNamiPaywallManager.ts +85 -0
- package/specs/NativeNamiPurchaseManager.ts +33 -0
- package/src/Nami.ts +28 -18
- package/src/NamiCampaignManager.ts +57 -53
- package/src/NamiCustomerManager.ts +55 -81
- package/src/NamiEntitlementManager.ts +49 -36
- package/src/NamiFlowManager.ts +35 -45
- package/src/NamiPaywallManager.ts +84 -139
- package/src/NamiPurchaseManager.ts +69 -70
- package/src/transformers.ts +21 -0
- package/src/types.ts +39 -7
- package/src/version.ts +5 -0
- package/tsconfig.json +24 -22
- package/.eslintignore +0 -3
- package/.eslintrc.js +0 -52
- package/.github/workflows/CI.yaml +0 -341
- package/.github/workflows/app_prod.yaml +0 -387
- package/.github/workflows/app_stg.yaml +0 -398
- package/.github/workflows/build.yml +0 -70
- package/.pre-commit-config.yaml +0 -24
- package/.prettierrc.js +0 -7
- package/android/src/main/java/com/nami/reactlibrary/Constants.kt +0 -3
- package/android/src/main/java/com/nami/reactlibrary/NamiBridgeModule.kt +0 -141
- package/android/src/main/java/com/nami/reactlibrary/NamiBridgePackage.java +0 -51
- package/android/src/main/java/com/nami/reactlibrary/NamiFlowManagerBridge.kt +0 -60
- package/android/src/main/java/com/nami/reactlibrary/NamiMLManagerBridgeModule.kt +0 -58
- package/android/src/main/java/com/nami/reactlibrary/NamiManagerBridge.kt +0 -26
- package/android/src/main/java/com/nami/reactlibrary/NamiPaywallManagerBridgeModule.kt +0 -258
- package/android/src/main/java/com/nami/reactlibrary/NamiPurchaseManagerBridge.kt +0 -108
- package/build-utils/get_version_code.py +0 -140
- package/build-utils/preflight.py +0 -46
- package/ios/NamiMLManagerBridge.m +0 -93
- package/ios/NamiManager.m +0 -18
- package/ios/NamiManager.swift +0 -30
- package/ios/RNNami.h +0 -10
- package/ios/RNNami.m +0 -13
- package/src/Nami.d.ts +0 -8
- package/src/NamiCampaignManager.d.ts +0 -18
- package/src/NamiEntitlementManager.d.ts +0 -15
- package/src/NamiFlowManager.d.ts +0 -32
- package/src/NamiMLManager.d.ts +0 -7
- package/src/NamiMLManager.ts +0 -13
- package/src/NamiManager.d.ts +0 -5
- package/src/NamiManager.ts +0 -14
- package/src/NamiPaywallManager.d.ts +0 -34
- package/src/NamiPurchaseManager.d.ts +0 -20
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import type { TurboModule } from 'react-native';
|
|
2
|
+
export interface Spec extends TurboModule {
|
|
3
|
+
buySkuComplete(purchase: {
|
|
4
|
+
product: {
|
|
5
|
+
id: string;
|
|
6
|
+
skuId: string;
|
|
7
|
+
name?: string;
|
|
8
|
+
type: string;
|
|
9
|
+
};
|
|
10
|
+
transactionID?: string;
|
|
11
|
+
originalTransactionID?: string;
|
|
12
|
+
orderId?: string;
|
|
13
|
+
purchaseToken?: string;
|
|
14
|
+
receiptId?: string;
|
|
15
|
+
localizedPrice?: string;
|
|
16
|
+
userId?: string;
|
|
17
|
+
marketplace?: string;
|
|
18
|
+
price?: string;
|
|
19
|
+
currencyCode?: string;
|
|
20
|
+
}): void;
|
|
21
|
+
buySkuCompleteApple(purchase: {
|
|
22
|
+
product: {
|
|
23
|
+
id: string;
|
|
24
|
+
skuId: string;
|
|
25
|
+
name?: string;
|
|
26
|
+
type: string;
|
|
27
|
+
};
|
|
28
|
+
transactionID: string;
|
|
29
|
+
originalTransactionID: string;
|
|
30
|
+
price: string;
|
|
31
|
+
currencyCode: string;
|
|
32
|
+
}): void;
|
|
33
|
+
buySkuCompleteAmazon(purchase: {
|
|
34
|
+
product: {
|
|
35
|
+
id: string;
|
|
36
|
+
skuId: string;
|
|
37
|
+
name?: string;
|
|
38
|
+
type: string;
|
|
39
|
+
};
|
|
40
|
+
receiptId: string;
|
|
41
|
+
localizedPrice: string;
|
|
42
|
+
userId: string;
|
|
43
|
+
marketplace: string;
|
|
44
|
+
}): void;
|
|
45
|
+
buySkuCompleteGooglePlay(purchase: {
|
|
46
|
+
product: {
|
|
47
|
+
id: string;
|
|
48
|
+
skuId: string;
|
|
49
|
+
name?: string;
|
|
50
|
+
type: string;
|
|
51
|
+
};
|
|
52
|
+
orderId: string;
|
|
53
|
+
purchaseToken: string;
|
|
54
|
+
}): void;
|
|
55
|
+
registerBuySkuHandler(): void;
|
|
56
|
+
registerCloseHandler(): void;
|
|
57
|
+
registerSignInHandler(): void;
|
|
58
|
+
registerRestoreHandler(): void;
|
|
59
|
+
registerDeeplinkActionHandler(): void;
|
|
60
|
+
dismiss(): Promise<void>;
|
|
61
|
+
show(): void;
|
|
62
|
+
hide(): void;
|
|
63
|
+
isHidden(): Promise<boolean>;
|
|
64
|
+
isPaywallOpen(): Promise<boolean>;
|
|
65
|
+
buySkuCancel(): void;
|
|
66
|
+
setProductDetails(productDetails: string, allowOffers?: boolean): void;
|
|
67
|
+
setAppSuppliedVideoDetails(url: string, name?: string): void;
|
|
68
|
+
allowUserInteraction(allowed: boolean): void;
|
|
69
|
+
}
|
|
70
|
+
declare const _default: Spec;
|
|
71
|
+
export default _default;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { TurboModule } from 'react-native';
|
|
2
|
+
export interface Spec extends TurboModule {
|
|
3
|
+
allPurchases(): Promise<Array<{
|
|
4
|
+
skuId: string;
|
|
5
|
+
sku?: {
|
|
6
|
+
id: string;
|
|
7
|
+
skuId: string;
|
|
8
|
+
name?: string;
|
|
9
|
+
type: string;
|
|
10
|
+
promoId?: string;
|
|
11
|
+
promoToken?: string;
|
|
12
|
+
};
|
|
13
|
+
transactionIdentifier?: string;
|
|
14
|
+
purchaseToken?: string;
|
|
15
|
+
expires?: number;
|
|
16
|
+
purchaseInitiatedTimestamp: number;
|
|
17
|
+
purchaseSource?: 'CAMPAIGN' | 'MARKETPLACE' | 'UNKNOWN';
|
|
18
|
+
}>>;
|
|
19
|
+
skuPurchased(skuId: string): Promise<boolean>;
|
|
20
|
+
anySkuPurchased(skuIds: string[]): Promise<boolean>;
|
|
21
|
+
consumePurchasedSku(skuId: string): void;
|
|
22
|
+
presentCodeRedemptionSheet(): void;
|
|
23
|
+
restorePurchases(): void;
|
|
24
|
+
registerPurchasesChangedHandler(): void;
|
|
25
|
+
registerRestorePurchasesHandler(): void;
|
|
26
|
+
}
|
|
27
|
+
declare const _default: Spec;
|
|
28
|
+
export default _default;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { NativeEventEmitter } from 'react-native';
|
|
2
|
+
import type { PaywallLaunchContext, NamiCampaign } from './types';
|
|
3
|
+
export declare enum NamiCampaignManagerEvents {
|
|
4
|
+
AvailableCampaignsChanged = "AvailableCampaignsChanged",
|
|
5
|
+
NamiPaywallEvent = "NamiPaywallEvent"
|
|
6
|
+
}
|
|
7
|
+
export declare const NamiCampaignManager: {
|
|
8
|
+
emitter: NativeEventEmitter;
|
|
9
|
+
launchSubscription: ReturnType<NativeEventEmitter["addListener"]> | undefined;
|
|
10
|
+
launch(label: string | null, withUrl: string | null, context: PaywallLaunchContext | null, resultCallback?: (success: boolean, errorCode?: number | null) => void, actionCallback?: (event: any) => void): void;
|
|
11
|
+
allCampaigns: () => Promise<{
|
|
12
|
+
id?: string;
|
|
13
|
+
rule?: string;
|
|
14
|
+
segment?: string;
|
|
15
|
+
paywall?: string;
|
|
16
|
+
type: string;
|
|
17
|
+
value?: string;
|
|
18
|
+
}[]>;
|
|
19
|
+
isCampaignAvailable: (campaignName: string | null) => Promise<boolean>;
|
|
20
|
+
refresh: () => Promise<{
|
|
21
|
+
id?: string;
|
|
22
|
+
rule?: string;
|
|
23
|
+
segment?: string;
|
|
24
|
+
paywall?: string;
|
|
25
|
+
type: string;
|
|
26
|
+
value?: string;
|
|
27
|
+
}[]>;
|
|
28
|
+
registerAvailableCampaignsHandler: (callback: (campaigns: NamiCampaign[]) => void) => (() => void);
|
|
29
|
+
};
|
|
@@ -1,27 +1,25 @@
|
|
|
1
1
|
import { NativeEventEmitter, EmitterSubscription } from 'react-native';
|
|
2
|
-
import { AccountStateAction, CustomerJourneyState } from './types';
|
|
3
|
-
export declare const RNNamiCustomerManager: any;
|
|
2
|
+
import type { AccountStateAction, CustomerJourneyState } from './types';
|
|
4
3
|
export declare enum NamiCustomerManagerEvents {
|
|
5
4
|
JourneyStateChanged = "JourneyStateChanged",
|
|
6
5
|
AccountStateChanged = "AccountStateChanged"
|
|
7
6
|
}
|
|
8
|
-
export
|
|
7
|
+
export declare const NamiCustomerManager: {
|
|
9
8
|
emitter: NativeEventEmitter;
|
|
9
|
+
login: (customerId: string) => void;
|
|
10
|
+
logout: () => void;
|
|
10
11
|
setCustomerAttribute: (key: string, value: string) => void;
|
|
11
12
|
getCustomerAttribute: (key: string) => Promise<string | undefined>;
|
|
12
13
|
clearCustomerAttribute: (key: string) => void;
|
|
13
14
|
clearAllCustomerAttributes: () => void;
|
|
14
|
-
journeyState: () => Promise<CustomerJourneyState
|
|
15
|
+
journeyState: () => Promise<CustomerJourneyState>;
|
|
15
16
|
isLoggedIn: () => Promise<boolean>;
|
|
16
17
|
loggedInId: () => Promise<string | undefined>;
|
|
17
|
-
|
|
18
|
-
login: (customerId: string) => void;
|
|
19
|
-
logout: () => void;
|
|
20
|
-
registerJourneyStateHandler: (callback: (journeyState: CustomerJourneyState) => void) => EmitterSubscription['remove'];
|
|
21
|
-
registerAccountStateHandler: (callback: (action: AccountStateAction, success: boolean, error?: number) => void) => EmitterSubscription['remove'];
|
|
18
|
+
setCustomerDataPlatformId: (platformId: any) => void;
|
|
22
19
|
clearCustomerDataPlatformId: () => void;
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
setAnonymousMode: (anonymousMode: any) => void;
|
|
21
|
+
deviceId: () => Promise<string>;
|
|
25
22
|
inAnonymousMode: () => Promise<boolean>;
|
|
26
|
-
|
|
27
|
-
|
|
23
|
+
registerJourneyStateHandler: (callback: (state: CustomerJourneyState) => void) => EmitterSubscription["remove"];
|
|
24
|
+
registerAccountStateHandler: (callback: (action: AccountStateAction, success: boolean, error?: number) => void) => EmitterSubscription["remove"];
|
|
25
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { NativeEventEmitter, EmitterSubscription } from 'react-native';
|
|
2
|
+
import type { NamiEntitlement } from './types';
|
|
3
|
+
export declare enum NamiEntitlementManagerEvents {
|
|
4
|
+
EntitlementsChanged = "EntitlementsChanged"
|
|
5
|
+
}
|
|
6
|
+
export declare const NamiEntitlementManager: {
|
|
7
|
+
emitter: NativeEventEmitter;
|
|
8
|
+
active: () => Promise<NamiEntitlement[]>;
|
|
9
|
+
isEntitlementActive: (entitlementId: string) => Promise<boolean>;
|
|
10
|
+
refresh: (callback: (entitlements: NamiEntitlement[]) => void) => EmitterSubscription["remove"];
|
|
11
|
+
registerActiveEntitlementsHandler: (callback: (entitlements: NamiEntitlement[]) => void) => EmitterSubscription["remove"];
|
|
12
|
+
clearProvisionalEntitlementGrants: () => void;
|
|
13
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { NativeEventEmitter } from 'react-native';
|
|
2
|
+
export declare enum NamiFlowManagerEvents {
|
|
3
|
+
Handoff = "Handoff",
|
|
4
|
+
FlowEvent = "FlowEvent"
|
|
5
|
+
}
|
|
6
|
+
export declare const NamiFlowManager: {
|
|
7
|
+
emitter: NativeEventEmitter;
|
|
8
|
+
registerStepHandoff: (callback: (handoffTag: string, handoffData?: Record<string, unknown>) => void) => (() => void);
|
|
9
|
+
resume: () => void;
|
|
10
|
+
registerEventHandler: (callback: (payload: Record<string, unknown>) => void) => (() => void);
|
|
11
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { NativeEventEmitter } from 'react-native';
|
|
2
|
+
import type { NamiPurchaseDetails, NamiPurchaseSuccessApple, NamiPurchaseSuccessAmazon, NamiPurchaseSuccessGooglePlay, NamiSKU } from '../src/types';
|
|
3
|
+
export declare enum NamiPaywallManagerEvents {
|
|
4
|
+
BuySku = "RegisterBuySKU",
|
|
5
|
+
Close = "PaywallCloseRequested",
|
|
6
|
+
SignIn = "PaywallSignInRequested",
|
|
7
|
+
Restore = "PaywallRestoreRequested",
|
|
8
|
+
DeeplinkAction = "PaywallDeeplinkAction"
|
|
9
|
+
}
|
|
10
|
+
export declare const NamiPaywallManager: {
|
|
11
|
+
emitter: NativeEventEmitter;
|
|
12
|
+
buySkuComplete: (purchase: NamiPurchaseDetails) => void;
|
|
13
|
+
buySkuCompleteApple: (purchase: NamiPurchaseSuccessApple) => void;
|
|
14
|
+
buySkuCompleteAmazon: (purchase: NamiPurchaseSuccessAmazon) => void;
|
|
15
|
+
buySkuCompleteGooglePlay: (purchase: NamiPurchaseSuccessGooglePlay) => void;
|
|
16
|
+
registerBuySkuHandler: (callback: (sku: NamiSKU) => void) => (() => void);
|
|
17
|
+
registerCloseHandler: (callback: () => void) => (() => void);
|
|
18
|
+
registerSignInHandler: (callback: () => void) => (() => void);
|
|
19
|
+
registerRestoreHandler: (callback: () => void) => (() => void);
|
|
20
|
+
registerDeeplinkActionHandler: (callback: (url: string) => void) => (() => void);
|
|
21
|
+
dismiss: () => Promise<boolean>;
|
|
22
|
+
show: () => void;
|
|
23
|
+
hide: () => void;
|
|
24
|
+
isHidden: () => Promise<boolean>;
|
|
25
|
+
isPaywallOpen: () => Promise<boolean>;
|
|
26
|
+
buySkuCancel: () => void;
|
|
27
|
+
setProductDetails: (productDetails: string, allowOffers?: boolean) => void;
|
|
28
|
+
setAppSuppliedVideoDetails: (url: string, name?: string) => void;
|
|
29
|
+
allowUserInteraction: (allowed: boolean) => void;
|
|
30
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { NativeEventEmitter } from 'react-native';
|
|
2
|
+
import { NamiPurchase, NamiPurchasesState, NamiRestorePurchasesState } from './types';
|
|
3
|
+
export declare enum NamiPurchaseManagerEvents {
|
|
4
|
+
PurchasesChanged = "PurchasesChanged",
|
|
5
|
+
RestorePurchasesStateChanged = "RestorePurchasesStateChanged"
|
|
6
|
+
}
|
|
7
|
+
export declare const NamiPurchaseManager: {
|
|
8
|
+
emitter: NativeEventEmitter;
|
|
9
|
+
allPurchases: () => Promise<NamiPurchase[]>;
|
|
10
|
+
skuPurchased: (skuId: string) => Promise<boolean>;
|
|
11
|
+
anySkuPurchased: (skuIds: string[]) => Promise<boolean>;
|
|
12
|
+
consumePurchasedSku: (skuId: string) => void;
|
|
13
|
+
presentCodeRedemptionSheet: () => void;
|
|
14
|
+
restorePurchases: () => void;
|
|
15
|
+
registerPurchasesChangedHandler: (callback: (state: NamiPurchasesState, purchases: NamiPurchase[], error: string) => void) => (() => void);
|
|
16
|
+
registerRestorePurchasesHandler: (callback: (state: NamiRestorePurchasesState, newPurchases: NamiPurchase[], oldPurchases: NamiPurchase[]) => void) => (() => void);
|
|
17
|
+
};
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
export type NamiConfiguration = {
|
|
2
|
-
|
|
3
|
-
'appPlatformID-android': string;
|
|
2
|
+
appPlatformID: string;
|
|
4
3
|
logLevel: string;
|
|
5
4
|
namiCommands?: string[];
|
|
6
5
|
namiLanguageCode?: NamiLanguageCodes;
|
|
@@ -44,8 +43,8 @@ export type AppleProduct = {
|
|
|
44
43
|
priceCurrency: string;
|
|
45
44
|
priceLanguage: string;
|
|
46
45
|
};
|
|
47
|
-
export type GoogleProduct =
|
|
48
|
-
export type AmazonProduct =
|
|
46
|
+
export type GoogleProduct = Record<string, never>;
|
|
47
|
+
export type AmazonProduct = Record<string, never>;
|
|
49
48
|
export type NamiCampaign = {
|
|
50
49
|
name: string;
|
|
51
50
|
rule: string;
|
|
@@ -91,7 +90,7 @@ export type PaywallLaunchContext = {
|
|
|
91
90
|
[key: string]: string;
|
|
92
91
|
};
|
|
93
92
|
customObject?: {
|
|
94
|
-
[key: string]:
|
|
93
|
+
[key: string]: unknown;
|
|
95
94
|
};
|
|
96
95
|
};
|
|
97
96
|
export type CustomerJourneyState = {
|
|
@@ -108,11 +107,23 @@ export type NamiEntitlement = {
|
|
|
108
107
|
activePurchases: NamiPurchase[];
|
|
109
108
|
desc: string;
|
|
110
109
|
name: string;
|
|
111
|
-
namiId: string;
|
|
112
110
|
purchasedSkus: NamiSKU[];
|
|
113
111
|
referenceId: string;
|
|
114
112
|
relatedSkus: NamiSKU[];
|
|
115
113
|
};
|
|
114
|
+
export type NamiPurchaseDetails = {
|
|
115
|
+
product: NamiSKU;
|
|
116
|
+
transactionID?: string;
|
|
117
|
+
originalTransactionID?: string;
|
|
118
|
+
orderId?: string;
|
|
119
|
+
purchaseToken?: string;
|
|
120
|
+
receiptId?: string;
|
|
121
|
+
localizedPrice?: string;
|
|
122
|
+
price?: string;
|
|
123
|
+
currencyCode?: string;
|
|
124
|
+
userId?: string;
|
|
125
|
+
marketplace?: string;
|
|
126
|
+
};
|
|
116
127
|
export type NamiPurchaseSuccessApple = {
|
|
117
128
|
product: NamiSKU;
|
|
118
129
|
transactionID: string;
|
|
@@ -170,6 +181,15 @@ export type NamiPurchase = {
|
|
|
170
181
|
purchaseInitiatedTimestamp: Date;
|
|
171
182
|
purchaseSource?: 'CAMPAIGN' | 'MARKETPLACE' | 'UNKNOWN';
|
|
172
183
|
};
|
|
184
|
+
export type NamiPurchaseFromBridge = {
|
|
185
|
+
sku?: NamiSKU;
|
|
186
|
+
skuId: string;
|
|
187
|
+
transactionIdentifier?: string;
|
|
188
|
+
purchaseToken?: string;
|
|
189
|
+
expires?: number;
|
|
190
|
+
purchaseInitiatedTimestamp: number;
|
|
191
|
+
purchaseSource?: 'CAMPAIGN' | 'MARKETPLACE' | 'UNKNOWN';
|
|
192
|
+
};
|
|
173
193
|
export type NamiPurchasesState = 'pending' | 'purchased' | 'consumed' | 'resubscribed' | 'unsubscribed' | 'deferred' | 'failed' | 'cancelled' | 'unknown';
|
|
174
194
|
export type NamiPaywallEvent = {
|
|
175
195
|
action: NamiPaywallAction;
|
|
@@ -205,4 +225,13 @@ export type NamiPaywallEventVideoMetadata = {
|
|
|
205
225
|
contentTimecode?: number;
|
|
206
226
|
contentDuration?: number;
|
|
207
227
|
};
|
|
228
|
+
export type NamiFlowHandoffPayload = {
|
|
229
|
+
handoffTag: string;
|
|
230
|
+
handoffData?: Record<string, unknown>;
|
|
231
|
+
};
|
|
232
|
+
export type NamiAccountStateEvent = {
|
|
233
|
+
action: AccountStateAction;
|
|
234
|
+
success: boolean;
|
|
235
|
+
error?: number;
|
|
236
|
+
};
|
|
208
237
|
export {};
|
package/index.ts
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
export { Nami } from './src/Nami';
|
|
2
|
-
export { NamiMLManager } from './src/NamiMLManager';
|
|
3
2
|
export { NamiCampaignManager } from './src/NamiCampaignManager';
|
|
4
3
|
export { NamiCustomerManager } from './src/NamiCustomerManager';
|
|
5
4
|
export { NamiEntitlementManager } from './src/NamiEntitlementManager';
|
|
6
|
-
export { NamiManager } from './src/NamiManager';
|
|
7
5
|
export { NamiPurchaseManager } from './src/NamiPurchaseManager';
|
|
8
6
|
export { NamiPaywallManager } from './src/NamiPaywallManager';
|
|
9
7
|
export { NamiFlowManager } from './src/NamiFlowManager';
|
package/ios/Nami.m
CHANGED
|
@@ -2,100 +2,20 @@
|
|
|
2
2
|
// Nami.m
|
|
3
3
|
// RNNami
|
|
4
4
|
//
|
|
5
|
-
// Copyright © 2020-
|
|
5
|
+
// Copyright © 2020-2025 Nami ML Inc. All rights reserved.
|
|
6
6
|
//
|
|
7
|
-
|
|
8
|
-
#import <Foundation/Foundation.h>
|
|
9
|
-
#import <NamiApple/NamiApple.h>
|
|
10
|
-
|
|
11
7
|
#import <React/RCTBridgeModule.h>
|
|
12
|
-
#import <React/RCTEventEmitter.h>
|
|
13
|
-
|
|
14
|
-
#import "React/RCTViewManager.h"
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
@interface NamiBridge : NSObject <RCTBridgeModule>
|
|
19
|
-
@end
|
|
20
|
-
@implementation NamiBridge (RCTExternModule)
|
|
21
|
-
|
|
22
|
-
RCT_EXPORT_METHOD(configure: (NSDictionary *)configDict completion: (RCTResponseSenderBlock) completion) {
|
|
23
|
-
NSString *appID = configDict[@"appPlatformID-apple"];
|
|
24
|
-
|
|
25
|
-
if ([appID length] > 0 ) {
|
|
26
|
-
NamiConfiguration *config = [NamiConfiguration configurationForAppPlatformId:appID];
|
|
27
|
-
NSLog(@"NAMI: RN Bridge - appPlatformId: %@", appID);
|
|
28
|
-
|
|
29
|
-
NSString *logLevelString = configDict[@"logLevel"];
|
|
30
|
-
if ([logLevelString isEqualToString:@"ERROR" ]) {
|
|
31
|
-
config.logLevel = NamiLogLevelError;
|
|
32
|
-
} else if ([logLevelString isEqualToString:@"INFO" ]) {
|
|
33
|
-
config.logLevel = NamiLogLevelInfo;
|
|
34
|
-
} else if ([logLevelString isEqualToString:@"WARNING" ]) {
|
|
35
|
-
config.logLevel = NamiLogLevelWarn;
|
|
36
|
-
} else {
|
|
37
|
-
// If they messed up the params, just set logging to full.
|
|
38
|
-
config.logLevel = NamiLogLevelDebug;
|
|
39
|
-
}
|
|
40
8
|
|
|
41
|
-
|
|
42
|
-
if ([languageString length] > 0) {
|
|
43
|
-
NSLog(@"NAMI: RN Bridge - language code: %@", languageString);
|
|
44
|
-
if ([[NamiLanguageCodes allAvailableNamiLanguageCodes]
|
|
45
|
-
containsObject:[languageString lowercaseString]] ) {
|
|
46
|
-
config.namiLanguageCode = languageString;
|
|
47
|
-
} else {
|
|
48
|
-
NSLog(@"Warning: Nami language code from config dictionary %@ not found in list of available Nami Language Codes:\n%@", languageString, [NamiLanguageCodes allAvailableNamiLanguageCodes]);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
9
|
+
@interface RCT_EXTERN_MODULE(RNNami, NSObject)
|
|
51
10
|
|
|
52
|
-
|
|
53
|
-
|
|
11
|
+
RCT_EXTERN_METHOD(configure:(NSDictionary *)configDict
|
|
12
|
+
resolver:(RCTPromiseResolveBlock)resolve
|
|
13
|
+
rejecter:(RCTPromiseRejectBlock)reject)
|
|
54
14
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
if ( appCommandStrings != NULL ) {
|
|
58
|
-
NSLog(@"NAMI: RN Bridge - additional config settings %@", configDict[@"namiCommands"]);
|
|
59
|
-
if ([appCommandStrings isKindOfClass:[NSArray class]] ) {
|
|
60
|
-
for (NSObject *commandObj in ((NSArray *)appCommandStrings)){
|
|
61
|
-
if ([commandObj isKindOfClass:[NSString class]]) {
|
|
62
|
-
[namiCommandStrings addObject:(NSString *)commandObj];
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
config.namiCommands = namiCommandStrings;
|
|
69
|
-
|
|
70
|
-
NSString *initialConfigString = configDict[@"initialConfig"];
|
|
71
|
-
if ([initialConfigString length] > 0) {
|
|
72
|
-
NSLog(@"NAMI: RN Bridge - Found an initialConfig file to use for Nami SDK setup.");
|
|
73
|
-
config.initialConfig = initialConfigString;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
[Nami configureWith:config :^(BOOL sdkConfigured) {
|
|
77
|
-
if ( sdkConfigured == YES ) {
|
|
78
|
-
NSDictionary *dict = @{@"success": @YES};
|
|
79
|
-
completion(@[dict]);
|
|
80
|
-
} else {
|
|
81
|
-
NSDictionary *dict = @{@"success": @NO};
|
|
82
|
-
completion(@[dict]);
|
|
83
|
-
}
|
|
84
|
-
}];
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
@end
|
|
89
|
-
|
|
90
|
-
@implementation NamiBridge
|
|
91
|
-
RCT_EXPORT_MODULE_NO_LOAD(NamiBridge, NamiBridge)
|
|
92
|
-
|
|
93
|
-
- (dispatch_queue_t)methodQueue
|
|
94
|
-
{
|
|
95
|
-
return dispatch_get_main_queue();
|
|
96
|
-
}
|
|
15
|
+
RCT_EXTERN_METHOD(sdkConfigured:(RCTPromiseResolveBlock)resolve
|
|
16
|
+
rejecter:(RCTPromiseRejectBlock)reject)
|
|
97
17
|
|
|
98
18
|
+ (BOOL)requiresMainQueueSetup {
|
|
99
|
-
|
|
19
|
+
return NO;
|
|
100
20
|
}
|
|
101
21
|
@end
|
package/ios/Nami.swift
ADDED
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Nami.swift
|
|
3
|
+
// RNNami
|
|
4
|
+
//
|
|
5
|
+
// Copyright © 2020-2025 Nami ML Inc. All rights reserved.
|
|
6
|
+
//
|
|
7
|
+
import Foundation
|
|
8
|
+
import NamiApple
|
|
9
|
+
import React
|
|
10
|
+
|
|
11
|
+
#if RCT_NEW_ARCH_ENABLED
|
|
12
|
+
import React_RCTTurboModule
|
|
13
|
+
|
|
14
|
+
extension RNNami: RCTTurboModule {}
|
|
15
|
+
#endif
|
|
16
|
+
|
|
17
|
+
@objc(RNNami)
|
|
18
|
+
class RNNami: NSObject {
|
|
19
|
+
static func moduleName() -> String! {
|
|
20
|
+
return "RNNami"
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
@objc
|
|
24
|
+
func configure(
|
|
25
|
+
_ configDict: NSDictionary,
|
|
26
|
+
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
27
|
+
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
28
|
+
) {
|
|
29
|
+
guard let appID = configDict["appPlatformID"] as? String, !appID.isEmpty else {
|
|
30
|
+
reject("missing_app_id", "The appPlatformID is required.", nil)
|
|
31
|
+
return
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
let config = NamiConfiguration(appPlatformId: appID)
|
|
35
|
+
NSLog("RNNami: Configure with appPlatformId: %@", appID)
|
|
36
|
+
|
|
37
|
+
if isNewArchitectureEnabled() {
|
|
38
|
+
NSLog("RNNami: New Architecture is ENABLED")
|
|
39
|
+
} else {
|
|
40
|
+
NSLog("RNNami: New Architecture is DISABLED")
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
if let logLevelString = configDict["logLevel"] as? String {
|
|
44
|
+
config.logLevel = {
|
|
45
|
+
switch logLevelString.uppercased() {
|
|
46
|
+
case "ERROR": return .error
|
|
47
|
+
case "INFO": return .info
|
|
48
|
+
case "WARNING": return .warn
|
|
49
|
+
default: return .debug
|
|
50
|
+
}
|
|
51
|
+
}()
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if let languageCode = configDict["namiLanguageCode"] as? String,
|
|
55
|
+
NamiLanguageCodes.allAvailableNamiLanguageCodes.contains(where: { $0.caseInsensitiveCompare(languageCode) == .orderedSame })
|
|
56
|
+
{
|
|
57
|
+
config.namiLanguageCode = languageCode
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
if let commands = configDict["namiCommands"] as? [String] {
|
|
61
|
+
config.namiCommands = commands
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if let initialConfig = configDict["initialConfig"] as? String {
|
|
65
|
+
config.initialConfig = initialConfig
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
Nami.configure(with: config) { sdkConfigured in
|
|
69
|
+
resolve(["success": sdkConfigured])
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
@objc
|
|
74
|
+
func sdkConfigured(_ resolve: RCTPromiseResolveBlock, rejecter _: RCTPromiseRejectBlock) {
|
|
75
|
+
resolve(Nami.sdkConfigured())
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
func isNewArchitectureEnabled() -> Bool {
|
|
79
|
+
#if RCT_NEW_ARCH_ENABLED
|
|
80
|
+
return true
|
|
81
|
+
#else
|
|
82
|
+
return false
|
|
83
|
+
#endif
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
//
|
|
2
|
-
//
|
|
2
|
+
// NamiCampaignManagerBridge.m
|
|
3
3
|
// RNNami
|
|
4
4
|
//
|
|
5
|
-
// Copyright ©
|
|
5
|
+
// Copyright © 2020-2025 Nami ML Inc. All rights reserved.
|
|
6
6
|
//
|
|
7
7
|
|
|
8
8
|
#import <React/RCTBridgeModule.h>
|
|
@@ -20,7 +20,7 @@ RCT_EXTERN_METHOD(refresh:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRe
|
|
|
20
20
|
RCT_EXTERN_METHOD(registerAvailableCampaignsHandler)
|
|
21
21
|
|
|
22
22
|
+ (BOOL)requiresMainQueueSetup {
|
|
23
|
-
return
|
|
23
|
+
return NO;
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
@end
|