@appboxo/capacitor-boxo-sdk 0.0.2

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.
@@ -0,0 +1,18 @@
1
+ require 'json'
2
+
3
+ package = JSON.parse(File.read(File.join(__dir__, 'package.json')))
4
+
5
+ Pod::Spec.new do |s|
6
+ s.name = 'CapacitorBoxoSdk'
7
+ s.version = package['version']
8
+ s.summary = package['description']
9
+ s.license = package['license']
10
+ s.homepage = package['repository']['url']
11
+ s.author = package['author']
12
+ s.source = { :git => package['repository']['url'], :tag => s.version.to_s }
13
+ s.source_files = 'ios/Sources/**/*.{swift,h,m,c,cc,mm,cpp}'
14
+ s.ios.deployment_target = '13.0'
15
+ s.dependency 'Capacitor'
16
+ s.dependency 'AppBoxoSDK', '1.5.4'
17
+ s.swift_version = '5.1'
18
+ end
package/Package.swift ADDED
@@ -0,0 +1,28 @@
1
+ // swift-tools-version: 5.9
2
+ import PackageDescription
3
+
4
+ let package = Package(
5
+ name: "CapacitorBoxoSdk",
6
+ platforms: [.iOS(.v13)],
7
+ products: [
8
+ .library(
9
+ name: "CapacitorBoxoSdk",
10
+ targets: ["AppboxoPlugin"])
11
+ ],
12
+ dependencies: [
13
+ .package(url: "https://github.com/ionic-team/capacitor-swift-pm.git", branch: "main")
14
+ ],
15
+ targets: [
16
+ .target(
17
+ name: "AppboxoPlugin",
18
+ dependencies: [
19
+ .product(name: "Capacitor", package: "capacitor-swift-pm"),
20
+ .product(name: "Cordova", package: "capacitor-swift-pm")
21
+ ],
22
+ path: "ios/Sources/AppboxoPlugin"),
23
+ .testTarget(
24
+ name: "AppboxoPluginTests",
25
+ dependencies: ["AppboxoPlugin"],
26
+ path: "ios/Tests/AppboxoPluginTests")
27
+ ]
28
+ )
package/README.md ADDED
@@ -0,0 +1,240 @@
1
+ # capacitor-boxo-sdk
2
+
3
+ A Capacitor wrapper over Appboxo SDK for IOS and Android.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install capacitor-boxo-sdk
9
+ npx cap sync
10
+ ```
11
+
12
+ ## API
13
+
14
+ <docgen-index>
15
+
16
+ * [`setConfig(...)`](#setconfig)
17
+ * [`openMiniapp(...)`](#openminiapp)
18
+ * [`setAuthCode(...)`](#setauthcode)
19
+ * [`closeMiniapp(...)`](#closeminiapp)
20
+ * [`sendCustomEvent(...)`](#sendcustomevent)
21
+ * [`sendPaymentEvent(...)`](#sendpaymentevent)
22
+ * [`getMiniapps()`](#getminiapps)
23
+ * [`hideMiniapps()`](#hideminiapps)
24
+ * [`logout()`](#logout)
25
+ * [Interfaces](#interfaces)
26
+
27
+ </docgen-index>
28
+
29
+ <docgen-api>
30
+ <!--Update the source file JSDoc comments and rerun docgen to update the docs below-->
31
+
32
+ ### setConfig(...)
33
+
34
+ ```typescript
35
+ setConfig(options: ConfigOptions) => Promise<void>
36
+ ```
37
+
38
+ Set global configs
39
+
40
+ | Param | Type |
41
+ | ------------- | ------------------------------------------------------- |
42
+ | **`options`** | <code><a href="#configoptions">ConfigOptions</a></code> |
43
+
44
+ --------------------
45
+
46
+
47
+ ### openMiniapp(...)
48
+
49
+ ```typescript
50
+ openMiniapp(options: OpenMiniappOptions) => Promise<void>
51
+ ```
52
+
53
+ Open miniapp with options
54
+
55
+ | Param | Type |
56
+ | ------------- | ----------------------------------------------------------------- |
57
+ | **`options`** | <code><a href="#openminiappoptions">OpenMiniappOptions</a></code> |
58
+
59
+ --------------------
60
+
61
+
62
+ ### setAuthCode(...)
63
+
64
+ ```typescript
65
+ setAuthCode(options: { appId: string; authCode: string; }) => Promise<void>
66
+ ```
67
+
68
+ get AuthCode from hostapp backend and send it to miniapp
69
+
70
+ | Param | Type |
71
+ | ------------- | ------------------------------------------------- |
72
+ | **`options`** | <code>{ appId: string; authCode: string; }</code> |
73
+
74
+ --------------------
75
+
76
+
77
+ ### closeMiniapp(...)
78
+
79
+ ```typescript
80
+ closeMiniapp(options: { appId: string; }) => Promise<void>
81
+ ```
82
+
83
+ close miniapp by appId
84
+
85
+ | Param | Type |
86
+ | ------------- | ------------------------------- |
87
+ | **`options`** | <code>{ appId: string; }</code> |
88
+
89
+ --------------------
90
+
91
+
92
+ ### sendCustomEvent(...)
93
+
94
+ ```typescript
95
+ sendCustomEvent(customEvent: CustomEvent) => Promise<void>
96
+ ```
97
+
98
+ send custom event to miniapp
99
+
100
+ | Param | Type |
101
+ | ----------------- | --------------------------------------------------- |
102
+ | **`customEvent`** | <code><a href="#customevent">CustomEvent</a></code> |
103
+
104
+ --------------------
105
+
106
+
107
+ ### sendPaymentEvent(...)
108
+
109
+ ```typescript
110
+ sendPaymentEvent(paymentEvent: PaymentEvent) => Promise<void>
111
+ ```
112
+
113
+ send payment event to miniapp
114
+
115
+ | Param | Type |
116
+ | ------------------ | ----------------------------------------------------- |
117
+ | **`paymentEvent`** | <code><a href="#paymentevent">PaymentEvent</a></code> |
118
+
119
+ --------------------
120
+
121
+
122
+ ### getMiniapps()
123
+
124
+ ```typescript
125
+ getMiniapps() => Promise<MiniappListResult>
126
+ ```
127
+
128
+ Get list of miniapps
129
+
130
+ **Returns:** <code>Promise&lt;<a href="#miniapplistresult">MiniappListResult</a>&gt;</code>
131
+
132
+ --------------------
133
+
134
+
135
+ ### hideMiniapps()
136
+
137
+ ```typescript
138
+ hideMiniapps() => Promise<void>
139
+ ```
140
+
141
+ Miniapp opens on a native screen. To show payment processing page need to hide miniapp screen.
142
+ To use this function need to enable 'enableMultitaskMode: true' in Appboxo.setConfigs()
143
+
144
+ --------------------
145
+
146
+
147
+ ### logout()
148
+
149
+ ```typescript
150
+ logout() => Promise<void>
151
+ ```
152
+
153
+ When host app user logs out, it is highly important to clear all miniapp storage data.
154
+
155
+ --------------------
156
+
157
+
158
+ ### Interfaces
159
+
160
+
161
+ #### ConfigOptions
162
+
163
+ | Prop | Type | Description |
164
+ | ------------------------- | ------------------------------------------ | ---------------------------------------------------------------------------------------- |
165
+ | **`clientId`** | <code>string</code> | your client id from dashboard |
166
+ | **`userId`** | <code>string</code> | hostapp userId, will be used for the Consent Management |
167
+ | **`sandboxMode`** | <code>boolean</code> | switch to sandbox mode |
168
+ | **`enableMultitaskMode`** | <code>boolean</code> | Each miniapp appears as a task in the Recents screen. !It works only on android devices. |
169
+ | **`theme`** | <code>'light' \| 'dark' \| 'system'</code> | theme for splash screen and other native components used inside miniapp. |
170
+ | **`isDebug`** | <code>boolean</code> | enables webview debugging |
171
+ | **`showPermissionsPage`** | <code>boolean</code> | use it to hide "Settings" from Miniapp menu |
172
+ | **`showClearCache`** | <code>boolean</code> | use it to hide "Clear cache" from Miniapp menu |
173
+
174
+
175
+ #### OpenMiniappOptions
176
+
177
+ | Prop | Type | Description |
178
+ | -------------------- | ----------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
179
+ | **`appId`** | <code>string</code> | miniapp id |
180
+ | **`data`** | <code>object</code> | (optional) data as Map that is sent to miniapp |
181
+ | **`theme`** | <code>'light' \| 'dark' \| 'system'</code> | (optional) miniapp theme "dark" \| "light" (by default is system theme) |
182
+ | **`extraUrlParams`** | <code>object</code> | (optional) extra query params to append to miniapp URL (like: http://miniapp-url.com/?param=test) |
183
+ | **`urlSuffix`** | <code>string</code> | (optional) suffix to append to miniapp URL (like: http://miniapp-url.com/?param=test) |
184
+ | **`colors`** | <code><a href="#coloroptions">ColorOptions</a></code> | (optional) provide colors to miniapp if miniapp supports |
185
+ | **`enableSplash`** | <code>boolean</code> | (optional) use to skip miniapp splash screen |
186
+
187
+
188
+ #### ColorOptions
189
+
190
+ | Prop | Type |
191
+ | -------------------- | ------------------- |
192
+ | **`primaryColor`** | <code>string</code> |
193
+ | **`secondaryColor`** | <code>string</code> |
194
+ | **`tertiaryColor`** | <code>string</code> |
195
+
196
+
197
+ #### CustomEvent
198
+
199
+ | Prop | Type |
200
+ | --------------- | ------------------- |
201
+ | **`appId`** | <code>string</code> |
202
+ | **`requestId`** | <code>number</code> |
203
+ | **`type`** | <code>string</code> |
204
+ | **`errorType`** | <code>string</code> |
205
+ | **`payload`** | <code>object</code> |
206
+
207
+
208
+ #### PaymentEvent
209
+
210
+ | Prop | Type |
211
+ | ---------------------- | ------------------- |
212
+ | **`appId`** | <code>string</code> |
213
+ | **`transactionToken`** | <code>string</code> |
214
+ | **`miniappOrderId`** | <code>string</code> |
215
+ | **`amount`** | <code>number</code> |
216
+ | **`currency`** | <code>string</code> |
217
+ | **`status`** | <code>string</code> |
218
+ | **`hostappOrderId`** | <code>string</code> |
219
+ | **`extraParams`** | <code>object</code> |
220
+
221
+
222
+ #### MiniappListResult
223
+
224
+ | Prop | Type |
225
+ | -------------- | -------------------------- |
226
+ | **`miniapps`** | <code>[MiniappData]</code> |
227
+ | **`error`** | <code>string</code> |
228
+
229
+
230
+ #### MiniappData
231
+
232
+ | Prop | Type |
233
+ | ----------------- | ------------------- |
234
+ | **`appId`** | <code>string</code> |
235
+ | **`name`** | <code>string</code> |
236
+ | **`category`** | <code>string</code> |
237
+ | **`description`** | <code>string</code> |
238
+ | **`logo`** | <code>string</code> |
239
+
240
+ </docgen-api>
@@ -0,0 +1,84 @@
1
+ ext {
2
+ junitVersion = project.hasProperty('junitVersion') ? rootProject.ext.junitVersion : '4.13.2'
3
+ androidxAppCompatVersion = project.hasProperty('androidxAppCompatVersion') ? rootProject.ext.androidxAppCompatVersion : '1.6.1'
4
+ androidxJunitVersion = project.hasProperty('androidxJunitVersion') ? rootProject.ext.androidxJunitVersion : '1.1.5'
5
+ androidxEspressoCoreVersion = project.hasProperty('androidxEspressoCoreVersion') ? rootProject.ext.androidxEspressoCoreVersion : '3.5.1'
6
+ }
7
+
8
+ buildscript {
9
+ ext {
10
+ kotlin_version = '1.9.22'
11
+ }
12
+ repositories {
13
+ google()
14
+ mavenCentral()
15
+ }
16
+ dependencies {
17
+ classpath 'com.android.tools.build:gradle:8.2.2'
18
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
19
+ }
20
+ }
21
+
22
+ apply plugin: 'com.android.library'
23
+ apply plugin: 'kotlin-android'
24
+
25
+ android {
26
+ namespace "io.boxo.sdk.capacitor"
27
+ compileSdk project.hasProperty('compileSdkVersion') ? rootProject.ext.compileSdkVersion : 34
28
+ defaultConfig {
29
+ minSdkVersion project.hasProperty('minSdkVersion') ? rootProject.ext.minSdkVersion : 22
30
+ targetSdkVersion project.hasProperty('targetSdkVersion') ? rootProject.ext.targetSdkVersion : 34
31
+ versionCode 1
32
+ versionName "1.0"
33
+ testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
34
+ }
35
+ buildTypes {
36
+ release {
37
+ minifyEnabled false
38
+ proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
39
+ }
40
+ }
41
+ lintOptions {
42
+ abortOnError false
43
+ }
44
+ compileOptions {
45
+ sourceCompatibility JavaVersion.VERSION_17
46
+ targetCompatibility JavaVersion.VERSION_17
47
+ }
48
+ kotlinOptions {
49
+ jvmTarget = '17'
50
+ }
51
+ }
52
+
53
+ repositories {
54
+ google()
55
+ mavenCentral()
56
+ }
57
+
58
+ rootProject.allprojects {
59
+ repositories {
60
+ maven { url "https://jitpack.io" }
61
+ jcenter()
62
+ maven {
63
+ url "https://maven.pkg.github.com/Appboxo/android-sdk-packages"
64
+ credentials {
65
+ username = "appboxoandroidsdk"
66
+ password = "\u0037\u0039\u0064\u0031\u0065\u0064\u0061\u0036\u0030\u0034\u0063\u0061\u0031\u0066\u0030\u0032\u0066\u0031\u0037\u0066\u0032\u0061\u0039\u0033\u0064\u0035\u0039\u0039\u0061\u0035\u0035\u0062\u0066\u0065\u0031\u0064\u0066\u0064\u0038\u0038"
67
+ }
68
+ }
69
+ }
70
+ }
71
+
72
+ dependencies {
73
+ implementation fileTree(dir: 'libs', include: ['*.jar'])
74
+ implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
75
+ implementation project(':capacitor-android')
76
+ implementation('com.appboxo:sdk:1.5.7') {
77
+ exclude group: 'com.google.android.gms', module: 'play-services-location'
78
+ }
79
+ implementation "androidx.appcompat:appcompat:$androidxAppCompatVersion"
80
+ testImplementation "junit:junit:$junitVersion"
81
+ androidTestImplementation "androidx.test.ext:junit:$androidxJunitVersion"
82
+ androidTestImplementation "androidx.test.espresso:espresso-core:$androidxEspressoCoreVersion"
83
+
84
+ }
@@ -0,0 +1,2 @@
1
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android">
2
+ </manifest>
@@ -0,0 +1,322 @@
1
+ package io.boxo.sdk.capacitor
2
+
3
+ import android.os.Handler
4
+ import android.os.Looper
5
+ import com.appboxo.data.models.MiniappData
6
+ import com.appboxo.js.params.CustomEvent
7
+ import com.appboxo.js.params.PaymentData
8
+ import com.appboxo.sdk.Appboxo
9
+ import com.appboxo.sdk.Config
10
+ import com.appboxo.sdk.Miniapp
11
+ import com.appboxo.sdk.MiniappConfig
12
+ import com.appboxo.sdk.MiniappListCallback
13
+ import com.appboxo.ui.main.AppboxoActivity
14
+ import com.getcapacitor.JSArray
15
+ import com.getcapacitor.JSObject
16
+ import com.getcapacitor.Plugin
17
+ import com.getcapacitor.PluginCall
18
+ import com.getcapacitor.PluginMethod
19
+ import com.getcapacitor.annotation.CapacitorPlugin
20
+
21
+ @CapacitorPlugin(name = "Appboxo")
22
+ class AppboxoPlugin : Plugin(), Miniapp.LifecycleListener,
23
+ Miniapp.CustomEventListener, Miniapp.AuthListener,
24
+ Miniapp.PaymentEventListener {
25
+
26
+ private var handler: Handler? = null
27
+
28
+ override fun load() {
29
+ super.load()
30
+ Appboxo.init(bridge.activity.application)
31
+ handler = Handler(Looper.getMainLooper())
32
+ }
33
+
34
+ @PluginMethod
35
+ fun setConfig(call: PluginCall) {
36
+ val clientId = call.getString("clientId")!!
37
+ val userId = call.getString("userId") ?: ""
38
+ val sandboxMode = call.getBoolean("sandboxMde", false)!!
39
+ val enableMultitaskMode = call.getBoolean("enableMultitaskMode", false)!!
40
+ val theme = call.getString("theme", "system")!!
41
+ val isDebug = call.getBoolean("isDebug", false)!!
42
+ val showPermissionsPage = call.getBoolean("showPermissionsPage", true)!!
43
+ val showClearCache = call.getBoolean("showClearCache", true)!!
44
+ val globalTheme: Config.Theme = when (theme) {
45
+ "light" -> Config.Theme.LIGHT
46
+ "dark" -> Config.Theme.DARK
47
+ else -> Config.Theme.SYSTEM
48
+ }
49
+ Appboxo
50
+ .setConfig(
51
+ Config.Builder()
52
+ .setClientId(clientId)
53
+ .setUserId(userId)
54
+ .sandboxMode(sandboxMode)
55
+ .multitaskMode(enableMultitaskMode)
56
+ .setTheme(globalTheme)
57
+ .permissionsPage(showPermissionsPage)
58
+ .showClearCache(showClearCache)
59
+ .debug(isDebug)
60
+ .build()
61
+ )
62
+ }
63
+
64
+ @PluginMethod
65
+ fun openMiniapp(call: PluginCall) {
66
+ val appId = call.getString("appId")!!
67
+ val data = call.getObject("data")
68
+ val theme = call.getString("theme")
69
+ val extraUrlParams = call.getObject("extraUrlParams")
70
+ val urlSuffix = call.getString("urlSuffix")
71
+ val colors = call.getObject("colors")
72
+ val enableSplash = call.getBoolean("enableSplash")
73
+ val miniapp: Miniapp = Appboxo.getMiniapp(appId)
74
+ .setCustomEventListener(this)
75
+ .setPaymentEventListener(this)
76
+ .setAuthListener(this)
77
+ .setLifecycleListener(this)
78
+ if (data != null) miniapp.setData(data.toMap())
79
+ val configBuilder = MiniappConfig.Builder()
80
+ if (theme != null) {
81
+ val miniappTheme: Config.Theme? = when (theme) {
82
+ "light" -> Config.Theme.LIGHT
83
+ "dark" -> Config.Theme.DARK
84
+ "system" -> Config.Theme.SYSTEM
85
+ else -> null
86
+ }
87
+ if (miniappTheme != null) {
88
+ configBuilder.setTheme(miniappTheme)
89
+ }
90
+ }
91
+ if (extraUrlParams != null) {
92
+ val map: Map<String, Any> = extraUrlParams.toMap()
93
+ val stringMap: MutableMap<String, String> = HashMap()
94
+ for ((key, value) in map) stringMap[key] = value.toString()
95
+ configBuilder.setExtraUrlParams(stringMap)
96
+ }
97
+ urlSuffix?.also { suffix -> configBuilder.setUrlSuffix(suffix) }
98
+ if (colors != null) {
99
+ configBuilder.setColors(
100
+ colors.getString("primaryColor") ?: "",
101
+ colors.getString("secondaryColor") ?: "",
102
+ colors.getString("tertiaryColor") ?: "",
103
+ )
104
+ }
105
+ if (enableSplash != null)
106
+ configBuilder.enableSplash(enableSplash)
107
+ miniapp.setConfig(configBuilder.build())
108
+ miniapp.open(bridge.activity)
109
+ }
110
+
111
+ @PluginMethod
112
+ fun setAuthCode(call: PluginCall) {
113
+ val appId = call.getString("appId")!!
114
+ val authCode = call.getString("authCode")!!
115
+ Appboxo.getMiniapp(appId)
116
+ .setAuthCode(authCode)
117
+ }
118
+
119
+ @PluginMethod
120
+ fun closeMiniapp(call: PluginCall) {
121
+ val appId = call.getString("appId")!!
122
+ handler?.post { Appboxo.getExistingMiniapp(appId)?.close() }
123
+ }
124
+
125
+ override fun handle(
126
+ miniAppActivity: AppboxoActivity,
127
+ miniapp: Miniapp,
128
+ customEvent: CustomEvent
129
+ ) {
130
+ val params = JSObject()
131
+ params.put("appId", miniapp.appId)
132
+ try {
133
+ params.put("requestId", customEvent.requestId ?: 0)
134
+ params.put("type", customEvent.type)
135
+ params.put("errorType", customEvent.errorType)
136
+ params.put("payload", customEvent.payload)
137
+ sendEvent(CUSTOM_EVENTS_EVENT_NAME, params)
138
+ } catch (e: Exception) {
139
+ e.printStackTrace()
140
+ }
141
+ }
142
+
143
+ override fun onLaunch(miniapp: Miniapp) {
144
+ val params = JSObject()
145
+ params.put("appId", miniapp.appId)
146
+ params.put("lifecycle", "onLaunch")
147
+ sendEvent(MINIAPP_LIFECYCLE_EVENT_NAME, params)
148
+ }
149
+
150
+ override fun onResume(miniapp: Miniapp) {
151
+ val params = JSObject()
152
+ params.put("appId", miniapp.appId)
153
+ params.put("lifecycle", "onResume")
154
+ sendEvent(MINIAPP_LIFECYCLE_EVENT_NAME, params)
155
+ }
156
+
157
+ override fun onPause(miniapp: Miniapp) {
158
+ val params = JSObject()
159
+ params.put("appId", miniapp.appId)
160
+ params.put("lifecycle", "onPause")
161
+ sendEvent(MINIAPP_LIFECYCLE_EVENT_NAME, params)
162
+ }
163
+
164
+ override fun onClose(miniapp: Miniapp) {
165
+ val params = JSObject()
166
+ params.put("appId", miniapp.appId)
167
+ params.put("lifecycle", "onClose")
168
+ sendEvent(MINIAPP_LIFECYCLE_EVENT_NAME, params)
169
+ }
170
+
171
+ override fun onError(miniapp: Miniapp, message: String) {
172
+ val params = JSObject()
173
+ params.put("appId", miniapp.appId)
174
+ params.put("lifecycle", "onError")
175
+ params.put("error", message)
176
+ sendEvent(MINIAPP_LIFECYCLE_EVENT_NAME, params)
177
+ }
178
+
179
+ override fun onUserInteraction(miniapp: Miniapp) {
180
+ val params = JSObject()
181
+ params.put("appId", miniapp.appId)
182
+ params.put("lifecycle", "onUserInteraction")
183
+ sendEvent(MINIAPP_LIFECYCLE_EVENT_NAME, params)
184
+ }
185
+
186
+ override fun onAuth(appboxoActivity: AppboxoActivity, miniapp: Miniapp) {
187
+ val params = JSObject()
188
+ params.put("appId", miniapp.appId)
189
+ params.put("lifecycle", "onAuth")
190
+ sendEvent(MINIAPP_LIFECYCLE_EVENT_NAME, params)
191
+ }
192
+
193
+ @PluginMethod
194
+ fun sendCustomEvent(call: PluginCall) {
195
+ try {
196
+ val appId: String = call.getString("appId")!!
197
+ val event = CustomEvent(
198
+ call.getInt("requestId"),
199
+ call.getString("type")!!,
200
+ call.getString("errorType"),
201
+ call.getObject("payload")?.toMap() ?: emptyMap()
202
+ )
203
+ handler?.post { Appboxo.getExistingMiniapp(appId)?.sendEvent(event) }
204
+ } catch (e: Exception) {
205
+ e.printStackTrace()
206
+ }
207
+ }
208
+
209
+ @PluginMethod
210
+ fun sendPaymentEvent(call: PluginCall) {
211
+ try {
212
+ val appId: String = call.getString("appId")!!
213
+ val data = PaymentData(
214
+ call.getString("transactionToken") ?: "",
215
+ call.getString("miniappOrderId") ?: "",
216
+ call.getDouble("amount") ?: 0.0,
217
+ call.getString("currency") ?: "",
218
+ call.getString("status") ?: "",
219
+ call.getString("hostappOrderId") ?: "",
220
+ call.getObject("extraParams")?.toMap()
221
+ )
222
+ handler?.post { Appboxo.getExistingMiniapp(appId)?.sendPaymentResult(data) }
223
+ } catch (e: Exception) {
224
+ e.printStackTrace()
225
+ }
226
+ }
227
+
228
+ @PluginMethod
229
+ fun getMiniapps(call: PluginCall) {
230
+ Appboxo.getMiniapps(object : MiniappListCallback {
231
+ override fun onSuccess(miniapps: List<MiniappData>) {
232
+ try {
233
+ val list = JSArray()
234
+ for (i in miniapps.indices) {
235
+ val miniappData: MiniappData = miniapps[i]
236
+ val data = JSObject()
237
+ data.put("appId", miniappData.appId)
238
+ data.put("name", miniappData.name)
239
+ data.put("category", miniappData.category)
240
+ data.put("logo", miniappData.logo)
241
+ data.put("description", miniappData.description)
242
+ list.put(data)
243
+ }
244
+ val params = JSObject()
245
+ params.put("miniapps", list)
246
+ call.resolve(params)
247
+ } catch (e: Exception) {
248
+ e.printStackTrace()
249
+ }
250
+ }
251
+
252
+ override fun onFailure(e: Exception) {
253
+ val result = JSObject()
254
+ result.put("error", e.message)
255
+ call.resolve(result)
256
+ }
257
+ })
258
+ }
259
+
260
+ @PluginMethod
261
+ fun hideMiniapps(call: PluginCall) {
262
+ Appboxo.hideMiniapps()
263
+ }
264
+
265
+ @PluginMethod
266
+ fun logout(call: PluginCall) {
267
+ Appboxo.logout()
268
+ }
269
+
270
+ private fun sendEvent(name: String, data: JSObject) {
271
+ notifyListeners(name, data)
272
+ }
273
+
274
+ override fun handle(
275
+ miniAppActivity: AppboxoActivity,
276
+ miniapp: Miniapp,
277
+ paymentData: PaymentData
278
+ ) {
279
+ val params = JSObject()
280
+ params.put("appId", miniapp.appId)
281
+ try {
282
+ params.put("transactionToken", paymentData.transactionToken)
283
+ params.put("miniappOrderId", paymentData.miniappOrderId)
284
+ params.put("amount", paymentData.amount)
285
+ params.put("currency", paymentData.currency)
286
+ params.put("status", paymentData.status)
287
+ params.put("hostappOrderId", paymentData.hostappOrderId)
288
+ if (paymentData.extraParams != null) {
289
+ params.put("extraParams", paymentData.extraParams)
290
+ }
291
+ sendEvent(PAYMENT_EVENTS_EVENT_NAME, params)
292
+ } catch (e: Exception) {
293
+ e.printStackTrace()
294
+ }
295
+ }
296
+
297
+ companion object {
298
+ private const val CUSTOM_EVENTS_EVENT_NAME = "custom_event"
299
+ private const val PAYMENT_EVENTS_EVENT_NAME = "payment_event"
300
+ private const val MINIAPP_LIFECYCLE_EVENT_NAME = "miniapp_lifecycle"
301
+
302
+ fun JSObject.toMap(): Map<String, Any> {
303
+ val map: MutableMap<String, Any> = HashMap()
304
+ val iterator: Iterator<String> = this.keys()
305
+
306
+ while (iterator.hasNext()) {
307
+ val key = iterator.next()
308
+ var value: Any = this.get(key)
309
+
310
+ if (value is JSObject) {
311
+ value = value.toMap()
312
+ }
313
+ if (value is JSArray) {
314
+ value = value.toList<Any>()
315
+ }
316
+ map[key] = value
317
+ }
318
+
319
+ return map
320
+ }
321
+ }
322
+ }