Skip to content

Commit 37e9064

Browse files
committed
Add requestDeviceData
1 parent 67e0dc9 commit 37e9064

File tree

10 files changed

+99
-20
lines changed

10 files changed

+99
-20
lines changed

android/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,5 +56,5 @@ dependencies {
5656
api 'com.facebook.react:react-native:+'
5757

5858
compileOnly 'com.braintreepayments.api:braintree:3.14.1'
59+
compileOnly 'com.braintreepayments.api:data-collector:3.+'
5960
}
60-

android/src/main/java/com/smarkets/paypal/RNPaypalModule.java

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@
66

77
import androidx.fragment.app.FragmentActivity;
88
import com.braintreepayments.api.BraintreeFragment;
9+
import com.braintreepayments.api.DataCollector;
910
import com.braintreepayments.api.PayPal;
1011
import com.braintreepayments.api.exceptions.ErrorWithResponse;
1112
import com.braintreepayments.api.exceptions.InvalidArgumentException;
1213
import com.braintreepayments.api.interfaces.BraintreeCancelListener;
1314
import com.braintreepayments.api.interfaces.BraintreeErrorListener;
15+
import com.braintreepayments.api.interfaces.BraintreeResponseListener;
1416
import com.braintreepayments.api.interfaces.PaymentMethodNonceCreatedListener;
1517
import com.braintreepayments.api.models.PayPalAccountNonce;
1618
import com.braintreepayments.api.models.PayPalRequest;
@@ -154,6 +156,30 @@ public void requestBillingAgreement(
154156
PayPal.requestBillingAgreement(braintreeFragment, request);
155157
}
156158

159+
@ReactMethod
160+
public void requestDeviceData(
161+
final String token,
162+
final Promise promise
163+
) {
164+
BraintreeFragment braintreeFragment = null;
165+
166+
try {
167+
braintreeFragment = initializeBraintreeFragment(token, promise);
168+
} catch (Exception e) {
169+
promise.reject("braintree_sdk_setup_failed", e);
170+
return;
171+
}
172+
173+
DataCollector.collectDeviceData(braintreeFragment, new BraintreeResponseListener<String>() {
174+
@Override
175+
public void onResponse(String deviceData) {
176+
WritableMap result = Arguments.createMap();
177+
result.putString("deviceData", deviceData);
178+
promise.resolve(result);
179+
}
180+
});
181+
}
182+
157183
@Override
158184
public void onActivityResult(Activity activity, final int requestCode, final int resultCode, final Intent data) {
159185

index.d.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,10 @@ export interface PaypalResponse {
6363
phone: string
6464
}
6565

66+
export interface DeviceDataResponse {
67+
deviceData: string
68+
}
69+
6670
declare function requestOneTimePayment(token: string, {
6771
amount,
6872
currency,
@@ -88,3 +92,5 @@ declare function requestBillingAgreement(token: string, {
8892
currency ? : paypalSupportedCurrencies,
8993
localeCode ? : paypalLocalCodes,
9094
}): Promise <PaypalResponse> ;
95+
96+
declare function requestDeviceData(token: string): Promise <DeviceDataResponse> ;

index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,5 @@ export default RNPaypal;
77
export const {
88
requestOneTimePayment,
99
requestBillingAgreement,
10-
} = RNPaypal;
10+
requestDeviceData,
11+
} = RNPaypal;

ios/RNPaypal.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,9 @@
77

88
#import "BraintreeCore.h"
99
#import "BraintreePayPal.h"
10+
#import "BTDataCollector.h"
1011

11-
@interface RNPaypal : UIViewController <RCTBridgeModule, BTAppSwitchDelegate, BTViewControllerPresentingDelegate>
12+
@interface RNPaypal : UIViewController <RCTBridgeModule, BTAppSwitchDelegate, BTViewControllerPresentingDelegate, BTDataCollectorDelegate>
1213

1314
+ (instancetype)sharedInstance;
1415

ios/RNPaypal.m

Lines changed: 40 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ + (BOOL)requiresMainQueueSetup
2424
RCT_EXPORT_MODULE()
2525

2626
RCT_EXPORT_METHOD(
27-
requestOneTimePayment:(NSString *)clientToken
28-
options:(NSDictionary*)options
29-
resolve:(RCTPromiseResolveBlock)resolve
27+
requestOneTimePayment:(NSString *)clientToken
28+
options:(NSDictionary*)options
29+
resolve:(RCTPromiseResolveBlock)resolve
3030
reject:(RCTPromiseRejectBlock)reject)
3131
{
3232
dispatch_async(dispatch_get_main_queue(), ^{
@@ -40,7 +40,7 @@ + (BOOL)requiresMainQueueSetup
4040
BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithAPIClient:braintreeClient];
4141
payPalDriver.viewControllerPresentingDelegate = self;
4242
payPalDriver.appSwitchDelegate = self;
43-
43+
4444
BTPayPalRequest *request= [[BTPayPalRequest alloc] initWithAmount:options[@"amount"]];
4545
NSString* currency = options[@"currency"];
4646
if (currency) request.currencyCode = currency;
@@ -57,7 +57,7 @@ + (BOOL)requiresMainQueueSetup
5757
else if ([@"order" isEqualToString:intent])
5858
request.intent = BTPayPalRequestIntentOrder;
5959
}
60-
60+
6161
[payPalDriver requestOneTimePayment:request completion:^(BTPayPalAccountNonce * _Nullable tokenizedPayPalAccount, NSError * _Nullable error) {
6262
if (tokenizedPayPalAccount) {
6363
NSDictionary* result = @{
@@ -68,7 +68,7 @@ + (BOOL)requiresMainQueueSetup
6868
@"lastName" : (tokenizedPayPalAccount.lastName ?: [NSNull null]),
6969
@"phone" : (tokenizedPayPalAccount.phone ?: [NSNull null]),
7070
};
71-
71+
7272
resolve(result);
7373
return;
7474
} else if (error) {
@@ -83,9 +83,35 @@ + (BOOL)requiresMainQueueSetup
8383
}
8484

8585
RCT_EXPORT_METHOD(
86-
requestBillingAgreement:(NSString *)clientToken
87-
options:(NSDictionary*)options
88-
resolve:(RCTPromiseResolveBlock)resolve
86+
requestDeviceData:(NSString *)clientToken
87+
resolve:(RCTPromiseResolveBlock)resolve
88+
reject:(RCTPromiseRejectBlock)reject)
89+
{
90+
dispatch_async(dispatch_get_main_queue(), ^{
91+
BTAPIClient* braintreeClient = [[BTAPIClient alloc] initWithAuthorization:clientToken];
92+
if (braintreeClient == nil) {
93+
NSError *error = [NSError errorWithDomain:@"RNPayPal" code:1 userInfo:nil];
94+
reject(@"braintree_sdk_setup_failed", @"Could not initialize Braintree SDK", error);
95+
return;
96+
}
97+
98+
BTDataCollector *dataCollector = [[BTDataCollector alloc] initWithAPIClient:braintreeClient];
99+
dataCollector.delegate = self;
100+
[dataCollector collectCardFraudData:^(NSString * _Nonnull deviceData) {
101+
NSDictionary* result = @{
102+
@"deviceData" : deviceData,
103+
};
104+
resolve(result);
105+
}];
106+
});
107+
}
108+
109+
110+
111+
RCT_EXPORT_METHOD(
112+
requestBillingAgreement:(NSString *)clientToken
113+
options:(NSDictionary*)options
114+
resolve:(RCTPromiseResolveBlock)resolve
89115
reject:(RCTPromiseRejectBlock)reject)
90116
{
91117
dispatch_async(dispatch_get_main_queue(), ^{
@@ -105,13 +131,13 @@ + (BOOL)requiresMainQueueSetup
105131
BTPayPalDriver *payPalDriver = [[BTPayPalDriver alloc] initWithAPIClient:braintreeClient];
106132
payPalDriver.viewControllerPresentingDelegate = self;
107133
payPalDriver.appSwitchDelegate = self;
108-
134+
109135
BTPayPalRequest *request = [[BTPayPalRequest alloc] initWithAmount:options[@"billingAgreementDescription"]];
110136
NSString* currency = options[@"currency"];
111137
if (currency) request.currencyCode = currency;
112138
NSString* localeCode = options[@"localeCode"];
113139
if (localeCode) request.localeCode = localeCode;
114-
140+
115141
[payPalDriver requestBillingAgreement:request completion:^(BTPayPalAccountNonce * _Nullable tokenizedPayPalAccount, NSError * _Nullable error) {
116142
if (tokenizedPayPalAccount) {
117143
NSDictionary* result = @{
@@ -122,7 +148,7 @@ + (BOOL)requiresMainQueueSetup
122148
@"lastName" : (tokenizedPayPalAccount.lastName ?: [NSNull null]),
123149
@"phone" : (tokenizedPayPalAccount.phone ?: [NSNull null]),
124150
};
125-
151+
126152
resolve(result);
127153
return;
128154
} else if (error) {
@@ -136,9 +162,10 @@ + (BOOL)requiresMainQueueSetup
136162
});
137163
}
138164

165+
139166
- (BOOL)application:(UIApplication *)application
140167
openURL:(NSURL *)url
141-
sourceApplication:(NSString *)sourceApplication
168+
sourceApplication:(NSString *)sourceApplication
142169
annotation:(id)annotation
143170
{
144171
if ([url.scheme localizedCaseInsensitiveCompare:URLScheme] == NSOrderedSame) {

paypalExample/App.tsx

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
import {
1212
requestOneTimePayment,
1313
requestBillingAgreement,
14+
requestDeviceData,
1415
PaypalResponse,
1516
} from 'react-native-paypal';
1617

@@ -26,6 +27,7 @@ const App = () => {
2627
lastName: '',
2728
phone: '',
2829
});
30+
const [deviceData, setDeviceData] = useState('');
2931
const [amount, setAmount] = useState('10');
3032
const [
3133
billingAgreementDescription,
@@ -42,6 +44,12 @@ const App = () => {
4244
.then(setSuccess)
4345
.catch((err) => setError(err.message));
4446

47+
const requestData = () =>
48+
requestDeviceData(token)
49+
.then((({ deviceData }) => setDeviceData(deviceData)))
50+
.catch((err) => setError(err.message));
51+
52+
4553
return (
4654
<SafeAreaView>
4755
<ScrollView>
@@ -76,6 +84,10 @@ const App = () => {
7684
<Text style={styles.buttonText}>Request Billing</Text>
7785
</TouchableOpacity>
7886

87+
<TouchableOpacity onPress={requestData} style={styles.button}>
88+
<Text style={styles.buttonText}>Request Device Data</Text>
89+
</TouchableOpacity>
90+
7991
{!!error && <Text style={styles.errorText}>Error: {error}</Text>}
8092

8193
<Text style={styles.sectionTitle}>Response:</Text>
@@ -85,6 +97,7 @@ const App = () => {
8597
<Text>First Name: {success.firstName}</Text>
8698
<Text>Last Name: {success.lastName}</Text>
8799
<Text>Phone: {success.phone}</Text>
100+
<Text>deviceData: {deviceData}</Text>
88101
</View>
89102
</ScrollView>
90103
</SafeAreaView>

paypalExample/android/app/build.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -187,6 +187,7 @@ dependencies {
187187

188188
implementation "androidx.swiperefreshlayout:swiperefreshlayout:1.0.0"
189189
implementation "com.braintreepayments.api:braintree:3.14.1"
190+
implementation "com.braintreepayments.api:data-collector:3.+"
190191

191192
debugImplementation("com.facebook.flipper:flipper:${FLIPPER_VERSION}") {
192193
exclude group:'com.facebook.fbjni'

paypalExample/ios/Podfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,5 @@ target 'paypalExample-tvOS' do
3333
end
3434

3535
pod 'Braintree', '~> 4.35.0'
36+
pod 'Braintree/DataCollector'
3637
pod 'RNPaypal', :path => '../node_modules/react-native-paypal'

paypalExample/ios/Podfile.lock

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ PODS:
88
- Braintree/Card (4.35.0):
99
- Braintree/Core
1010
- Braintree/Core (4.35.0)
11+
- Braintree/DataCollector (4.35.0):
12+
- Braintree/Core
1113
- Braintree/PayPal (4.35.0):
1214
- Braintree/Core
1315
- Braintree/PayPalOneTouch
@@ -318,7 +320,7 @@ PODS:
318320
- React-Core (= 0.63.2)
319321
- React-cxxreact (= 0.63.2)
320322
- React-jsi (= 0.63.2)
321-
- RNPaypal (2.2.0):
323+
- RNPaypal (3.1.1):
322324
- Braintree
323325
- React
324326
- Yoga (1.14.0)
@@ -327,6 +329,7 @@ PODS:
327329

328330
DEPENDENCIES:
329331
- Braintree (~> 4.35.0)
332+
- Braintree/DataCollector
330333
- DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`)
331334
- FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`)
332335
- FBReactNativeSpec (from `../node_modules/react-native/Libraries/FBReactNativeSpec`)
@@ -486,10 +489,10 @@ SPEC CHECKSUMS:
486489
React-RCTText: 1b6773e776e4b33f90468c20fe3b16ca3e224bb8
487490
React-RCTVibration: 4d2e726957f4087449739b595f107c0d4b6c2d2d
488491
ReactCommon: a0a1edbebcac5e91338371b72ffc66aa822792ce
489-
RNPaypal: 71327bc2b1d1af8ec6578a9b8069a9bfa201fd98
492+
RNPaypal: ac01980ea29ad4df3b46f99ea58fa290914d734f
490493
Yoga: 7740b94929bbacbddda59bf115b5317e9a161598
491494
YogaKit: f782866e155069a2cca2517aafea43200b01fd5a
492495

493-
PODFILE CHECKSUM: 71591b0aba0212054b86dee5ba491669792cb307
496+
PODFILE CHECKSUM: 2959c167c0f09e859a1b23b8e604ff6057b91754
494497

495-
COCOAPODS: 1.9.1
498+
COCOAPODS: 1.10.0

0 commit comments

Comments
 (0)