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.
- package/android/build.gradle +8 -15
- package/android/gradle.properties +3 -3
- package/android/src/main/java/com/tapjoyreactnativesdk/TJOfferwallDiscoverNativeView.kt +2 -2
- package/android/src/main/java/com/tapjoyreactnativesdk/TJOfferwallDiscoverNativeViewManager.kt +21 -16
- package/android/src/main/java/com/tapjoyreactnativesdk/TapjoyReactNativeSdkModule.kt +130 -87
- package/android/src/main/java/com/tapjoyreactnativesdk/TapjoyReactNativeSdkPackage.kt +29 -5
- package/example/android/app/build.gradle +1 -1
- package/example/android/app/src/main/java/com/tapjoyreactnativesdkexample/MainApplication.kt +2 -8
- package/example/android/build.gradle +4 -4
- package/example/android/gradle/wrapper/gradle-wrapper.properties +1 -1
- package/example/android/gradle.properties +5 -0
- package/example/ios/Podfile +2 -1
- package/example/ios/TapjoyReactNativeSdkExample/Info.plist +3 -1
- package/example/ios/TapjoyReactNativeSdkExample.xcodeproj/project.pbxproj +0 -45
- package/example/metro.config.js +9 -15
- package/example/package.json +19 -16
- package/example/scripts/set-arch.sh +25 -0
- package/example/src/App.tsx +1 -2
- package/example/src/MainScreen.tsx +76 -60
- package/example/src/OfferwallDiscoverScreen.tsx +105 -91
- package/example/src/OfferwallScreen.tsx +170 -156
- package/example/src/Styles.ts +3 -2
- package/example/src/UserProperties.tsx +170 -136
- 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 +14 -16
- 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
|
@@ -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
|
-
<
|
|
260
|
-
<
|
|
261
|
-
<View style={
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
<
|
|
274
|
-
style={styles.
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
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
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
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
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
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
|
-
<
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
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}>
|
|
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={
|
|
394
|
-
onSelectItem={
|
|
395
|
-
initialSelectedItem={
|
|
383
|
+
data={statusData}
|
|
384
|
+
onSelectItem={handleBelowConsentAge}
|
|
385
|
+
initialSelectedItem={initialBelowConsentAgeItem}
|
|
396
386
|
/>
|
|
397
387
|
</View>
|
|
398
388
|
</View>
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
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
|
-
</
|
|
408
|
-
</
|
|
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 :
|
|
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');
|