nimbbl-mobile-react-native-sdk 1.0.0-alpha.10

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 (44) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +374 -0
  3. package/android/build.gradle +86 -0
  4. package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  5. package/android/gradle/wrapper/gradle-wrapper.properties +6 -0
  6. package/android/gradle.properties +4 -0
  7. package/android/gradlew +185 -0
  8. package/android/gradlew.bat +89 -0
  9. package/android/settings.gradle +1 -0
  10. package/android/src/main/AndroidManifest.xml +19 -0
  11. package/android/src/main/java/com/nimbbl/reactnative/NimbblCheckoutActivity.kt +224 -0
  12. package/android/src/main/java/com/nimbbl/reactnative/NimbblReactNativeSDKModule.kt +428 -0
  13. package/android/src/main/java/com/nimbbl/reactnative/NimbblReactNativeSDKPackage.kt +16 -0
  14. package/android/src/main/java/com/nimbbl/reactnative/TestActivity.kt +28 -0
  15. package/index.tsx +8 -0
  16. package/ios/NimbblReactNativeSDK.m +20 -0
  17. package/ios/NimbblReactNativeSDK.podspec +38 -0
  18. package/ios/NimbblReactNativeSDK.swift +199 -0
  19. package/lib/NimbblSDK.d.ts +91 -0
  20. package/lib/NimbblSDK.d.ts.map +1 -0
  21. package/lib/NimbblSDK.js +214 -0
  22. package/lib/NimbblSDK.js.map +1 -0
  23. package/lib/__tests__/__mocks__/react-native.d.ts +26 -0
  24. package/lib/__tests__/__mocks__/react-native.d.ts.map +1 -0
  25. package/lib/__tests__/__mocks__/react-native.js +23 -0
  26. package/lib/__tests__/__mocks__/react-native.js.map +1 -0
  27. package/lib/__tests__/setup.d.ts +1 -0
  28. package/lib/__tests__/setup.d.ts.map +1 -0
  29. package/lib/__tests__/setup.js +4 -0
  30. package/lib/__tests__/setup.js.map +1 -0
  31. package/lib/constants.d.ts +31 -0
  32. package/lib/constants.d.ts.map +1 -0
  33. package/lib/constants.js +40 -0
  34. package/lib/constants.js.map +1 -0
  35. package/lib/index.d.ts +14 -0
  36. package/lib/index.d.ts.map +1 -0
  37. package/lib/index.js +32 -0
  38. package/lib/index.js.map +1 -0
  39. package/lib/types.d.ts +48 -0
  40. package/lib/types.d.ts.map +1 -0
  41. package/lib/types.js +8 -0
  42. package/lib/types.js.map +1 -0
  43. package/nimbbl-mobile-react-native-sdk.podspec +27 -0
  44. package/package.json +90 -0
@@ -0,0 +1,89 @@
1
+ @rem
2
+ @rem Copyright 2015 the original author or authors.
3
+ @rem
4
+ @rem Licensed under the Apache License, Version 2.0 (the "License");
5
+ @rem you may not use this file except in compliance with the License.
6
+ @rem You may obtain a copy of the License at
7
+ @rem
8
+ @rem https://www.apache.org/licenses/LICENSE-2.0
9
+ @rem
10
+ @rem Unless required by applicable law or agreed to in writing, software
11
+ @rem distributed under the License is distributed on an "AS IS" BASIS,
12
+ @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ @rem See the License for the specific language governing permissions and
14
+ @rem limitations under the License.
15
+ @rem
16
+
17
+ @if "%DEBUG%" == "" @echo off
18
+ @rem ##########################################################################
19
+ @rem
20
+ @rem Gradle startup script for Windows
21
+ @rem
22
+ @rem ##########################################################################
23
+
24
+ @rem Set local scope for the variables with windows NT shell
25
+ if "%OS%"=="Windows_NT" setlocal
26
+
27
+ set DIRNAME=%~dp0
28
+ if "%DIRNAME%" == "" set DIRNAME=.
29
+ set APP_BASE_NAME=%~n0
30
+ set APP_HOME=%DIRNAME%
31
+
32
+ @rem Resolve any "." and ".." in APP_HOME to make it shorter.
33
+ for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
34
+
35
+ @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
36
+ set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
37
+
38
+ @rem Find java.exe
39
+ if defined JAVA_HOME goto findJavaFromJavaHome
40
+
41
+ set JAVA_EXE=java.exe
42
+ %JAVA_EXE% -version >NUL 2>&1
43
+ if "%ERRORLEVEL%" == "0" goto execute
44
+
45
+ echo.
46
+ echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
47
+ echo.
48
+ echo Please set the JAVA_HOME variable in your environment to match the
49
+ echo location of your Java installation.
50
+
51
+ goto fail
52
+
53
+ :findJavaFromJavaHome
54
+ set JAVA_HOME=%JAVA_HOME:"=%
55
+ set JAVA_EXE=%JAVA_HOME%/bin/java.exe
56
+
57
+ if exist "%JAVA_EXE%" goto execute
58
+
59
+ echo.
60
+ echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
61
+ echo.
62
+ echo Please set the JAVA_HOME variable in your environment to match the
63
+ echo location of your Java installation.
64
+
65
+ goto fail
66
+
67
+ :execute
68
+ @rem Setup the command line
69
+
70
+ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
71
+
72
+
73
+ @rem Execute Gradle
74
+ "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
75
+
76
+ :end
77
+ @rem End local scope for the variables with windows NT shell
78
+ if "%ERRORLEVEL%"=="0" goto mainEnd
79
+
80
+ :fail
81
+ rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
82
+ rem the _cmd.exe /c_ return code!
83
+ if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
84
+ exit /b 1
85
+
86
+ :mainEnd
87
+ if "%OS%"=="Windows_NT" endlocal
88
+
89
+ :omega
@@ -0,0 +1 @@
1
+ rootProject.name = 'nimbbl-react-native-sdk'
@@ -0,0 +1,19 @@
1
+ <?xml version="1.0" encoding="utf-8"?>
2
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android">
3
+
4
+ <uses-permission android:name="android.permission.INTERNET" />
5
+ <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
6
+
7
+ <application>
8
+ <!-- Module specific configurations can be added here -->
9
+ <activity
10
+ android:name=".NimbblCheckoutActivity"
11
+ android:exported="false"
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
+ </application>
18
+
19
+ </manifest>
@@ -0,0 +1,224 @@
1
+ package com.nimbbl.reactnative
2
+
3
+ import android.app.Activity
4
+ import android.content.Intent
5
+ import android.os.Bundle
6
+ import android.util.Log
7
+ import android.widget.TextView
8
+ import android.view.ViewGroup
9
+ import android.widget.LinearLayout
10
+ import android.graphics.Color
11
+ import tech.nimbbl.webviewsdk.core.NimbblCheckoutSDK
12
+ import tech.nimbbl.webviewsdk.models.NimbblCheckoutOptions
13
+ import tech.nimbbl.webviewsdk.models.interfaces.NimbblCheckoutPaymentListener
14
+ import com.facebook.react.bridge.Arguments
15
+ import com.facebook.react.modules.core.DeviceEventManagerModule
16
+
17
+ class NimbblCheckoutActivity : Activity(), NimbblCheckoutPaymentListener {
18
+
19
+ companion object {
20
+ private const val TAG = "NimbblCheckoutActivity"
21
+ const val EXTRA_ORDER_TOKEN = "order_token"
22
+ const val EXTRA_PAYMENT_MODE_CODE = "payment_mode_code"
23
+ const val EXTRA_BANK_CODE = "bank_code"
24
+ const val EXTRA_WALLET_CODE = "wallet_code"
25
+ const val EXTRA_PAYMENT_FLOW = "payment_flow"
26
+
27
+ fun startCheckout(
28
+ activity: Activity,
29
+ orderToken: String,
30
+ paymentModeCode: String = "",
31
+ bankCode: String = "",
32
+ walletCode: String = "",
33
+ paymentFlow: String = ""
34
+ ) {
35
+ Log.d(TAG, "startCheckout method called with orderToken: $orderToken")
36
+ println("startCheckout method called with orderToken: $orderToken")
37
+
38
+ val intent = Intent(activity, NimbblCheckoutActivity::class.java).apply {
39
+ putExtra(EXTRA_ORDER_TOKEN, orderToken)
40
+ putExtra(EXTRA_PAYMENT_MODE_CODE, paymentModeCode)
41
+ putExtra(EXTRA_BANK_CODE, bankCode)
42
+ putExtra(EXTRA_WALLET_CODE, walletCode)
43
+ putExtra(EXTRA_PAYMENT_FLOW, paymentFlow)
44
+ }
45
+
46
+ Log.d(TAG, "Intent created, starting activity...")
47
+ println("Intent created, starting activity...")
48
+ activity.startActivity(intent)
49
+ Log.d(TAG, "Activity startActivity() called")
50
+ println("Activity startActivity() called")
51
+ }
52
+ }
53
+
54
+ override fun onCreate(savedInstanceState: Bundle?) {
55
+ super.onCreate(savedInstanceState)
56
+
57
+ Log.d(TAG, "NimbblCheckoutActivity created")
58
+ println("NimbblCheckoutActivity onCreate called")
59
+
60
+ // Create a simple UI to show the activity is launching
61
+ val layout = LinearLayout(this).apply {
62
+ orientation = LinearLayout.VERTICAL
63
+ layoutParams = ViewGroup.LayoutParams(
64
+ ViewGroup.LayoutParams.MATCH_PARENT,
65
+ ViewGroup.LayoutParams.MATCH_PARENT
66
+ )
67
+ setBackgroundColor(Color.WHITE)
68
+ }
69
+
70
+ val textView = TextView(this).apply {
71
+ text = "NimbblCheckoutActivity is loading...\nOrder Token: ${intent.getStringExtra(EXTRA_ORDER_TOKEN)}"
72
+ textSize = 16f
73
+ setTextColor(Color.BLACK)
74
+ setPadding(50, 100, 50, 50)
75
+ }
76
+
77
+ layout.addView(textView)
78
+ setContentView(layout)
79
+
80
+ Log.d(TAG, "Simple UI set up")
81
+ println("Simple UI set up")
82
+
83
+ try {
84
+ // Get the checkout options from intent
85
+ val orderToken = intent.getStringExtra(EXTRA_ORDER_TOKEN)
86
+ val paymentModeCode = intent.getStringExtra(EXTRA_PAYMENT_MODE_CODE) ?: ""
87
+ val bankCode = intent.getStringExtra(EXTRA_BANK_CODE) ?: ""
88
+ val walletCode = intent.getStringExtra(EXTRA_WALLET_CODE) ?: ""
89
+ val paymentFlow = intent.getStringExtra(EXTRA_PAYMENT_FLOW) ?: ""
90
+
91
+ Log.d(TAG, "Received order token: $orderToken")
92
+ Log.d(TAG, "Received payment mode code: $paymentModeCode")
93
+ Log.d(TAG, "Received bank code: $bankCode")
94
+ Log.d(TAG, "Received wallet code: $walletCode")
95
+ Log.d(TAG, "Received payment flow: $paymentFlow")
96
+
97
+ if (orderToken.isNullOrEmpty()) {
98
+ Log.e(TAG, "Order token is required")
99
+ finish()
100
+ return
101
+ }
102
+
103
+ Log.d(TAG, "Starting checkout with order token: $orderToken")
104
+ println("Starting checkout with order token: $orderToken")
105
+
106
+ // Use direct method calls instead of reflection
107
+ Log.d(TAG, "Using direct Android SDK calls...")
108
+ println("Using direct Android SDK calls...")
109
+
110
+ try {
111
+ // Create checkout options first (matching native sample app pattern)
112
+ val checkoutOptions = NimbblCheckoutOptions.Builder()
113
+ .setOrderToken(orderToken)
114
+ .setPaymentModeCode(paymentModeCode)
115
+ .setBankCode(bankCode)
116
+ .setPaymentFlow(paymentFlow)
117
+ .setWalletCode(walletCode)
118
+ .build()
119
+
120
+ Log.d(TAG, "Checkout options created successfully")
121
+ println("Checkout options created successfully")
122
+
123
+ // Initialize SDK and call checkout (matching native sample app pattern)
124
+ Log.d(TAG, "About to init SDK and call checkout...")
125
+ println("About to init SDK and call checkout...")
126
+
127
+ NimbblCheckoutSDK.instance?.init(this)
128
+ NimbblCheckoutSDK.instance?.checkout(checkoutOptions)
129
+
130
+ Log.d(TAG, "NimbblCheckoutSDK init and checkout called successfully")
131
+ println("NimbblCheckoutSDK init and checkout called successfully")
132
+
133
+ Log.d(TAG, "Webview should appear now...")
134
+ println("Webview should appear now...")
135
+
136
+ } catch (e: Exception) {
137
+ Log.e(TAG, "Error calling Android SDK: ${e.message}", e)
138
+ println("Error calling Android SDK: ${e.message}")
139
+ e.printStackTrace()
140
+ finish()
141
+ }
142
+
143
+ } catch (e: Exception) {
144
+ Log.e(TAG, "Error in onCreate: ${e.message}", e)
145
+ println("Error in onCreate: ${e.message}")
146
+ e.printStackTrace()
147
+ finish()
148
+ }
149
+ }
150
+
151
+
152
+
153
+ override fun onPaymentSuccess(data: MutableMap<String, Any>) {
154
+ // Set result for the calling activity (NimbblReactNativeSDKModule)
155
+ val intent = Intent().apply {
156
+ putExtra("status", "success")
157
+ putExtra("order_id", data["order_id"]?.toString() ?: "")
158
+ putExtra("payment_id", data["payment_id"]?.toString() ?: "")
159
+ putExtra("response", data.toString())
160
+ }
161
+ setResult(Activity.RESULT_OK, intent)
162
+
163
+ finish()
164
+ }
165
+
166
+ override fun onPaymentFailed(data: String) {
167
+ // Set result for the calling activity (NimbblReactNativeSDKModule)
168
+ val intent = Intent().apply {
169
+ putExtra("status", "failed")
170
+ putExtra("response", data)
171
+ }
172
+ setResult(Activity.RESULT_CANCELED, intent)
173
+
174
+ finish()
175
+ }
176
+
177
+ override fun onBackPressed() {
178
+ Log.d(TAG, "Back pressed - blocked to prevent accidental cancellation")
179
+ println("Back pressed - blocked to prevent accidental cancellation")
180
+
181
+ // Block the back button completely
182
+ // The WebView should handle its own back navigation internally
183
+ // Only success and failure events should be sent to the sample app
184
+ }
185
+
186
+ override fun onPause() {
187
+ super.onPause()
188
+ Log.d(TAG, "onPause called - cleaning up resources")
189
+ println("onPause called - cleaning up resources")
190
+
191
+ // Clean up any resources that might be causing leaks
192
+ try {
193
+ // The NimbblCheckoutSDK should handle its own cleanup
194
+ // but we can add additional cleanup here if needed
195
+ } catch (e: Exception) {
196
+ Log.e(TAG, "Error during onPause cleanup", e)
197
+ }
198
+ }
199
+
200
+ override fun onDestroy() {
201
+ super.onDestroy()
202
+ Log.d(TAG, "onDestroy called - final cleanup")
203
+ println("onDestroy called - final cleanup")
204
+
205
+ // Final cleanup to prevent memory leaks
206
+ try {
207
+ // Call cleanup on NimbblCheckoutSDK to properly unregister broadcast receivers
208
+ NimbblCheckoutSDK.instance?.let { sdk ->
209
+ try {
210
+ // Try to call any cleanup method if available
211
+ val cleanupMethod = sdk.javaClass.getMethod("cleanup")
212
+ cleanupMethod.invoke(sdk)
213
+ Log.d(TAG, "NimbblCheckoutSDK cleanup called successfully")
214
+ } catch (e: NoSuchMethodException) {
215
+ Log.d(TAG, "NimbblCheckoutSDK cleanup method not found, skipping")
216
+ } catch (e: Exception) {
217
+ Log.e(TAG, "Error calling NimbblCheckoutSDK cleanup", e)
218
+ }
219
+ }
220
+ } catch (e: Exception) {
221
+ Log.e(TAG, "Error during onDestroy cleanup", e)
222
+ }
223
+ }
224
+ }