nimbbl-mobile-react-native-sdk 1.2.0 → 1.3.1
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/README.md +128 -167
- package/android/build.gradle +4 -4
- package/android/src/main/AndroidManifest.xml +0 -4
- package/android/src/main/java/com/nimbbl/reactnative/NimbblCheckoutActivity.kt +49 -54
- package/android/src/main/java/com/nimbbl/reactnative/NimbblReactNativeSDKModule.kt +257 -55
- package/ios/NimbblReactNativeSDK.swift +11 -33
- package/lib/NimbblSDK.d.ts +3 -31
- package/lib/NimbblSDK.js +23 -101
- package/lib/constants.d.ts +3 -13
- package/lib/constants.js +4 -16
- package/lib/index.d.ts +2 -2
- package/lib/index.js +1 -3
- package/lib/types.d.ts +26 -10
- package/lib/types.js +1 -1
- package/nimbbl-mobile-react-native-sdk.podspec +1 -1
- package/package.json +7 -2
package/README.md
CHANGED
|
@@ -1,21 +1,24 @@
|
|
|
1
1
|
# Nimbbl React Native SDK
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
**🎉 First Release - Production Ready!**
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
A comprehensive React Native SDK for integrating Nimbbl payment gateway into your mobile applications. This SDK provides a seamless bridge between React Native and native payment functionality, offering a unified API for both iOS and Android platforms.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
## ✨ Key Features
|
|
8
|
+
|
|
9
|
+
- 🚀 **Easy Integration** - Simple setup and initialization with production-ready defaults
|
|
8
10
|
- 💳 **Multiple Payment Methods** - Support for cards, UPI, netbanking, wallets, EMI, and cash
|
|
9
11
|
- 🌐 **WebView Integration** - Built-in payment webview with customization options
|
|
10
|
-
- 🔗 **Bridge
|
|
11
|
-
- 📱 **Cross Platform** -
|
|
12
|
-
- 🛡️ **Type Safety** - Comprehensive TypeScript definitions
|
|
13
|
-
- 📊 **
|
|
14
|
-
- 🔄 **Event Handling** -
|
|
12
|
+
- 🔗 **Robust Bridge** - Seamless communication between React Native and native SDKs
|
|
13
|
+
- 📱 **Cross Platform** - Identical behavior on both iOS and Android
|
|
14
|
+
- 🛡️ **Type Safety** - Comprehensive TypeScript definitions for better development experience
|
|
15
|
+
- 📊 **Production Ready** - Built-in analytics, logging, and error handling
|
|
16
|
+
- 🔄 **Unified Event Handling** - Single callback system for all payment responses
|
|
17
|
+
- 🎯 **Latest Native SDKs** - Built on iOS 2.0.7 and Android 4.0.4
|
|
15
18
|
|
|
16
|
-
##
|
|
19
|
+
## 🚀 Quick Start
|
|
17
20
|
|
|
18
|
-
###
|
|
21
|
+
### Installation
|
|
19
22
|
|
|
20
23
|
```bash
|
|
21
24
|
npm install nimbbl-mobile-react-native-sdk
|
|
@@ -23,35 +26,47 @@ npm install nimbbl-mobile-react-native-sdk
|
|
|
23
26
|
yarn add nimbbl-mobile-react-native-sdk
|
|
24
27
|
```
|
|
25
28
|
|
|
26
|
-
|
|
29
|
+
### Basic Integration
|
|
27
30
|
|
|
28
|
-
|
|
31
|
+
```typescript
|
|
32
|
+
import { NimbblSDK } from 'nimbbl-mobile-react-native-sdk';
|
|
29
33
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
34
|
+
const nimbblSDK = NimbblSDK.getSharedInstance();
|
|
35
|
+
|
|
36
|
+
// Initialize with default production configuration
|
|
37
|
+
await nimbblSDK.initialize();
|
|
38
|
+
|
|
39
|
+
// Set up payment response handler
|
|
40
|
+
nimbblSDK.addCheckoutResponseListener((data) => {
|
|
41
|
+
if (data.status === 'success') {
|
|
42
|
+
console.log('Payment successful:', data);
|
|
43
|
+
} else {
|
|
44
|
+
console.log('Payment failed:', data);
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
// Start payment with all optional parameters
|
|
49
|
+
await nimbblSDK.checkout({
|
|
50
|
+
orderToken: 'YOUR_ORDER_TOKEN',
|
|
51
|
+
paymentModeCode: '<OPTIONAL>',
|
|
52
|
+
bankCode: '<OPTIONAL>',
|
|
53
|
+
walletCode: '<OPTIONAL>',
|
|
54
|
+
paymentFlow: '<OPTIONAL>'
|
|
55
|
+
});
|
|
56
|
+
```
|
|
33
57
|
|
|
58
|
+
**That's it! Your payment integration is complete.** 🎉
|
|
34
59
|
|
|
60
|
+
## 📚 Documentation
|
|
35
61
|
|
|
36
|
-
|
|
62
|
+
- **[Sample App](../nimbbl_react_native_sample_app/)** - Complete working example with React Navigation
|
|
63
|
+
- **[Simple Integration Guide](../nimbbl_react_native_sample_app/SIMPLE_INTEGRATION_EXAMPLE.md)** - Step-by-step merchant integration
|
|
64
|
+
- **[BUILD.md](BUILD.md)** - Development build guide
|
|
65
|
+
- **[SETUP.md](SETUP.md)** - Comprehensive development setup
|
|
37
66
|
|
|
38
|
-
### NPM Version Support
|
|
39
67
|
|
|
40
|
-
The Nimbbl React Native SDK is compatible with the following npm versions:
|
|
41
68
|
|
|
42
|
-
|
|
43
|
-
|-------------|----------------|-------|
|
|
44
|
-
| `^1.0.0-alpha.0` | ✅ Supported | Initial alpha release |
|
|
45
|
-
| `^1.0.0-alpha.1` | ✅ Supported | Bug fixes and improvements |
|
|
46
|
-
| `^1.0.0-alpha.2` | ✅ Supported | Enhanced error handling |
|
|
47
|
-
| `^1.0.0-alpha.3` | ✅ Supported | Enhanced error handling |
|
|
48
|
-
| `^1.0.0-alpha.12` | ✅ Supported | Latest alpha release |
|
|
49
|
-
| `^1.0.0` | ✅ Supported | Initial stable release |
|
|
50
|
-
| `^1.0.1` | ✅ Supported | Bug fixes and improvements |
|
|
51
|
-
| `^1.1.0` | ✅ Supported | Production ready with environment URL initialization |
|
|
52
|
-
| `^1.1.1` | ✅ Supported | Bug fixes and improvements |
|
|
53
|
-
| `^1.2.0` | ✅ **Latest Stable** | **Updated to latest native SDK versions** |
|
|
54
|
-
| `^2.0.0` | 🔄 Coming Soon | Major version with breaking changes |
|
|
69
|
+
## 📋 System Requirements
|
|
55
70
|
|
|
56
71
|
### React Native Version Support
|
|
57
72
|
|
|
@@ -63,7 +78,7 @@ The Nimbbl React Native SDK is compatible with the following npm versions:
|
|
|
63
78
|
| `^0.73.0` | ✅ Supported | Latest stable version |
|
|
64
79
|
| `^0.74.0` | ✅ Supported | Latest stable version |
|
|
65
80
|
| `^0.75.0` | ✅ Supported | Latest stable version |
|
|
66
|
-
| `^0.76.0` | ✅
|
|
81
|
+
| `^0.76.0` | ✅ **Recommended** | **Latest stable version** |
|
|
67
82
|
|
|
68
83
|
### Node.js Version Support
|
|
69
84
|
|
|
@@ -81,61 +96,71 @@ The Nimbbl React Native SDK is compatible with the following npm versions:
|
|
|
81
96
|
| **Android** | ✅ Supported | API Level 21 (Android 5.0) |
|
|
82
97
|
| **iOS** | ✅ Supported | iOS 13.0+ |
|
|
83
98
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
- **Alpha Releases**: Alpha versions may contain breaking changes between releases
|
|
87
|
-
- **Stable Releases**: Breaking changes will be clearly documented in release notes
|
|
88
|
-
- **Migration Guide**: Migration guides will be provided for major version updates
|
|
89
|
-
|
|
90
|
-
### Versioning Strategy
|
|
99
|
+
## 🎯 Why Choose Nimbbl React Native SDK?
|
|
91
100
|
|
|
92
|
-
-
|
|
93
|
-
-
|
|
94
|
-
-
|
|
95
|
-
-
|
|
101
|
+
- ✅ **First Release**: Built from the ground up with modern React Native best practices
|
|
102
|
+
- ✅ **Production Ready**: Thoroughly tested and optimized for production environments
|
|
103
|
+
- ✅ **Cross-Platform Consistency**: Identical behavior on iOS and Android
|
|
104
|
+
- ✅ **Latest Native SDKs**: Built on the most recent iOS (2.0.7) and Android (4.0.4) SDKs
|
|
105
|
+
- ✅ **TypeScript First**: Full TypeScript support with comprehensive type definitions
|
|
106
|
+
- ✅ **Simple Integration**: Get started in minutes with our straightforward API
|
|
96
107
|
|
|
97
|
-
##
|
|
108
|
+
## 🚀 Getting Started
|
|
98
109
|
|
|
99
|
-
###
|
|
110
|
+
### 1. Install the SDK
|
|
100
111
|
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
**For npm package (production use):**
|
|
104
|
-
```javascript
|
|
105
|
-
import { NimbblSDK } from 'nimbbl-mobile-react-native-sdk';
|
|
112
|
+
```bash
|
|
113
|
+
npm install nimbbl-mobile-react-native-sdk
|
|
106
114
|
```
|
|
107
115
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
### 1. Initialize the SDK
|
|
116
|
+
### 2. Import and Initialize
|
|
111
117
|
|
|
112
118
|
```javascript
|
|
113
119
|
import { NimbblSDK } from 'nimbbl-mobile-react-native-sdk';
|
|
114
120
|
|
|
115
121
|
const nimbblSDK = NimbblSDK.getSharedInstance();
|
|
116
122
|
|
|
117
|
-
// Initialize
|
|
123
|
+
// Initialize with default production configuration
|
|
118
124
|
await nimbblSDK.initialize();
|
|
125
|
+
|
|
126
|
+
// OR initialize with custom configuration
|
|
127
|
+
await nimbblSDK.initialize({
|
|
128
|
+
api_base_url: 'https://api.nimbbl.tech/',
|
|
129
|
+
app_code: 'your_custom_app_code' // Optional: defaults to 'reactnative_webview_sdk'
|
|
130
|
+
});
|
|
119
131
|
```
|
|
120
132
|
|
|
121
133
|
|
|
122
134
|
|
|
123
|
-
###
|
|
135
|
+
### 3. Set Up Payment Response Handler
|
|
124
136
|
|
|
125
137
|
```javascript
|
|
126
|
-
//
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
138
|
+
// Set up unified payment response handler
|
|
139
|
+
nimbblSDK.addCheckoutResponseListener((data) => {
|
|
140
|
+
if (data.status === 'success') {
|
|
141
|
+
console.log('Payment successful:', data);
|
|
142
|
+
// Handle successful payment
|
|
143
|
+
} else {
|
|
144
|
+
console.log('Payment failed:', data);
|
|
145
|
+
// Handle failed payment
|
|
146
|
+
}
|
|
133
147
|
});
|
|
134
148
|
```
|
|
135
149
|
|
|
136
|
-
###
|
|
150
|
+
### 4. Start Payment
|
|
151
|
+
|
|
152
|
+
```javascript
|
|
153
|
+
// Start payment with all optional parameters
|
|
154
|
+
await nimbblSDK.checkout({
|
|
155
|
+
orderToken: 'YOUR_ORDER_TOKEN',
|
|
156
|
+
paymentModeCode: '<OPTIONAL>',
|
|
157
|
+
bankCode: '<OPTIONAL>',
|
|
158
|
+
walletCode: '<OPTIONAL>',
|
|
159
|
+
paymentFlow: '<OPTIONAL>'
|
|
160
|
+
});
|
|
161
|
+
```
|
|
137
162
|
|
|
138
|
-
|
|
163
|
+
**That's it! Your payment integration is complete.** 🎉
|
|
139
164
|
|
|
140
165
|
## API Reference
|
|
141
166
|
|
|
@@ -178,33 +203,16 @@ nimbblSDK.addCheckoutResponseListener((data) => {
|
|
|
178
203
|
// nimbblSDK.removeCheckoutResponseListener(callback);
|
|
179
204
|
```
|
|
180
205
|
|
|
181
|
-
## Configuration
|
|
182
|
-
|
|
183
|
-
### SDK Configuration
|
|
184
|
-
|
|
185
|
-
```javascript
|
|
186
|
-
const config = {
|
|
187
|
-
environment: 'production', // 'production' (default) or 'sandbox'
|
|
188
|
-
options: {
|
|
189
|
-
timeout: 30000,
|
|
190
|
-
enable_logging: false,
|
|
191
|
-
enable_analytics: true,
|
|
192
|
-
api_base_url: 'https://api.nimbbl.tech/' // Optional: override default URL
|
|
193
|
-
}
|
|
194
|
-
};
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
|
|
198
206
|
## Error Handling
|
|
199
207
|
|
|
200
208
|
```javascript
|
|
201
209
|
try {
|
|
202
210
|
const checkoutResult = await nimbblSDK.checkout({
|
|
203
211
|
orderToken: 'YOUR_ORDER_TOKEN',
|
|
204
|
-
paymentModeCode: '',
|
|
205
|
-
bankCode: '',
|
|
206
|
-
walletCode: '',
|
|
207
|
-
paymentFlow: ''
|
|
212
|
+
paymentModeCode: '<OPTIONAL>',
|
|
213
|
+
bankCode: '<OPTIONAL>',
|
|
214
|
+
walletCode: '<OPTIONAL>',
|
|
215
|
+
paymentFlow: '<OPTIONAL>'
|
|
208
216
|
});
|
|
209
217
|
} catch (error) {
|
|
210
218
|
// Handle payment error
|
|
@@ -456,98 +464,51 @@ For production applications, consider locking to specific versions:
|
|
|
456
464
|
- **Stable versions**: Deprecated features will be marked with warnings for at least one minor version
|
|
457
465
|
- **Major versions**: Breaking changes will be clearly documented
|
|
458
466
|
|
|
459
|
-
##
|
|
460
|
-
|
|
461
|
-
### v1.2.0 (Latest Stable Release)
|
|
462
|
-
|
|
463
|
-
**🚀 Updated to Latest Native SDK Versions!**
|
|
464
|
-
|
|
465
|
-
#### ✨ New Features
|
|
466
|
-
- **Latest iOS SDK**: Updated to `nimbbl_mobile_kit_ios_webview_sdk: ~> 2.0.4`
|
|
467
|
-
- **Latest Android SDK**: Updated to `nimbbl_mobile_kit_android_webview_sdk: v4.0.3`
|
|
468
|
-
- **Enhanced Compatibility**: Full compatibility with latest native SDK features
|
|
469
|
-
- **Unified Event Handling**: New `addCheckoutResponseListener()` method for simplified event handling
|
|
470
|
-
- **Clean API**: Removed legacy `payment_success` and `payment_failed` events for cleaner codebase
|
|
471
|
-
- **iOS-Android Parity**: Complete feature parity between iOS and Android modules
|
|
472
|
-
- **Callback Support**: Direct callback support for better production reliability
|
|
473
|
-
|
|
474
|
-
#### 🔧 Improvements
|
|
475
|
-
- **Better Performance**: Leverages latest optimizations from native SDKs
|
|
476
|
-
- **Enhanced Security**: Includes latest security updates from native SDKs
|
|
477
|
-
- **Improved Stability**: Bug fixes and stability improvements from native SDKs
|
|
478
|
-
- **Future-Ready**: Prepared for upcoming native SDK features
|
|
479
|
-
- **Cross-Platform Consistency**: iOS and Android modules now have identical APIs
|
|
480
|
-
- **Production Ready**: Enhanced callback system for production environments
|
|
481
|
-
|
|
482
|
-
#### 🐛 Bug Fixes
|
|
483
|
-
- Resolved compatibility issues with older native SDK versions
|
|
484
|
-
- Fixed potential memory leaks in native bridge communication
|
|
485
|
-
- Improved error handling for edge cases
|
|
486
|
-
- Fixed iOS `setCheckoutCallback is not a function` error
|
|
487
|
-
- Resolved method signature conflicts in iOS native module
|
|
488
|
-
- Enhanced callback-based communication for better reliability
|
|
467
|
+
## 📝 Release Notes
|
|
489
468
|
|
|
490
|
-
### v1.
|
|
469
|
+
### v1.3.0 - First Release 🎉
|
|
491
470
|
|
|
492
|
-
**🚀 Production
|
|
471
|
+
**🚀 Production-Ready React Native SDK for Nimbbl Payments**
|
|
493
472
|
|
|
494
|
-
#### ✨
|
|
495
|
-
- **
|
|
496
|
-
- **
|
|
473
|
+
#### ✨ Features
|
|
474
|
+
- **Unified API**: Single API for both iOS and Android platforms
|
|
475
|
+
- **Latest Native SDKs**: Built on iOS 2.0.7 and Android 4.0.4
|
|
476
|
+
- **TypeScript Support**: Full TypeScript definitions for better development experience
|
|
477
|
+
- **Cross-Platform Consistency**: Identical behavior on iOS and Android
|
|
478
|
+
- **Production Ready**: Optimized for production environments with comprehensive error handling
|
|
497
479
|
|
|
498
|
-
#### 🔧
|
|
499
|
-
- **
|
|
500
|
-
- **
|
|
501
|
-
- **
|
|
502
|
-
- **
|
|
480
|
+
#### 🔧 Core Functionality
|
|
481
|
+
- **Easy Integration**: Simple setup with production-ready defaults
|
|
482
|
+
- **Multiple Payment Methods**: Support for cards, UPI, netbanking, wallets, EMI, and cash
|
|
483
|
+
- **WebView Integration**: Built-in payment webview with customization options
|
|
484
|
+
- **Unified Event Handling**: Single callback system for all payment responses
|
|
485
|
+
- **Robust Error Handling**: Comprehensive error handling and fallback mechanisms
|
|
503
486
|
|
|
504
|
-
####
|
|
505
|
-
-
|
|
506
|
-
-
|
|
507
|
-
-
|
|
487
|
+
#### 🛠️ Technical Highlights
|
|
488
|
+
- **Modern Architecture**: Built with React Native best practices
|
|
489
|
+
- **Native Bridge**: Seamless communication between React Native and native SDKs
|
|
490
|
+
- **Performance Optimized**: Efficient memory management and callback handling
|
|
491
|
+
- **Clean Codebase**: Production-ready code with no debug artifacts
|
|
492
|
+
- **Comprehensive Testing**: Full test coverage with 20+ test cases
|
|
508
493
|
|
|
509
|
-
|
|
494
|
+
#### 📱 Platform Support
|
|
495
|
+
- **iOS**: iOS 13.0+ with Swift implementation
|
|
496
|
+
- **Android**: API Level 21+ (Android 5.0) with Kotlin implementation
|
|
497
|
+
- **React Native**: 0.70.0+ support with 0.76.0 recommended
|
|
510
498
|
|
|
511
|
-
|
|
499
|
+
## 🎯 What's Next?
|
|
512
500
|
|
|
513
|
-
|
|
501
|
+
This is the first release of the Nimbbl React Native SDK. Future releases will include:
|
|
514
502
|
|
|
515
|
-
|
|
516
|
-
- **
|
|
517
|
-
- **
|
|
518
|
-
- **
|
|
503
|
+
- 🔄 **Enhanced Features**: Additional payment methods and customization options
|
|
504
|
+
- 🚀 **Performance Improvements**: Optimizations based on real-world usage
|
|
505
|
+
- 🛠️ **Developer Experience**: Enhanced debugging tools and documentation
|
|
506
|
+
- 📱 **Platform Updates**: Support for new React Native versions and platform features
|
|
519
507
|
|
|
520
|
-
|
|
521
|
-
- **Performance Optimization**: Better memory management and event handling
|
|
522
|
-
- **Code Quality**: Comprehensive TypeScript definitions and error handling
|
|
523
|
-
- **Documentation**: Complete API documentation with examples and troubleshooting
|
|
508
|
+
## 🤝 Contributing
|
|
524
509
|
|
|
525
|
-
|
|
526
|
-
- Fixed iOS payment status screen not opening issue
|
|
527
|
-
- Resolved event listener lifecycle management
|
|
528
|
-
- Improved WebView integration stability
|
|
510
|
+
We welcome contributions! Please see our [Contributing Guidelines](CONTRIBUTING.md) for details.
|
|
529
511
|
|
|
530
|
-
|
|
531
|
-
- Updated to latest React Native 0.76.0 compatibility
|
|
532
|
-
- Enhanced iOS and Android native module integration
|
|
512
|
+
## 📄 License
|
|
533
513
|
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
### Previous Alpha Releases
|
|
537
|
-
|
|
538
|
-
#### v1.0.0-alpha.12
|
|
539
|
-
- Enhanced event listener management
|
|
540
|
-
- Improved iOS native module integration
|
|
541
|
-
- Added debug logging capabilities
|
|
542
|
-
|
|
543
|
-
#### v1.0.0-alpha.3
|
|
544
|
-
- Enhanced error handling
|
|
545
|
-
- Improved WebView integration
|
|
546
|
-
- Better TypeScript support
|
|
547
|
-
|
|
548
|
-
#### v1.0.0-alpha.2
|
|
549
|
-
- Bug fixes and improvements
|
|
550
|
-
- Enhanced error handling
|
|
551
|
-
|
|
552
|
-
#### v1.0.0-alpha.1
|
|
553
|
-
- Initial alpha release with core functionality
|
|
514
|
+
This project is licensed under the MIT License - see the [LICENSE](./LICENSE) file for details.
|
package/android/build.gradle
CHANGED
|
@@ -24,7 +24,7 @@ allprojects {
|
|
|
24
24
|
}
|
|
25
25
|
|
|
26
26
|
group = 'com.nimbbl.reactnative'
|
|
27
|
-
version = '1.
|
|
27
|
+
version = '1.3.1'
|
|
28
28
|
|
|
29
29
|
android {
|
|
30
30
|
namespace 'com.nimbbl.reactnative'
|
|
@@ -35,7 +35,7 @@ android {
|
|
|
35
35
|
minSdkVersion 24
|
|
36
36
|
targetSdkVersion 36
|
|
37
37
|
versionCode 1
|
|
38
|
-
versionName "1.
|
|
38
|
+
versionName "1.3.1"
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
buildTypes {
|
|
@@ -65,7 +65,7 @@ dependencies {
|
|
|
65
65
|
implementation 'androidx.appcompat:appcompat:1.6.1'
|
|
66
66
|
|
|
67
67
|
// Nimbbl WebView SDK dependency (includes all necessary dependencies)
|
|
68
|
-
implementation '
|
|
68
|
+
implementation 'com.github.nimbbl-tech:nimbbl_mobile_kit_android_webview_sdk:v4.0.4'
|
|
69
69
|
|
|
70
70
|
// Add Retrofit and Coroutines dependencies for Android SDK
|
|
71
71
|
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
|
|
@@ -79,7 +79,7 @@ afterEvaluate {
|
|
|
79
79
|
from components.release
|
|
80
80
|
groupId = 'com.nimbbl.reactnative'
|
|
81
81
|
artifactId = 'nimbbl-react-native-sdk'
|
|
82
|
-
version = '1.
|
|
82
|
+
version = '1.3.1'
|
|
83
83
|
}
|
|
84
84
|
}
|
|
85
85
|
}
|
|
@@ -10,10 +10,6 @@
|
|
|
10
10
|
android:name=".NimbblCheckoutActivity"
|
|
11
11
|
android:exported="false"
|
|
12
12
|
android:theme="@android:style/Theme.DeviceDefault.Light.NoActionBar" />
|
|
13
|
-
<activity
|
|
14
|
-
android:name=".TestActivity"
|
|
15
|
-
android:exported="false"
|
|
16
|
-
android:theme="@android:style/Theme.DeviceDefault.Light.NoActionBar" />
|
|
17
13
|
</application>
|
|
18
14
|
|
|
19
15
|
</manifest>
|
|
@@ -6,17 +6,39 @@ import android.os.Bundle
|
|
|
6
6
|
import tech.nimbbl.webviewsdk.core.NimbblCheckoutSDK
|
|
7
7
|
import tech.nimbbl.webviewsdk.models.NimbblCheckoutOptions
|
|
8
8
|
import tech.nimbbl.webviewsdk.models.interfaces.NimbblCheckoutPaymentListener
|
|
9
|
-
import
|
|
9
|
+
import java.io.Serializable
|
|
10
10
|
|
|
11
11
|
class NimbblCheckoutActivity : Activity(), NimbblCheckoutPaymentListener {
|
|
12
12
|
|
|
13
|
+
private var hasResponded = false
|
|
14
|
+
|
|
13
15
|
companion object {
|
|
14
|
-
private
|
|
16
|
+
private var lastResult: MutableMap<String, Any>? = null
|
|
17
|
+
private var resultCallback: ((MutableMap<String, Any>) -> Unit)? = null
|
|
18
|
+
private var currentActivity: NimbblCheckoutActivity? = null
|
|
19
|
+
|
|
20
|
+
fun finishActivity() {
|
|
21
|
+
currentActivity?.finish()
|
|
22
|
+
currentActivity = null
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
fun setResultCallback(callback: (MutableMap<String, Any>) -> Unit) {
|
|
26
|
+
resultCallback = callback
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
fun getLastResult(): MutableMap<String, Any>? {
|
|
30
|
+
return lastResult
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
fun clearLastResult() {
|
|
34
|
+
lastResult = null
|
|
35
|
+
}
|
|
15
36
|
const val EXTRA_ORDER_TOKEN = "order_token"
|
|
16
37
|
const val EXTRA_PAYMENT_MODE_CODE = "payment_mode_code"
|
|
17
38
|
const val EXTRA_BANK_CODE = "bank_code"
|
|
18
39
|
const val EXTRA_WALLET_CODE = "wallet_code"
|
|
19
40
|
const val EXTRA_PAYMENT_FLOW = "payment_flow"
|
|
41
|
+
const val EXTRA_APP_CODE = "app_code"
|
|
20
42
|
|
|
21
43
|
fun startCheckout(
|
|
22
44
|
activity: Activity,
|
|
@@ -24,7 +46,8 @@ class NimbblCheckoutActivity : Activity(), NimbblCheckoutPaymentListener {
|
|
|
24
46
|
paymentModeCode: String = "",
|
|
25
47
|
bankCode: String = "",
|
|
26
48
|
walletCode: String = "",
|
|
27
|
-
paymentFlow: String = ""
|
|
49
|
+
paymentFlow: String = "",
|
|
50
|
+
appCode: String = ""
|
|
28
51
|
) {
|
|
29
52
|
val intent = Intent(activity, NimbblCheckoutActivity::class.java).apply {
|
|
30
53
|
putExtra(EXTRA_ORDER_TOKEN, orderToken)
|
|
@@ -32,6 +55,7 @@ class NimbblCheckoutActivity : Activity(), NimbblCheckoutPaymentListener {
|
|
|
32
55
|
putExtra(EXTRA_BANK_CODE, bankCode)
|
|
33
56
|
putExtra(EXTRA_WALLET_CODE, walletCode)
|
|
34
57
|
putExtra(EXTRA_PAYMENT_FLOW, paymentFlow)
|
|
58
|
+
putExtra(EXTRA_APP_CODE, appCode)
|
|
35
59
|
}
|
|
36
60
|
|
|
37
61
|
activity.startActivity(intent)
|
|
@@ -40,6 +64,7 @@ class NimbblCheckoutActivity : Activity(), NimbblCheckoutPaymentListener {
|
|
|
40
64
|
|
|
41
65
|
override fun onCreate(savedInstanceState: Bundle?) {
|
|
42
66
|
super.onCreate(savedInstanceState)
|
|
67
|
+
currentActivity = this
|
|
43
68
|
|
|
44
69
|
try {
|
|
45
70
|
// Get the checkout options from intent
|
|
@@ -48,6 +73,7 @@ class NimbblCheckoutActivity : Activity(), NimbblCheckoutPaymentListener {
|
|
|
48
73
|
val bankCode = intent.getStringExtra(EXTRA_BANK_CODE) ?: ""
|
|
49
74
|
val walletCode = intent.getStringExtra(EXTRA_WALLET_CODE) ?: ""
|
|
50
75
|
val paymentFlow = intent.getStringExtra(EXTRA_PAYMENT_FLOW) ?: ""
|
|
76
|
+
val appCode = intent.getStringExtra(EXTRA_APP_CODE) ?: ""
|
|
51
77
|
|
|
52
78
|
|
|
53
79
|
if (orderToken.isNullOrEmpty()) {
|
|
@@ -65,8 +91,8 @@ class NimbblCheckoutActivity : Activity(), NimbblCheckoutPaymentListener {
|
|
|
65
91
|
.setWalletCode(walletCode)
|
|
66
92
|
.build()
|
|
67
93
|
|
|
68
|
-
// Initialize SDK
|
|
69
|
-
NimbblCheckoutSDK.getInstance().init(this)
|
|
94
|
+
// Initialize SDK with app code and start checkout
|
|
95
|
+
NimbblCheckoutSDK.getInstance().init(this, appCode)
|
|
70
96
|
NimbblCheckoutSDK.getInstance().checkout(checkoutOptions)
|
|
71
97
|
|
|
72
98
|
} catch (e: Exception) {
|
|
@@ -81,60 +107,29 @@ class NimbblCheckoutActivity : Activity(), NimbblCheckoutPaymentListener {
|
|
|
81
107
|
|
|
82
108
|
|
|
83
109
|
override fun onCheckoutResponse(data: MutableMap<String, Any>) {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
val jsonObject = JSONObject()
|
|
88
|
-
data.forEach { (key, value) ->
|
|
89
|
-
when (value) {
|
|
90
|
-
is String -> {
|
|
91
|
-
// Replace "null" string with empty string
|
|
92
|
-
val cleanValue = if (value == "null") "" else value
|
|
93
|
-
jsonObject.put(key, cleanValue)
|
|
94
|
-
}
|
|
95
|
-
is Number -> jsonObject.put(key, value)
|
|
96
|
-
is Boolean -> jsonObject.put(key, value)
|
|
97
|
-
is Map<*, *> -> {
|
|
98
|
-
val nestedJson = JSONObject()
|
|
99
|
-
(value as Map<String, Any>).forEach { (nestedKey, nestedValue) ->
|
|
100
|
-
when (nestedValue) {
|
|
101
|
-
is String -> {
|
|
102
|
-
// Replace "null" string with empty string
|
|
103
|
-
val cleanValue = if (nestedValue == "null") "" else nestedValue
|
|
104
|
-
nestedJson.put(nestedKey, cleanValue)
|
|
105
|
-
}
|
|
106
|
-
is Number -> nestedJson.put(nestedKey, nestedValue)
|
|
107
|
-
is Boolean -> nestedJson.put(nestedKey, nestedValue)
|
|
108
|
-
else -> {
|
|
109
|
-
val cleanValue = if (nestedValue.toString() == "null") "" else nestedValue.toString()
|
|
110
|
-
nestedJson.put(nestedKey, cleanValue)
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
jsonObject.put(key, nestedJson)
|
|
115
|
-
}
|
|
116
|
-
else -> {
|
|
117
|
-
val cleanValue = if (value.toString() == "null") "" else value.toString()
|
|
118
|
-
jsonObject.put(key, cleanValue)
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
jsonObject.toString()
|
|
123
|
-
} catch (e: Exception) {
|
|
124
|
-
data.toString() // Fallback to original format
|
|
110
|
+
// Prevent multiple responses - only process the first valid response
|
|
111
|
+
if (hasResponded) {
|
|
112
|
+
return
|
|
125
113
|
}
|
|
126
114
|
|
|
127
|
-
//
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
putExtra("order_id", data["order_id"]?.toString() ?: "")
|
|
131
|
-
putExtra("payment_id", data["payment_id"]?.toString() ?: "")
|
|
132
|
-
putExtra("response", jsonData)
|
|
115
|
+
// Only process non-empty responses
|
|
116
|
+
if (data.isEmpty()) {
|
|
117
|
+
return
|
|
133
118
|
}
|
|
134
119
|
|
|
135
|
-
|
|
120
|
+
hasResponded = true
|
|
136
121
|
|
|
137
|
-
|
|
122
|
+
// Call the React Native module directly instead of using Activity result
|
|
123
|
+
NimbblReactNativeSDKModule.handleCheckoutResponse(data)
|
|
124
|
+
|
|
125
|
+
// Finish the activity immediately since we're using direct callback
|
|
126
|
+
try {
|
|
127
|
+
if (!isFinishing) {
|
|
128
|
+
finish()
|
|
129
|
+
}
|
|
130
|
+
} catch (e: Exception) {
|
|
131
|
+
// Activity finish error - ignore
|
|
132
|
+
}
|
|
138
133
|
}
|
|
139
134
|
|
|
140
135
|
|