tapjoy-react-native-sdk 14.5.0 → 14.6.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/android/build.gradle +6 -13
- package/android/src/main/java/com/tapjoyreactnativesdk/TJOfferwallDiscoverNativeViewManager.kt +21 -16
- package/android/src/main/java/com/tapjoyreactnativesdk/TapjoyReactNativeSdkModule.kt +112 -74
- package/android/src/main/java/com/tapjoyreactnativesdk/TapjoyReactNativeSdkPackage.kt +29 -5
- package/example/android/app/build.gradle +1 -1
- package/example/ios/Podfile +2 -1
- package/example/ios/TapjoyReactNativeSdkExample/Info.plist +2 -0
- package/example/package.json +4 -2
- package/example/scripts/set-arch.sh +25 -0
- package/example/src/MainScreen.tsx +1 -0
- package/example/src/UserProperties.tsx +20 -1
- package/ios/TJOfferwallDiscoverNativeViewManager.m +11 -1
- package/ios/TJOfferwallDiscoverNativeViewManager.swift +2 -2
- package/ios/TapjoyReactNativeSdk.m +36 -15
- package/ios/TapjoyReactNativeSdk.swift +24 -4
- package/lib/commonjs/NativeTapjoyReactNativeSdk.js +2 -0
- package/lib/commonjs/TJOfferwallDiscoverView.js +43 -16
- package/lib/commonjs/TJOfferwallDiscoverViewNativeComponent.js +6 -0
- package/lib/commonjs/TJPlacement.js +17 -13
- package/lib/commonjs/TJPrivacyPolicy.js +81 -11
- package/lib/commonjs/TJVersion.js +1 -1
- package/lib/commonjs/Tapjoy.js +16 -10
- package/lib/commonjs/index.js +2 -1
- package/lib/commonjs/utils/ArchitectureDetection.js +7 -0
- package/lib/typescript/NativeTapjoyReactNativeSdk.d.ts +53 -0
- package/lib/typescript/TJOfferwallDiscoverView.d.ts +3 -12
- package/lib/typescript/TJOfferwallDiscoverViewNativeComponent.d.ts +21 -0
- package/lib/typescript/TJPrivacyPolicy.d.ts +29 -1
- package/lib/typescript/Tapjoy.d.ts +1 -1
- package/lib/typescript/index.d.ts +5 -3
- package/lib/typescript/utils/ArchitectureDetection.d.ts +5 -0
- package/package.json +7 -2
- package/src/NativeTapjoyReactNativeSdk.ts +117 -0
- package/src/TJOfferwallDiscoverView.tsx +56 -39
- package/src/TJOfferwallDiscoverViewNativeComponent.ts +37 -0
- package/src/TJPlacement.ts +17 -13
- package/src/TJPrivacyPolicy.ts +84 -12
- package/src/TJVersion.ts +1 -1
- package/src/Tapjoy.ts +20 -13
- package/src/index.ts +13 -3
- package/src/utils/ArchitectureDetection.ts +14 -0
- package/tapjoy-react-native-sdk.podspec +1 -1
package/example/package.json
CHANGED
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "TapjoyReactNativeSdkExample",
|
|
3
|
-
"version": "14.
|
|
3
|
+
"version": "14.6.0",
|
|
4
4
|
"private": true,
|
|
5
5
|
"scripts": {
|
|
6
6
|
"android": "react-native run-android",
|
|
7
7
|
"ios": "react-native run-ios",
|
|
8
8
|
"start": "react-native start",
|
|
9
|
-
"pods": "pod-install --quiet"
|
|
9
|
+
"pods": "pod-install --quiet",
|
|
10
|
+
"set-new-arch": "./scripts/set-arch.sh true",
|
|
11
|
+
"set-old-arch": "./scripts/set-arch.sh false"
|
|
10
12
|
},
|
|
11
13
|
"dependencies": {
|
|
12
14
|
"tapjoy-react-native-sdk": "file:../",
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
#!/bin/sh
|
|
2
|
+
set -eu
|
|
3
|
+
BASE_DIR="$(cd "$(dirname "$0")" && pwd)"
|
|
4
|
+
GRADLE_PROPERTIES="$BASE_DIR/../android/gradle.properties"
|
|
5
|
+
PODFILE="$BASE_DIR/../ios/Podfile"
|
|
6
|
+
ANDROID_DIR="$BASE_DIR/../android"
|
|
7
|
+
IOS_DIR="$BASE_DIR/../ios"
|
|
8
|
+
if [ "$#" -ne 1 ]; then
|
|
9
|
+
echo "Usage: set-arch.sh <true|false>"
|
|
10
|
+
exit 1
|
|
11
|
+
fi
|
|
12
|
+
VALUE="$1"
|
|
13
|
+
if [ "$VALUE" != "true" ] && [ "$VALUE" != "false" ]; then
|
|
14
|
+
echo "Expected true or false"
|
|
15
|
+
exit 1
|
|
16
|
+
fi
|
|
17
|
+
/usr/bin/sed -i '' "s/^newArchEnabled=.*/newArchEnabled=$VALUE/" "$GRADLE_PROPERTIES"
|
|
18
|
+
/usr/bin/sed -i '' "s/:new_arch_enabled => .*/:new_arch_enabled => $VALUE/" "$PODFILE"
|
|
19
|
+
|
|
20
|
+
echo "Running gradle clean..."
|
|
21
|
+
cd "$ANDROID_DIR" && ./gradlew clean
|
|
22
|
+
|
|
23
|
+
echo "Running pod install..."
|
|
24
|
+
cd "$IOS_DIR" && pod install
|
|
25
|
+
|
|
@@ -40,6 +40,7 @@ const UserProperties: React.FC = () => {
|
|
|
40
40
|
const [userSegment, setUserSegment] = useState<TJSegment>(TJSegment.Unknown);
|
|
41
41
|
const [userTag, setUserTag] = useState<string>('');
|
|
42
42
|
const [optOut, setOptOut] = useState<boolean>(false);
|
|
43
|
+
const [usageStatsConsent, setUsageStatsConsent] = useState<TJStatus>(TJStatus.Unknown);
|
|
43
44
|
const isFocused = useIsFocused();
|
|
44
45
|
|
|
45
46
|
const statusData = [
|
|
@@ -115,6 +116,7 @@ const UserProperties: React.FC = () => {
|
|
|
115
116
|
setBelowConsentAge(await privacyPolicy.getBelowConsentAge());
|
|
116
117
|
setSubjectToGDPR(await privacyPolicy.getSubjectToGDPR());
|
|
117
118
|
setUserConsent(await privacyPolicy.getUserConsent());
|
|
119
|
+
setUsageStatsConsent(await privacyPolicy.getUsageStatsConsent());
|
|
118
120
|
setUSPrivacy(await privacyPolicy.getUSPrivacy());
|
|
119
121
|
} catch (error) {
|
|
120
122
|
setStatusLabelText(`Failed to retrieve Privacy Policy: ${error}`);
|
|
@@ -164,7 +166,7 @@ const UserProperties: React.FC = () => {
|
|
|
164
166
|
const initialSubjectToGDPRItem = findStatus(isSubjectToGDPR);
|
|
165
167
|
const initialUserSegmentItem = findSegment(userSegment);
|
|
166
168
|
const initialOptOutItem = findOptOut(optOut);
|
|
167
|
-
|
|
169
|
+
const initialUsageStatsConsentItem = findStatus(usageStatsConsent);
|
|
168
170
|
const applyProperties = async () => {
|
|
169
171
|
try {
|
|
170
172
|
let trimmedUserId = userId?.trim();
|
|
@@ -182,6 +184,7 @@ const UserProperties: React.FC = () => {
|
|
|
182
184
|
privacyPolicy.setSubjectToGDPRStatus(isSubjectToGDPR);
|
|
183
185
|
privacyPolicy.setBelowConsentAgeStatus(isBelowConsentAge);
|
|
184
186
|
privacyPolicy.setUserConsentStatus(userConsent);
|
|
187
|
+
privacyPolicy.setUsageStatsConsent(usageStatsConsent);
|
|
185
188
|
privacyPolicy.setUSPrivacy(USPrivacy);
|
|
186
189
|
if (Platform.OS === 'android') {
|
|
187
190
|
privacyPolicy.optOutAdvertisingID(optOut);
|
|
@@ -254,6 +257,10 @@ const UserProperties: React.FC = () => {
|
|
|
254
257
|
setUserSegment(item.value);
|
|
255
258
|
};
|
|
256
259
|
|
|
260
|
+
const handleUsageStatsConsent = (item: { value: TJStatus; label: string }) => {
|
|
261
|
+
setUsageStatsConsent(item.value);
|
|
262
|
+
};
|
|
263
|
+
|
|
257
264
|
const handleOptOut = (item: { value: boolean; label: string }) => {
|
|
258
265
|
setOptOut(item.value);
|
|
259
266
|
};
|
|
@@ -389,6 +396,18 @@ const UserProperties: React.FC = () => {
|
|
|
389
396
|
/>
|
|
390
397
|
</View>
|
|
391
398
|
</View>
|
|
399
|
+
{Platform.OS === 'android' && (
|
|
400
|
+
<View style={styles.selectionContainer}>
|
|
401
|
+
<View style={styles.horizontalContainer}>
|
|
402
|
+
<Text style={styles.userPropertiesLabel}>Usage Stats Consent:</Text>
|
|
403
|
+
<SelectionMenu
|
|
404
|
+
data={statusData}
|
|
405
|
+
onSelectItem={handleUsageStatsConsent}
|
|
406
|
+
initialSelectedItem={initialUsageStatsConsentItem}
|
|
407
|
+
/>
|
|
408
|
+
</View>
|
|
409
|
+
</View>
|
|
410
|
+
)}
|
|
392
411
|
<View style={styles.inputContainer}>
|
|
393
412
|
<Text style={styles.userPropertiesLabel}>US Privacy:</Text>
|
|
394
413
|
<TextInput
|
|
@@ -1,7 +1,17 @@
|
|
|
1
1
|
#import <React/RCTViewManager.h>
|
|
2
|
+
#import <React/RCTUIManager.h>
|
|
3
|
+
|
|
4
|
+
#ifdef RCT_NEW_ARCH_ENABLED
|
|
5
|
+
#if __has_include(<React/RCTViewComponentView.h>)
|
|
6
|
+
#import <React/RCTViewComponentView.h>
|
|
7
|
+
#endif
|
|
8
|
+
#if __has_include("TapjoyReactNativeSdkSpec.h")
|
|
9
|
+
#import "TapjoyReactNativeSdkSpec.h"
|
|
10
|
+
#endif
|
|
11
|
+
#endif
|
|
2
12
|
|
|
3
13
|
@interface RCT_EXTERN_MODULE(TJOfferwallDiscoverNativeViewManager, RCTViewManager)
|
|
4
|
-
RCT_EXTERN_METHOD(requestContent: (nonnull NSNumber *)tag :
|
|
14
|
+
RCT_EXTERN_METHOD(requestContent: (nonnull NSNumber *)tag placement:(NSString *)placement)
|
|
5
15
|
RCT_EXTERN_METHOD(clearContent: (nonnull NSNumber *)tag)
|
|
6
16
|
RCT_EXPORT_VIEW_PROPERTY(onRequestSuccess, RCTBubblingEventBlock)
|
|
7
17
|
RCT_EXPORT_VIEW_PROPERTY(onRequestFailure, RCTBubblingEventBlock)
|
|
@@ -20,14 +20,14 @@ class TJOfferwallDiscoverNativeViewManager: RCTViewManager, TJOfferwallDiscoverD
|
|
|
20
20
|
/**
|
|
21
21
|
Show the OfferwallDiscover content.
|
|
22
22
|
*/
|
|
23
|
-
@objc func requestContent(_ tag: NSNumber,
|
|
23
|
+
@objc func requestContent(_ tag: NSNumber, placement: String) {
|
|
24
24
|
DispatchQueue.main.async {
|
|
25
25
|
self.owdView.requestContent(placement)
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
|
|
29
29
|
/**
|
|
30
|
-
|
|
30
|
+
Clear displayed content.
|
|
31
31
|
*/
|
|
32
32
|
@objc func clearContent(_ tag: NSNumber) {
|
|
33
33
|
DispatchQueue.main.async {
|
|
@@ -1,17 +1,23 @@
|
|
|
1
1
|
#import <React/RCTBridgeModule.h>
|
|
2
2
|
#import <React/RCTEventEmitter.h>
|
|
3
3
|
|
|
4
|
-
|
|
4
|
+
#ifdef RCT_NEW_ARCH_ENABLED
|
|
5
|
+
#if __has_include("TapjoyReactNativeSdkSpec.h")
|
|
6
|
+
#import "TapjoyReactNativeSdkSpec.h"
|
|
7
|
+
#endif
|
|
8
|
+
#endif
|
|
9
|
+
|
|
10
|
+
@interface RCT_EXTERN_MODULE(TapjoyReactNativeSdk, RCTEventEmitter)
|
|
5
11
|
|
|
6
12
|
#pragma mark - SDK
|
|
7
|
-
RCT_EXTERN_METHOD(connect:(NSString *)sdkKey connectFlags:(NSDictionary *)connectFlags resolve:(RCTPromiseResolveBlock
|
|
8
|
-
RCT_EXTERN_METHOD(setLoggingLevel:(NSNumber *)loggingLevel)
|
|
9
|
-
RCT_EXTERN_METHOD(getLoggingLevel:(RCTPromiseResolveBlock
|
|
13
|
+
RCT_EXTERN_METHOD(connect:(NSString *)sdkKey connectFlags:(NSDictionary *)connectFlags resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
|
|
14
|
+
RCT_EXTERN_METHOD(setLoggingLevel:(nonnull NSNumber *)loggingLevel)
|
|
15
|
+
RCT_EXTERN_METHOD(getLoggingLevel:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
|
|
10
16
|
RCT_EXTERN__BLOCKING_SYNCHRONOUS_METHOD(isConnected)
|
|
11
17
|
RCT_EXTERN_METHOD(setCustomParameter:(NSString *)customParameter)
|
|
12
|
-
RCT_EXTERN_METHOD(getCustomParameter:(RCTPromiseResolveBlock
|
|
13
|
-
RCT_EXTERN_METHOD(setUserId:(NSString *)userId resolve:(RCTPromiseResolveBlock
|
|
14
|
-
RCT_EXTERN_METHOD(getUserId:(RCTPromiseResolveBlock
|
|
18
|
+
RCT_EXTERN_METHOD(getCustomParameter:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
|
|
19
|
+
RCT_EXTERN_METHOD(setUserId:(NSString *)userId resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
|
|
20
|
+
RCT_EXTERN_METHOD(getUserId:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
|
|
15
21
|
RCT_EXTERN_METHOD(setUserSegment:(nonnull NSNumber *)userSegment)
|
|
16
22
|
RCT_EXTERN_METHOD(getUserSegment: (RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
|
|
17
23
|
RCT_EXTERN_METHOD(setMaxLevel:(int)maxLevel)
|
|
@@ -30,16 +36,16 @@ RCT_EXTERN_METHOD(showPlacement:(NSString *)name)
|
|
|
30
36
|
RCT_EXTERN__BLOCKING_SYNCHRONOUS_METHOD(isContentReady:(NSString *)name)
|
|
31
37
|
RCT_EXTERN__BLOCKING_SYNCHRONOUS_METHOD(isContentAvailable:(NSString *)name)
|
|
32
38
|
RCT_EXTERN_METHOD(setEntryPoint:(NSString *)name entryPoint:(nonnull NSNumber *)entryPoint)
|
|
33
|
-
RCT_EXTERN_METHOD(getEntryPoint:(NSString *)name resolve:(RCTPromiseResolveBlock
|
|
34
|
-
RCT_EXTERN_METHOD(setCurrencyBalance:(NSInteger)amount currencyId:(NSString *)currencyId placementName:(NSString *)placementName resolve:(RCTPromiseResolveBlock
|
|
35
|
-
RCT_EXTERN_METHOD(getPlacementCurrencyBalance:(NSString *)currencyId placementName:(NSString *)placementName resolve:(RCTPromiseResolveBlock
|
|
36
|
-
RCT_EXTERN_METHOD(setRequiredAmount:(NSInteger)requiredAmount currencyId:(NSString *)currencyId placementName:(NSString *)placementName resolve:(RCTPromiseResolveBlock
|
|
37
|
-
RCT_EXTERN_METHOD(getRequiredAmount:(NSString *)currencyId placementName:(NSString *)placementName resolve:(RCTPromiseResolveBlock
|
|
39
|
+
RCT_EXTERN_METHOD(getEntryPoint:(NSString *)name resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
|
|
40
|
+
RCT_EXTERN_METHOD(setCurrencyBalance:(NSInteger)amount currencyId:(NSString *)currencyId placementName:(NSString *)placementName resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
|
|
41
|
+
RCT_EXTERN_METHOD(getPlacementCurrencyBalance:(NSString *)currencyId placementName:(NSString *)placementName resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
|
|
42
|
+
RCT_EXTERN_METHOD(setRequiredAmount:(NSInteger)requiredAmount currencyId:(NSString *)currencyId placementName:(NSString *)placementName resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
|
|
43
|
+
RCT_EXTERN_METHOD(getRequiredAmount:(NSString *)currencyId placementName:(NSString *)placementName resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
|
|
38
44
|
|
|
39
45
|
#pragma mark - Currency
|
|
40
|
-
RCT_EXTERN_METHOD(getCurrencyBalance:(RCTPromiseResolveBlock
|
|
41
|
-
RCT_EXTERN_METHOD(spendCurrency:(int)amount resolve:(RCTPromiseResolveBlock
|
|
42
|
-
RCT_EXTERN_METHOD(awardCurrency:(int)amount resolve:(RCTPromiseResolveBlock
|
|
46
|
+
RCT_EXTERN_METHOD(getCurrencyBalance:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
|
|
47
|
+
RCT_EXTERN_METHOD(spendCurrency:(int)amount resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
|
|
48
|
+
RCT_EXTERN_METHOD(awardCurrency:(int)amount resolve:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
|
|
43
49
|
|
|
44
50
|
#pragma mark - Privacy
|
|
45
51
|
RCT_EXTERN_METHOD(setUSPrivacy:(NSString *)privacyValue)
|
|
@@ -50,6 +56,10 @@ RCT_EXTERN_METHOD(getBelowConsentAge: (RCTPromiseResolveBlock)resolve reject:(RC
|
|
|
50
56
|
RCT_EXTERN_METHOD(getSubjectToGDPR: (RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
|
|
51
57
|
RCT_EXTERN_METHOD(getUserConsent: (RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
|
|
52
58
|
RCT_EXTERN_METHOD(getUSPrivacy: (RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
|
|
59
|
+
RCT_EXTERN_METHOD(getUsageStatsConsent:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
|
|
60
|
+
RCT_EXTERN_METHOD(setUsageStatsConsent:(nonnull NSNumber *)usageStatsConsent)
|
|
61
|
+
RCT_EXTERN_METHOD(optOutAdvertisingID:(BOOL)optOut)
|
|
62
|
+
RCT_EXTERN_METHOD(getOptOutAdvertisingID:(RCTPromiseResolveBlock)resolve reject:(RCTPromiseRejectBlock)reject)
|
|
53
63
|
+ (BOOL)requiresMainQueueSetup
|
|
54
64
|
{
|
|
55
65
|
return NO;
|
|
@@ -58,4 +68,15 @@ RCT_EXTERN_METHOD(getUSPrivacy: (RCTPromiseResolveBlock)resolve reject:(RCTPromi
|
|
|
58
68
|
#pragma mark - Purchase
|
|
59
69
|
RCT_EXTERN_METHOD(trackPurchase:(NSString *)currencyCode price:(nonnull NSNumber *)price);
|
|
60
70
|
|
|
71
|
+
#pragma mark - Event Emitter
|
|
72
|
+
RCT_EXTERN_METHOD(addListener:(NSString *)eventName)
|
|
73
|
+
RCT_EXTERN_METHOD(removeListeners:(double)count)
|
|
74
|
+
|
|
75
|
+
@end
|
|
76
|
+
|
|
77
|
+
#ifdef RCT_NEW_ARCH_ENABLED
|
|
78
|
+
#if __has_include("TapjoyReactNativeSdkSpec.h")
|
|
79
|
+
@interface TapjoyReactNativeSdk () <NativeTapjoyReactNativeSdkSpec>
|
|
61
80
|
@end
|
|
81
|
+
#endif
|
|
82
|
+
#endif
|
|
@@ -19,12 +19,14 @@ class TapjoyReactNativeSdk: RCTEventEmitter {
|
|
|
19
19
|
return ["TapjoyPlacement", "Tapjoy"];
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
@objc override func
|
|
22
|
+
@objc override func addListener(_ eventName: String) {
|
|
23
23
|
listeners += 1
|
|
24
|
+
super.addListener(eventName)
|
|
24
25
|
}
|
|
25
|
-
|
|
26
|
-
@objc override func
|
|
27
|
-
listeners -=
|
|
26
|
+
|
|
27
|
+
@objc override func removeListeners(_ count: Double) {
|
|
28
|
+
listeners -= Int(count)
|
|
29
|
+
super.removeListeners(count)
|
|
28
30
|
}
|
|
29
31
|
|
|
30
32
|
func attemptSendEvent(withName name: String, body: [AnyHashable : Any?]?) {
|
|
@@ -555,6 +557,24 @@ class TapjoyReactNativeSdk: RCTEventEmitter {
|
|
|
555
557
|
@objc func trackPurchase(_ currencyCode: String, price: NSNumber) {
|
|
556
558
|
Tapjoy.trackPurchase(withCurrencyCode: currencyCode, price: price.doubleValue)
|
|
557
559
|
}
|
|
560
|
+
|
|
561
|
+
// No-op methods for iOS
|
|
562
|
+
@objc func getUsageStatsConsent(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
563
|
+
resolve(2)
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
// No-op methods for iOS
|
|
567
|
+
@objc func setUsageStatsConsent(_ usageStatsConsent: NSNumber) {
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
// No-op methods for iOS
|
|
571
|
+
@objc func optOutAdvertisingID(_ optOut: Bool) {
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
// No-op methods for iOS
|
|
575
|
+
@objc func getOptOutAdvertisingID(_ resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
576
|
+
resolve(false)
|
|
577
|
+
}
|
|
558
578
|
}
|
|
559
579
|
|
|
560
580
|
extension TapjoyReactNativeSdk: TJPlacementDelegate {
|
|
@@ -1,25 +1,52 @@
|
|
|
1
|
-
import { findNodeHandle, requireNativeComponent, UIManager
|
|
1
|
+
import { findNodeHandle, requireNativeComponent, UIManager } from 'react-native';
|
|
2
2
|
import React from 'react';
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
3
|
+
import { isFabricEnabled } from './utils/ArchitectureDetection';
|
|
4
|
+
let fabricModule = null;
|
|
5
|
+
let legacyComponent = null;
|
|
6
|
+
const getFabricModule = () => {
|
|
7
|
+
if (fabricModule == null) {
|
|
8
|
+
fabricModule = require('./TJOfferwallDiscoverViewNativeComponent');
|
|
9
|
+
}
|
|
10
|
+
return fabricModule;
|
|
11
|
+
};
|
|
12
|
+
const getLegacyComponent = () => {
|
|
13
|
+
if (legacyComponent == null) {
|
|
14
|
+
legacyComponent = requireNativeComponent('TJOfferwallDiscoverNativeView');
|
|
13
15
|
}
|
|
16
|
+
return legacyComponent;
|
|
17
|
+
};
|
|
18
|
+
const getNativeComponent = () => {
|
|
19
|
+
if (isFabricEnabled()) {
|
|
20
|
+
return getFabricModule().default;
|
|
21
|
+
}
|
|
22
|
+
return getLegacyComponent();
|
|
23
|
+
};
|
|
24
|
+
export default class TJOfferwallDiscoverView extends React.Component {
|
|
25
|
+
viewRef = React.createRef();
|
|
14
26
|
render() {
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}}/>);
|
|
27
|
+
const NativeComponent = getNativeComponent();
|
|
28
|
+
return (<NativeComponent {...this.props} ref={this.viewRef}/>);
|
|
18
29
|
}
|
|
19
30
|
requestContent(placement) {
|
|
20
|
-
|
|
31
|
+
if (isFabricEnabled() && this.viewRef.current) {
|
|
32
|
+
getFabricModule().Commands.requestContent(this.viewRef.current, placement);
|
|
33
|
+
}
|
|
34
|
+
else {
|
|
35
|
+
const nodeHandle = findNodeHandle(this.viewRef.current);
|
|
36
|
+
if (nodeHandle != null) {
|
|
37
|
+
UIManager.dispatchViewManagerCommand(nodeHandle, 'requestContent', [placement]);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
21
40
|
}
|
|
22
41
|
clearContent() {
|
|
23
|
-
|
|
42
|
+
if (isFabricEnabled() && this.viewRef.current) {
|
|
43
|
+
getFabricModule().Commands.clearContent(this.viewRef.current);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
const nodeHandle = findNodeHandle(this.viewRef.current);
|
|
47
|
+
if (nodeHandle != null) {
|
|
48
|
+
UIManager.dispatchViewManagerCommand(nodeHandle, 'clearContent', []);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
24
51
|
}
|
|
25
52
|
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent';
|
|
2
|
+
import codegenNativeCommands from 'react-native/Libraries/Utilities/codegenNativeCommands';
|
|
3
|
+
export const Commands = codegenNativeCommands({
|
|
4
|
+
supportedCommands: ['requestContent', 'clearContent'],
|
|
5
|
+
});
|
|
6
|
+
export default codegenNativeComponent('TJOfferwallDiscoverNativeView');
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
import { NativeEventEmitter, NativeModules } from 'react-native';
|
|
2
2
|
import { EventEmitter } from 'eventemitter3';
|
|
3
3
|
import TJEntryPoint from './TJEntryPoint';
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
import NativeTapjoyReactNativeSdk from './NativeTapjoyReactNativeSdk';
|
|
5
|
+
import { isTurboModuleEnabled } from './utils/ArchitectureDetection';
|
|
6
|
+
const TapjoyNative = isTurboModuleEnabled()
|
|
7
|
+
? NativeTapjoyReactNativeSdk
|
|
8
|
+
: NativeModules.TapjoyReactNativeSdk;
|
|
9
|
+
const TapjoyEmitter = new NativeEventEmitter(TapjoyNative);
|
|
6
10
|
const TapjoyEventType = 'TapjoyPlacement';
|
|
7
11
|
class TJPlacement extends EventEmitter {
|
|
8
12
|
static REQUEST_DID_SUCCEED = 'requestDidSucceed';
|
|
@@ -37,7 +41,7 @@ class TJPlacement extends EventEmitter {
|
|
|
37
41
|
super();
|
|
38
42
|
this.name = name;
|
|
39
43
|
this.error = undefined;
|
|
40
|
-
|
|
44
|
+
TapjoyNative.createPlacement(this.name);
|
|
41
45
|
}
|
|
42
46
|
/**
|
|
43
47
|
* Request placement content.
|
|
@@ -63,7 +67,7 @@ class TJPlacement extends EventEmitter {
|
|
|
63
67
|
this.emit(TJPlacement.CONTENT_IS_READY, this);
|
|
64
68
|
}
|
|
65
69
|
});
|
|
66
|
-
|
|
70
|
+
TapjoyNative.requestPlacement(this.name);
|
|
67
71
|
}
|
|
68
72
|
/**
|
|
69
73
|
* Displays the content associated with the placement.
|
|
@@ -79,7 +83,7 @@ class TJPlacement extends EventEmitter {
|
|
|
79
83
|
this.emit(TJPlacement.CONTENT_DID_DISAPPEAR, this);
|
|
80
84
|
}
|
|
81
85
|
});
|
|
82
|
-
|
|
86
|
+
TapjoyNative.showPlacement(this.name);
|
|
83
87
|
}
|
|
84
88
|
/**
|
|
85
89
|
* Checks whether the content is ready for use.
|
|
@@ -87,7 +91,7 @@ class TJPlacement extends EventEmitter {
|
|
|
87
91
|
* @returns {boolean} True if the content is ready; otherwise, false.
|
|
88
92
|
*/
|
|
89
93
|
isContentReady() {
|
|
90
|
-
return
|
|
94
|
+
return TapjoyNative.isContentReady(this.name);
|
|
91
95
|
}
|
|
92
96
|
/**
|
|
93
97
|
* Checks whether the content is available for use.
|
|
@@ -95,7 +99,7 @@ class TJPlacement extends EventEmitter {
|
|
|
95
99
|
* @returns {boolean} True if the content is available; otherwise, false.
|
|
96
100
|
*/
|
|
97
101
|
isContentAvailable() {
|
|
98
|
-
return
|
|
102
|
+
return TapjoyNative.isContentAvailable(this.name);
|
|
99
103
|
}
|
|
100
104
|
/**
|
|
101
105
|
* Sets the currency balance for given currency id.
|
|
@@ -104,7 +108,7 @@ class TJPlacement extends EventEmitter {
|
|
|
104
108
|
* @param {Number} currencyBalance - The amount of the currency to set. Must be greater than or equal to 0.
|
|
105
109
|
*/
|
|
106
110
|
async setCurrencyBalance(currencyId, currencyBalance) {
|
|
107
|
-
await
|
|
111
|
+
await TapjoyNative.setCurrencyBalance(currencyBalance, currencyId, this.name);
|
|
108
112
|
}
|
|
109
113
|
/**
|
|
110
114
|
* Gets the currency balance for given currency id.
|
|
@@ -113,7 +117,7 @@ class TJPlacement extends EventEmitter {
|
|
|
113
117
|
* @return {Number} currencyBalance - The amount of the currency.
|
|
114
118
|
*/
|
|
115
119
|
async getCurrencyBalance(currencyId) {
|
|
116
|
-
return await
|
|
120
|
+
return await TapjoyNative.getPlacementCurrencyBalance(currencyId, this.name);
|
|
117
121
|
}
|
|
118
122
|
/**
|
|
119
123
|
* Sets the currency amount required
|
|
@@ -122,7 +126,7 @@ class TJPlacement extends EventEmitter {
|
|
|
122
126
|
* @param {String} currencyId The identifier of the currency.
|
|
123
127
|
*/
|
|
124
128
|
async setRequiredAmount(amount, currencyId) {
|
|
125
|
-
await
|
|
129
|
+
await TapjoyNative.setRequiredAmount(amount, currencyId, this.name);
|
|
126
130
|
}
|
|
127
131
|
/**
|
|
128
132
|
* Gets the currency amount required.
|
|
@@ -131,7 +135,7 @@ class TJPlacement extends EventEmitter {
|
|
|
131
135
|
* @return {Number} The amount of currency the user needs. -1 if not available.
|
|
132
136
|
*/
|
|
133
137
|
async getRequiredAmount(currencyId) {
|
|
134
|
-
return await
|
|
138
|
+
return await TapjoyNative.getRequiredAmount(currencyId, this.name);
|
|
135
139
|
}
|
|
136
140
|
/**
|
|
137
141
|
* Sets the entry point for this placement instance.
|
|
@@ -140,7 +144,7 @@ class TJPlacement extends EventEmitter {
|
|
|
140
144
|
* @see TJEntryPoint
|
|
141
145
|
*/
|
|
142
146
|
setEntryPoint(entryPoint) {
|
|
143
|
-
|
|
147
|
+
TapjoyNative.setEntryPoint(this.name, Object.values(TJEntryPoint).indexOf(entryPoint));
|
|
144
148
|
}
|
|
145
149
|
/**
|
|
146
150
|
* Gets the entry point for this placement instance.
|
|
@@ -149,7 +153,7 @@ class TJPlacement extends EventEmitter {
|
|
|
149
153
|
* @see TJEntryPoint
|
|
150
154
|
*/
|
|
151
155
|
async getEntryPoint() {
|
|
152
|
-
const entryPointValue = Object.values(TJEntryPoint)[await
|
|
156
|
+
const entryPointValue = Object.values(TJEntryPoint)[await TapjoyNative.getEntryPoint(this.name)];
|
|
153
157
|
return entryPointValue;
|
|
154
158
|
}
|
|
155
159
|
}
|
|
@@ -1,9 +1,24 @@
|
|
|
1
1
|
import { NativeModules, Platform } from 'react-native';
|
|
2
|
-
|
|
2
|
+
import NativeTapjoyReactNativeSdk from './NativeTapjoyReactNativeSdk';
|
|
3
|
+
import { isTurboModuleEnabled } from './utils/ArchitectureDetection';
|
|
4
|
+
import TJStatus from './TJStatus';
|
|
5
|
+
const LINKING_ERROR = `The package 'tapjoy-react-native-sdk' doesn't seem to be linked. Make sure: \n\n` +
|
|
6
|
+
Platform.select({ ios: "- You have run 'pod install'\n", default: '' }) +
|
|
7
|
+
'- You rebuilt the app after installing the package\n' +
|
|
8
|
+
'- You are not using Expo Go\n';
|
|
9
|
+
const TapjoyAPI = isTurboModuleEnabled()
|
|
10
|
+
? NativeTapjoyReactNativeSdk
|
|
11
|
+
: NativeModules.TapjoyReactNativeSdk
|
|
12
|
+
? NativeModules.TapjoyReactNativeSdk
|
|
13
|
+
: new Proxy({}, {
|
|
14
|
+
get() {
|
|
15
|
+
throw new Error(LINKING_ERROR);
|
|
16
|
+
},
|
|
17
|
+
});
|
|
3
18
|
class TJPrivacyPolicy {
|
|
4
19
|
async getBelowConsentAge() {
|
|
5
20
|
try {
|
|
6
|
-
let isBelowConsentAge = await
|
|
21
|
+
let isBelowConsentAge = await TapjoyAPI.getBelowConsentAge();
|
|
7
22
|
return isBelowConsentAge;
|
|
8
23
|
}
|
|
9
24
|
catch (err) {
|
|
@@ -13,7 +28,7 @@ class TJPrivacyPolicy {
|
|
|
13
28
|
}
|
|
14
29
|
async getSubjectToGDPR() {
|
|
15
30
|
try {
|
|
16
|
-
let isSubjectToGDPR = await
|
|
31
|
+
let isSubjectToGDPR = await TapjoyAPI.getSubjectToGDPR();
|
|
17
32
|
return isSubjectToGDPR;
|
|
18
33
|
}
|
|
19
34
|
catch (err) {
|
|
@@ -22,11 +37,11 @@ class TJPrivacyPolicy {
|
|
|
22
37
|
}
|
|
23
38
|
}
|
|
24
39
|
setUSPrivacy(usPrivacy) {
|
|
25
|
-
|
|
40
|
+
TapjoyAPI.setUSPrivacy(usPrivacy);
|
|
26
41
|
}
|
|
27
42
|
async getUSPrivacy() {
|
|
28
43
|
try {
|
|
29
|
-
let usPrivacy = await
|
|
44
|
+
let usPrivacy = await TapjoyAPI.getUSPrivacy();
|
|
30
45
|
return usPrivacy;
|
|
31
46
|
}
|
|
32
47
|
catch (err) {
|
|
@@ -36,7 +51,7 @@ class TJPrivacyPolicy {
|
|
|
36
51
|
}
|
|
37
52
|
async getUserConsent() {
|
|
38
53
|
try {
|
|
39
|
-
let userConsent = await
|
|
54
|
+
let userConsent = await TapjoyAPI.getUserConsent();
|
|
40
55
|
return userConsent;
|
|
41
56
|
}
|
|
42
57
|
catch (err) {
|
|
@@ -44,18 +59,73 @@ class TJPrivacyPolicy {
|
|
|
44
59
|
throw err;
|
|
45
60
|
}
|
|
46
61
|
}
|
|
62
|
+
/**
|
|
63
|
+
* WARNING: EXPERIMENTAL API - DO NOT USE IT
|
|
64
|
+
*
|
|
65
|
+
* Android only.
|
|
66
|
+
*
|
|
67
|
+
* This method is experimental and intended for internal purposes only.
|
|
68
|
+
*
|
|
69
|
+
* Returns the user's consent status for accessing Android's Usage Stats API.
|
|
70
|
+
*
|
|
71
|
+
* @return TJStatus.True if the user agrees, TJStatus.False otherwise
|
|
72
|
+
*/
|
|
73
|
+
async getUsageStatsConsent() {
|
|
74
|
+
if (Platform.OS === 'android') {
|
|
75
|
+
try {
|
|
76
|
+
return await TapjoyAPI.getUsageStatsConsent();
|
|
77
|
+
}
|
|
78
|
+
catch (err) {
|
|
79
|
+
console.error(err);
|
|
80
|
+
throw err;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
console.warn('getUsageStatsConsent is only supported on Android.');
|
|
85
|
+
return Promise.resolve(TJStatus.Unknown);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
47
88
|
setBelowConsentAgeStatus(isBelowConsentAgeStatus) {
|
|
48
|
-
|
|
89
|
+
TapjoyAPI.setBelowConsentAgeStatus(isBelowConsentAgeStatus);
|
|
49
90
|
}
|
|
50
91
|
setSubjectToGDPRStatus(isSubjectToGDPRStatus) {
|
|
51
|
-
|
|
92
|
+
TapjoyAPI.setSubjectToGDPRStatus(isSubjectToGDPRStatus);
|
|
52
93
|
}
|
|
53
94
|
setUserConsentStatus(userConsentStatus) {
|
|
54
|
-
|
|
95
|
+
TapjoyAPI.setUserConsentStatus(userConsentStatus);
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* WARNING: EXPERIMENTAL API - DO NOT USE IT
|
|
99
|
+
*
|
|
100
|
+
* Android only.
|
|
101
|
+
*
|
|
102
|
+
* This method is experimental and intended for internal purposes only.
|
|
103
|
+
*
|
|
104
|
+
* Sets the user's consent status for accessing Android's Usage Stats API.
|
|
105
|
+
* The Android Usage Stats API (UsageStatsManager) allows apps to access
|
|
106
|
+
* data about app usage on the device.
|
|
107
|
+
*
|
|
108
|
+
* @param usageStatsConsent TJStatus.True if the user has granted permission
|
|
109
|
+
* to access their usage statistics, TJStatus.False
|
|
110
|
+
* if they have denied or not yet granted permission.
|
|
111
|
+
*/
|
|
112
|
+
setUsageStatsConsent(usageStatsConsent) {
|
|
113
|
+
if (Platform.OS === 'android') {
|
|
114
|
+
try {
|
|
115
|
+
TapjoyAPI.setUsageStatsConsent(usageStatsConsent);
|
|
116
|
+
}
|
|
117
|
+
catch (err) {
|
|
118
|
+
console.error(err);
|
|
119
|
+
throw err;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
console.warn('setUsageStatsConsent is only supported on Android.');
|
|
124
|
+
}
|
|
55
125
|
}
|
|
56
126
|
optOutAdvertisingID(optOut) {
|
|
57
127
|
if (Platform.OS === 'android') {
|
|
58
|
-
|
|
128
|
+
TapjoyAPI.optOutAdvertisingID(optOut);
|
|
59
129
|
}
|
|
60
130
|
else {
|
|
61
131
|
console.warn('optOutAdvertisingID is only supported on Android.');
|
|
@@ -63,7 +133,7 @@ class TJPrivacyPolicy {
|
|
|
63
133
|
}
|
|
64
134
|
getOptOutAdvertisingID() {
|
|
65
135
|
if (Platform.OS === 'android') {
|
|
66
|
-
return
|
|
136
|
+
return TapjoyAPI.getOptOutAdvertisingID();
|
|
67
137
|
}
|
|
68
138
|
else {
|
|
69
139
|
console.warn('getOptOutAdvertisingID is only supported on Android.');
|