上传文件至 /
This commit is contained in:
39
CHANGELOG.md
Normal file
39
CHANGELOG.md
Normal file
@@ -0,0 +1,39 @@
|
||||
# Changelog
|
||||
|
||||
All notable changes to this project will be documented in this file.
|
||||
|
||||
## [1.0.0] - 2024-01-XX
|
||||
|
||||
### Added
|
||||
- Initial release with Turbo Modules support
|
||||
- Swift implementation for iOS
|
||||
- Kotlin implementation for Android
|
||||
- Support for latest Braintree SDK versions:
|
||||
- iOS: Braintree 6.0, BraintreeDropIn 9.0
|
||||
- Android: Drop-In 6.16.0, Card 4.45.0
|
||||
- Apple Pay support (iOS)
|
||||
- Google Pay support (Android)
|
||||
- Venmo payment support
|
||||
- PayPal payment support
|
||||
- 3D Secure authentication
|
||||
- Direct card tokenization
|
||||
- Device data collection for fraud detection
|
||||
- Vault manager support
|
||||
- Dark theme support (iOS)
|
||||
- Custom font support (iOS)
|
||||
- TypeScript definitions
|
||||
- Comprehensive documentation and examples
|
||||
|
||||
### Features
|
||||
- Full React Native New Architecture compatibility
|
||||
- Backward compatible with old architecture
|
||||
- Promise-based API
|
||||
- Detailed error handling
|
||||
- Latest payment methods support
|
||||
|
||||
### Technical
|
||||
- Built with React Native 0.73 compatibility
|
||||
- Minimum iOS version: 13.0
|
||||
- Minimum Android SDK: 21
|
||||
- Swift 5.0
|
||||
- Kotlin 1.8.21
|
||||
21
LICENSE
Normal file
21
LICENSE
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2024 [Your Name]
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
402
MIGRATION.md
Normal file
402
MIGRATION.md
Normal file
@@ -0,0 +1,402 @@
|
||||
# Migration Guide
|
||||
|
||||
## Migrating from Old Braintree Drop-In Implementation
|
||||
|
||||
This guide helps you migrate from the legacy Braintree implementation to the new Turbo Module version.
|
||||
|
||||
## Key Differences
|
||||
|
||||
### Architecture
|
||||
- **Old**: Bridge-based module
|
||||
- **New**: Turbo Module with full New Architecture support
|
||||
|
||||
### SDK Versions
|
||||
- **iOS**: Upgraded to Braintree 6.0, BraintreeDropIn 9.0
|
||||
- **Android**: Upgraded to Drop-In 6.16.0, Card 4.45.0
|
||||
|
||||
### Language
|
||||
- **iOS**: Migrated from Objective-C to Swift
|
||||
- **Android**: Migrated from Java to Kotlin
|
||||
|
||||
## Breaking Changes
|
||||
|
||||
### 1. Import Statement
|
||||
|
||||
**Old:**
|
||||
```javascript
|
||||
import RNBraintreeDropIn from 'react-native-braintree-dropin';
|
||||
```
|
||||
|
||||
**New:**
|
||||
```typescript
|
||||
import BraintreeDropIn from 'react-native-braintree-dropin-turbo';
|
||||
```
|
||||
|
||||
### 2. Method Calls
|
||||
|
||||
**Old:**
|
||||
```javascript
|
||||
RNBraintreeDropIn.show(options)
|
||||
.then(result => {
|
||||
console.log(result.nonce);
|
||||
})
|
||||
.catch(error => {
|
||||
console.error(error);
|
||||
});
|
||||
```
|
||||
|
||||
**New:**
|
||||
```typescript
|
||||
try {
|
||||
const result = await BraintreeDropIn.show(options);
|
||||
console.log(result.nonce);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
}
|
||||
```
|
||||
|
||||
### 3. Options Structure
|
||||
|
||||
Most options remain the same, but there are some changes:
|
||||
|
||||
**Old:**
|
||||
```javascript
|
||||
{
|
||||
clientToken: 'token',
|
||||
darkTheme: true,
|
||||
merchantIdentifier: 'merchant.id', // iOS
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
**New (unchanged, but TypeScript-typed):**
|
||||
```typescript
|
||||
{
|
||||
clientToken: 'token',
|
||||
darkTheme: true,
|
||||
merchantIdentifier: 'merchant.id',
|
||||
// ...
|
||||
}: DropInOptions
|
||||
```
|
||||
|
||||
### 4. Android Setup Changes
|
||||
|
||||
**Old:**
|
||||
```java
|
||||
// No special initialization needed
|
||||
```
|
||||
|
||||
**New:**
|
||||
```kotlin
|
||||
import com.braintreedroptinturbo.RNBraintreeDropInModule
|
||||
|
||||
class MainActivity : FragmentActivity() {
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
RNBraintreeDropInModule.initDropInClient(this)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**Important:** MainActivity must now extend `FragmentActivity` instead of `ReactActivity`.
|
||||
|
||||
### 5. Package Name Changes
|
||||
|
||||
**Old (AndroidManifest.xml):**
|
||||
```xml
|
||||
<!-- Old package name -->
|
||||
```
|
||||
|
||||
**New:**
|
||||
```kotlin
|
||||
package com.braintreedroptinturbo
|
||||
```
|
||||
|
||||
### 6. iOS Podspec
|
||||
|
||||
**Old:**
|
||||
```ruby
|
||||
pod 'RNBraintreeDropIn', :path => '../node_modules/react-native-braintree-dropin'
|
||||
```
|
||||
|
||||
**New (auto-linked):**
|
||||
```ruby
|
||||
# No manual podspec needed - auto-linked
|
||||
# Or if manual:
|
||||
pod 'react-native-braintree-dropin-turbo', :path => '../node_modules/react-native-braintree-dropin-turbo'
|
||||
```
|
||||
|
||||
## Step-by-Step Migration
|
||||
|
||||
### Step 1: Uninstall Old Package
|
||||
|
||||
```bash
|
||||
npm uninstall react-native-braintree-dropin
|
||||
# or
|
||||
yarn remove react-native-braintree-dropin
|
||||
```
|
||||
|
||||
### Step 2: Clean iOS Pods
|
||||
|
||||
```bash
|
||||
cd ios
|
||||
rm -rf Pods Podfile.lock
|
||||
cd ..
|
||||
```
|
||||
|
||||
### Step 3: Install New Package
|
||||
|
||||
```bash
|
||||
npm install react-native-braintree-dropin-turbo
|
||||
# or
|
||||
yarn add react-native-braintree-dropin-turbo
|
||||
```
|
||||
|
||||
### Step 4: Update iOS
|
||||
|
||||
```bash
|
||||
cd ios
|
||||
pod install
|
||||
cd ..
|
||||
```
|
||||
|
||||
### Step 5: Update Android MainActivity
|
||||
|
||||
Update your `MainActivity.kt` (or convert from .java to .kt):
|
||||
|
||||
```kotlin
|
||||
import android.os.Bundle
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
import com.braintreedroptinturbo.RNBraintreeDropInModule
|
||||
|
||||
class MainActivity : FragmentActivity() {
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
RNBraintreeDropInModule.initDropInClient(this)
|
||||
}
|
||||
|
||||
// If you have other ReactActivity methods, you may need to adjust them
|
||||
}
|
||||
```
|
||||
|
||||
### Step 6: Update Import Statements
|
||||
|
||||
Find and replace in your codebase:
|
||||
|
||||
```bash
|
||||
# Find
|
||||
import RNBraintreeDropIn from 'react-native-braintree-dropin';
|
||||
|
||||
# Replace with
|
||||
import BraintreeDropIn from 'react-native-braintree-dropin-turbo';
|
||||
```
|
||||
|
||||
### Step 7: Update Method Calls
|
||||
|
||||
Convert from promise chains to async/await (recommended):
|
||||
|
||||
**Before:**
|
||||
```javascript
|
||||
RNBraintreeDropIn.show(options)
|
||||
.then(result => {
|
||||
// handle result
|
||||
})
|
||||
.catch(error => {
|
||||
// handle error
|
||||
});
|
||||
```
|
||||
|
||||
**After:**
|
||||
```typescript
|
||||
try {
|
||||
const result = await BraintreeDropIn.show(options);
|
||||
// handle result
|
||||
} catch (error) {
|
||||
// handle error
|
||||
}
|
||||
```
|
||||
|
||||
### Step 8: Add TypeScript Types (Optional but Recommended)
|
||||
|
||||
If using TypeScript, add proper typing:
|
||||
|
||||
```typescript
|
||||
import BraintreeDropIn, {
|
||||
type DropInOptions,
|
||||
type PaymentResult
|
||||
} from 'react-native-braintree-dropin-turbo';
|
||||
|
||||
const options: DropInOptions = {
|
||||
clientToken: 'your-token',
|
||||
orderTotal: 10.00,
|
||||
// ...
|
||||
};
|
||||
|
||||
const result: PaymentResult = await BraintreeDropIn.show(options);
|
||||
```
|
||||
|
||||
### Step 9: Test Thoroughly
|
||||
|
||||
Test all payment flows:
|
||||
- Credit/Debit cards
|
||||
- Apple Pay (iOS)
|
||||
- Google Pay (Android)
|
||||
- Venmo
|
||||
- PayPal
|
||||
- 3D Secure
|
||||
|
||||
## API Changes
|
||||
|
||||
### Unchanged Methods
|
||||
|
||||
These methods work the same way:
|
||||
- `show(options)` - Display Drop-In UI
|
||||
- `fetchMostRecentPaymentMethod(clientToken)` - Get last payment method
|
||||
- `tokenizeCard(clientToken, cardInfo)` - Tokenize a card
|
||||
|
||||
### New Methods
|
||||
|
||||
- `collectDeviceData(clientToken)` - Now available as a standalone method
|
||||
|
||||
### Return Types
|
||||
|
||||
The return types are now properly typed with TypeScript:
|
||||
|
||||
```typescript
|
||||
interface PaymentResult {
|
||||
nonce: string;
|
||||
type: string;
|
||||
description: string;
|
||||
isDefault: boolean;
|
||||
deviceData: string;
|
||||
}
|
||||
```
|
||||
|
||||
## Compatibility
|
||||
|
||||
### React Native Version Support
|
||||
|
||||
- **Old**: React Native 0.60+
|
||||
- **New**: React Native 0.68+ (Turbo Modules support)
|
||||
|
||||
If you're on an older React Native version, you'll need to upgrade first.
|
||||
|
||||
### New Architecture
|
||||
|
||||
The new package supports both:
|
||||
- Old Architecture (Bridge)
|
||||
- New Architecture (Turbo Modules)
|
||||
|
||||
Enable New Architecture by setting:
|
||||
- iOS: `ENV['RCT_NEW_ARCH_ENABLED'] = '1'` in Podfile
|
||||
- Android: `newArchEnabled=true` in gradle.properties
|
||||
|
||||
## Common Migration Issues
|
||||
|
||||
### Issue 1: MainActivity Compilation Error
|
||||
|
||||
**Error:** "MainActivity must extend FragmentActivity"
|
||||
|
||||
**Solution:**
|
||||
```kotlin
|
||||
// Change from
|
||||
class MainActivity : ReactActivity()
|
||||
|
||||
// To
|
||||
class MainActivity : FragmentActivity()
|
||||
```
|
||||
|
||||
### Issue 2: Swift Bridging Header
|
||||
|
||||
**Error:** "No such module 'BraintreeDropIn'"
|
||||
|
||||
**Solution:**
|
||||
1. Clean and rebuild
|
||||
2. Check Swift version is 5.0+
|
||||
3. Run `pod install` again
|
||||
|
||||
### Issue 3: Android Build Failures
|
||||
|
||||
**Error:** Various Gradle errors
|
||||
|
||||
**Solution:**
|
||||
```bash
|
||||
cd android
|
||||
./gradlew clean
|
||||
cd ..
|
||||
# Rebuild
|
||||
```
|
||||
|
||||
### Issue 4: Type Errors
|
||||
|
||||
**Error:** TypeScript type mismatches
|
||||
|
||||
**Solution:** Make sure you're importing types:
|
||||
```typescript
|
||||
import type { DropInOptions, PaymentResult } from 'react-native-braintree-dropin-turbo';
|
||||
```
|
||||
|
||||
## Testing After Migration
|
||||
|
||||
Create a test checklist:
|
||||
|
||||
- [ ] Drop-In UI displays correctly
|
||||
- [ ] Card payment works
|
||||
- [ ] Apple Pay works (iOS)
|
||||
- [ ] Google Pay works (Android)
|
||||
- [ ] Venmo works
|
||||
- [ ] PayPal works
|
||||
- [ ] 3D Secure verification works
|
||||
- [ ] Error handling works
|
||||
- [ ] Device data collection works
|
||||
- [ ] Vault manager works (if used)
|
||||
|
||||
## Rollback Plan
|
||||
|
||||
If you need to rollback:
|
||||
|
||||
```bash
|
||||
# Uninstall new package
|
||||
npm uninstall react-native-braintree-dropin-turbo
|
||||
|
||||
# Reinstall old package
|
||||
npm install react-native-braintree-dropin@[old-version]
|
||||
|
||||
# Clean iOS
|
||||
cd ios && rm -rf Pods Podfile.lock && pod install && cd ..
|
||||
|
||||
# Revert MainActivity changes
|
||||
# Rebuild
|
||||
```
|
||||
|
||||
## Benefits of Migration
|
||||
|
||||
1. ✅ **Performance**: Turbo Modules are faster than the old bridge
|
||||
2. ✅ **Latest SDKs**: Access to latest Braintree features and security updates
|
||||
3. ✅ **Type Safety**: Full TypeScript support
|
||||
4. ✅ **Future-proof**: Compatible with React Native's New Architecture
|
||||
5. ✅ **Better Maintenance**: Modern codebase with Swift and Kotlin
|
||||
6. ✅ **Improved Error Handling**: Better error messages and handling
|
||||
|
||||
## Getting Help
|
||||
|
||||
If you encounter issues during migration:
|
||||
|
||||
1. Check this migration guide
|
||||
2. Review the [Installation Guide](./INSTALLATION.md)
|
||||
3. Check closed issues on GitHub
|
||||
4. Open a new issue with:
|
||||
- Old package version
|
||||
- New package version
|
||||
- React Native version
|
||||
- Complete error messages
|
||||
- Migration steps attempted
|
||||
|
||||
## Timeline Recommendation
|
||||
|
||||
- **Testing Phase**: 1-2 days
|
||||
- **Migration**: 2-3 hours
|
||||
- **QA Testing**: 1-2 days
|
||||
- **Monitoring**: 1 week post-release
|
||||
|
||||
Good luck with your migration! 🚀
|
||||
269
README.md
Normal file
269
README.md
Normal file
@@ -0,0 +1,269 @@
|
||||
# react-native-braintree-dropin-turbo
|
||||
|
||||
Modern Braintree Drop-In UI for React Native with Turbo Modules support.
|
||||
|
||||
## Features
|
||||
|
||||
- ✅ Turbo Modules support (React Native 0.68+)
|
||||
- ✅ Latest Braintree SDK versions
|
||||
- ✅ iOS (Swift) and Android (Kotlin)
|
||||
- ✅ Apple Pay support (iOS)
|
||||
- ✅ Google Pay support (Android)
|
||||
- ✅ Venmo support
|
||||
- ✅ PayPal support
|
||||
- ✅ 3D Secure support
|
||||
- ✅ Card tokenization
|
||||
- ✅ Device data collection
|
||||
|
||||
## Installation
|
||||
|
||||
```bash
|
||||
npm install react-native-braintree-dropin-turbo
|
||||
# or
|
||||
yarn add react-native-braintree-dropin-turbo
|
||||
```
|
||||
|
||||
### iOS Setup
|
||||
|
||||
1. Install pods:
|
||||
|
||||
```bash
|
||||
cd ios && pod install
|
||||
```
|
||||
|
||||
2. Add to your `Info.plist` for Apple Pay:
|
||||
|
||||
```xml
|
||||
<key>com.apple.developer.in-app-payments</key>
|
||||
<array>
|
||||
<string>merchant.your.merchant.identifier</string>
|
||||
</array>
|
||||
```
|
||||
|
||||
### Android Setup
|
||||
|
||||
1. Initialize DropIn client in your `MainActivity.kt`:
|
||||
|
||||
```kotlin
|
||||
import com.braintreedroptinturbo.RNBraintreeDropInModule
|
||||
|
||||
class MainActivity : ReactActivity() {
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
RNBraintreeDropInModule.initDropInClient(this)
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
2. Make sure your MainActivity extends `FragmentActivity`:
|
||||
|
||||
```kotlin
|
||||
import androidx.fragment.app.FragmentActivity
|
||||
|
||||
class MainActivity : FragmentActivity() {
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
### Basic Usage
|
||||
|
||||
```typescript
|
||||
import BraintreeDropIn from 'react-native-braintree-dropin-turbo';
|
||||
|
||||
try {
|
||||
const result = await BraintreeDropIn.show({
|
||||
clientToken: 'YOUR_CLIENT_TOKEN',
|
||||
orderTotal: 10.0,
|
||||
currencyCode: 'USD',
|
||||
});
|
||||
|
||||
console.log('Payment nonce:', result.nonce);
|
||||
console.log('Device data:', result.deviceData);
|
||||
// Send result.nonce to your server
|
||||
} catch (error) {
|
||||
if (error.message === 'USER_CANCELLATION') {
|
||||
console.log('User cancelled payment');
|
||||
} else {
|
||||
console.error('Payment error:', error);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### With Apple Pay (iOS)
|
||||
|
||||
```typescript
|
||||
const result = await BraintreeDropIn.show({
|
||||
clientToken: 'YOUR_CLIENT_TOKEN',
|
||||
applePay: true,
|
||||
merchantIdentifier: 'merchant.your.identifier',
|
||||
countryCode: 'US',
|
||||
currencyCode: 'USD',
|
||||
merchantName: 'Your Store',
|
||||
orderTotal: 10.0,
|
||||
});
|
||||
```
|
||||
|
||||
### With Google Pay (Android)
|
||||
|
||||
```typescript
|
||||
const result = await BraintreeDropIn.show({
|
||||
clientToken: 'YOUR_CLIENT_TOKEN',
|
||||
googlePay: true,
|
||||
googlePayMerchantId: 'YOUR_MERCHANT_ID',
|
||||
orderTotal: 10.0,
|
||||
currencyCode: 'USD',
|
||||
});
|
||||
```
|
||||
|
||||
### With 3D Secure
|
||||
|
||||
```typescript
|
||||
const result = await BraintreeDropIn.show({
|
||||
clientToken: 'YOUR_CLIENT_TOKEN',
|
||||
threeDSecure: {
|
||||
amount: 10.0,
|
||||
},
|
||||
});
|
||||
```
|
||||
|
||||
### Tokenize Card Directly
|
||||
|
||||
```typescript
|
||||
const result = await BraintreeDropIn.tokenizeCard('YOUR_CLIENT_TOKEN', {
|
||||
number: '4111111111111111',
|
||||
expirationMonth: '12',
|
||||
expirationYear: '2025',
|
||||
cvv: '123',
|
||||
postalCode: '12345',
|
||||
});
|
||||
```
|
||||
|
||||
### Collect Device Data
|
||||
|
||||
```typescript
|
||||
const deviceData = await BraintreeDropIn.collectDeviceData('YOUR_CLIENT_TOKEN');
|
||||
// Send to your server for fraud detection
|
||||
```
|
||||
|
||||
### Fetch Most Recent Payment Method
|
||||
|
||||
```typescript
|
||||
const paymentMethod =
|
||||
await BraintreeDropIn.fetchMostRecentPaymentMethod('YOUR_CLIENT_TOKEN');
|
||||
|
||||
if (paymentMethod) {
|
||||
console.log('Last payment:', paymentMethod.description);
|
||||
}
|
||||
```
|
||||
|
||||
## API Reference
|
||||
|
||||
### `show(options: DropInOptions): Promise<PaymentResult>`
|
||||
|
||||
Display the Braintree Drop-In UI.
|
||||
|
||||
#### Options
|
||||
|
||||
| Option | Type | Required | Description |
|
||||
| --------------------- | ------- | -------- | ---------------------------------------------------- |
|
||||
| `clientToken` | string | ✅ | Braintree client token |
|
||||
| `orderTotal` | number | ❌ | Total amount for the transaction |
|
||||
| `currencyCode` | string | ❌ | Currency code (default: 'USD') |
|
||||
| `darkTheme` | boolean | ❌ | Use dark theme (iOS only) |
|
||||
| `fontFamily` | string | ❌ | Custom font family (iOS only) |
|
||||
| `boldFontFamily` | string | ❌ | Custom bold font family (iOS only) |
|
||||
| `vaultManager` | boolean | ❌ | Enable vault manager |
|
||||
| `cardDisabled` | boolean | ❌ | Disable card payments |
|
||||
| `applePay` | boolean | ❌ | Enable Apple Pay (iOS only) |
|
||||
| `merchantIdentifier` | string | ❌ | Apple Pay merchant ID (required if applePay is true) |
|
||||
| `countryCode` | string | ❌ | Country code for Apple Pay |
|
||||
| `merchantName` | string | ❌ | Merchant name for Apple Pay |
|
||||
| `venmo` | boolean | ❌ | Enable Venmo |
|
||||
| `payPal` | boolean | ❌ | Enable PayPal |
|
||||
| `googlePay` | boolean | ❌ | Enable Google Pay (Android only) |
|
||||
| `googlePayMerchantId` | string | ❌ | Google Pay merchant ID |
|
||||
| `threeDSecure` | object | ❌ | 3D Secure configuration |
|
||||
| `threeDSecure.amount` | number | ❌ | Amount for 3D Secure verification |
|
||||
|
||||
#### Returns
|
||||
|
||||
```typescript
|
||||
interface PaymentResult {
|
||||
nonce: string; // Payment method nonce
|
||||
type: string; // Payment method type
|
||||
description: string; // Payment method description
|
||||
isDefault: boolean; // Is default payment method
|
||||
deviceData: string; // Device data for fraud detection
|
||||
}
|
||||
```
|
||||
|
||||
### `tokenizeCard(clientToken: string, cardInfo: CardInfo): Promise<PaymentResult>`
|
||||
|
||||
Tokenize a card without showing the UI.
|
||||
|
||||
```typescript
|
||||
interface CardInfo {
|
||||
number?: string;
|
||||
expirationMonth?: string;
|
||||
expirationYear?: string;
|
||||
cvv: string;
|
||||
postalCode?: string;
|
||||
onlyCVV?: boolean; // If true, only CVV is required
|
||||
}
|
||||
```
|
||||
|
||||
### `collectDeviceData(clientToken: string): Promise<string>`
|
||||
|
||||
Collect device data for fraud detection.
|
||||
|
||||
### `fetchMostRecentPaymentMethod(clientToken: string): Promise<PaymentResult | null>`
|
||||
|
||||
Fetch the most recently used payment method.
|
||||
|
||||
## Error Handling
|
||||
|
||||
```typescript
|
||||
try {
|
||||
const result = await BraintreeDropIn.show(options);
|
||||
} catch (error) {
|
||||
switch (error.message) {
|
||||
case 'USER_CANCELLATION':
|
||||
// User cancelled the payment flow
|
||||
break;
|
||||
case 'NO_CLIENT_TOKEN':
|
||||
// Client token was not provided
|
||||
break;
|
||||
case '3DSECURE_NOT_ABLE_TO_SHIFT_LIABILITY':
|
||||
// 3D Secure verification failed
|
||||
break;
|
||||
default:
|
||||
// Other errors
|
||||
console.error(error);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Braintree SDK Versions
|
||||
|
||||
- **iOS**: Braintree ~> 6.0, BraintreeDropIn ~> 9.0
|
||||
- **Android**: Drop-In 6.16.0, Card 4.45.0, Data Collector 4.45.0
|
||||
|
||||
## Requirements
|
||||
|
||||
- React Native >= 0.68
|
||||
- iOS >= 13.0
|
||||
- Android minSdkVersion >= 21
|
||||
|
||||
## New Architecture (Turbo Modules)
|
||||
|
||||
This library supports the New Architecture out of the box. No additional configuration needed.
|
||||
|
||||
## License
|
||||
|
||||
MIT
|
||||
|
||||
## Support
|
||||
|
||||
For issues and feature requests, please visit the [GitHub repository](https://github.com/aveekshan/react-native-braintree-dropin-turbo).
|
||||
49
react-native-braintree-dropin-turbo.podspec
Normal file
49
react-native-braintree-dropin-turbo.podspec
Normal file
@@ -0,0 +1,49 @@
|
||||
require "json"
|
||||
|
||||
package = JSON.parse(File.read(File.join(__dir__, "package.json")))
|
||||
|
||||
Pod::Spec.new do |s|
|
||||
s.name = "react-native-braintree-dropin-turbo"
|
||||
s.version = package["version"]
|
||||
s.summary = package["description"]
|
||||
s.homepage = package["homepage"]
|
||||
s.license = package["license"]
|
||||
s.authors = package["author"]
|
||||
|
||||
s.platforms = { :ios => "13.0" }
|
||||
s.source = { :git => "https://github.com/aveekshan/react-native-braintree-dropin-turbo.git", :tag => "#{s.version}" }
|
||||
|
||||
s.source_files = "ios/**/*.{h,m,mm,swift}"
|
||||
|
||||
# Use install_modules_dependencies helper to install the dependencies if React Native version >=0.71.0.
|
||||
# See https://github.com/facebook/react-native/blob/febf6b7f33fdb4904669f99d795eba4c0f95d7bf/scripts/cocoapods/new_architecture.rb#L79.
|
||||
if respond_to?(:install_modules_dependencies, true)
|
||||
install_modules_dependencies(s)
|
||||
else
|
||||
s.dependency "React-Core"
|
||||
|
||||
# Don't install the dependencies when we run `pod install` in the old architecture.
|
||||
if ENV['RCT_NEW_ARCH_ENABLED'] == '1' then
|
||||
s.compiler_flags = folly_compiler_flags + " -DRCT_NEW_ARCH_ENABLED=1"
|
||||
s.pod_target_xcconfig = {
|
||||
"HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\"",
|
||||
"OTHER_CPLUSPLUSFLAGS" => "-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1",
|
||||
"CLANG_CXX_LANGUAGE_STANDARD" => "c++17"
|
||||
}
|
||||
s.dependency "React-Codegen"
|
||||
s.dependency "RCT-Folly"
|
||||
s.dependency "RCTRequired"
|
||||
s.dependency "RCTTypeSafety"
|
||||
s.dependency "ReactCommon/turbomodule/core"
|
||||
end
|
||||
end
|
||||
|
||||
# Braintree Dependencies
|
||||
# s.dependency 'Braintree', '~> 6.0'
|
||||
# s.dependency 'BraintreeDropIn', '~> 9.0'
|
||||
# s.dependency 'Braintree/DataCollector', '~> 6.0'
|
||||
# s.dependency 'Braintree/ApplePay', '~> 6.0'
|
||||
# s.dependency 'Braintree/Venmo', '~> 6.0'
|
||||
|
||||
s.swift_version = '5.0'
|
||||
end
|
||||
Reference in New Issue
Block a user