react-native-nami-sdk 3.3.0-beta.7 → 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 -58
- 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,18 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
|
|
4
|
+
const pkgPath = path.resolve(__dirname, '../package.json');
|
|
5
|
+
const versionFilePath = path.resolve(__dirname, '../src/version.ts');
|
|
6
|
+
|
|
7
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
|
|
8
|
+
const version = pkg.version;
|
|
9
|
+
|
|
10
|
+
const fileContent = `/**
|
|
11
|
+
* Auto-generated file. Do not edit manually.
|
|
12
|
+
* React Native Nami SDK version.
|
|
13
|
+
*/
|
|
14
|
+
export const NAMI_REACT_NATIVE_VERSION = '${version}';
|
|
15
|
+
`;
|
|
16
|
+
|
|
17
|
+
fs.writeFileSync(versionFilePath, fileContent, 'utf8');
|
|
18
|
+
console.log(`Generated version.ts with version ${version}`);
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { TurboModule } from 'react-native';
|
|
2
|
+
import { TurboModuleRegistry } from 'react-native';
|
|
3
|
+
|
|
4
|
+
export interface Spec extends TurboModule {
|
|
5
|
+
configure(config: {
|
|
6
|
+
appPlatformID: string;
|
|
7
|
+
logLevel: string;
|
|
8
|
+
namiCommands?: string[];
|
|
9
|
+
namiLanguageCode?: string;
|
|
10
|
+
initialConfig?: string;
|
|
11
|
+
}): Promise<{ success: boolean }>;
|
|
12
|
+
|
|
13
|
+
sdkConfigured(): Promise<boolean>;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export default TurboModuleRegistry.getEnforcing<Spec>('RNNami');
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import type { TurboModule } from 'react-native';
|
|
2
|
+
import { TurboModuleRegistry } from 'react-native';
|
|
3
|
+
|
|
4
|
+
export interface Spec extends TurboModule {
|
|
5
|
+
launch(
|
|
6
|
+
label: string | null,
|
|
7
|
+
withUrl: string | null,
|
|
8
|
+
context: {
|
|
9
|
+
productGroups?: string[];
|
|
10
|
+
customAttributes?: { [key: string]: string };
|
|
11
|
+
customObject?: { [key: string]: unknown };
|
|
12
|
+
} | null,
|
|
13
|
+
completion: (successAction: boolean, error: number | null) => void,
|
|
14
|
+
paywallCompletion: (event: {
|
|
15
|
+
campaignId?: string;
|
|
16
|
+
campaignName?: string;
|
|
17
|
+
campaignType?: string;
|
|
18
|
+
campaignLabel?: string;
|
|
19
|
+
campaignUrl?: string;
|
|
20
|
+
paywallId?: string;
|
|
21
|
+
paywallName?: string;
|
|
22
|
+
segmentId?: string;
|
|
23
|
+
externalSegmentId?: string;
|
|
24
|
+
action: string;
|
|
25
|
+
sku?: {
|
|
26
|
+
id?: string;
|
|
27
|
+
name?: string;
|
|
28
|
+
skuId?: string;
|
|
29
|
+
type?: string;
|
|
30
|
+
promoId?: string;
|
|
31
|
+
promoToken?: string;
|
|
32
|
+
};
|
|
33
|
+
purchaseError?: string;
|
|
34
|
+
purchases?: Array<{
|
|
35
|
+
sku?: {
|
|
36
|
+
id: string;
|
|
37
|
+
skuId: string;
|
|
38
|
+
name: string;
|
|
39
|
+
type: string;
|
|
40
|
+
};
|
|
41
|
+
skuId: string;
|
|
42
|
+
transactionIdentifier?: string;
|
|
43
|
+
purchaseToken?: string;
|
|
44
|
+
expires?: number; // timestamp (ms)
|
|
45
|
+
purchaseInitiatedTimestamp: number; // timestamp (ms)
|
|
46
|
+
purchaseSource?: 'CAMPAIGN' | 'MARKETPLACE' | 'UNKNOWN';
|
|
47
|
+
}>;
|
|
48
|
+
deeplinkUrl?: string;
|
|
49
|
+
componentChange?: {
|
|
50
|
+
id?: string;
|
|
51
|
+
name?: string;
|
|
52
|
+
};
|
|
53
|
+
videoMetadata?: {
|
|
54
|
+
id?: string;
|
|
55
|
+
name?: string;
|
|
56
|
+
url?: string;
|
|
57
|
+
loopVideo?: boolean;
|
|
58
|
+
muteByDefault?: boolean;
|
|
59
|
+
autoplayVideo?: boolean;
|
|
60
|
+
contentTimecode?: string;
|
|
61
|
+
contentDuration?: string;
|
|
62
|
+
};
|
|
63
|
+
timeSpentOnPaywall?: number;
|
|
64
|
+
}) => void,
|
|
65
|
+
): void;
|
|
66
|
+
|
|
67
|
+
allCampaigns(): Promise<
|
|
68
|
+
{
|
|
69
|
+
id?: string;
|
|
70
|
+
rule?: string;
|
|
71
|
+
segment?: string;
|
|
72
|
+
paywall?: string;
|
|
73
|
+
type: string;
|
|
74
|
+
value?: string;
|
|
75
|
+
}[]
|
|
76
|
+
>;
|
|
77
|
+
|
|
78
|
+
isCampaignAvailable(source?: string): Promise<boolean>;
|
|
79
|
+
|
|
80
|
+
refresh(): Promise<
|
|
81
|
+
{
|
|
82
|
+
id?: string;
|
|
83
|
+
rule?: string;
|
|
84
|
+
segment?: string;
|
|
85
|
+
paywall?: string;
|
|
86
|
+
type: string;
|
|
87
|
+
value?: string;
|
|
88
|
+
}[]
|
|
89
|
+
>;
|
|
90
|
+
|
|
91
|
+
registerAvailableCampaignsHandler(): void;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export default TurboModuleRegistry.getEnforcing<Spec>('RNNamiCampaignManager');
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { TurboModule } from 'react-native';
|
|
2
|
+
import { TurboModuleRegistry } from 'react-native';
|
|
3
|
+
|
|
4
|
+
export interface Spec extends TurboModule {
|
|
5
|
+
setCustomerAttribute(key: string, value: string): void;
|
|
6
|
+
getCustomerAttribute(key: string): Promise<string | null>;
|
|
7
|
+
clearCustomerAttribute(key: string): void;
|
|
8
|
+
clearAllCustomerAttributes(): void;
|
|
9
|
+
|
|
10
|
+
setCustomerDataPlatformId(platformId: string): void;
|
|
11
|
+
clearCustomerDataPlatformId(): void;
|
|
12
|
+
|
|
13
|
+
setAnonymousMode(anonymousMode: boolean): void;
|
|
14
|
+
inAnonymousMode(): Promise<boolean>;
|
|
15
|
+
|
|
16
|
+
journeyState(): Promise<{
|
|
17
|
+
formerSubscriber: boolean;
|
|
18
|
+
inGracePeriod: boolean;
|
|
19
|
+
inTrialPeriod: boolean;
|
|
20
|
+
inIntroOfferPeriod: boolean;
|
|
21
|
+
isCancelled: boolean;
|
|
22
|
+
inPause: boolean;
|
|
23
|
+
inAccountHold: boolean;
|
|
24
|
+
}>;
|
|
25
|
+
|
|
26
|
+
isLoggedIn(): Promise<boolean>;
|
|
27
|
+
loggedInId(): Promise<string | null>;
|
|
28
|
+
deviceId(): Promise<string>;
|
|
29
|
+
|
|
30
|
+
login(customerId: string): void;
|
|
31
|
+
logout(): void;
|
|
32
|
+
|
|
33
|
+
registerJourneyStateHandler(): void;
|
|
34
|
+
registerAccountStateHandler(): void;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
export default TurboModuleRegistry.getEnforcing<Spec>('RNNamiCustomerManager');
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { TurboModule } from 'react-native';
|
|
2
|
+
import { TurboModuleRegistry } from 'react-native';
|
|
3
|
+
|
|
4
|
+
export interface Spec extends TurboModule {
|
|
5
|
+
isEntitlementActive(referenceId?: string): Promise<boolean>;
|
|
6
|
+
active(): Promise<
|
|
7
|
+
Array<{
|
|
8
|
+
referenceId: string;
|
|
9
|
+
desc?: string;
|
|
10
|
+
name?: string;
|
|
11
|
+
purchasedSkus: Array<{
|
|
12
|
+
id: string;
|
|
13
|
+
skuId: string;
|
|
14
|
+
name?: string;
|
|
15
|
+
type: string;
|
|
16
|
+
promoId?: string;
|
|
17
|
+
promoToken?: string;
|
|
18
|
+
}>;
|
|
19
|
+
relatedSkus: Array<{
|
|
20
|
+
id: string;
|
|
21
|
+
skuId: string;
|
|
22
|
+
name?: string;
|
|
23
|
+
type: string;
|
|
24
|
+
promoId?: string;
|
|
25
|
+
promoToken?: string;
|
|
26
|
+
}>;
|
|
27
|
+
activePurchases: Array<{
|
|
28
|
+
skuId: string;
|
|
29
|
+
transactionIdentifier?: string;
|
|
30
|
+
expires?: string;
|
|
31
|
+
purchaseInitiatedTimestamp: string;
|
|
32
|
+
purchaseSource?: string;
|
|
33
|
+
sku?: {
|
|
34
|
+
id: string;
|
|
35
|
+
skuId: string;
|
|
36
|
+
name?: string;
|
|
37
|
+
type: string;
|
|
38
|
+
promoId?: string;
|
|
39
|
+
promoToken?: string;
|
|
40
|
+
};
|
|
41
|
+
}>;
|
|
42
|
+
}>
|
|
43
|
+
>;
|
|
44
|
+
|
|
45
|
+
refresh(): void;
|
|
46
|
+
|
|
47
|
+
registerActiveEntitlementsHandler(): void;
|
|
48
|
+
|
|
49
|
+
clearProvisionalEntitlementGrants(): void;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export default TurboModuleRegistry.getEnforcing<Spec>(
|
|
53
|
+
'RNNamiEntitlementManager',
|
|
54
|
+
);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { TurboModule } from 'react-native';
|
|
2
|
+
import { TurboModuleRegistry } from 'react-native';
|
|
3
|
+
|
|
4
|
+
export interface Spec extends TurboModule {
|
|
5
|
+
registerStepHandoff(): void;
|
|
6
|
+
|
|
7
|
+
resume(): void;
|
|
8
|
+
|
|
9
|
+
registerEventHandler(): void;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export default TurboModuleRegistry.getEnforcing<Spec>('RNNamiFlowManager');
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import type { TurboModule } from 'react-native';
|
|
2
|
+
import { TurboModuleRegistry } from 'react-native';
|
|
3
|
+
|
|
4
|
+
export interface Spec extends TurboModule {
|
|
5
|
+
// Unified purchase success handler
|
|
6
|
+
buySkuComplete(purchase: {
|
|
7
|
+
product: {
|
|
8
|
+
id: string;
|
|
9
|
+
skuId: string;
|
|
10
|
+
name?: string;
|
|
11
|
+
type: string;
|
|
12
|
+
};
|
|
13
|
+
transactionID?: string;
|
|
14
|
+
originalTransactionID?: string;
|
|
15
|
+
orderId?: string;
|
|
16
|
+
purchaseToken?: string;
|
|
17
|
+
receiptId?: string;
|
|
18
|
+
localizedPrice?: string;
|
|
19
|
+
userId?: string;
|
|
20
|
+
marketplace?: string;
|
|
21
|
+
price?: string;
|
|
22
|
+
currencyCode?: string;
|
|
23
|
+
}): void;
|
|
24
|
+
|
|
25
|
+
// Backward compatibility methods
|
|
26
|
+
buySkuCompleteApple(purchase: {
|
|
27
|
+
product: {
|
|
28
|
+
id: string;
|
|
29
|
+
skuId: string;
|
|
30
|
+
name?: string;
|
|
31
|
+
type: string;
|
|
32
|
+
};
|
|
33
|
+
transactionID: string;
|
|
34
|
+
originalTransactionID: string;
|
|
35
|
+
price: string;
|
|
36
|
+
currencyCode: string;
|
|
37
|
+
}): void;
|
|
38
|
+
|
|
39
|
+
buySkuCompleteAmazon(purchase: {
|
|
40
|
+
product: {
|
|
41
|
+
id: string;
|
|
42
|
+
skuId: string;
|
|
43
|
+
name?: string;
|
|
44
|
+
type: string;
|
|
45
|
+
};
|
|
46
|
+
receiptId: string;
|
|
47
|
+
localizedPrice: string;
|
|
48
|
+
userId: string;
|
|
49
|
+
marketplace: string;
|
|
50
|
+
}): void;
|
|
51
|
+
|
|
52
|
+
buySkuCompleteGooglePlay(purchase: {
|
|
53
|
+
product: {
|
|
54
|
+
id: string;
|
|
55
|
+
skuId: string;
|
|
56
|
+
name?: string;
|
|
57
|
+
type: string;
|
|
58
|
+
};
|
|
59
|
+
orderId: string;
|
|
60
|
+
purchaseToken: string;
|
|
61
|
+
}): void;
|
|
62
|
+
|
|
63
|
+
registerBuySkuHandler(): void;
|
|
64
|
+
registerCloseHandler(): void;
|
|
65
|
+
registerSignInHandler(): void;
|
|
66
|
+
registerRestoreHandler(): void;
|
|
67
|
+
registerDeeplinkActionHandler(): void;
|
|
68
|
+
|
|
69
|
+
dismiss(): Promise<void>;
|
|
70
|
+
show(): void;
|
|
71
|
+
hide(): void;
|
|
72
|
+
|
|
73
|
+
isHidden(): Promise<boolean>;
|
|
74
|
+
isPaywallOpen(): Promise<boolean>;
|
|
75
|
+
|
|
76
|
+
buySkuCancel(): void;
|
|
77
|
+
|
|
78
|
+
setProductDetails(productDetails: string, allowOffers?: boolean): void;
|
|
79
|
+
|
|
80
|
+
setAppSuppliedVideoDetails(url: string, name?: string): void;
|
|
81
|
+
|
|
82
|
+
allowUserInteraction(allowed: boolean): void;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
export default TurboModuleRegistry.getEnforcing<Spec>('RNNamiPaywallManager');
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { TurboModule } from 'react-native';
|
|
2
|
+
import { TurboModuleRegistry } from 'react-native';
|
|
3
|
+
|
|
4
|
+
export interface Spec extends TurboModule {
|
|
5
|
+
allPurchases(): Promise<
|
|
6
|
+
Array<{
|
|
7
|
+
skuId: string;
|
|
8
|
+
sku?: {
|
|
9
|
+
id: string;
|
|
10
|
+
skuId: string;
|
|
11
|
+
name?: string;
|
|
12
|
+
type: string;
|
|
13
|
+
promoId?: string;
|
|
14
|
+
promoToken?: string;
|
|
15
|
+
};
|
|
16
|
+
transactionIdentifier?: string;
|
|
17
|
+
purchaseToken?: string;
|
|
18
|
+
expires?: number; // timestamp in milliseconds
|
|
19
|
+
purchaseInitiatedTimestamp: number; // timestamp in milliseconds
|
|
20
|
+
purchaseSource?: 'CAMPAIGN' | 'MARKETPLACE' | 'UNKNOWN';
|
|
21
|
+
}>
|
|
22
|
+
>;
|
|
23
|
+
|
|
24
|
+
skuPurchased(skuId: string): Promise<boolean>;
|
|
25
|
+
anySkuPurchased(skuIds: string[]): Promise<boolean>;
|
|
26
|
+
consumePurchasedSku(skuId: string): void;
|
|
27
|
+
presentCodeRedemptionSheet(): void;
|
|
28
|
+
restorePurchases(): void;
|
|
29
|
+
registerPurchasesChangedHandler(): void;
|
|
30
|
+
registerRestorePurchasesHandler(): void;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export default TurboModuleRegistry.getEnforcing<Spec>('RNNamiPurchaseManager');
|
package/src/Nami.ts
CHANGED
|
@@ -1,24 +1,34 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import type { Spec } from '../specs/NativeNami';
|
|
2
|
+
import { TurboModuleRegistry, NativeModules } from 'react-native';
|
|
3
|
+
import type { NamiConfiguration } from './types';
|
|
3
4
|
|
|
4
|
-
|
|
5
|
+
const RNNami: Spec =
|
|
6
|
+
TurboModuleRegistry.getEnforcing<Spec>('RNNami') ?? NativeModules.RNNami;
|
|
5
7
|
|
|
6
|
-
|
|
7
|
-
configure: (config: NamiConfiguration) => Promise<{ success: boolean }>;
|
|
8
|
-
}
|
|
8
|
+
import { NAMI_REACT_NATIVE_VERSION } from './version';
|
|
9
9
|
|
|
10
|
-
export const Nami
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
(resultObject: { success: boolean }) => {
|
|
19
|
-
resolve(resultObject);
|
|
20
|
-
},
|
|
21
|
-
);
|
|
10
|
+
export const Nami = {
|
|
11
|
+
configure: async (config: NamiConfiguration): Promise<boolean> => {
|
|
12
|
+
const result = await RNNami.configure({
|
|
13
|
+
...config,
|
|
14
|
+
namiCommands: [
|
|
15
|
+
...(config.namiCommands ?? []),
|
|
16
|
+
`extendedClientInfo:react-native:${NAMI_REACT_NATIVE_VERSION}`,
|
|
17
|
+
],
|
|
22
18
|
});
|
|
19
|
+
|
|
20
|
+
// Treat 'already configured' as success
|
|
21
|
+
if (result?.success === false) {
|
|
22
|
+
const alreadyConfigured = await RNNami.sdkConfigured?.();
|
|
23
|
+
if (alreadyConfigured) {
|
|
24
|
+
return true;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
return result?.success ?? false;
|
|
29
|
+
},
|
|
30
|
+
|
|
31
|
+
sdkConfigured: async (): Promise<boolean> => {
|
|
32
|
+
return await RNNami.sdkConfigured?.();
|
|
23
33
|
},
|
|
24
34
|
};
|
|
@@ -1,62 +1,61 @@
|
|
|
1
|
+
import type { Spec } from '../specs/NativeNamiCampaignManager';
|
|
1
2
|
import {
|
|
3
|
+
TurboModuleRegistry,
|
|
2
4
|
NativeModules,
|
|
3
5
|
NativeEventEmitter,
|
|
4
|
-
EmitterSubscription,
|
|
5
6
|
} from 'react-native';
|
|
6
|
-
import {
|
|
7
|
-
LaunchCampaignError,
|
|
8
|
-
NamiCampaign,
|
|
9
|
-
NamiPaywallActionHandler,
|
|
7
|
+
import type {
|
|
10
8
|
NamiPaywallEvent,
|
|
11
9
|
PaywallLaunchContext,
|
|
10
|
+
NamiCampaign,
|
|
12
11
|
} from './types';
|
|
12
|
+
import { NamiPaywallAction } from './types';
|
|
13
13
|
|
|
14
|
-
|
|
14
|
+
const RNNamiCampaignManager: Spec =
|
|
15
|
+
TurboModuleRegistry.getEnforcing<Spec>('RNNamiCampaignManager') ??
|
|
16
|
+
NativeModules.RNNamiCampaignManager;
|
|
15
17
|
|
|
16
18
|
export enum NamiCampaignManagerEvents {
|
|
17
|
-
ResultCampaign = 'ResultCampaign',
|
|
18
19
|
AvailableCampaignsChanged = 'AvailableCampaignsChanged',
|
|
20
|
+
NamiPaywallEvent = 'NamiPaywallEvent',
|
|
19
21
|
}
|
|
20
22
|
|
|
21
|
-
const
|
|
23
|
+
const validPaywallActions = new Set(
|
|
24
|
+
Object.values(NamiPaywallAction) as NamiPaywallAction[],
|
|
25
|
+
);
|
|
22
26
|
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
isCampaignAvailable(campaignSource: string | null): Promise<boolean>;
|
|
28
|
-
launch: (
|
|
29
|
-
label?: string,
|
|
30
|
-
withUrl?: string,
|
|
31
|
-
context?: PaywallLaunchContext,
|
|
32
|
-
resultCallback?: (success: boolean, error?: LaunchCampaignError) => void,
|
|
33
|
-
actionCallback?: NamiPaywallActionHandler,
|
|
34
|
-
) => void;
|
|
35
|
-
refresh: () => Promise<Array<NamiCampaign>>;
|
|
36
|
-
registerAvailableCampaignsHandler: (
|
|
37
|
-
callback: (availableCampaigns: NamiCampaign[]) => void,
|
|
38
|
-
) => EmitterSubscription['remove'];
|
|
27
|
+
function mapToNamiPaywallAction(action: string): NamiPaywallAction {
|
|
28
|
+
return validPaywallActions.has(action as NamiPaywallAction)
|
|
29
|
+
? (action as NamiPaywallAction)
|
|
30
|
+
: NamiPaywallAction.UNKNOWN;
|
|
39
31
|
}
|
|
40
32
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
33
|
+
const emitter = new NativeEventEmitter(NativeModules.RNNamiCampaignManager);
|
|
34
|
+
|
|
35
|
+
export const NamiCampaignManager = {
|
|
36
|
+
emitter,
|
|
37
|
+
|
|
38
|
+
launchSubscription: undefined as
|
|
39
|
+
| ReturnType<NativeEventEmitter['addListener']>
|
|
40
|
+
| undefined,
|
|
41
|
+
|
|
42
|
+
launch(
|
|
43
|
+
label: string | null,
|
|
44
|
+
withUrl: string | null,
|
|
45
|
+
context: PaywallLaunchContext | null,
|
|
46
|
+
resultCallback?: (success: boolean, errorCode?: number | null) => void,
|
|
47
|
+
actionCallback?: (event: any) => void,
|
|
48
|
+
): void {
|
|
46
49
|
if (this.launchSubscription) {
|
|
47
50
|
this.launchSubscription.remove();
|
|
48
51
|
}
|
|
49
52
|
|
|
50
53
|
this.launchSubscription = this.emitter.addListener(
|
|
51
|
-
NamiCampaignManagerEvents.
|
|
52
|
-
body => {
|
|
53
|
-
body.action = body.action.startsWith(searchString_Nami)
|
|
54
|
-
? body.action.substring(5, body.action.length)
|
|
55
|
-
: body.action;
|
|
56
|
-
|
|
54
|
+
NamiCampaignManagerEvents.NamiPaywallEvent,
|
|
55
|
+
(body: any) => {
|
|
57
56
|
if (actionCallback) {
|
|
58
57
|
const paywallEvent: NamiPaywallEvent = {
|
|
59
|
-
action: body.action,
|
|
58
|
+
action: mapToNamiPaywallAction(body.action),
|
|
60
59
|
campaignId: body.campaignId,
|
|
61
60
|
campaignName: body.campaignName,
|
|
62
61
|
campaignType: body.campaignType,
|
|
@@ -78,33 +77,38 @@ export const NamiCampaignManager: ICampaignManager = {
|
|
|
78
77
|
}
|
|
79
78
|
},
|
|
80
79
|
);
|
|
80
|
+
|
|
81
81
|
RNNamiCampaignManager.launch(
|
|
82
|
-
label
|
|
83
|
-
withUrl
|
|
84
|
-
context
|
|
82
|
+
label,
|
|
83
|
+
withUrl,
|
|
84
|
+
context,
|
|
85
85
|
resultCallback ?? (() => {}),
|
|
86
86
|
actionCallback ?? (() => {}),
|
|
87
87
|
);
|
|
88
88
|
},
|
|
89
89
|
|
|
90
|
-
|
|
91
|
-
return RNNamiCampaignManager.
|
|
90
|
+
allCampaigns: async () => {
|
|
91
|
+
return await RNNamiCampaignManager.allCampaigns();
|
|
92
92
|
},
|
|
93
93
|
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
94
|
+
isCampaignAvailable: async (campaignName: string | null) => {
|
|
95
|
+
return await RNNamiCampaignManager.isCampaignAvailable(
|
|
96
|
+
campaignName ?? undefined,
|
|
97
|
+
);
|
|
98
|
+
},
|
|
99
|
+
|
|
100
|
+
refresh: async () => {
|
|
101
|
+
return await RNNamiCampaignManager.refresh();
|
|
102
|
+
},
|
|
103
|
+
|
|
104
|
+
registerAvailableCampaignsHandler: (
|
|
105
|
+
callback: (campaigns: NamiCampaign[]) => void,
|
|
106
|
+
): (() => void) => {
|
|
107
|
+
const sub = emitter.addListener(
|
|
99
108
|
NamiCampaignManagerEvents.AvailableCampaignsChanged,
|
|
100
109
|
callback,
|
|
101
110
|
);
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
return () => {
|
|
105
|
-
if (subscription) {
|
|
106
|
-
subscription.remove();
|
|
107
|
-
}
|
|
108
|
-
};
|
|
111
|
+
RNNamiCampaignManager.registerAvailableCampaignsHandler?.();
|
|
112
|
+
return () => sub.remove();
|
|
109
113
|
},
|
|
110
114
|
};
|