@primer-io/react-native 0.13.0-beta.1 → 0.15.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.
Files changed (100) hide show
  1. package/android/build.gradle +2 -2
  2. package/android/gradle.properties +1 -1
  3. package/android/src/main/java/com/primerioreactnative/PrimerRN.kt +192 -153
  4. package/android/src/main/java/com/primerioreactnative/PrimerRNEventListener.kt +131 -86
  5. package/android/src/main/java/com/primerioreactnative/ReactNativePackage.kt +3 -14
  6. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerErrorRN.kt +3 -4
  7. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerEventsRN.kt +11 -0
  8. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerSettingsRN.kt +4 -3
  9. package/android/src/main/java/com/primerioreactnative/utils/ErrorHelper.kt +11 -0
  10. package/android/src/main/java/com/primerioreactnative/utils/PrimerImplementedRNCallbacks.kt +14 -0
  11. package/ios/DataModels/PrimerErrorRN.swift +1 -1
  12. package/ios/DataModels/PrimerSettingsRN.swift +6 -0
  13. package/ios/RNTPrimer.m +43 -0
  14. package/ios/RNTPrimer.swift +394 -0
  15. package/ios/ReactNative-Bridging-Header.h +3 -0
  16. package/ios/ReactNative.xcodeproj/project.pbxproj +44 -0
  17. package/lib/commonjs/Primer.js +220 -209
  18. package/lib/commonjs/Primer.js.map +1 -1
  19. package/lib/commonjs/RNPrimer.js +145 -0
  20. package/lib/commonjs/RNPrimer.js.map +1 -0
  21. package/lib/commonjs/index.js +1 -28
  22. package/lib/commonjs/index.js.map +1 -1
  23. package/lib/commonjs/models/primer-intent.js.map +1 -1
  24. package/lib/commonjs/models/utils/redirectScheme.js +4 -0
  25. package/lib/commonjs/models/utils/redirectScheme.js.map +1 -0
  26. package/lib/module/Primer.js +204 -210
  27. package/lib/module/Primer.js.map +1 -1
  28. package/lib/module/RNPrimer.js +136 -0
  29. package/lib/module/RNPrimer.js.map +1 -0
  30. package/lib/module/index.js +3 -4
  31. package/lib/module/index.js.map +1 -1
  32. package/lib/module/models/primer-intent.js.map +1 -1
  33. package/lib/module/models/utils/redirectScheme.js +2 -0
  34. package/lib/module/models/utils/redirectScheme.js.map +1 -0
  35. package/lib/typescript/Primer.d.ts +13 -0
  36. package/lib/typescript/RNPrimer.d.ts +24 -0
  37. package/lib/typescript/index.d.ts +1 -3
  38. package/lib/typescript/models/primer-callbacks.d.ts +7 -9
  39. package/lib/typescript/models/primer-config.d.ts +16 -13
  40. package/lib/typescript/models/primer-intent.d.ts +1 -1
  41. package/lib/typescript/models/primer-request.d.ts +2 -12
  42. package/lib/typescript/models/primer-settings.d.ts +5 -6
  43. package/lib/typescript/models/primer.d.ts +4 -4
  44. package/lib/typescript/models/utils/redirectScheme.d.ts +3 -0
  45. package/package.json +4 -1
  46. package/primer-io-react-native.podspec +2 -3
  47. package/src/Primer.ts +227 -178
  48. package/src/RNPrimer.ts +170 -0
  49. package/src/index.tsx +2 -3
  50. package/src/models/primer-callbacks.ts +9 -27
  51. package/src/models/primer-config.ts +23 -20
  52. package/src/models/primer-intent.ts +1 -1
  53. package/src/models/primer-request.ts +2 -16
  54. package/src/models/primer-settings.ts +5 -6
  55. package/src/models/primer.ts +5 -5
  56. package/src/models/utils/redirectScheme.ts +5 -0
  57. package/android/src/main/java/com/primerioreactnative/PrimerCardNumberEditTextManager.kt +0 -83
  58. package/android/src/main/java/com/primerioreactnative/PrimerHeadlessUniversalCheckout.kt +0 -201
  59. package/android/src/main/java/com/primerioreactnative/huc/assets/AssetsManager.kt +0 -56
  60. package/android/src/main/java/com/primerioreactnative/huc/events/PrimerHeadlessUniversalCheckoutEvent.kt +0 -11
  61. package/android/src/main/java/com/primerioreactnative/huc/extensions/Map.kt +0 -10
  62. package/ios/Core/PrimerRN+PrimerDelegate.swift +0 -148
  63. package/ios/Core/PrimerRN.m +0 -34
  64. package/ios/Core/PrimerRN.swift +0 -168
  65. package/ios/Core/ReactNative-Bridging-Header.h +0 -13
  66. package/ios/Headless Universal Checkout/RNTPrimerCardNumberInputElementManager.m +0 -23
  67. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckout.m +0 -30
  68. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckout.swift +0 -241
  69. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.m +0 -14
  70. package/ios/Headless Universal Checkout/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.swift +0 -117
  71. package/lib/commonjs/PrimerInput.js +0 -80
  72. package/lib/commonjs/PrimerInput.js.map +0 -1
  73. package/lib/commonjs/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js +0 -14
  74. package/lib/commonjs/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js.map +0 -1
  75. package/lib/commonjs/headless_checkout/NativePrimerHeadlessUniversalCheckout.js +0 -73
  76. package/lib/commonjs/headless_checkout/NativePrimerHeadlessUniversalCheckout.js.map +0 -1
  77. package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js +0 -119
  78. package/lib/commonjs/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +0 -1
  79. package/lib/commonjs/headless_checkout/types.js +0 -2
  80. package/lib/commonjs/headless_checkout/types.js.map +0 -1
  81. package/lib/module/PrimerInput.js +0 -46
  82. package/lib/module/PrimerInput.js.map +0 -1
  83. package/lib/module/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js +0 -5
  84. package/lib/module/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.js.map +0 -1
  85. package/lib/module/headless_checkout/NativePrimerHeadlessUniversalCheckout.js +0 -64
  86. package/lib/module/headless_checkout/NativePrimerHeadlessUniversalCheckout.js.map +0 -1
  87. package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js +0 -104
  88. package/lib/module/headless_checkout/PrimerHeadlessUniversalCheckout.js.map +0 -1
  89. package/lib/module/headless_checkout/types.js +0 -2
  90. package/lib/module/headless_checkout/types.js.map +0 -1
  91. package/lib/typescript/PrimerInput.d.ts +0 -15
  92. package/lib/typescript/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.d.ts +0 -1
  93. package/lib/typescript/headless_checkout/NativePrimerHeadlessUniversalCheckout.d.ts +0 -10
  94. package/lib/typescript/headless_checkout/PrimerHeadlessUniversalCheckout.d.ts +0 -14
  95. package/lib/typescript/headless_checkout/types.d.ts +0 -16
  96. package/src/PrimerInput.tsx +0 -73
  97. package/src/RNTPrimerHeadlessUniversalCheckoutCardFormUIManager.tsx +0 -2
  98. package/src/headless_checkout/NativePrimerHeadlessUniversalCheckout.ts +0 -94
  99. package/src/headless_checkout/PrimerHeadlessUniversalCheckout.ts +0 -136
  100. package/src/headless_checkout/types.ts +0 -18
@@ -1,47 +1,50 @@
1
- import type {
2
- OnClientSessionActionsCallback,
3
- OnDismissCallback,
4
- OnPrimerErrorCallback,
5
- OnSavedPaymentInstrumentsFetchedCallback,
6
- OnTokenAddedToVaultCallback,
7
- OnTokenizeSuccessCallback,
8
- } from './primer-callbacks';
1
+ import type { IClientSessionAction } from 'src/Primer';
2
+ import type { IPrimerError } from 'src/RNPrimer';
3
+ import type { PaymentInstrumentToken } from './payment-instrument-token';
4
+ import type { PrimerResumeHandler } from './primer-request';
9
5
  import type { PrimerSettings } from './primer-settings';
10
6
  import type { PrimerTheme } from './primer-theme';
11
7
 
12
- export type PrimerConfig = IPrimerConfig;
13
- interface IPrimerConfig {
8
+ export interface IPrimerConfig {
14
9
  /**
15
10
  * Include data for different payment methods (e.g. amount or business details)
16
11
  */
17
12
  settings?: PrimerSettings;
13
+
18
14
  /**
19
15
  * Set colors and dimensions for the Primer UI.
20
16
  */
21
17
  theme?: PrimerTheme;
18
+
19
+ // onClientTokenCallback?: (resumeHandler: PrimerResumeHandler) => void;
20
+
22
21
  /**
23
- * Use this callback to grab a Primer payment instrument token and complete a payment.
22
+ * Use this callback to grab a Primer payment instrument and complete a payment.
24
23
  */
25
- onTokenizeSuccess?: OnTokenizeSuccessCallback;
24
+ onTokenizeSuccess?: (paymentInstrument: PaymentInstrumentToken, resumeHandler: PrimerResumeHandler) => void;
26
25
 
27
- onResumeSuccess?: OnTokenizeSuccessCallback;
26
+ /**
27
+ * Use this callback to resume a PENDING payment with the token provided.
28
+ */
29
+ onResumeSuccess?: (resumeToken: string, resumeHandler: PrimerResumeHandler | null) => void;
28
30
 
29
31
  /**
30
32
  * Use this callback to perform some action when a payment instrument was saved to Primer.
31
33
  */
32
- onTokenAddedToVault?: OnTokenAddedToVaultCallback;
34
+ onTokenAddedToVault?: (paymentInstrument: PaymentInstrumentToken) => void;
35
+
33
36
  /**
34
37
  * Use this callback to perform some action when the Primer UI is dismissed.
35
38
  */
36
- onDismiss?: OnDismissCallback;
39
+ onDismiss?: () => void;
40
+
37
41
  /**
38
42
  * Use this callback to perform some action when the SDK throws an error.
39
43
  */
40
- onError?: OnPrimerErrorCallback;
44
+ onError?: (err: IPrimerError, resumeHandler: PrimerResumeHandler) => void;
45
+
41
46
  /**
42
- * Use this to receive saved payment instruments fetch result.
47
+ * Use this callback to perform actions on payment methods, like surcharging.
43
48
  */
44
- onSavedPaymentInstrumentsFetched?: OnSavedPaymentInstrumentsFetchedCallback;
45
-
46
- onClientSessionActions?: OnClientSessionActionsCallback;
49
+ onClientSessionActions?: (clientSessionActions: IClientSessionAction[], resumeHandler: PrimerResumeHandler | null) => void;
47
50
  }
@@ -34,7 +34,7 @@ const paymentMethods = [
34
34
  export type SinglePrimerPaymentMethod = typeof paymentMethods[number];
35
35
  export interface AnyPrimerPaymentMethodIntent {
36
36
  vault: boolean;
37
- paymentMethod: 'Any';
37
+ paymentMethod: SinglePrimerPaymentMethod;
38
38
  }
39
39
 
40
40
  export type PrimerPaymentMethodIntent = ISinglePrimerPaymentMethodIntent;
@@ -1,21 +1,7 @@
1
1
  export type PrimerResumeHandler = IPrimerResumeHandler;
2
2
 
3
3
  interface IPrimerResumeHandler {
4
- handleError: (error: string) => void;
5
-
4
+ handleNewClientToken: (clientToken: string) => void;
5
+ handleError: (error: Error) => void;
6
6
  handleSuccess: () => void;
7
-
8
- handleNewClientToken: (token: string) => void;
9
-
10
- /**
11
- * @deprecated This method should not be used
12
- * Please use handleError instead.
13
- */
14
- resumeWithError: (error: string | null) => void;
15
-
16
- /**
17
- * @deprecated This method should not be used.
18
- * Please use handleSuccess or handleNewClientToken instead.
19
- */
20
- resumeWithSuccess: (clientToken: string | null) => void;
21
7
  }
@@ -1,5 +1,6 @@
1
1
  import type { CountryCode } from './utils/countryCode';
2
2
  import type { CurrencyCode } from './utils/currencyCode';
3
+ import type { RedirectScheme } from './utils/redirectScheme';
3
4
 
4
5
  export type PrimerSettings = IPrimerSettings;
5
6
  interface IPrimerSettings {
@@ -20,7 +21,7 @@ interface IOrder {
20
21
 
21
22
  interface IOrderItem {
22
23
  name: string;
23
- unitAmount?: number;
24
+ amount: number;
24
25
  quantity: number;
25
26
  isPending?: boolean;
26
27
  }
@@ -46,10 +47,11 @@ interface IOptions {
46
47
  isResultScreenEnabled?: boolean;
47
48
  isLoadingScreenEnabled?: boolean;
48
49
  isFullScreenEnabled?: boolean;
49
- isThreeDsEnabled?: boolean;
50
+ is3DSOnVaultingEnabled?: boolean;
51
+ is3DSDevelopmentModeEnabled?: boolean;
50
52
  locale?: string;
51
53
  ios?: IIosOptions;
52
- android?: IAndroidOptions;
54
+ redirectScheme?: RedirectScheme;
53
55
  }
54
56
 
55
57
  interface IIosOptions {
@@ -57,9 +59,6 @@ interface IIosOptions {
57
59
  urlSchemeIdentifier?: string;
58
60
  merchantIdentifier?: string;
59
61
  }
60
- interface IAndroidOptions {
61
- redirectScheme?: string;
62
- }
63
62
 
64
63
  interface IAddress {
65
64
  line1?: String;
@@ -1,4 +1,4 @@
1
- import type { PrimerConfig } from './primer-config';
1
+ import type { IPrimerConfig } from './primer-config';
2
2
  import type { PrimerPaymentMethodIntent } from './primer-intent';
3
3
 
4
4
  export interface IPrimer {
@@ -11,7 +11,7 @@ export interface IPrimer {
11
11
  * @param config Configuration object for the SDK. Use this to set listeners, theme,
12
12
  * and payment method specific settings.
13
13
  */
14
- showUniversalCheckout(token: String, config: PrimerConfig): void;
14
+ showUniversalCheckout(token: string | null, config: IPrimerConfig): void;
15
15
 
16
16
  /**
17
17
  * Launch Primer's Vault Manager.
@@ -20,7 +20,7 @@ export interface IPrimer {
20
20
  * @param config Configuration object for the SDK. Use this to set listeners, theme,
21
21
  * and payment method specific settings.
22
22
  */
23
- showVaultManager(token: String, config: PrimerConfig): void;
23
+ showVaultManager(token: string | null, config: IPrimerConfig): void;
24
24
 
25
25
  /**
26
26
  * Launch checkout with a specific payment method
@@ -29,9 +29,9 @@ export interface IPrimer {
29
29
  * @param config Configuration for the SDK.
30
30
  */
31
31
  showPaymentMethod(
32
- token: String,
32
+ token: string | null,
33
33
  intent: PrimerPaymentMethodIntent,
34
- config: PrimerConfig
34
+ config: IPrimerConfig
35
35
  ): void;
36
36
 
37
37
  /**
@@ -0,0 +1,5 @@
1
+ var redirectSchemes = [
2
+ 'primer'
3
+ ] as const;
4
+
5
+ export type RedirectScheme = typeof redirectSchemes[number];
@@ -1,83 +0,0 @@
1
- package com.primerioreactnative
2
-
3
- import android.content.res.ColorStateList
4
- import android.graphics.Color
5
- import android.graphics.drawable.ColorDrawable
6
- import android.graphics.drawable.GradientDrawable
7
- import android.view.ViewGroup
8
- import android.widget.EditText
9
- import android.widget.LinearLayout
10
- import android.widget.TextView
11
- import com.facebook.drawee.backends.pipeline.Fresco
12
- import com.facebook.react.bridge.ReactApplicationContext
13
- import com.facebook.react.uimanager.SimpleViewManager
14
- import com.facebook.react.uimanager.ThemedReactContext
15
- import com.facebook.react.uimanager.ViewProps
16
- import com.facebook.react.uimanager.annotations.ReactProp
17
- import com.facebook.react.views.image.ReactImageView
18
- import io.primer.android.components.manager.PrimerCardManager
19
- import io.primer.android.components.manager.PrimerUniversalCheckoutCardManagerInterface
20
- import io.primer.android.components.ui.widgets.*
21
-
22
- val listOfTextInputs = mutableListOf<PrimerEditText>()
23
-
24
- class PrimerCardNumberEditTextManager : SimpleViewManager<PrimerCardNumberEditText>() {
25
-
26
- override fun getName(): String {
27
- return REACT_CLASS
28
- }
29
-
30
- override fun createViewInstance(reactContext: ThemedReactContext): PrimerCardNumberEditText {
31
- val editText = PrimerCardNumberEditText(reactContext)
32
- return editText
33
- }
34
-
35
- companion object {
36
- const val REACT_CLASS = "PrimerCardNumberEditText"
37
- }
38
- }
39
-
40
- class PrimerCardholderNameEditTextManager : SimpleViewManager<PrimerCardholderNameEditText>() {
41
-
42
- override fun getName(): String {
43
- return REACT_CLASS
44
- }
45
-
46
- override fun createViewInstance(reactContext: ThemedReactContext): PrimerCardholderNameEditText {
47
- return PrimerCardholderNameEditText(reactContext)
48
- }
49
-
50
- companion object {
51
- const val REACT_CLASS = "PrimerCardholderNameEditText"
52
- }
53
- }
54
-
55
- class PrimerExpiryEditTextManager : SimpleViewManager<PrimerExpiryEditText>() {
56
-
57
- override fun getName(): String {
58
- return REACT_CLASS
59
- }
60
-
61
- override fun createViewInstance(reactContext: ThemedReactContext): PrimerExpiryEditText {
62
- return PrimerExpiryEditText(reactContext)
63
- }
64
-
65
- companion object {
66
- const val REACT_CLASS = "PrimerExpiryEditText"
67
- }
68
- }
69
-
70
- class PrimerCvvEditTextManager : SimpleViewManager<PrimerCvvEditText>() {
71
-
72
- override fun getName(): String {
73
- return REACT_CLASS
74
- }
75
-
76
- override fun createViewInstance(reactContext: ThemedReactContext): PrimerCvvEditText {
77
- return PrimerCvvEditText(reactContext)
78
- }
79
-
80
- companion object {
81
- const val REACT_CLASS = "PrimerCvvEditText"
82
- }
83
- }
@@ -1,201 +0,0 @@
1
- package com.primerioreactnative
2
-
3
- import androidx.annotation.Nullable
4
- import androidx.core.content.ContextCompat
5
- import com.facebook.react.bridge.*
6
- import com.facebook.react.modules.core.DeviceEventManagerModule
7
- import com.primerioreactnative.datamodels.ErrorTypeRN
8
- import com.primerioreactnative.datamodels.PrimerErrorRN
9
- import com.primerioreactnative.datamodels.PrimerPaymentInstrumentTokenRN
10
- import com.primerioreactnative.datamodels.PrimerSettingsRN
11
- import com.primerioreactnative.huc.assets.AssetsManager
12
- import com.primerioreactnative.huc.assets.AssetsManager.drawableToBitmap
13
- import com.primerioreactnative.huc.assets.AssetsManager.getFile
14
- import com.primerioreactnative.huc.events.PrimerHeadlessUniversalCheckoutEvent
15
- import com.primerioreactnative.huc.extensions.toArgumentsMap
16
- import io.primer.android.completion.ResumeHandler
17
- import io.primer.android.components.PrimerHeadlessUniversalCheckout
18
- import io.primer.android.components.PrimerHeadlessUniversalCheckoutListener
19
- import io.primer.android.components.domain.core.models.PrimerHeadlessUniversalCheckoutPaymentMethod
20
- import io.primer.android.components.ui.assets.ImageType
21
- import io.primer.android.model.dto.*
22
- import kotlinx.serialization.decodeFromString
23
- import kotlinx.serialization.encodeToString
24
- import kotlinx.serialization.json.Json
25
-
26
- class PrimerHeadlessUniversalCheckout(
27
- private val reactContext: ReactApplicationContext,
28
- private val json: Json,
29
- ) : ReactContextBaseJavaModule(reactContext), PrimerHeadlessUniversalCheckoutListener {
30
-
31
- override fun getName(): String {
32
- return "PrimerHeadlessUniversalCheckout"
33
- }
34
-
35
- private var resumeHandler: ResumeHandler? = null
36
- private var successCallback: Callback? = null
37
-
38
- @ReactMethod
39
- fun startWithClientToken(
40
- clientToken: String,
41
- settingsStr: String?,
42
- errorCallback: Callback,
43
- successCallback: Callback
44
- ) {
45
- try {
46
- val settings = json.decodeFromString<PrimerSettingsRN>(settingsStr.orEmpty())
47
- this.successCallback = successCallback
48
- PrimerHeadlessUniversalCheckout.current.start(
49
- reactContext,
50
- clientToken,
51
- PrimerConfig(settings = settings.format()),
52
- this
53
- )
54
- } catch (e: Exception) {
55
- errorCallback.invoke(
56
- json.encodeToString(
57
- PrimerErrorRN(
58
- ErrorTypeRN.InitFailed,
59
- "failed to initialise PrimerHeadlessUniversalCheckout SDK, error: $e",
60
- )
61
- )
62
- )
63
- }
64
- }
65
-
66
- @ReactMethod
67
- fun resumeWithClientToken(resumeToken: String) {
68
- this.resumeHandler?.handleNewClientToken(resumeToken)
69
- }
70
-
71
- @ReactMethod
72
- fun showPaymentMethod(paymentMethodType: String) {
73
- val primerPaymentMethodType = PrimerPaymentMethodType.safeValueOf(paymentMethodType)
74
- PrimerHeadlessUniversalCheckout.current.showPaymentMethod(
75
- reactContext,
76
- primerPaymentMethodType
77
- )
78
- }
79
-
80
- @ReactMethod
81
- fun disposeHeadlessCheckout() {
82
- PrimerHeadlessUniversalCheckout.current.cleanup()
83
- }
84
-
85
- @ReactMethod
86
- fun getAssetForPaymentMethodType(
87
- paymentMethodType: String,
88
- assetType: String,
89
- errorCallback: Callback,
90
- successCallback: Callback
91
- ) {
92
-
93
- val primerPaymentMethodType = PrimerPaymentMethodType.safeValueOf(paymentMethodType)
94
- val type = ImageType.values().find { it.name.equals(assetType, ignoreCase = true) }
95
- when {
96
- primerPaymentMethodType == PaymentMethodType.UNKNOWN -> {
97
- errorCallback.invoke(
98
- json.encodeToString(
99
- PrimerErrorRN(
100
- ErrorTypeRN.AssetMissing,
101
- "Asset for $paymentMethodType does not exist, make sure you don't have any typos."
102
- )
103
- )
104
- )
105
- }
106
- type == null -> {
107
- errorCallback.invoke(
108
- json.encodeToString(
109
- PrimerErrorRN(
110
- ErrorTypeRN.AssetMismatch,
111
- "You have provided assetType=$assetType, but variable assetType can be 'LOGO' or 'ICON'."
112
- )
113
- )
114
- )
115
- }
116
- else -> {
117
- PrimerHeadlessUniversalCheckout.getAsset(primerPaymentMethodType, type)?.let { resourceId ->
118
- val file = getFile(reactContext, paymentMethodType)
119
- AssetsManager.saveBitmapToFile(
120
- file,
121
- drawableToBitmap(ContextCompat.getDrawable(reactContext, resourceId)!!),
122
- )
123
- successCallback.invoke("file://${file.absolutePath}")
124
- } ?: run {
125
- errorCallback.invoke(
126
- json.encodeToString(
127
- PrimerErrorRN(
128
- ErrorTypeRN.AssetMissing,
129
- "Failed to find $paymentMethodType for $assetType"
130
- )
131
- )
132
- )
133
- }
134
- }
135
- }
136
- }
137
-
138
- override fun onClientSessionSetupSuccessfully(paymentMethods: List<PrimerHeadlessUniversalCheckoutPaymentMethod>) {
139
- sendEvent(PrimerHeadlessUniversalCheckoutEvent.CLIENT_SESSION_SETUP_SUCCESS)
140
- successCallback?.invoke(
141
- Arguments.fromList(paymentMethods.map { it.paymentMethodType.name })
142
- )
143
- }
144
-
145
- override fun onTokenizationPreparation() {
146
- sendEvent(PrimerHeadlessUniversalCheckoutEvent.TOKENIZATION_PREPARATION_STARTED)
147
- }
148
-
149
- override fun onTokenizationStarted() {
150
- sendEvent(PrimerHeadlessUniversalCheckoutEvent.TOKENIZATION_STARTED)
151
- }
152
-
153
- override fun onPaymentMethodShowed() {
154
- sendEvent(PrimerHeadlessUniversalCheckoutEvent.PAYMENT_METH0D_SHOWED)
155
- }
156
-
157
- override fun onTokenizationSuccess(
158
- paymentMethodToken: PaymentMethodToken,
159
- resumeHandler: ResumeHandler
160
- ) {
161
- this.resumeHandler = resumeHandler
162
-
163
- sendEvent(
164
- PrimerHeadlessUniversalCheckoutEvent.TOKENIZATION_SUCCESS,
165
- mapOf(
166
- "paymentMethodToken" to json.encodeToString(
167
- PrimerPaymentInstrumentTokenRN.fromPaymentMethodToken(
168
- paymentMethodToken
169
- )
170
- )
171
- ).toArgumentsMap()
172
- )
173
- }
174
-
175
- override fun onResumeSuccess(resumeToken: String, resumeHandler: ResumeHandler) {
176
- this.resumeHandler = resumeHandler
177
-
178
- sendEvent(
179
- PrimerHeadlessUniversalCheckoutEvent.RESUME,
180
- mapOf("resumeToken" to resumeToken).toArgumentsMap()
181
- )
182
-
183
- }
184
-
185
- override fun onError(error: APIError) {
186
- sendEvent(
187
- PrimerHeadlessUniversalCheckoutEvent.ERROR,
188
- mapOf("error" to error.toString()).toArgumentsMap()
189
- )
190
- }
191
-
192
-
193
- private fun sendEvent(
194
- event: PrimerHeadlessUniversalCheckoutEvent,
195
- @Nullable params: WritableMap? = null
196
- ) {
197
- reactContext
198
- .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter::class.java)
199
- .emit(event.eventName, params)
200
- }
201
- }
@@ -1,56 +0,0 @@
1
- package com.primerioreactnative.huc.assets
2
-
3
- import android.graphics.Bitmap
4
- import android.graphics.Canvas
5
- import android.graphics.drawable.BitmapDrawable
6
- import android.graphics.drawable.Drawable
7
- import com.facebook.react.bridge.ReactApplicationContext
8
- import java.io.File
9
- import java.io.FileOutputStream
10
- import java.util.*
11
-
12
- internal object AssetsManager {
13
-
14
- private const val ASSETS_DIRECTORY = "primer-sdk"
15
- private const val COMPRESS_QUALITY = 100
16
-
17
- fun drawableToBitmap(drawable: Drawable): Bitmap {
18
- if (drawable is BitmapDrawable) {
19
- return drawable.bitmap
20
- }
21
-
22
- val bitmap = Bitmap.createBitmap(
23
- drawable.intrinsicWidth,
24
- drawable.intrinsicHeight,
25
- Bitmap.Config.ARGB_8888
26
- )
27
- val canvas = Canvas(bitmap)
28
- drawable.setBounds(0, 0, canvas.width, canvas.height)
29
- drawable.draw(canvas)
30
- return bitmap
31
- }
32
-
33
- fun saveBitmapToFile(
34
- file: File,
35
- bitmap: Bitmap,
36
- format: Bitmap.CompressFormat = Bitmap.CompressFormat.PNG,
37
- ) {
38
-
39
- FileOutputStream(file).use {
40
- bitmap.compress(format, COMPRESS_QUALITY, it)
41
- it.close()
42
- }
43
- }
44
-
45
- fun getFile(context: ReactApplicationContext, path: String): File {
46
- val directory = File(context.filesDir, path)
47
- if (!directory.exists()) directory.mkdirs()
48
- val file = File(
49
- context.filesDir,
50
- ASSETS_DIRECTORY + File.pathSeparator + path.toLowerCase(Locale.ROOT)
51
- )
52
- if (!file.exists()) file.createNewFile()
53
- return file
54
- }
55
-
56
- }
@@ -1,11 +0,0 @@
1
- package com.primerioreactnative.huc.events
2
-
3
- internal enum class PrimerHeadlessUniversalCheckoutEvent(val eventName: String) {
4
- CLIENT_SESSION_SETUP_SUCCESS("clientSessionDidSetUpSuccessfully"),
5
- TOKENIZATION_PREPARATION_STARTED("preparationStarted"),
6
- PAYMENT_METH0D_SHOWED("paymentMethodPresented"),
7
- TOKENIZATION_STARTED("tokenizationStarted"),
8
- TOKENIZATION_SUCCESS("tokenizationSucceeded"),
9
- RESUME("resume"),
10
- ERROR("error");
11
- }
@@ -1,10 +0,0 @@
1
- package com.primerioreactnative.huc.extensions
2
-
3
- import com.facebook.react.bridge.Arguments
4
-
5
- internal fun Map<String, String>.toArgumentsMap() =
6
- Arguments.createMap().apply {
7
- entries.forEach {
8
- putString(it.key, it.value)
9
- }
10
- }