judokit-react-native 3.4.9 → 4.0.0

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/JudoPay.tsx CHANGED
@@ -13,7 +13,10 @@ export {
13
13
  JudoTransactionType,
14
14
  JudoTransactionMode,
15
15
  JudoPaymentMethod,
16
- JudoCardNetwork
16
+ JudoCardNetwork,
17
+ ChallengeRequestIndicator,
18
+ JudoThreeDSButtonType,
19
+ ScaExemption
17
20
  } from './types/JudoTypes'
18
21
 
19
22
  export type {
@@ -25,7 +28,13 @@ export type {
25
28
  JudoTheme,
26
29
  JudoResponse,
27
30
  JudoConfiguration,
28
- JudoAuthorization
31
+ JudoAuthorization,
32
+ NetworkTimeout,
33
+ JudoThreeDSButtonCustomization,
34
+ JudoThreeDSLabelCustomization,
35
+ JudoThreeDSTextBoxCustomization,
36
+ JudoThreeDSToolbarCustomization,
37
+ JudoThreeDSUIConfiguration
29
38
  } from './types/JudoTypes'
30
39
 
31
40
  export {
@@ -58,7 +67,6 @@ export type { JudoPBBAConfiguration } from './types/JudoPBBATypes'
58
67
  export { JudoPBBAButton }
59
68
 
60
69
  class JudoPay {
61
-
62
70
  //------------------------------------------------------------------
63
71
  // Private properties
64
72
  //------------------------------------------------------------------
@@ -114,7 +122,9 @@ class JudoPay {
114
122
  *
115
123
  * @returns an asynchronous boolean value that indicates if ApplePay is available.
116
124
  */
117
- public isApplePayAvailableWithConfiguration(configuration: JudoConfiguration): Promise<boolean> {
125
+ public isApplePayAvailableWithConfiguration(
126
+ configuration: JudoConfiguration
127
+ ): Promise<boolean> {
118
128
  const params = this.generateJudoParameters(configuration)
119
129
  return NativeModules.RNJudo.isApplePayAvailableWithConfiguration(params)
120
130
  }
@@ -139,6 +149,18 @@ class JudoPay {
139
149
  return NativeModules.RNJudo.invokeTransaction(params)
140
150
  }
141
151
 
152
+ public async fetchTransactionDetails(
153
+ receiptId: string
154
+ ): Promise<JudoResponse> {
155
+ const params = {
156
+ authorization: this.generateAuthorizationParameters(),
157
+ sandboxed: this.isSandboxed,
158
+ receiptId
159
+ }
160
+
161
+ return NativeModules.RNJudo.fetchTransactionDetails(params)
162
+ }
163
+
142
164
  /**
143
165
  * A method for completing a payment/pre-auth transaction using a saved card token.
144
166
  *
@@ -155,19 +177,19 @@ class JudoPay {
155
177
  mode: JudoTransactionMode,
156
178
  configuration: JudoConfiguration,
157
179
  cardToken: string,
158
- securityCode: string,
159
- cardholderName: string,
180
+ securityCode: string | undefined | null,
181
+ cardholderName: string | undefined | null,
160
182
  cardScheme: string
161
183
  ): Promise<JudoResponse> {
162
- const params = this.generateTransactionModeParameters(
163
- mode,
164
- configuration
165
- )
166
- params['cardToken'] = cardToken
167
- params['securityCode'] = securityCode
168
- params['cardholderName'] = cardholderName
169
- params['cardScheme'] = cardScheme
170
-
184
+ const params = {
185
+ ...this.generateTransactionModeParameters(mode, configuration),
186
+ ...{
187
+ cardToken,
188
+ securityCode,
189
+ cardholderName,
190
+ cardScheme
191
+ }
192
+ }
171
193
  return NativeModules.RNJudo.performTokenTransaction(params)
172
194
  }
173
195
 
@@ -285,17 +307,10 @@ class JudoPay {
285
307
  }
286
308
  }
287
309
 
288
- private readonly generateTransactionDetailsParameters = (
289
- receiptId: string
290
- ): Record<string, any> => {
291
- return {
292
- authorization: this.generateAuthorizationParameters(),
293
- sandboxed: this.isSandboxed,
294
- receiptId: receiptId
295
- }
296
- }
297
-
298
- private readonly generateAuthorizationParameters = (): Record<string, any> => {
310
+ private readonly generateAuthorizationParameters = (): Record<
311
+ string,
312
+ any
313
+ > => {
299
314
  if (this.authorization.secret) {
300
315
  return {
301
316
  token: this.authorization.token,
package/RNJudopay.podspec CHANGED
@@ -15,7 +15,7 @@ Pod::Spec.new do |s|
15
15
  s.source_files = "ios/Classes/**/*.{h,m}"
16
16
  s.requires_arc = true
17
17
  s.dependency "React"
18
- s.dependency "JudoKit-iOS", "3.1.8"
18
+ s.dependency "JudoKit-iOS", "3.1.11"
19
19
 
20
20
  s.test_spec 'RNJudoTests' do |test_spec|
21
21
  test_spec.source_files = 'ios/RNJudoTests/**/*.{h,m}'
@@ -1,76 +1,65 @@
1
1
  apply plugin: 'com.android.library'
2
- apply plugin: 'jacoco'
3
- apply plugin: 'maven'
4
2
  apply plugin: 'kotlin-android'
5
- apply plugin: 'kotlin-android-extensions'
6
3
  apply plugin: 'de.mannodermaus.android-junit5'
4
+ apply plugin: 'jacoco'
7
5
 
8
- import groovy.json.JsonSlurper
9
-
10
- def DEFAULT_COMPILE_SDK_VERSION = 31
11
- def DEFAULT_BUILD_TOOLS_VERSION = "30.0.3"
6
+ def DEFAULT_COMPILE_SDK_VERSION = 33
12
7
  def DEFAULT_MIN_SDK_VERSION = 21
13
- def DEFAULT_TARGET_SDK_VERSION = 31
8
+ def DEFAULT_TARGET_SDK_VERSION = 33
9
+
10
+ def isNewArchitectureEnabled() {
11
+ return rootProject.hasProperty("newArchEnabled") && rootProject.getProperty("newArchEnabled") == "true"
12
+ }
14
13
 
15
- def safeExtGet(prop, fallback) {
16
- rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
14
+ if (isNewArchitectureEnabled()) {
15
+ apply plugin: 'com.facebook.react'
16
+ }
17
+
18
+ def getExtOrIntegerDefault(name, fallback) {
19
+ return rootProject.ext.has(name) ? rootProject.ext.get(name) : (fallback).toInteger()
17
20
  }
18
21
 
19
22
  buildscript {
20
- ext.kotlin_version = '1.6.10'
21
- ext.junit5_version = '5.7.0'
23
+ ext.kotlin_version = '1.7.20'
24
+ ext.junit5_version = '5.9.1'
22
25
 
23
26
  repositories {
24
27
  maven { url 'https://plugins.gradle.org/m2/' }
25
-
26
- mavenCentral()
27
28
  google()
29
+ mavenCentral()
28
30
  }
29
31
 
30
32
  dependencies {
31
- classpath 'com.android.tools.build:gradle:3.5.4'
33
+ classpath 'com.android.tools.build:gradle:7.3.1'
32
34
  classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
33
- classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
34
- classpath 'de.mannodermaus.gradle.plugins:android-junit5:1.7.1.1'
35
+ classpath 'de.mannodermaus.gradle.plugins:android-junit5:1.8.2.1'
35
36
  }
36
37
  }
37
38
 
38
39
  android {
39
- compileSdkVersion safeExtGet('compileSdkVersion', DEFAULT_COMPILE_SDK_VERSION)
40
- buildToolsVersion safeExtGet('buildToolsVersion', DEFAULT_BUILD_TOOLS_VERSION)
41
-
42
- compileOptions {
43
- sourceCompatibility JavaVersion.VERSION_1_8
44
- targetCompatibility JavaVersion.VERSION_1_8
45
- }
40
+ compileSdkVersion getExtOrIntegerDefault('compileSdkVersion', DEFAULT_COMPILE_SDK_VERSION)
46
41
 
47
42
  defaultConfig {
48
- minSdkVersion safeExtGet('minSdkVersion', DEFAULT_MIN_SDK_VERSION)
49
- targetSdkVersion safeExtGet('targetSdkVersion', DEFAULT_TARGET_SDK_VERSION)
50
- versionCode 1
51
- versionName "1.0"
52
- }
53
-
54
- lintOptions {
55
- abortOnError false
43
+ minSdkVersion getExtOrIntegerDefault('minSdkVersion', DEFAULT_MIN_SDK_VERSION)
44
+ targetSdkVersion getExtOrIntegerDefault('targetSdkVersion', DEFAULT_TARGET_SDK_VERSION)
45
+ buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
56
46
  }
57
-
58
- testOptions {
59
- unitTests.returnDefaultValues = true
60
- }
61
- packagingOptions {
62
- exclude 'META-INF/AL2.0'
63
- exclude 'META-INF/LGPL2.1'
64
- }
65
-
66
47
  buildTypes {
48
+ release {
49
+ minifyEnabled false
50
+ }
67
51
  debug {
68
52
  testCoverageEnabled true
69
53
  }
70
54
  }
71
-
55
+
56
+ lintOptions {
57
+ disable 'GradleCompatible'
58
+ }
59
+
72
60
  testOptions {
73
61
  animationsDisabled = true
62
+ unitTests.returnDefaultValues = true
74
63
  unitTests.all {
75
64
  jacoco {
76
65
  includeNoLocationClasses = true
@@ -82,26 +71,89 @@ android {
82
71
 
83
72
  repositories {
84
73
  mavenLocal()
85
-
86
74
  mavenCentral()
87
75
  google()
88
76
 
89
77
  maven { url 'https://vocalinkzapp.jfrog.io/artifactory/merchant-library-maven/' }
90
78
 
91
- maven { url "$projectDir/../node_modules/react-native/android" }
79
+ def found = false
80
+ def defaultDir = null
81
+ def androidSourcesName = 'React Native sources'
82
+
83
+ if (rootProject.ext.has('reactNativeAndroidRoot')) {
84
+ defaultDir = rootProject.ext.get('reactNativeAndroidRoot')
85
+ } else {
86
+ defaultDir = new File(
87
+ projectDir,
88
+ '/../../../node_modules/react-native/android'
89
+ )
90
+ }
91
+
92
+ if (defaultDir.exists()) {
93
+ maven {
94
+ url defaultDir.toString()
95
+ name androidSourcesName
96
+ }
97
+
98
+ logger.info(":${project.name}:reactNativeAndroidRoot ${defaultDir.canonicalPath}")
99
+ found = true
100
+ } else {
101
+ def parentDir = rootProject.projectDir
102
+
103
+ 1.upto(5, {
104
+ if (found) return true
105
+ parentDir = parentDir.parentFile
106
+
107
+ def androidSourcesDir = new File(
108
+ parentDir,
109
+ 'node_modules/react-native'
110
+ )
111
+
112
+ def androidPrebuiltBinaryDir = new File(
113
+ parentDir,
114
+ 'node_modules/react-native/android'
115
+ )
116
+
117
+ if (androidPrebuiltBinaryDir.exists()) {
118
+ maven {
119
+ url androidPrebuiltBinaryDir.toString()
120
+ name androidSourcesName
121
+ }
122
+
123
+ logger.info(":${project.name}:reactNativeAndroidRoot ${androidPrebuiltBinaryDir.canonicalPath}")
124
+ found = true
125
+ } else if (androidSourcesDir.exists()) {
126
+ maven {
127
+ url androidSourcesDir.toString()
128
+ name androidSourcesName
129
+ }
130
+
131
+ logger.info(":${project.name}:reactNativeAndroidRoot ${androidSourcesDir.canonicalPath}")
132
+ found = true
133
+ }
134
+ })
135
+ }
136
+
137
+ if (!found) {
138
+ throw new GradleException(
139
+ "${project.name}: unable to locate React Native android sources. " +
140
+ "Ensure you have you installed React Native as a dependency in your project and try again."
141
+ )
142
+ }
92
143
  }
93
144
 
94
145
  dependencies {
95
146
  //noinspection GradleDynamicVersion
96
147
  implementation 'com.facebook.react:react-native:+'
97
- implementation 'androidx.appcompat:appcompat:1.4.1'
98
- implementation 'androidx.appcompat:appcompat-resources:1.4.1'
99
- implementation 'com.google.android.gms:play-services-wallet:18.0.0'
100
- implementation 'androidx.core:core-ktx:1.7.0'
101
- implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
148
+ implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
149
+
150
+ implementation 'androidx.appcompat:appcompat:1.5.1'
151
+ implementation 'androidx.appcompat:appcompat-resources:1.5.1'
152
+ implementation 'com.google.android.gms:play-services-wallet:19.1.0'
153
+ implementation 'androidx.core:core-ktx:1.9.0'
102
154
  implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.1.0'
103
155
 
104
- implementation 'com.judopay:judokit-android:3.0.11.0.1'
156
+ implementation 'com.judopay:judokit-android:4.0.1'
105
157
 
106
158
  //JUnit 5
107
159
  testImplementation "org.junit.jupiter:junit-jupiter-api:$junit5_version"
@@ -109,11 +161,19 @@ dependencies {
109
161
  testImplementation "org.junit.jupiter:junit-jupiter-params:$junit5_version"
110
162
  testRuntimeOnly "org.junit.vintage:junit-vintage-engine:$junit5_version"
111
163
 
112
- testImplementation 'androidx.test:core:1.4.0'
113
- testImplementation 'io.mockk:mockk:1.10.0'
164
+ testImplementation 'androidx.test:core:1.5.0'
165
+ testImplementation 'io.mockk:mockk:1.13.3'
114
166
  testImplementation 'android.arch.core:core-testing:1.1.1'
115
167
  }
116
168
 
169
+ if (isNewArchitectureEnabled()) {
170
+ react {
171
+ jsRootDir = file("../src/")
172
+ libraryName = "JudoKit-ReactNative"
173
+ codegenJavaPackageName = "com.reactlibrary"
174
+ }
175
+ }
176
+
117
177
  task generateCodeAnalysisReport {
118
178
  group 'Reporting'
119
179
  description 'Start reporting code analysis tasks (Jacoco)'
@@ -122,77 +182,6 @@ task generateCodeAnalysisReport {
122
182
 
123
183
  task jacocoTestReport(type: JacocoReport, group: 'verification', description: 'Generate Jacoco Reports for all android variants')
124
184
 
125
- def configureReactNativePom(def pom) {
126
- def packageJson = new JsonSlurper().parseText(file('../package.json').text)
127
-
128
- pom.project {
129
- name packageJson.title
130
- artifactId packageJson.name
131
- version = packageJson.version
132
- group = "com.reactlibrary"
133
- description packageJson.description
134
- url packageJson.repository.baseUrl
135
-
136
- licenses {
137
- license {
138
- name packageJson.license
139
- url packageJson.repository.baseUrl + '/blob/master/' + packageJson.licenseFilename
140
- distribution 'repo'
141
- }
142
- }
143
-
144
- developers {
145
- developer {
146
- id packageJson.author.username
147
- name packageJson.author.name
148
- }
149
- }
150
- }
151
- }
152
-
153
- afterEvaluate { project ->
154
-
155
- task androidJavadoc(type: Javadoc) {
156
- source = android.sourceSets.main.java.srcDirs
157
- classpath += files(android.bootClasspath)
158
- classpath += files(project.getConfigurations().getByName('compile').asList())
159
- include '**/*.java'
160
- }
161
-
162
- task androidJavadocJar(type: Jar, dependsOn: androidJavadoc) {
163
- classifier = 'javadoc'
164
- from androidJavadoc.destinationDir
165
- }
166
-
167
- task androidSourcesJar(type: Jar) {
168
- classifier = 'sources'
169
- from android.sourceSets.main.java.srcDirs
170
- include '**/*.java'
171
- }
172
-
173
- android.libraryVariants.all { variant ->
174
- def name = variant.name.capitalize()
175
- task "jar${name}"(type: Jar, dependsOn: variant.javaCompileProvider.get()) {
176
- from variant.javaCompileProvider.get().destinationDir
177
- }
178
- }
179
-
180
- artifacts {
181
- archives androidSourcesJar
182
- archives androidJavadocJar
183
- }
184
-
185
- task installArchives(type: Upload) {
186
- configuration = configurations.archives
187
- repositories.mavenDeployer {
188
- // Deploy to react-native-event-bridge/maven, ready to publish to npm
189
- repository url: "file://${projectDir}/../android/maven"
190
-
191
- configureReactNativePom pom
192
- }
193
- }
194
- }
195
-
196
185
  project.afterEvaluate {
197
186
  def variants = android.hasProperty('libraryVariants') ? android.libraryVariants : android.applicationVariants
198
187
  variants.forEach {
@@ -235,7 +224,7 @@ def addJacocoTask(variant) {
235
224
  sourceDirectories.from(files(variant.sourceSets.kotlin.srcDirs.flatten()))
236
225
  def kotlinTask = tasks.getByName("compile${variantName}Kotlin")
237
226
  if (kotlinTask) {
238
- classDirectories += fileTree(dir: kotlinTask.destinationDir, excludes: excludedFiles)
227
+ classDirectories += fileTree(dir: kotlinTask.destinationDirectory, excludes: excludedFiles)
239
228
  }
240
229
  }
241
230
 
@@ -54,15 +54,15 @@ internal val ReadableMap.cardholderName: String?
54
54
  internal val ReadableMap.cardType: CardNetwork
55
55
  get() {
56
56
  val cardScheme = if (hasKey("cardScheme")) {
57
- getString("cardScheme") ?: ""
57
+ getString("cardScheme")?.lowercase() ?: ""
58
58
  } else {
59
59
  ""
60
60
  }
61
61
 
62
- return when (cardScheme.lowercase()) {
63
- CARD_SCHEME_VISA -> CardNetwork.VISA
64
- CARD_SCHEME_MASTERCARD -> CardNetwork.MASTERCARD
65
- CARD_SCHEME_AMEX -> CardNetwork.AMEX
62
+ return when {
63
+ cardScheme.contains(CARD_SCHEME_VISA) -> CardNetwork.VISA
64
+ cardScheme.contains(CARD_SCHEME_MASTERCARD) -> CardNetwork.MASTERCARD
65
+ cardScheme.contains(CARD_SCHEME_AMEX) -> CardNetwork.AMEX
66
66
  else -> CardNetwork.OTHER
67
67
  }
68
68
  }
@@ -70,6 +70,9 @@ internal val ReadableMap.cardType: CardNetwork
70
70
  internal val ReadableMap.judoId: String?
71
71
  get() = configuration?.getString("judoId")
72
72
 
73
+ internal val ReadableMap.receiptId: String?
74
+ get() = getString("receiptId")
75
+
73
76
  internal val ReadableMap.token: String?
74
77
  get() = authorization?.getString("token")
75
78
 
@@ -100,6 +103,9 @@ internal val ReadableMap.paymentReference: String?
100
103
  internal val ReadableMap.isInitialRecurringPayment: Boolean?
101
104
  get() = configuration?.getBoolean("isInitialRecurringPayment")
102
105
 
106
+ internal val ReadableMap.isDelayedAuthorisation: Boolean?
107
+ get() = configuration?.getBoolean("isDelayedAuthorisation")
108
+
103
109
  internal val ReadableMap.networkTimeout: ReadableMap?
104
110
  get() {
105
111
  if (configuration.hasKey("networkTimeout")) {
@@ -276,6 +282,182 @@ internal val ReadableMap.uiConfiguration: ReadableMap?
276
282
  return null
277
283
  }
278
284
 
285
+ internal val ReadableMap.threeDSUIConfiguration: ReadableMap?
286
+ get() {
287
+ if (uiConfiguration.hasKey("threeDSUIConfiguration")) {
288
+ return uiConfiguration?.getMap("threeDSUIConfiguration")
289
+ }
290
+ return null
291
+ }
292
+
293
+ internal val ReadableMap.threeDSUITextBoxCustomization: ReadableMap?
294
+ get() {
295
+ if (threeDSUIConfiguration.hasKey("textBoxCustomization")) {
296
+ return threeDSUIConfiguration?.getMap("textBoxCustomization")
297
+ }
298
+ return null
299
+ }
300
+
301
+ internal val ReadableMap.threeDSUIButtonCustomizations: ReadableMap?
302
+ get() {
303
+ if (threeDSUIConfiguration.hasKey("buttonCustomizations")) {
304
+ return threeDSUIConfiguration?.getMap("buttonCustomizations")
305
+ }
306
+ return null
307
+ }
308
+
309
+ internal val ReadableMap.threeDSUISubmitButtonCustomization: ReadableMap?
310
+ get() {
311
+ if (threeDSUIButtonCustomizations.hasKey("SUBMIT")) {
312
+ return threeDSUIButtonCustomizations?.getMap("SUBMIT")
313
+ }
314
+ return null
315
+ }
316
+
317
+ internal val ReadableMap.threeDSUIContinueButtonCustomization: ReadableMap?
318
+ get() {
319
+ if (threeDSUIButtonCustomizations.hasKey("CONTINUE")) {
320
+ return threeDSUIButtonCustomizations?.getMap("CONTINUE")
321
+ }
322
+ return null
323
+ }
324
+
325
+ internal val ReadableMap.threeDSUINextButtonCustomization: ReadableMap?
326
+ get() {
327
+ if (threeDSUIButtonCustomizations.hasKey("NEXT")) {
328
+ return threeDSUIButtonCustomizations?.getMap("NEXT")
329
+ }
330
+ return null
331
+ }
332
+
333
+ internal val ReadableMap.threeDSUICancelButtonCustomization: ReadableMap?
334
+ get() {
335
+ if (threeDSUIButtonCustomizations.hasKey("CANCEL")) {
336
+ return threeDSUIButtonCustomizations?.getMap("CANCEL")
337
+ }
338
+ return null
339
+ }
340
+
341
+ internal val ReadableMap.threeDSUIResendButtonCustomization: ReadableMap?
342
+ get() {
343
+ if (threeDSUIButtonCustomizations.hasKey("RESEND")) {
344
+ return threeDSUIButtonCustomizations?.getMap("RESEND")
345
+ }
346
+ return null
347
+ }
348
+
349
+ internal val ReadableMap.threeDSUIToolbarCustomization: ReadableMap?
350
+ get() {
351
+ if (threeDSUIConfiguration.hasKey("toolbarCustomization")) {
352
+ return threeDSUIConfiguration?.getMap("toolbarCustomization")
353
+ }
354
+ return null
355
+ }
356
+
357
+ internal val ReadableMap.threeDSUILabelCustomization: ReadableMap?
358
+ get() {
359
+ if (threeDSUIConfiguration.hasKey("labelCustomization")) {
360
+ return threeDSUIConfiguration?.getMap("labelCustomization")
361
+ }
362
+ return null
363
+ }
364
+
365
+ internal val ReadableMap.textFontName: String?
366
+ get() {
367
+ if (hasKey("textFontName")) {
368
+ return getString("textFontName")
369
+ }
370
+ return null
371
+ }
372
+
373
+ internal val ReadableMap.textColor: String?
374
+ get() {
375
+ if (hasKey("textColor")) {
376
+ return getString("textColor")
377
+ }
378
+ return null
379
+ }
380
+
381
+ internal val ReadableMap.backgroundColor: String?
382
+ get() {
383
+ if (hasKey("backgroundColor")) {
384
+ return getString("backgroundColor")
385
+ }
386
+ return null
387
+ }
388
+
389
+ internal val ReadableMap.headerText: String?
390
+ get() {
391
+ if (hasKey("headerText")) {
392
+ return getString("headerText")
393
+ }
394
+ return null
395
+ }
396
+
397
+ internal val ReadableMap.buttonText: String?
398
+ get() {
399
+ if (hasKey("buttonText")) {
400
+ return getString("buttonText")
401
+ }
402
+ return null
403
+ }
404
+
405
+ internal val ReadableMap.headingTextFontName: String?
406
+ get() {
407
+ if (hasKey("headingTextFontName")) {
408
+ return getString("headingTextFontName")
409
+ }
410
+ return null
411
+ }
412
+
413
+ internal val ReadableMap.headingTextColor: String?
414
+ get() {
415
+ if (hasKey("headingTextColor")) {
416
+ return getString("headingTextColor")
417
+ }
418
+ return null
419
+ }
420
+
421
+ internal val ReadableMap.borderColor: String?
422
+ get() {
423
+ if (hasKey("borderColor")) {
424
+ return getString("borderColor")
425
+ }
426
+ return null
427
+ }
428
+
429
+ internal val ReadableMap.textFontSize: Int?
430
+ get() {
431
+ if (hasKey("textFontSize")) {
432
+ return getInt("textFontSize")
433
+ }
434
+ return null
435
+ }
436
+
437
+ internal val ReadableMap.cornerRadius: Int?
438
+ get() {
439
+ if (hasKey("cornerRadius")) {
440
+ return getInt("cornerRadius")
441
+ }
442
+ return null
443
+ }
444
+
445
+ internal val ReadableMap.headingTextFontSize: Int?
446
+ get() {
447
+ if (hasKey("headingTextFontSize")) {
448
+ return getInt("headingTextFontSize")
449
+ }
450
+ return null
451
+ }
452
+
453
+ internal val ReadableMap.borderWidth: Int?
454
+ get() {
455
+ if (hasKey("borderWidth")) {
456
+ return getInt("borderWidth")
457
+ }
458
+ return null
459
+ }
460
+
279
461
  internal val ReadableMap.isAVSEnabled: Boolean?
280
462
  get() = uiConfiguration?.getBoolean("isAVSEnabled")
281
463