tapjoy-react-native-sdk 14.5.0 → 14.7.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.
Files changed (42) hide show
  1. package/android/build.gradle +6 -13
  2. package/android/src/main/java/com/tapjoyreactnativesdk/TJOfferwallDiscoverNativeViewManager.kt +21 -16
  3. package/android/src/main/java/com/tapjoyreactnativesdk/TapjoyReactNativeSdkModule.kt +112 -74
  4. package/android/src/main/java/com/tapjoyreactnativesdk/TapjoyReactNativeSdkPackage.kt +29 -5
  5. package/example/android/app/build.gradle +1 -1
  6. package/example/ios/Podfile +2 -1
  7. package/example/ios/TapjoyReactNativeSdkExample/Info.plist +2 -0
  8. package/example/package.json +4 -2
  9. package/example/scripts/set-arch.sh +25 -0
  10. package/example/src/MainScreen.tsx +1 -0
  11. package/example/src/UserProperties.tsx +20 -1
  12. package/ios/TJOfferwallDiscoverNativeViewManager.m +11 -1
  13. package/ios/TJOfferwallDiscoverNativeViewManager.swift +2 -2
  14. package/ios/TapjoyReactNativeSdk.m +36 -15
  15. package/ios/TapjoyReactNativeSdk.swift +24 -4
  16. package/lib/commonjs/NativeTapjoyReactNativeSdk.js +2 -0
  17. package/lib/commonjs/TJOfferwallDiscoverView.js +43 -16
  18. package/lib/commonjs/TJOfferwallDiscoverViewNativeComponent.js +6 -0
  19. package/lib/commonjs/TJPlacement.js +17 -13
  20. package/lib/commonjs/TJPrivacyPolicy.js +81 -11
  21. package/lib/commonjs/TJVersion.js +1 -1
  22. package/lib/commonjs/Tapjoy.js +16 -10
  23. package/lib/commonjs/index.js +2 -1
  24. package/lib/commonjs/utils/ArchitectureDetection.js +7 -0
  25. package/lib/typescript/NativeTapjoyReactNativeSdk.d.ts +53 -0
  26. package/lib/typescript/TJOfferwallDiscoverView.d.ts +3 -12
  27. package/lib/typescript/TJOfferwallDiscoverViewNativeComponent.d.ts +21 -0
  28. package/lib/typescript/TJPrivacyPolicy.d.ts +29 -1
  29. package/lib/typescript/Tapjoy.d.ts +1 -1
  30. package/lib/typescript/index.d.ts +5 -3
  31. package/lib/typescript/utils/ArchitectureDetection.d.ts +5 -0
  32. package/package.json +7 -2
  33. package/src/NativeTapjoyReactNativeSdk.ts +117 -0
  34. package/src/TJOfferwallDiscoverView.tsx +56 -39
  35. package/src/TJOfferwallDiscoverViewNativeComponent.ts +37 -0
  36. package/src/TJPlacement.ts +17 -13
  37. package/src/TJPrivacyPolicy.ts +84 -12
  38. package/src/TJVersion.ts +1 -1
  39. package/src/Tapjoy.ts +20 -13
  40. package/src/index.ts +13 -3
  41. package/src/utils/ArchitectureDetection.ts +14 -0
  42. package/tapjoy-react-native-sdk.podspec +1 -1
@@ -1,12 +1,14 @@
1
1
  {
2
2
  "name": "TapjoyReactNativeSdkExample",
3
- "version": "14.5.0",
3
+ "version": "14.7.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
+
@@ -5,6 +5,7 @@ import {
5
5
  Platform,
6
6
  Text,
7
7
  ScrollView,
8
+ TurboModuleRegistry
8
9
  } from 'react-native';
9
10
  import {
10
11
  SafeAreaProvider,
@@ -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 : NSString)
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, _ placement: String) {
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
- Show current content.
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
- @interface RCT_EXTERN_MODULE(TapjoyReactNativeSdk, NSObject)
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 *)resolve reject:(RCTPromiseRejectBlock)reject)
8
- RCT_EXTERN_METHOD(setLoggingLevel:(NSNumber *)loggingLevel)
9
- RCT_EXTERN_METHOD(getLoggingLevel:(RCTPromiseResolveBlock *)resolve reject:(RCTPromiseRejectBlock)reject)
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 *)resolve reject:(RCTPromiseRejectBlock)reject)
13
- RCT_EXTERN_METHOD(setUserId:(NSString *)userId resolve:(RCTPromiseResolveBlock *)resolve reject:(RCTPromiseRejectBlock)reject)
14
- RCT_EXTERN_METHOD(getUserId:(RCTPromiseResolveBlock *)resolve reject:(RCTPromiseRejectBlock)reject)
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 *)resolve reject:(RCTPromiseRejectBlock)reject)
34
- RCT_EXTERN_METHOD(setCurrencyBalance:(NSInteger)amount currencyId:(NSString *)currencyId placementName:(NSString *)placementName resolve:(RCTPromiseResolveBlock *)resolve reject:(RCTPromiseRejectBlock)reject)
35
- RCT_EXTERN_METHOD(getPlacementCurrencyBalance:(NSString *)currencyId placementName:(NSString *)placementName resolve:(RCTPromiseResolveBlock *)resolve reject:(RCTPromiseRejectBlock)reject)
36
- RCT_EXTERN_METHOD(setRequiredAmount:(NSInteger)requiredAmount currencyId:(NSString *)currencyId placementName:(NSString *)placementName resolve:(RCTPromiseResolveBlock *)resolve reject:(RCTPromiseRejectBlock)reject)
37
- RCT_EXTERN_METHOD(getRequiredAmount:(NSString *)currencyId placementName:(NSString *)placementName resolve:(RCTPromiseResolveBlock *)resolve reject:(RCTPromiseRejectBlock)reject)
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 *)resolve reject:(RCTPromiseRejectBlock)reject)
41
- RCT_EXTERN_METHOD(spendCurrency:(int)amount resolve:(RCTPromiseResolveBlock *)resolve reject:(RCTPromiseRejectBlock)reject)
42
- RCT_EXTERN_METHOD(awardCurrency:(int)amount resolve:(RCTPromiseResolveBlock *)resolve reject:(RCTPromiseRejectBlock)reject)
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 startObserving() {
22
+ @objc override func addListener(_ eventName: String) {
23
23
  listeners += 1
24
+ super.addListener(eventName)
24
25
  }
25
-
26
- @objc override func stopObserving() {
27
- listeners -= 1
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 {
@@ -0,0 +1,2 @@
1
+ import { TurboModuleRegistry } from 'react-native';
2
+ export default TurboModuleRegistry.get('TapjoyReactNativeSdk');
@@ -1,25 +1,52 @@
1
- import { findNodeHandle, requireNativeComponent, UIManager, } from 'react-native';
1
+ import { findNodeHandle, requireNativeComponent, UIManager } from 'react-native';
2
2
  import React from 'react';
3
- var Command;
4
- (function (Command) {
5
- Command["REQUEST_CONTENT"] = "requestContent";
6
- Command["CLEAR_CONTENT"] = "clearContent";
7
- })(Command || (Command = {}));
8
- const TJOfferwallDiscoverNativeView = requireNativeComponent('TJOfferwallDiscoverNativeView');
9
- export default class TJOfferwallDiscoverView extends React.Component {
10
- nativeCompHandle = null;
11
- constructor(props) {
12
- super(props);
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
- return (<TJOfferwallDiscoverNativeView {...this.props} ref={(ref) => {
16
- this.nativeCompHandle = findNodeHandle(ref);
17
- }}/>);
27
+ const NativeComponent = getNativeComponent();
28
+ return (<NativeComponent {...this.props} ref={this.viewRef}/>);
18
29
  }
19
30
  requestContent(placement) {
20
- UIManager.dispatchViewManagerCommand(this.nativeCompHandle, Command.REQUEST_CONTENT, [placement]);
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
- UIManager.dispatchViewManagerCommand(this.nativeCompHandle, Command.CLEAR_CONTENT, []);
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
- const Tapjoy = NativeModules.TapjoyReactNativeSdk;
5
- const TapjoyEmitter = new NativeEventEmitter(Tapjoy);
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
- Tapjoy.createPlacement(this.name);
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
- Tapjoy.requestPlacement(this.name);
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
- Tapjoy.showPlacement(this.name);
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 Tapjoy.isContentReady(this.name);
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 Tapjoy.isContentAvailable(this.name);
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 Tapjoy.setCurrencyBalance(currencyBalance, currencyId, this.name);
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 Tapjoy.getPlacementCurrencyBalance(currencyId, this.name);
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 Tapjoy.setRequiredAmount(amount, currencyId, this.name);
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 Tapjoy.getRequiredAmount(currencyId, this.name);
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
- Tapjoy.setEntryPoint(this.name, Object.values(TJEntryPoint).indexOf(entryPoint));
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 Tapjoy.getEntryPoint(this.name)];
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
- const Tapjoy = NativeModules.TapjoyReactNativeSdk;
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 Tapjoy.getBelowConsentAge();
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 Tapjoy.getSubjectToGDPR();
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
- Tapjoy.setUSPrivacy(usPrivacy);
40
+ TapjoyAPI.setUSPrivacy(usPrivacy);
26
41
  }
27
42
  async getUSPrivacy() {
28
43
  try {
29
- let usPrivacy = await Tapjoy.getUSPrivacy();
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 Tapjoy.getUserConsent();
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
- Tapjoy.setBelowConsentAgeStatus(isBelowConsentAgeStatus);
89
+ TapjoyAPI.setBelowConsentAgeStatus(isBelowConsentAgeStatus);
49
90
  }
50
91
  setSubjectToGDPRStatus(isSubjectToGDPRStatus) {
51
- Tapjoy.setSubjectToGDPRStatus(isSubjectToGDPRStatus);
92
+ TapjoyAPI.setSubjectToGDPRStatus(isSubjectToGDPRStatus);
52
93
  }
53
94
  setUserConsentStatus(userConsentStatus) {
54
- Tapjoy.setUserConsentStatus(userConsentStatus);
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
- Tapjoy.optOutAdvertisingID(optOut);
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 Tapjoy.getOptOutAdvertisingID();
136
+ return TapjoyAPI.getOptOutAdvertisingID();
67
137
  }
68
138
  else {
69
139
  console.warn('getOptOutAdvertisingID is only supported on Android.');
@@ -1,4 +1,4 @@
1
- const REACT_LIBRARY_VERSION = '14.5.0';
1
+ const REACT_LIBRARY_VERSION = '14.7.0';
2
2
  const REACT_LIBRARY_VERSION_SUFFIX = '';
3
3
  export class TJVersion {
4
4
  // Returns the version of the plugin - eg: 1.0.0-alpha-rc1