tapjoy-react-native-sdk 14.4.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.
Files changed (54) hide show
  1. package/android/build.gradle +8 -15
  2. package/android/gradle.properties +3 -3
  3. package/android/src/main/java/com/tapjoyreactnativesdk/TJOfferwallDiscoverNativeView.kt +2 -2
  4. package/android/src/main/java/com/tapjoyreactnativesdk/TJOfferwallDiscoverNativeViewManager.kt +21 -16
  5. package/android/src/main/java/com/tapjoyreactnativesdk/TapjoyReactNativeSdkModule.kt +130 -87
  6. package/android/src/main/java/com/tapjoyreactnativesdk/TapjoyReactNativeSdkPackage.kt +29 -5
  7. package/example/android/app/build.gradle +1 -1
  8. package/example/android/app/src/main/java/com/tapjoyreactnativesdkexample/MainApplication.kt +2 -8
  9. package/example/android/build.gradle +4 -4
  10. package/example/android/gradle/wrapper/gradle-wrapper.properties +1 -1
  11. package/example/android/gradle.properties +5 -0
  12. package/example/ios/Podfile +2 -1
  13. package/example/ios/TapjoyReactNativeSdkExample/Info.plist +3 -1
  14. package/example/ios/TapjoyReactNativeSdkExample.xcodeproj/project.pbxproj +0 -45
  15. package/example/metro.config.js +9 -15
  16. package/example/package.json +19 -16
  17. package/example/scripts/set-arch.sh +25 -0
  18. package/example/src/App.tsx +1 -2
  19. package/example/src/MainScreen.tsx +76 -60
  20. package/example/src/OfferwallDiscoverScreen.tsx +105 -91
  21. package/example/src/OfferwallScreen.tsx +170 -156
  22. package/example/src/Styles.ts +3 -2
  23. package/example/src/UserProperties.tsx +170 -136
  24. package/ios/TJOfferwallDiscoverNativeViewManager.m +11 -1
  25. package/ios/TJOfferwallDiscoverNativeViewManager.swift +2 -2
  26. package/ios/TapjoyReactNativeSdk.m +36 -15
  27. package/ios/TapjoyReactNativeSdk.swift +24 -4
  28. package/lib/commonjs/NativeTapjoyReactNativeSdk.js +2 -0
  29. package/lib/commonjs/TJOfferwallDiscoverView.js +43 -16
  30. package/lib/commonjs/TJOfferwallDiscoverViewNativeComponent.js +6 -0
  31. package/lib/commonjs/TJPlacement.js +17 -13
  32. package/lib/commonjs/TJPrivacyPolicy.js +81 -11
  33. package/lib/commonjs/TJVersion.js +1 -1
  34. package/lib/commonjs/Tapjoy.js +16 -10
  35. package/lib/commonjs/index.js +2 -1
  36. package/lib/commonjs/utils/ArchitectureDetection.js +7 -0
  37. package/lib/typescript/NativeTapjoyReactNativeSdk.d.ts +53 -0
  38. package/lib/typescript/TJOfferwallDiscoverView.d.ts +3 -12
  39. package/lib/typescript/TJOfferwallDiscoverViewNativeComponent.d.ts +21 -0
  40. package/lib/typescript/TJPrivacyPolicy.d.ts +29 -1
  41. package/lib/typescript/Tapjoy.d.ts +1 -1
  42. package/lib/typescript/index.d.ts +5 -3
  43. package/lib/typescript/utils/ArchitectureDetection.d.ts +5 -0
  44. package/package.json +14 -16
  45. package/src/NativeTapjoyReactNativeSdk.ts +117 -0
  46. package/src/TJOfferwallDiscoverView.tsx +56 -39
  47. package/src/TJOfferwallDiscoverViewNativeComponent.ts +37 -0
  48. package/src/TJPlacement.ts +17 -13
  49. package/src/TJPrivacyPolicy.ts +84 -12
  50. package/src/TJVersion.ts +1 -1
  51. package/src/Tapjoy.ts +20 -13
  52. package/src/index.ts +13 -3
  53. package/src/utils/ArchitectureDetection.ts +14 -0
  54. package/tapjoy-react-native-sdk.podspec +1 -1
@@ -3,10 +3,13 @@ import {
3
3
  View,
4
4
  TextInput,
5
5
  Text,
6
- SafeAreaView,
7
6
  ScrollView,
8
7
  Platform,
9
8
  } from 'react-native';
9
+ import {
10
+ SafeAreaProvider,
11
+ useSafeAreaInsets,
12
+ } from 'react-native-safe-area-context';
10
13
  import AsyncStorage from '@react-native-async-storage/async-storage';
11
14
  import Button from './Button';
12
15
  import styles from './Styles';
@@ -37,6 +40,7 @@ const UserProperties: React.FC = () => {
37
40
  const [userSegment, setUserSegment] = useState<TJSegment>(TJSegment.Unknown);
38
41
  const [userTag, setUserTag] = useState<string>('');
39
42
  const [optOut, setOptOut] = useState<boolean>(false);
43
+ const [usageStatsConsent, setUsageStatsConsent] = useState<TJStatus>(TJStatus.Unknown);
40
44
  const isFocused = useIsFocused();
41
45
 
42
46
  const statusData = [
@@ -112,6 +116,7 @@ const UserProperties: React.FC = () => {
112
116
  setBelowConsentAge(await privacyPolicy.getBelowConsentAge());
113
117
  setSubjectToGDPR(await privacyPolicy.getSubjectToGDPR());
114
118
  setUserConsent(await privacyPolicy.getUserConsent());
119
+ setUsageStatsConsent(await privacyPolicy.getUsageStatsConsent());
115
120
  setUSPrivacy(await privacyPolicy.getUSPrivacy());
116
121
  } catch (error) {
117
122
  setStatusLabelText(`Failed to retrieve Privacy Policy: ${error}`);
@@ -161,7 +166,7 @@ const UserProperties: React.FC = () => {
161
166
  const initialSubjectToGDPRItem = findStatus(isSubjectToGDPR);
162
167
  const initialUserSegmentItem = findSegment(userSegment);
163
168
  const initialOptOutItem = findOptOut(optOut);
164
-
169
+ const initialUsageStatsConsentItem = findStatus(usageStatsConsent);
165
170
  const applyProperties = async () => {
166
171
  try {
167
172
  let trimmedUserId = userId?.trim();
@@ -179,6 +184,7 @@ const UserProperties: React.FC = () => {
179
184
  privacyPolicy.setSubjectToGDPRStatus(isSubjectToGDPR);
180
185
  privacyPolicy.setBelowConsentAgeStatus(isBelowConsentAge);
181
186
  privacyPolicy.setUserConsentStatus(userConsent);
187
+ privacyPolicy.setUsageStatsConsent(usageStatsConsent);
182
188
  privacyPolicy.setUSPrivacy(USPrivacy);
183
189
  if (Platform.OS === 'android') {
184
190
  privacyPolicy.optOutAdvertisingID(optOut);
@@ -251,161 +257,189 @@ const UserProperties: React.FC = () => {
251
257
  setUserSegment(item.value);
252
258
  };
253
259
 
260
+ const handleUsageStatsConsent = (item: { value: TJStatus; label: string }) => {
261
+ setUsageStatsConsent(item.value);
262
+ };
263
+
254
264
  const handleOptOut = (item: { value: boolean; label: string }) => {
255
265
  setOptOut(item.value);
256
266
  };
257
267
 
268
+ const safeAreaInsets = useSafeAreaInsets();
269
+
258
270
  return (
259
- <ScrollView>
260
- <SafeAreaView style={styles.container}>
261
- <View style={styles.lineGap}>
262
- <Text style={styles.statusText}>{statusLabelText}</Text>
263
- </View>
264
- <View style={styles.inputContainer}>
265
- <Text style={styles.userPropertiesLabel}>User ID:</Text>
266
- <TextInput
267
- style={styles.textInput}
268
- value={userId}
269
- onChangeText={setUserId}
270
- placeholder="Enter user ID"
271
- placeholderTextColor="#888"
272
- />
273
- <Button
274
- style={styles.clearButton}
275
- onPress={handleClearInput}
276
- title={'\u2573'}
277
- />
278
- </View>
279
- <View style={styles.inputContainer}>
280
- <Text style={styles.userPropertiesLabel}>Max Level:</Text>
281
- <TextInput
282
- style={styles.textInput}
283
- value={maxLevel}
284
- keyboardType={'numeric'}
285
- onChangeText={setMaxLevel}
286
- placeholder="Enter max level"
287
- placeholderTextColor="#888"
288
- />
289
- <Button
290
- style={styles.clearButton}
291
- onPress={handleClearMaxLevel}
292
- title={'\u2573'}
293
- />
294
- </View>
295
- <View style={styles.inputContainer}>
296
- <Text style={styles.userPropertiesLabel}>User Level:</Text>
297
- <TextInput
298
- style={styles.textInput}
299
- value={userLevel}
300
- keyboardType={'numeric'}
301
- onChangeText={setUserLevel}
302
- placeholder="Enter user level"
303
- placeholderTextColor="#888"
304
- />
305
- <Button
306
- style={styles.clearButton}
307
- onPress={handleClearUserLevel}
308
- title={'\u2573'}
309
- />
310
- </View>
311
- <View style={styles.inputContainer}>
312
- <Text style={styles.userPropertiesLabel}>User Tags:</Text>
313
- <TextInput
314
- style={styles.textInput}
315
- value={userTag}
316
- onChangeText={setUserTag}
317
- placeholder="Enter user tag"
318
- placeholderTextColor="#888"
319
- />
320
- </View>
321
- <View style={styles.horizontalContainer}>
322
- <Button
323
- style={styles.buttonTag}
324
- onPress={handleAddUserTag}
325
- title={'Add'}
326
- />
327
- <Button
328
- style={styles.buttonTag}
329
- onPress={handleRemoveUserTag}
330
- title={'Remove'}
331
- />
332
- <Button
333
- style={styles.buttonTag}
334
- onPress={handleClearUserTag}
335
- title={'Clear'}
336
- />
337
- </View>
338
- <View style={styles.selectionContainer}>
339
- <View style={styles.horizontalContainer}>
340
- <Text style={styles.userPropertiesLabel}>User Segment:</Text>
341
- <SelectionMenu
342
- data={segmentData}
343
- onSelectItem={handleUserSegment}
344
- initialSelectedItem={initialUserSegmentItem}
271
+ <SafeAreaProvider>
272
+ <ScrollView>
273
+ <View style={[
274
+ styles.mainContainer,
275
+ {
276
+ paddingTop: safeAreaInsets.top,
277
+ paddingBottom: safeAreaInsets.bottom,
278
+ paddingLeft: safeAreaInsets.left,
279
+ paddingRight: safeAreaInsets.right,
280
+ },
281
+ ]}>
282
+ <View style={styles.lineGap}>
283
+ <Text style={styles.statusText}>{statusLabelText}</Text>
284
+ </View>
285
+ <View style={styles.inputContainer}>
286
+ <Text style={styles.userPropertiesLabel}>User ID:</Text>
287
+ <TextInput
288
+ style={styles.textInput}
289
+ value={userId}
290
+ onChangeText={setUserId}
291
+ placeholder="Enter user ID"
292
+ placeholderTextColor="#888"
293
+ />
294
+ <Button
295
+ style={styles.clearButton}
296
+ onPress={handleClearInput}
297
+ title={'\u2573'}
345
298
  />
346
299
  </View>
347
- </View>
348
- <View style={styles.selectionContainer}>
349
- <View style={styles.horizontalContainer}>
350
- <Text style={styles.userPropertiesLabel}>Subject To GDPR:</Text>
351
- <SelectionMenu
352
- data={statusData}
353
- onSelectItem={handleSubjectToGDPR}
354
- initialSelectedItem={initialSubjectToGDPRItem}
300
+ <View style={styles.inputContainer}>
301
+ <Text style={styles.userPropertiesLabel}>Max Level:</Text>
302
+ <TextInput
303
+ style={styles.textInput}
304
+ value={maxLevel}
305
+ keyboardType={'numeric'}
306
+ onChangeText={setMaxLevel}
307
+ placeholder="Enter max level"
308
+ placeholderTextColor="#888"
309
+ />
310
+ <Button
311
+ style={styles.clearButton}
312
+ onPress={handleClearMaxLevel}
313
+ title={'\u2573'}
355
314
  />
356
315
  </View>
357
- </View>
358
- <View style={styles.selectionContainer}>
359
- <View style={styles.horizontalContainer}>
360
- <Text style={styles.userPropertiesLabel}>Below Consent Age:</Text>
361
- <SelectionMenu
362
- data={statusData}
363
- onSelectItem={handleBelowConsentAge}
364
- initialSelectedItem={initialBelowConsentAgeItem}
316
+ <View style={styles.inputContainer}>
317
+ <Text style={styles.userPropertiesLabel}>User Level:</Text>
318
+ <TextInput
319
+ style={styles.textInput}
320
+ value={userLevel}
321
+ keyboardType={'numeric'}
322
+ onChangeText={setUserLevel}
323
+ placeholder="Enter user level"
324
+ placeholderTextColor="#888"
325
+ />
326
+ <Button
327
+ style={styles.clearButton}
328
+ onPress={handleClearUserLevel}
329
+ title={'\u2573'}
330
+ />
331
+ </View>
332
+ <View style={styles.inputContainer}>
333
+ <Text style={styles.userPropertiesLabel}>User Tags:</Text>
334
+ <TextInput
335
+ style={styles.textInput}
336
+ value={userTag}
337
+ onChangeText={setUserTag}
338
+ placeholder="Enter user tag"
339
+ placeholderTextColor="#888"
365
340
  />
366
341
  </View>
367
- </View>
368
- <View style={styles.selectionContainer}>
369
342
  <View style={styles.horizontalContainer}>
370
- <Text style={styles.userPropertiesLabel}>User Consent:</Text>
371
- <SelectionMenu
372
- data={statusData}
373
- onSelectItem={handleUserConsent}
374
- initialSelectedItem={initialUserConsentItem}
343
+ <Button
344
+ style={styles.buttonTag}
345
+ onPress={handleAddUserTag}
346
+ title={'Add'}
347
+ />
348
+ <Button
349
+ style={styles.buttonTag}
350
+ onPress={handleRemoveUserTag}
351
+ title={'Remove'}
352
+ />
353
+ <Button
354
+ style={styles.buttonTag}
355
+ onPress={handleClearUserTag}
356
+ title={'Clear'}
375
357
  />
376
358
  </View>
377
- </View>
378
- <View style={styles.inputContainer}>
379
- <Text style={styles.userPropertiesLabel}>US Privacy:</Text>
380
- <TextInput
381
- style={styles.textInput}
382
- value={USPrivacy}
383
- onChangeText={handleUSPrivacy}
384
- placeholder="E.g 1YYN"
385
- placeholderTextColor="#888"
386
- />
387
- </View>
388
- {Platform.OS === 'android' && (
389
359
  <View style={styles.selectionContainer}>
390
360
  <View style={styles.horizontalContainer}>
391
- <Text style={styles.userPropertiesLabel}>Opt Out Ad ID:</Text>
361
+ <Text style={styles.userPropertiesLabel}>User Segment:</Text>
362
+ <SelectionMenu
363
+ data={segmentData}
364
+ onSelectItem={handleUserSegment}
365
+ initialSelectedItem={initialUserSegmentItem}
366
+ />
367
+ </View>
368
+ </View>
369
+ <View style={styles.selectionContainer}>
370
+ <View style={styles.horizontalContainer}>
371
+ <Text style={styles.userPropertiesLabel}>Subject To GDPR:</Text>
372
+ <SelectionMenu
373
+ data={statusData}
374
+ onSelectItem={handleSubjectToGDPR}
375
+ initialSelectedItem={initialSubjectToGDPRItem}
376
+ />
377
+ </View>
378
+ </View>
379
+ <View style={styles.selectionContainer}>
380
+ <View style={styles.horizontalContainer}>
381
+ <Text style={styles.userPropertiesLabel}>Below Consent Age:</Text>
392
382
  <SelectionMenu
393
- data={optOutAdData}
394
- onSelectItem={handleOptOut}
395
- initialSelectedItem={initialOptOutItem}
383
+ data={statusData}
384
+ onSelectItem={handleBelowConsentAge}
385
+ initialSelectedItem={initialBelowConsentAgeItem}
396
386
  />
397
387
  </View>
398
388
  </View>
399
- )}
400
- <View style={styles.buttonContainer}>
401
- <Button
402
- style={styles.button}
403
- onPress={applyProperties}
404
- title={'Apply'}
405
- />
389
+ <View style={styles.selectionContainer}>
390
+ <View style={styles.horizontalContainer}>
391
+ <Text style={styles.userPropertiesLabel}>User Consent:</Text>
392
+ <SelectionMenu
393
+ data={statusData}
394
+ onSelectItem={handleUserConsent}
395
+ initialSelectedItem={initialUserConsentItem}
396
+ />
397
+ </View>
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
+ )}
411
+ <View style={styles.inputContainer}>
412
+ <Text style={styles.userPropertiesLabel}>US Privacy:</Text>
413
+ <TextInput
414
+ style={styles.textInput}
415
+ value={USPrivacy}
416
+ onChangeText={handleUSPrivacy}
417
+ placeholder="E.g 1YYN"
418
+ placeholderTextColor="#888"
419
+ />
420
+ </View>
421
+ {Platform.OS === 'android' && (
422
+ <View style={styles.selectionContainer}>
423
+ <View style={styles.horizontalContainer}>
424
+ <Text style={styles.userPropertiesLabel}>Opt Out Ad ID:</Text>
425
+ <SelectionMenu
426
+ data={optOutAdData}
427
+ onSelectItem={handleOptOut}
428
+ initialSelectedItem={initialOptOutItem}
429
+ />
430
+ </View>
431
+ </View>
432
+ )}
433
+ <View style={styles.buttonContainer}>
434
+ <Button
435
+ style={styles.button}
436
+ onPress={applyProperties}
437
+ title={'Apply'}
438
+ />
439
+ </View>
406
440
  </View>
407
- </SafeAreaView>
408
- </ScrollView>
441
+ </ScrollView>
442
+ </SafeAreaProvider>
409
443
  );
410
444
  };
411
445
 
@@ -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');