react-native-nami-sdk 3.3.0-beta.8 → 3.3.1
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 +97 -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 +25 -32
- 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 +79 -0
- package/android/src/main/java/com/namiml/reactnative/NamiPaywallManagerBridgeModule.kt +197 -0
- package/android/src/main/java/com/namiml/reactnative/NamiPurchaseManagerBridge.kt +107 -0
- package/android/src/main/java/com/{nami/reactlibrary → namiml/reactnative}/NamiUtil.kt +61 -23
- package/{index.d.ts → dist/index.d.ts} +0 -2
- package/dist/specs/NativeNami.d.ts +16 -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 +10 -0
- package/dist/specs/NativeNamiPaywallManager.d.ts +72 -0
- package/dist/specs/NativeNamiPurchaseManager.d.ts +27 -0
- package/dist/src/Nami.d.ts +6 -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 +13 -0
- package/dist/src/NamiPaywallManager.d.ts +30 -0
- package/dist/src/NamiPurchaseManager.d.ts +16 -0
- package/dist/src/transformers.d.ts +3 -0
- package/{src → dist/src}/types.d.ts +36 -6
- package/dist/src/version.d.ts +5 -0
- package/index.ts +0 -2
- package/ios/Nami.m +9 -87
- package/ios/Nami.swift +89 -0
- package/ios/NamiCampaignManagerBridge.m +3 -3
- package/ios/NamiCampaignManagerBridge.swift +47 -61
- package/ios/NamiCustomerManager.m +2 -2
- package/ios/NamiCustomerManager.swift +11 -3
- package/ios/NamiEntitlementManagerBridge.m +2 -3
- package/ios/NamiEntitlementManagerBridge.swift +47 -39
- package/ios/NamiFlowManagerBridge.m +4 -2
- package/ios/NamiFlowManagerBridge.swift +27 -6
- package/ios/NamiPaywallManagerBridge.m +3 -3
- package/ios/NamiPaywallManagerBridge.swift +24 -6
- package/ios/NamiPurchaseManagerBridge.m +3 -4
- package/ios/NamiPurchaseManagerBridge.swift +14 -15
- 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 +17 -3
- package/scripts/generate-version.ts +18 -0
- package/specs/NativeNami.ts +17 -0
- package/specs/NativeNamiCampaignManager.ts +94 -0
- package/specs/NativeNamiCustomerManager.ts +37 -0
- package/specs/NativeNamiEntitlementManager.ts +54 -0
- package/specs/NativeNamiFlowManager.ts +13 -0
- package/specs/NativeNamiPaywallManager.ts +86 -0
- package/specs/NativeNamiPurchaseManager.ts +32 -0
- package/src/Nami.ts +31 -18
- package/src/NamiCampaignManager.ts +57 -53
- package/src/NamiCustomerManager.ts +55 -81
- package/src/NamiEntitlementManager.ts +49 -36
- package/src/NamiFlowManager.ts +42 -44
- package/src/NamiPaywallManager.ts +84 -139
- package/src/NamiPurchaseManager.ts +66 -70
- package/src/transformers.ts +21 -0
- package/src/types.ts +40 -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,29 @@
|
|
|
1
|
+
import type { TurboModule } from 'react-native';
|
|
2
|
+
export interface Spec extends TurboModule {
|
|
3
|
+
setCustomerAttribute(key: string, value: string): void;
|
|
4
|
+
getCustomerAttribute(key: string): Promise<string | null>;
|
|
5
|
+
clearCustomerAttribute(key: string): void;
|
|
6
|
+
clearAllCustomerAttributes(): void;
|
|
7
|
+
setCustomerDataPlatformId(platformId: string): void;
|
|
8
|
+
clearCustomerDataPlatformId(): void;
|
|
9
|
+
setAnonymousMode(anonymousMode: boolean): void;
|
|
10
|
+
inAnonymousMode(): Promise<boolean>;
|
|
11
|
+
journeyState(): Promise<{
|
|
12
|
+
formerSubscriber: boolean;
|
|
13
|
+
inGracePeriod: boolean;
|
|
14
|
+
inTrialPeriod: boolean;
|
|
15
|
+
inIntroOfferPeriod: boolean;
|
|
16
|
+
isCancelled: boolean;
|
|
17
|
+
inPause: boolean;
|
|
18
|
+
inAccountHold: boolean;
|
|
19
|
+
}>;
|
|
20
|
+
isLoggedIn(): Promise<boolean>;
|
|
21
|
+
loggedInId(): Promise<string | null>;
|
|
22
|
+
deviceId(): Promise<string>;
|
|
23
|
+
login(customerId: string): void;
|
|
24
|
+
logout(): void;
|
|
25
|
+
registerJourneyStateHandler(): void;
|
|
26
|
+
registerAccountStateHandler(): void;
|
|
27
|
+
}
|
|
28
|
+
declare const _default: Spec;
|
|
29
|
+
export default _default;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { TurboModule } from 'react-native';
|
|
2
|
+
export interface Spec extends TurboModule {
|
|
3
|
+
isEntitlementActive(referenceId?: string): Promise<boolean>;
|
|
4
|
+
active(): Promise<Array<{
|
|
5
|
+
referenceId: string;
|
|
6
|
+
desc?: string;
|
|
7
|
+
name?: string;
|
|
8
|
+
purchasedSkus: Array<{
|
|
9
|
+
id: string;
|
|
10
|
+
skuId: string;
|
|
11
|
+
name?: string;
|
|
12
|
+
type: string;
|
|
13
|
+
promoId?: string;
|
|
14
|
+
promoToken?: string;
|
|
15
|
+
}>;
|
|
16
|
+
relatedSkus: Array<{
|
|
17
|
+
id: string;
|
|
18
|
+
skuId: string;
|
|
19
|
+
name?: string;
|
|
20
|
+
type: string;
|
|
21
|
+
promoId?: string;
|
|
22
|
+
promoToken?: string;
|
|
23
|
+
}>;
|
|
24
|
+
activePurchases: Array<{
|
|
25
|
+
skuId: string;
|
|
26
|
+
transactionIdentifier?: string;
|
|
27
|
+
expires?: string;
|
|
28
|
+
purchaseInitiatedTimestamp: string;
|
|
29
|
+
purchaseSource?: string;
|
|
30
|
+
sku?: {
|
|
31
|
+
id: string;
|
|
32
|
+
skuId: string;
|
|
33
|
+
name?: string;
|
|
34
|
+
type: string;
|
|
35
|
+
promoId?: string;
|
|
36
|
+
promoToken?: string;
|
|
37
|
+
};
|
|
38
|
+
}>;
|
|
39
|
+
}>>;
|
|
40
|
+
refresh(): void;
|
|
41
|
+
registerActiveEntitlementsHandler(): void;
|
|
42
|
+
clearProvisionalEntitlementGrants(): void;
|
|
43
|
+
}
|
|
44
|
+
declare const _default: Spec;
|
|
45
|
+
export default _default;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { TurboModule } from 'react-native';
|
|
2
|
+
export interface Spec extends TurboModule {
|
|
3
|
+
finish(): void;
|
|
4
|
+
isFlowOpen(): Promise<boolean>;
|
|
5
|
+
registerStepHandoff(): void;
|
|
6
|
+
resume(): void;
|
|
7
|
+
registerEventHandler(): void;
|
|
8
|
+
}
|
|
9
|
+
declare const _default: Spec;
|
|
10
|
+
export default _default;
|
|
@@ -0,0 +1,72 @@
|
|
|
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
|
+
storeType?: string;
|
|
21
|
+
}): void;
|
|
22
|
+
buySkuCompleteApple(purchase: {
|
|
23
|
+
product: {
|
|
24
|
+
id: string;
|
|
25
|
+
skuId: string;
|
|
26
|
+
name?: string;
|
|
27
|
+
type: string;
|
|
28
|
+
};
|
|
29
|
+
transactionID: string;
|
|
30
|
+
originalTransactionID: string;
|
|
31
|
+
price: string;
|
|
32
|
+
currencyCode: string;
|
|
33
|
+
}): void;
|
|
34
|
+
buySkuCompleteAmazon(purchase: {
|
|
35
|
+
product: {
|
|
36
|
+
id: string;
|
|
37
|
+
skuId: string;
|
|
38
|
+
name?: string;
|
|
39
|
+
type: string;
|
|
40
|
+
};
|
|
41
|
+
receiptId: string;
|
|
42
|
+
localizedPrice: string;
|
|
43
|
+
userId: string;
|
|
44
|
+
marketplace: string;
|
|
45
|
+
}): void;
|
|
46
|
+
buySkuCompleteGooglePlay(purchase: {
|
|
47
|
+
product: {
|
|
48
|
+
id: string;
|
|
49
|
+
skuId: string;
|
|
50
|
+
name?: string;
|
|
51
|
+
type: string;
|
|
52
|
+
};
|
|
53
|
+
orderId: string;
|
|
54
|
+
purchaseToken: string;
|
|
55
|
+
}): void;
|
|
56
|
+
registerBuySkuHandler(): void;
|
|
57
|
+
registerCloseHandler(): void;
|
|
58
|
+
registerSignInHandler(): void;
|
|
59
|
+
registerRestoreHandler(): void;
|
|
60
|
+
registerDeeplinkActionHandler(): void;
|
|
61
|
+
dismiss(): Promise<void>;
|
|
62
|
+
show(): void;
|
|
63
|
+
hide(): void;
|
|
64
|
+
isHidden(): Promise<boolean>;
|
|
65
|
+
isPaywallOpen(): Promise<boolean>;
|
|
66
|
+
buySkuCancel(): void;
|
|
67
|
+
setProductDetails(productDetails: string, allowOffers?: boolean): void;
|
|
68
|
+
setAppSuppliedVideoDetails(url: string, name?: string): void;
|
|
69
|
+
allowUserInteraction(allowed: boolean): void;
|
|
70
|
+
}
|
|
71
|
+
declare const _default: Spec;
|
|
72
|
+
export default _default;
|
|
@@ -0,0 +1,27 @@
|
|
|
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
|
+
presentCodeRedemptionSheet(): void;
|
|
22
|
+
restorePurchases(): void;
|
|
23
|
+
registerPurchasesChangedHandler(): void;
|
|
24
|
+
registerRestorePurchasesHandler(): void;
|
|
25
|
+
}
|
|
26
|
+
declare const _default: Spec;
|
|
27
|
+
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,13 @@
|
|
|
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
|
+
finish: () => void;
|
|
12
|
+
isFlowOpen: () => Promise<boolean>;
|
|
13
|
+
};
|
|
@@ -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,16 @@
|
|
|
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
|
+
presentCodeRedemptionSheet: () => void;
|
|
13
|
+
restorePurchases: () => void;
|
|
14
|
+
registerPurchasesChangedHandler: (callback: (state: NamiPurchasesState, purchases: NamiPurchase[], error: string) => void) => (() => void);
|
|
15
|
+
registerRestorePurchasesHandler: (callback: (state: NamiRestorePurchasesState, newPurchases: NamiPurchase[], oldPurchases: NamiPurchase[]) => void) => (() => void);
|
|
16
|
+
};
|
|
@@ -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,24 @@ 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
|
+
storeType?: string;
|
|
127
|
+
};
|
|
116
128
|
export type NamiPurchaseSuccessApple = {
|
|
117
129
|
product: NamiSKU;
|
|
118
130
|
transactionID: string;
|
|
@@ -170,6 +182,15 @@ export type NamiPurchase = {
|
|
|
170
182
|
purchaseInitiatedTimestamp: Date;
|
|
171
183
|
purchaseSource?: 'CAMPAIGN' | 'MARKETPLACE' | 'UNKNOWN';
|
|
172
184
|
};
|
|
185
|
+
export type NamiPurchaseFromBridge = {
|
|
186
|
+
sku?: NamiSKU;
|
|
187
|
+
skuId: string;
|
|
188
|
+
transactionIdentifier?: string;
|
|
189
|
+
purchaseToken?: string;
|
|
190
|
+
expires?: number;
|
|
191
|
+
purchaseInitiatedTimestamp: number;
|
|
192
|
+
purchaseSource?: 'CAMPAIGN' | 'MARKETPLACE' | 'UNKNOWN';
|
|
193
|
+
};
|
|
173
194
|
export type NamiPurchasesState = 'pending' | 'purchased' | 'consumed' | 'resubscribed' | 'unsubscribed' | 'deferred' | 'failed' | 'cancelled' | 'unknown';
|
|
174
195
|
export type NamiPaywallEvent = {
|
|
175
196
|
action: NamiPaywallAction;
|
|
@@ -205,4 +226,13 @@ export type NamiPaywallEventVideoMetadata = {
|
|
|
205
226
|
contentTimecode?: number;
|
|
206
227
|
contentDuration?: number;
|
|
207
228
|
};
|
|
229
|
+
export type NamiFlowHandoffPayload = {
|
|
230
|
+
handoffTag: string;
|
|
231
|
+
handoffData?: Record<string, unknown>;
|
|
232
|
+
};
|
|
233
|
+
export type NamiAccountStateEvent = {
|
|
234
|
+
action: AccountStateAction;
|
|
235
|
+
success: boolean;
|
|
236
|
+
error?: number;
|
|
237
|
+
};
|
|
208
238
|
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,22 @@
|
|
|
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
8
|
|
|
29
|
-
|
|
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
|
-
}
|
|
9
|
+
@interface RCT_EXTERN_MODULE(RNNami, NSObject)
|
|
40
10
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
-
}
|
|
11
|
+
RCT_EXTERN_METHOD(configure:(NSDictionary *)configDict
|
|
12
|
+
resolver:(RCTPromiseResolveBlock)resolve
|
|
13
|
+
rejecter:(RCTPromiseRejectBlock)reject)
|
|
51
14
|
|
|
52
|
-
|
|
53
|
-
|
|
15
|
+
RCT_EXTERN_METHOD(sdkConfigured:(RCTPromiseResolveBlock)resolve
|
|
16
|
+
rejecter:(RCTPromiseRejectBlock)reject)
|
|
54
17
|
|
|
55
|
-
|
|
56
|
-
NSObject *appCommandStrings = configDict[@"namiCommands"];
|
|
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
|
-
}
|
|
18
|
+
RCT_EXTERN_METHOD(sdkVersion:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject)
|
|
97
19
|
|
|
98
20
|
+ (BOOL)requiresMainQueueSetup {
|
|
99
|
-
|
|
21
|
+
return NO;
|
|
100
22
|
}
|
|
101
23
|
@end
|
package/ios/Nami.swift
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
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
|
+
// extension RNNami: RCTTurboModule {}
|
|
13
|
+
// #endif
|
|
14
|
+
|
|
15
|
+
@objc(RNNami)
|
|
16
|
+
class RNNami: NSObject {
|
|
17
|
+
static func moduleName() -> String! {
|
|
18
|
+
return "RNNami"
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
@objc
|
|
22
|
+
func configure(
|
|
23
|
+
_ configDict: NSDictionary,
|
|
24
|
+
resolver resolve: @escaping RCTPromiseResolveBlock,
|
|
25
|
+
rejecter reject: @escaping RCTPromiseRejectBlock
|
|
26
|
+
) {
|
|
27
|
+
guard let appID = configDict["appPlatformID"] as? String, !appID.isEmpty else {
|
|
28
|
+
reject("missing_app_id", "The appPlatformID is required.", nil)
|
|
29
|
+
return
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
let config = NamiConfiguration(appPlatformId: appID)
|
|
33
|
+
NSLog("RNNami: Configure with appPlatformId: %@", appID)
|
|
34
|
+
|
|
35
|
+
if isNewArchitectureEnabled() {
|
|
36
|
+
NSLog("RNNami: New Architecture is ENABLED")
|
|
37
|
+
} else {
|
|
38
|
+
NSLog("RNNami: New Architecture is DISABLED")
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if let logLevelString = configDict["logLevel"] as? String {
|
|
42
|
+
config.logLevel = {
|
|
43
|
+
switch logLevelString.uppercased() {
|
|
44
|
+
case "ERROR": return .error
|
|
45
|
+
case "INFO": return .info
|
|
46
|
+
case "WARNING": return .warn
|
|
47
|
+
default: return .debug
|
|
48
|
+
}
|
|
49
|
+
}()
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
if let languageCode = configDict["namiLanguageCode"] as? String,
|
|
53
|
+
NamiLanguageCodes.allAvailableNamiLanguageCodes.contains(where: { $0.caseInsensitiveCompare(languageCode) == .orderedSame })
|
|
54
|
+
{
|
|
55
|
+
config.namiLanguageCode = languageCode
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if let commands = configDict["namiCommands"] as? [String] {
|
|
59
|
+
config.namiCommands = commands
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
if let initialConfig = configDict["initialConfig"] as? String {
|
|
63
|
+
config.initialConfig = initialConfig
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
Nami.configure(with: config) { sdkConfigured in
|
|
67
|
+
resolve(["success": sdkConfigured])
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
@objc
|
|
72
|
+
func sdkConfigured(_ resolve: RCTPromiseResolveBlock, rejecter _: RCTPromiseRejectBlock) {
|
|
73
|
+
resolve(Nami.sdkConfigured())
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
@objc(sdkVersion:rejecter:)
|
|
77
|
+
func sdkVersion(resolve: @escaping RCTPromiseResolveBlock, reject _: @escaping RCTPromiseRejectBlock) {
|
|
78
|
+
let version = Nami.sdkVersion
|
|
79
|
+
resolve(version)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
func isNewArchitectureEnabled() -> Bool {
|
|
83
|
+
#if RCT_NEW_ARCH_ENABLED
|
|
84
|
+
return true
|
|
85
|
+
#else
|
|
86
|
+
return false
|
|
87
|
+
#endif
|
|
88
|
+
}
|
|
89
|
+
}
|
|
@@ -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
|