@primer-io/react-native 2.27.2 → 2.28.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 (108) hide show
  1. package/android/.settings/org.eclipse.buildship.core.prefs +2 -2
  2. package/android/build.gradle +1 -1
  3. package/android/src/main/java/com/primerioreactnative/PrimerRNEventListener.kt +4 -4
  4. package/android/src/main/java/com/primerioreactnative/PrimerRNHeadlessUniversalCheckoutListener.kt +5 -5
  5. package/android/src/main/java/com/primerioreactnative/ReactNativePackage.kt +8 -2
  6. package/android/src/main/java/com/primerioreactnative/components/datamodels/manager/raw/cardRedirect/PrimerRNCardRedirectData.kt +1 -1
  7. package/android/src/main/java/com/primerioreactnative/components/datamodels/manager/raw/phoneNumber/PrimerRNPhoneNumberData.kt +1 -1
  8. package/android/src/main/java/com/primerioreactnative/components/datamodels/manager/raw/retailOutlets/PrimerRNRetailOutletData.kt +1 -1
  9. package/android/src/main/java/com/primerioreactnative/components/datamodels/manager/raw/retailOutlets/RNRetailOutletsList.kt +1 -1
  10. package/android/src/main/java/com/primerioreactnative/components/datamodels/manager/{asset/PrimerRNAsset.kt → resource/Resources.kt} +41 -9
  11. package/android/src/main/java/com/primerioreactnative/components/manager/NativeViewContainer.kt +35 -0
  12. package/android/src/main/java/com/primerioreactnative/components/manager/ach/PrimerRNHeadlessUniversalCheckoutStripeAchUserDetailsComponent.kt +4 -4
  13. package/android/src/main/java/com/primerioreactnative/components/manager/asset/PrimerRNHeadlessUniversalCheckoutAssetManager.kt +83 -1
  14. package/android/src/main/java/com/primerioreactnative/components/manager/banks/PrimerRNHeadlessUniversalCheckoutBanksComponent.kt +1 -1
  15. package/android/src/main/java/com/primerioreactnative/components/manager/googlePay/PrimerGooglePayButtonConstantsModule.kt +39 -0
  16. package/android/src/main/java/com/primerioreactnative/components/manager/googlePay/PrimerGooglePayButtonManager.kt +38 -0
  17. package/android/src/main/java/com/primerioreactnative/components/manager/klarna/PrimerKlarnaPaymentViewManager.kt +15 -78
  18. package/android/src/main/java/com/primerioreactnative/components/manager/klarna/PrimerRNHeadlessUniversalCheckoutKlarnaComponent.kt +4 -4
  19. package/android/src/main/java/com/primerioreactnative/components/manager/raw/PrimerRNHeadlessUniversalCheckoutRawManager.kt +1 -1
  20. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerClientSessionRN.kt +10 -1
  21. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerPaymentInstrumentTokenRN.kt +5 -10
  22. package/android/src/main/java/com/primerioreactnative/datamodels/PrimerSettingsRN.kt +54 -33
  23. package/android/src/main/java/com/primerioreactnative/datamodels/extensions/ach/AchUserDetailsCollectableData.kt +1 -1
  24. package/android/src/main/java/com/primerioreactnative/datamodels/extensions/ach/AchUserDetailsStep.kt +1 -1
  25. package/android/src/main/java/com/primerioreactnative/extensions/PaymentInstrumentData.kt +29 -16
  26. package/android/src/main/java/com/primerioreactnative/extensions/PrimerCheckoutAdditionalInfo.kt +7 -7
  27. package/android/src/main/java/com/primerioreactnative/extensions/PrimerIssuingBank.kt +1 -1
  28. package/android/src/main/java/com/primerioreactnative/extensions/PrimerOrder.kt +7 -1
  29. package/android/src/main/java/com/primerioreactnative/extensions/PrimerPaymentMethodOptionsRN.kt +51 -32
  30. package/android/src/main/java/com/primerioreactnative/extensions/klarna/KlarnaPaymentCategory.kt +1 -1
  31. package/android/src/main/java/com/primerioreactnative/extensions/klarna/KlarnaPaymentCategoryRN.kt +1 -1
  32. package/android/src/main/java/com/primerioreactnative/extensions/klarna/KlarnaPaymentCollectableData.kt +2 -2
  33. package/android/src/main/java/com/primerioreactnative/extensions/klarna/KlarnaPaymentStep.kt +4 -4
  34. package/ios/Sources/DataModels/PrimerSettings+Extensions.swift +60 -3
  35. package/ios/Sources/Headless Universal Checkout/Managers/Assets Manager/RNTAssetsManager.m +7 -0
  36. package/ios/Sources/Headless Universal Checkout/Managers/Assets Manager/RNTAssetsManager.swift +62 -0
  37. package/ios/Sources/version.swift +1 -1
  38. package/lib/commonjs/HeadlessUniversalCheckout/Components/NativeResourceView.js +30 -0
  39. package/lib/commonjs/HeadlessUniversalCheckout/Components/NativeResourceView.js.map +1 -0
  40. package/lib/commonjs/HeadlessUniversalCheckout/Components/PrimerGooglePayButton.js +9 -0
  41. package/lib/commonjs/HeadlessUniversalCheckout/Components/PrimerGooglePayButton.js.map +1 -0
  42. package/lib/commonjs/HeadlessUniversalCheckout/Managers/AssetsManager.js +32 -0
  43. package/lib/commonjs/HeadlessUniversalCheckout/Managers/AssetsManager.js.map +1 -1
  44. package/lib/commonjs/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/ComponentWithRedirectManager.js +6 -0
  45. package/lib/commonjs/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/ComponentWithRedirectManager.js.map +1 -1
  46. package/lib/commonjs/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/KlarnaManager.js +6 -0
  47. package/lib/commonjs/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/KlarnaManager.js.map +1 -1
  48. package/lib/commonjs/HeadlessUniversalCheckout/Managers/VaultManager.js +24 -1
  49. package/lib/commonjs/HeadlessUniversalCheckout/Managers/VaultManager.js.map +1 -1
  50. package/lib/commonjs/index.js +20 -0
  51. package/lib/commonjs/index.js.map +1 -1
  52. package/lib/commonjs/models/PrimerPaymentMethodResource.js +2 -0
  53. package/lib/{module/models/PrimerAsset.js.map → commonjs/models/PrimerPaymentMethodResource.js.map} +1 -1
  54. package/lib/module/HeadlessUniversalCheckout/Components/NativeResourceView.js +22 -0
  55. package/lib/module/HeadlessUniversalCheckout/Components/NativeResourceView.js.map +1 -0
  56. package/lib/module/HeadlessUniversalCheckout/Components/PrimerGooglePayButton.js +3 -0
  57. package/lib/module/HeadlessUniversalCheckout/Components/PrimerGooglePayButton.js.map +1 -0
  58. package/lib/module/HeadlessUniversalCheckout/Managers/AssetsManager.js +32 -0
  59. package/lib/module/HeadlessUniversalCheckout/Managers/AssetsManager.js.map +1 -1
  60. package/lib/module/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/ComponentWithRedirectManager.js +6 -0
  61. package/lib/module/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/ComponentWithRedirectManager.js.map +1 -1
  62. package/lib/module/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/KlarnaManager.js +6 -0
  63. package/lib/module/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/KlarnaManager.js.map +1 -1
  64. package/lib/module/HeadlessUniversalCheckout/Managers/VaultManager.js +24 -1
  65. package/lib/module/HeadlessUniversalCheckout/Managers/VaultManager.js.map +1 -1
  66. package/lib/module/index.js +6 -0
  67. package/lib/module/index.js.map +1 -1
  68. package/lib/module/models/PrimerPaymentMethodResource.js +2 -0
  69. package/lib/{commonjs/models/PrimerAsset.js.map → module/models/PrimerPaymentMethodResource.js.map} +1 -1
  70. package/lib/typescript/HeadlessUniversalCheckout/Components/NativeResourceView.d.ts +11 -0
  71. package/lib/typescript/HeadlessUniversalCheckout/Components/NativeResourceView.d.ts.map +1 -0
  72. package/lib/typescript/HeadlessUniversalCheckout/Components/PrimerGooglePayButton.d.ts +6 -0
  73. package/lib/typescript/HeadlessUniversalCheckout/Components/PrimerGooglePayButton.d.ts.map +1 -0
  74. package/lib/typescript/HeadlessUniversalCheckout/Managers/AssetsManager.d.ts +10 -1
  75. package/lib/typescript/HeadlessUniversalCheckout/Managers/AssetsManager.d.ts.map +1 -1
  76. package/lib/typescript/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/ComponentWithRedirectManager.d.ts +16 -1
  77. package/lib/typescript/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/ComponentWithRedirectManager.d.ts.map +1 -1
  78. package/lib/typescript/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/KlarnaManager.d.ts +14 -1
  79. package/lib/typescript/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/KlarnaManager.d.ts.map +1 -1
  80. package/lib/typescript/HeadlessUniversalCheckout/Managers/VaultManager.d.ts.map +1 -1
  81. package/lib/typescript/index.d.ts +8 -1
  82. package/lib/typescript/index.d.ts.map +1 -1
  83. package/lib/typescript/models/PrimerClientSession.d.ts +7 -0
  84. package/lib/typescript/models/PrimerClientSession.d.ts.map +1 -1
  85. package/lib/typescript/models/PrimerPaymentMethodResource.d.ts +19 -0
  86. package/lib/typescript/models/PrimerPaymentMethodResource.d.ts.map +1 -0
  87. package/lib/typescript/models/PrimerPaymentMethodTokenData.d.ts +10 -49
  88. package/lib/typescript/models/PrimerPaymentMethodTokenData.d.ts.map +1 -1
  89. package/lib/typescript/models/PrimerSettings.d.ts +38 -2
  90. package/lib/typescript/models/PrimerSettings.d.ts.map +1 -1
  91. package/package.json +1 -1
  92. package/primer-io-react-native.podspec +1 -1
  93. package/src/HeadlessUniversalCheckout/Components/NativeResourceView.tsx +31 -0
  94. package/src/HeadlessUniversalCheckout/Components/PrimerGooglePayButton.tsx +8 -0
  95. package/src/HeadlessUniversalCheckout/Managers/AssetsManager.ts +34 -1
  96. package/src/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/ComponentWithRedirectManager.ts +24 -1
  97. package/src/HeadlessUniversalCheckout/Managers/PaymentMethodManagers/KlarnaManager.ts +22 -1
  98. package/src/HeadlessUniversalCheckout/Managers/VaultManager.ts +22 -1
  99. package/src/index.tsx +9 -3
  100. package/src/models/PrimerClientSession.ts +9 -1
  101. package/src/models/PrimerPaymentMethodResource.ts +21 -0
  102. package/src/models/PrimerPaymentMethodTokenData.ts +10 -53
  103. package/src/models/PrimerSettings.ts +42 -4
  104. package/lib/commonjs/models/PrimerAsset.js +0 -2
  105. package/lib/module/models/PrimerAsset.js +0 -2
  106. package/lib/typescript/models/PrimerAsset.d.ts +0 -15
  107. package/lib/typescript/models/PrimerAsset.d.ts.map +0 -1
  108. package/src/models/PrimerAsset.ts +0 -14
@@ -36,28 +36,23 @@ data class PrimerPaymentInstrumentTokenRN(
36
36
  val cardholderName: String? = null,
37
37
  val first6Digits: Int? = null,
38
38
  val last4Digits: Int? = null,
39
+ val accountNumberLast4Digits: Int? = null,
39
40
  val expirationMonth: Int? = null,
40
41
  val expirationYear: Int? = null,
41
- val gocardlessMandateId: String? = null,
42
42
  val externalPayerInfo: ExternalPayerInfo? = null,
43
43
  val klarnaCustomerToken: String? = null,
44
44
  val sessionData: SessionData? = null,
45
- // apaya
46
- val mx: String? = null,
47
- val mnc: Int? = null,
48
- val mcc: Int? = null,
49
- val hashedIdentifier: String? = null,
50
- val currencyCode: String? = null,
51
- val productId: String? = null,
52
- // async
53
45
  val paymentMethodType: String? = null,
54
- // bin
55
46
  val binData: BinData? = null,
47
+ val bankName: String? = null
56
48
  )
57
49
 
58
50
  @Serializable
59
51
  data class ExternalPayerInfo(
60
52
  val email: String,
53
+ val externalPayerId: String?,
54
+ val firstName: String?,
55
+ val lastName: String?
61
56
  )
62
57
 
63
58
  @Serializable
@@ -1,6 +1,7 @@
1
1
  package com.primerioreactnative.datamodels
2
2
 
3
3
  import android.content.Context
4
+ import com.google.android.gms.wallet.button.ButtonConstants
4
5
  import com.primerioreactnative.extensions.toLocale
5
6
  import com.primerioreactnative.extensions.toPrimerDebugOptions
6
7
  import com.primerioreactnative.extensions.toPrimerPaymentMethodOptions
@@ -25,20 +26,20 @@ data class PrimerSettingsRN(
25
26
 
26
27
  @Serializable
27
28
  data class LocaleSettingsRN(
28
- val languageCode: String? = null,
29
- val localeCode: String? = null
29
+ val languageCode: String? = null,
30
+ val localeCode: String? = null
30
31
  )
31
32
 
32
33
  @Serializable
33
34
  data class PrimerPaymentMethodOptionsRN(
34
- @SerialName("android")
35
- val androidSettingsRN: AndroidSettingsRN = AndroidSettingsRN(),
36
- var cardPaymentOptions: PrimerCardPaymentOptionsRN = PrimerCardPaymentOptionsRN(),
37
- var googlePayOptions: PrimerGooglePayOptionsRN = PrimerGooglePayOptionsRN(),
38
- var klarnaOptions: PrimerKlarnaOptionsRN = PrimerKlarnaOptionsRN(),
39
- var apayaOptions: PrimerApayaOptionsRN = PrimerApayaOptionsRN(),
40
- var threeDsOptions: PrimerThreeDsOptionsRN = PrimerThreeDsOptionsRN(),
41
- var stripeOptions: PrimerStripeOptionsRN = PrimerStripeOptionsRN(),
35
+ @SerialName("android")
36
+ val androidSettingsRN: AndroidSettingsRN = AndroidSettingsRN(),
37
+ var cardPaymentOptions: PrimerCardPaymentOptionsRN = PrimerCardPaymentOptionsRN(),
38
+ var googlePayOptions: PrimerGooglePayOptionsRN = PrimerGooglePayOptionsRN(),
39
+ var klarnaOptions: PrimerKlarnaOptionsRN = PrimerKlarnaOptionsRN(),
40
+ var apayaOptions: PrimerApayaOptionsRN = PrimerApayaOptionsRN(),
41
+ var threeDsOptions: PrimerThreeDsOptionsRN = PrimerThreeDsOptionsRN(),
42
+ var stripeOptions: PrimerStripeOptionsRN = PrimerStripeOptionsRN(),
42
43
  )
43
44
 
44
45
  @Serializable
@@ -120,49 +121,69 @@ data class PrimerCardPaymentOptionsRN(var is3DSOnVaultingEnabled: Boolean = true
120
121
 
121
122
  @Serializable
122
123
  data class PrimerThreeDsOptionsRN(
123
- @SerialName("android")
124
- val threeDsOptionsAndroid: PrimerThreeDsAndroidOptionsRN? = null
124
+ @SerialName("android")
125
+ val threeDsOptionsAndroid: PrimerThreeDsAndroidOptionsRN? = null
125
126
  )
126
127
 
127
- @Serializable
128
+ @Serializable
128
129
  data class PrimerThreeDsAndroidOptionsRN(val threeDsAppRequestorUrl: String? = null)
129
130
 
130
131
  @Serializable
131
132
  data class PrimerGooglePayOptionsRN(
132
- var merchantName: String? = null,
133
- var allowedCardNetworks: List<String> =
134
- listOf("AMEX", "DISCOVER", "JCB", "MASTERCARD", "VISA"),
135
- var buttonStyle: GooglePayButtonStyle = GooglePayButtonStyle.BLACK,
136
- @SerialName("isCaptureBillingAddressEnabled")
137
- var captureBillingAddress: Boolean = false,
138
- @SerialName("isExistingPaymentMethodRequired")
139
- var existingPaymentMethodRequired: Boolean = false
133
+ var merchantName: String? = null,
134
+ var allowedCardNetworks: List<String> =
135
+ listOf("AMEX", "DISCOVER", "JCB", "MASTERCARD", "VISA"),
136
+ var buttonStyle: GooglePayButtonStyle = GooglePayButtonStyle.BLACK,
137
+ @SerialName("isCaptureBillingAddressEnabled")
138
+ var captureBillingAddress: Boolean = false,
139
+ @SerialName("isExistingPaymentMethodRequired")
140
+ var existingPaymentMethodRequired: Boolean = false,
141
+ var shippingAddressParameters: PrimerGoogleShippingAddressParametersRN? = null,
142
+ @SerialName("requireShippingMethod")
143
+ var requireShippingMethod: Boolean = false,
144
+ @SerialName("emailAddressRequired")
145
+ var emailAddressRequired: Boolean = false,
146
+ @SerialName("buttonOptions")
147
+ var buttonOptions: PrimerGooglePayButtonOptionsRN? = null
148
+ )
149
+
150
+ @Serializable
151
+ data class PrimerGoogleShippingAddressParametersRN(
152
+ var phoneNumberRequired: Boolean = false
153
+ )
154
+
155
+ @Serializable
156
+ data class PrimerGooglePayButtonOptionsRN(
157
+ @SerialName("buttonTheme")
158
+ var buttonTheme: Int? = null,
159
+ @SerialName("buttonType")
160
+ var buttonType: Int? = null
140
161
  )
141
162
 
142
163
  @Serializable
143
164
  data class PrimerKlarnaOptionsRN(
144
- var recurringPaymentDescription: String? = null,
145
- @Deprecated("This property is deprecated and will be removed in future release.")
146
- var webViewTitle: String? = null,
165
+ var recurringPaymentDescription: String? = null,
166
+ @Deprecated("This property is deprecated and will be removed in future release.")
167
+ var webViewTitle: String? = null,
147
168
  )
148
169
 
149
170
  @Serializable
150
171
  data class PrimerStripeOptionsRN(
151
- val mandateData: MandateDataRN? = null,
152
- val publishableKey: String? = null,
172
+ val mandateData: MandateDataRN? = null,
173
+ val publishableKey: String? = null,
153
174
  ) {
154
- @Serializable
155
- data class MandateDataRN(
156
- @SerialName("fullMandateText") val fullMandateText: String? = null,
157
- @SerialName("fullMandateStringResourceName") val fullMandateStringResName: String? = null,
158
- val merchantName: String? = null
159
- )
175
+ @Serializable
176
+ data class MandateDataRN(
177
+ @SerialName("fullMandateText") val fullMandateText: String? = null,
178
+ @SerialName("fullMandateStringResourceName") val fullMandateStringResName: String? = null,
179
+ val merchantName: String? = null
180
+ )
160
181
  }
161
182
 
162
183
  @Serializable
163
184
  @Deprecated("This class is deprecated and will be removed in future release.")
164
185
  data class PrimerApayaOptionsRN(
165
- var webViewTitle: String? = null,
186
+ var webViewTitle: String? = null,
166
187
  )
167
188
 
168
189
  fun PrimerSettingsRN.toPrimerSettings(context: Context) = PrimerSettings(
@@ -2,7 +2,7 @@ package com.primerioreactnative.datamodels.extensions.ach
2
2
 
3
3
  import com.primerioreactnative.datamodels.NamedComponentValidatableData
4
4
  import com.primerioreactnative.datamodels.ach.AchUserDetailsStepRN
5
- import io.primer.android.components.presentation.paymentMethods.nativeUi.stripe.ach.composable.AchUserDetailsCollectableData
5
+ import io.primer.android.stripe.ach.api.composable.AchUserDetailsCollectableData
6
6
  import kotlinx.serialization.Serializable
7
7
  import com.primerioreactnative.datamodels.ach.AchUserDetailsCollectableDataRN
8
8
 
@@ -1,7 +1,7 @@
1
1
  package com.primerioreactnative.datamodels.extensions.ach
2
2
 
3
3
  import com.primerioreactnative.datamodels.ach.AchUserDetailsStepRN
4
- import io.primer.android.components.presentation.paymentMethods.nativeUi.stripe.ach.composable.AchUserDetailsStep
4
+ import io.primer.android.stripe.ach.api.composable.AchUserDetailsStep
5
5
 
6
6
  internal fun AchUserDetailsStep.UserDetailsCollected.toUserDetailsCollectedRN() =
7
7
  AchUserDetailsStepRN.UserDetailsCollectedRN()
@@ -4,21 +4,34 @@ import com.primerioreactnative.datamodels.PrimerPaymentInstrumentTokenRN
4
4
  import io.primer.android.data.tokenization.models.PaymentInstrumentData
5
5
 
6
6
  internal fun PaymentInstrumentData.toPaymentInstrumentDataRN() =
7
- PrimerPaymentInstrumentTokenRN.PaymentInstrumentData(
8
- network,
9
- cardholderName,
10
- first6Digits,
11
- last4Digits,
12
- expirationMonth,
13
- expirationYear,
14
- gocardlessMandateId,
15
- externalPayerInfo?.email?.let { PrimerPaymentInstrumentTokenRN.ExternalPayerInfo(it) },
16
- klarnaCustomerToken,
17
- sessionData?.let {
7
+ PrimerPaymentInstrumentTokenRN.PaymentInstrumentData(
8
+ network = network,
9
+ cardholderName = cardholderName,
10
+ first6Digits = first6Digits,
11
+ last4Digits = last4Digits,
12
+ accountNumberLast4Digits = accountNumberLast4Digits,
13
+ expirationMonth = expirationMonth,
14
+ expirationYear = expirationYear,
15
+ externalPayerInfo = externalPayerInfo?.let {
16
+ PrimerPaymentInstrumentTokenRN.ExternalPayerInfo(
17
+ email = it.email,
18
+ externalPayerId = it.externalPayerId,
19
+ firstName = it.firstName,
20
+ lastName = it.lastName
21
+ )
22
+ },
23
+ klarnaCustomerToken = klarnaCustomerToken,
24
+ sessionData = sessionData?.let {
18
25
  PrimerPaymentInstrumentTokenRN.SessionData(
19
- it.recurringDescription,
20
- it.billingAddress?.let { PrimerPaymentInstrumentTokenRN.BillingAddress(it.email) })
26
+ recurringDescription = it.recurringDescription,
27
+ billingAddress = it.billingAddress?.let {
28
+ PrimerPaymentInstrumentTokenRN.BillingAddress(email = it.email)
29
+ }
30
+ )
31
+ },
32
+ paymentMethodType = paymentMethodType,
33
+ binData = binData?.let {
34
+ PrimerPaymentInstrumentTokenRN.BinData(network = it.network)
21
35
  },
22
- mx, mnc, mcc, hashedIdentifier, currencyCode, productId, paymentMethodType,
23
- binData?.let { PrimerPaymentInstrumentTokenRN.BinData(it.network) }
24
- )
36
+ bankName = bankName
37
+ )
@@ -4,17 +4,17 @@ import com.primerioreactnative.datamodels.MultibancoCheckoutAdditionalInfoRN
4
4
  import com.primerioreactnative.datamodels.PromptPayCheckoutAdditionalInfoRN
5
5
  import com.primerioreactnative.datamodels.XenditCheckoutVoucherAdditionalInfoRN
6
6
  import com.primerioreactnative.datamodels.AchAdditionalInfoDisplayMandateRN
7
- import io.primer.android.domain.payments.additionalInfo.MultibancoCheckoutAdditionalInfo
8
- import io.primer.android.domain.payments.additionalInfo.PrimerCheckoutAdditionalInfo
9
- import io.primer.android.domain.payments.additionalInfo.PromptPayCheckoutAdditionalInfo
10
- import io.primer.android.domain.payments.additionalInfo.XenditCheckoutVoucherAdditionalInfo
11
- import io.primer.android.domain.payments.additionalInfo.AchAdditionalInfo
7
+ import io.primer.android.vouchers.multibanco.MultibancoCheckoutAdditionalInfo
8
+ import io.primer.android.payments.core.additionalInfo.PrimerCheckoutAdditionalInfo
9
+ import io.primer.android.qrcode.QrCodeCheckoutAdditionalInfo
10
+ import io.primer.android.vouchers.retailOutlets.XenditCheckoutVoucherAdditionalInfo
11
+ import io.primer.android.stripe.ach.api.additionalInfo.AchAdditionalInfo
12
12
 
13
13
  internal fun PrimerCheckoutAdditionalInfo.toCheckoutAdditionalInfoRN() = when (this) {
14
14
  is MultibancoCheckoutAdditionalInfo ->
15
15
  MultibancoCheckoutAdditionalInfoRN(expiresAt, reference, entity)
16
- is PromptPayCheckoutAdditionalInfo ->
17
- PromptPayCheckoutAdditionalInfoRN(expiresAt, qrCodeUrl, qrCodeBase64)
16
+ is QrCodeCheckoutAdditionalInfo ->
17
+ PromptPayCheckoutAdditionalInfoRN(expiresAt.orEmpty(), qrCodeUrl, qrCodeBase64)
18
18
  is XenditCheckoutVoucherAdditionalInfo ->
19
19
  XenditCheckoutVoucherAdditionalInfoRN(expiresAt, couponCode, retailerName)
20
20
  is AchAdditionalInfo.DisplayMandate ->
@@ -1,7 +1,7 @@
1
1
  package com.primerioreactnative.extensions
2
2
 
3
3
  import com.primerioreactnative.datamodels.PrimerIssuingBankRN
4
- import io.primer.android.domain.rpc.banks.models.IssuingBank
4
+ import io.primer.android.banks.implementation.rpc.domain.models.IssuingBank
5
5
 
6
6
  internal fun IssuingBank.toPrimerIssuingBankRN() =
7
7
  PrimerIssuingBankRN(id, name, disabled, iconUrl)
@@ -1,6 +1,12 @@
1
1
  package com.primerioreactnative.extensions
2
2
 
3
3
  import com.primerioreactnative.datamodels.PrimerOrderRN
4
+ import com.primerioreactnative.datamodels.PrimerShippingRN
4
5
  import io.primer.android.domain.action.models.PrimerOrder
6
+ import io.primer.android.domain.action.models.PrimerShipping
5
7
 
6
- internal fun PrimerOrder.toPrimerOrderRN() = PrimerOrderRN(countryCode)
8
+ internal fun PrimerOrder.toPrimerOrderRN() =
9
+ PrimerOrderRN(countryCode = countryCode, shipping = shipping?.toPrimerShippingRN())
10
+
11
+ internal fun PrimerShipping.toPrimerShippingRN() =
12
+ PrimerShippingRN(amount, methodId, methodName, methodDescription)
@@ -6,48 +6,67 @@ import io.primer.android.data.settings.PrimerStripeOptions.MandateData.TemplateM
6
6
  import io.primer.android.data.settings.PrimerStripeOptions.MandateData.FullMandateData
7
7
  import io.primer.android.data.settings.PrimerStripeOptions.MandateData.FullMandateStringData
8
8
  import android.content.Context
9
+ import com.google.android.gms.wallet.button.ButtonConstants
10
+ import com.primerioreactnative.components.manager.googlePay.PrimerGooglePayButtonOptionsMapping
9
11
 
10
12
  fun PrimerPaymentMethodOptionsRN.toPrimerPaymentMethodOptions(context: Context) =
11
- PrimerPaymentMethodOptions(
12
- androidSettingsRN.redirectScheme,
13
- googlePayOptions.toPrimerGooglePayOptions(),
14
- klarnaOptions.toPrimerKlarnaOptions(),
15
- threeDsOptions.toPrimerThreeDsOptions(),
16
- stripeOptions.toPrimerStripeOptions(context),
17
- )
13
+ PrimerPaymentMethodOptions(
14
+ androidSettingsRN.redirectScheme,
15
+ googlePayOptions.toPrimerGooglePayOptions(),
16
+ klarnaOptions.toPrimerKlarnaOptions(),
17
+ threeDsOptions.toPrimerThreeDsOptions(),
18
+ stripeOptions.toPrimerStripeOptions(context),
19
+ )
18
20
 
19
21
  fun PrimerGooglePayOptionsRN.toPrimerGooglePayOptions() =
20
- PrimerGooglePayOptions(
21
- merchantName = merchantName,
22
- allowedCardNetworks = allowedCardNetworks,
23
- buttonStyle = buttonStyle,
24
- captureBillingAddress = captureBillingAddress,
25
- existingPaymentMethodRequired = existingPaymentMethodRequired
26
- )
22
+ PrimerGooglePayOptions(
23
+ merchantName = merchantName,
24
+ allowedCardNetworks = allowedCardNetworks,
25
+ buttonStyle = buttonStyle,
26
+ captureBillingAddress = captureBillingAddress,
27
+ existingPaymentMethodRequired = existingPaymentMethodRequired,
28
+ shippingAddressParameters = shippingAddressParameters?.toPrimerGoogleShippingAddressParameters(),
29
+ requireShippingMethod = requireShippingMethod,
30
+ emailAddressRequired = emailAddressRequired,
31
+ buttonOptions = buttonOptions?.toPrimerGooglePayButtonOptions() ?: GooglePayButtonOptions()
32
+ )
33
+
34
+ fun PrimerGoogleShippingAddressParametersRN.toPrimerGoogleShippingAddressParameters() =
35
+ PrimerGoogleShippingAddressParameters(phoneNumberRequired)
36
+
37
+ fun PrimerGooglePayButtonOptionsRN.toPrimerGooglePayButtonOptions() = GooglePayButtonOptions(
38
+ buttonType = buttonType ?: ButtonConstants.ButtonType.PAY,
39
+ buttonTheme = buttonTheme ?: ButtonConstants.ButtonTheme.DARK,
40
+ )
27
41
 
28
42
  fun PrimerKlarnaOptionsRN.toPrimerKlarnaOptions() =
29
- PrimerKlarnaOptions(recurringPaymentDescription, webViewTitle)
43
+ PrimerKlarnaOptions(recurringPaymentDescription, webViewTitle)
30
44
 
31
45
  fun PrimerThreeDsOptionsRN.toPrimerThreeDsOptions() =
32
- PrimerThreeDsOptions(threeDsOptionsAndroid?.threeDsAppRequestorUrl)
46
+ PrimerThreeDsOptions(threeDsOptionsAndroid?.threeDsAppRequestorUrl)
33
47
 
34
- fun PrimerStripeOptionsRN.toPrimerStripeOptions(context: Context) =
35
- PrimerStripeOptions(mandateData = mandateData?.toMandateData(context), publishableKey = publishableKey)
48
+ fun PrimerStripeOptionsRN.toPrimerStripeOptions(context: Context) =
49
+ PrimerStripeOptions(
50
+ mandateData = mandateData?.toMandateData(context),
51
+ publishableKey = publishableKey
52
+ )
36
53
 
37
54
  private fun PrimerStripeOptionsRN.MandateDataRN.toMandateData(context: Context) = when {
38
- merchantName != null -> TemplateMandateData(merchantName)
39
- fullMandateStringResName != null -> {
40
- val stringId = context.getResources().getIdentifier(fullMandateStringResName, "string", context.getPackageName())
41
- if (stringId != 0) {
42
- FullMandateData(stringId)
43
- } else {
44
- if (fullMandateText != null) {
45
- FullMandateStringData(fullMandateText)
46
- } else {
47
- error("Missing mandate data")
48
- }
49
- }
55
+ merchantName != null -> TemplateMandateData(merchantName)
56
+ fullMandateStringResName != null -> {
57
+ val stringId = context.getResources()
58
+ .getIdentifier(fullMandateStringResName, "string", context.getPackageName())
59
+ if (stringId != 0) {
60
+ FullMandateData(stringId)
61
+ } else {
62
+ if (fullMandateText != null) {
63
+ FullMandateStringData(fullMandateText)
64
+ } else {
65
+ error("Missing mandate data")
66
+ }
50
67
  }
51
- fullMandateText != null -> FullMandateStringData(fullMandateText)
52
- else -> error("Missing mandate data")
68
+ }
69
+
70
+ fullMandateText != null -> FullMandateStringData(fullMandateText)
71
+ else -> error("Missing mandate data")
53
72
  }
@@ -1,7 +1,7 @@
1
1
  package com.primerioreactnative.extensions.klarna
2
2
 
3
3
  import com.primerioreactnative.datamodels.klarna.KlarnaPaymentCategoryRN
4
- import io.primer.android.components.domain.payments.paymentMethods.nativeUi.klarna.models.KlarnaPaymentCategory
4
+ import io.primer.android.klarna.implementation.session.domain.models.KlarnaPaymentCategory
5
5
 
6
6
  internal fun KlarnaPaymentCategory.toKlarnaPaymentCategoryRN() =
7
7
  KlarnaPaymentCategoryRN(
@@ -1,7 +1,7 @@
1
1
  package com.primerioreactnative.extensions.klarna
2
2
 
3
3
  import com.primerioreactnative.datamodels.klarna.KlarnaPaymentCategoryRN
4
- import io.primer.android.components.domain.payments.paymentMethods.nativeUi.klarna.models.KlarnaPaymentCategory
4
+ import io.primer.android.klarna.implementation.session.domain.models.KlarnaPaymentCategory
5
5
 
6
6
  internal fun KlarnaPaymentCategoryRN.toKlarnaPaymentCategory() =
7
7
  KlarnaPaymentCategory(
@@ -2,8 +2,8 @@ package com.primerioreactnative.extensions.klarna
2
2
 
3
3
  import com.primerioreactnative.datamodels.klarna.KlarnaPaymentCollectableDataRN.PaymentOptionsRN
4
4
  import com.primerioreactnative.datamodels.klarna.KlarnaPaymentCollectableDataRN.FinalizePaymentRN
5
- import io.primer.android.components.presentation.paymentMethods.nativeUi.klarna.models.KlarnaPaymentCollectableData.PaymentOptions
6
- import io.primer.android.components.presentation.paymentMethods.nativeUi.klarna.models.KlarnaPaymentCollectableData.FinalizePayment
5
+ import io.primer.android.klarna.api.composable.KlarnaPaymentCollectableData.PaymentOptions
6
+ import io.primer.android.klarna.api.composable.KlarnaPaymentCollectableData.FinalizePayment
7
7
 
8
8
  internal fun PaymentOptions.toPaymentOptionsRN() =
9
9
  PaymentOptionsRN(
@@ -5,10 +5,10 @@ import com.primerioreactnative.datamodels.klarna.KlarnaPaymentStepRN.PaymentView
5
5
  import com.primerioreactnative.datamodels.klarna.KlarnaPaymentStepRN.PaymentSessionAuthorizedRN
6
6
  import com.primerioreactnative.datamodels.klarna.KlarnaPaymentStepRN.PaymentSessionFinalizedRN
7
7
  import com.primerioreactnative.extensions.klarna.toKlarnaPaymentCategoryRN
8
- import io.primer.android.components.presentation.paymentMethods.nativeUi.klarna.models.KlarnaPaymentStep.PaymentSessionCreated
9
- import io.primer.android.components.presentation.paymentMethods.nativeUi.klarna.models.KlarnaPaymentStep.PaymentViewLoaded
10
- import io.primer.android.components.presentation.paymentMethods.nativeUi.klarna.models.KlarnaPaymentStep.PaymentSessionAuthorized
11
- import io.primer.android.components.presentation.paymentMethods.nativeUi.klarna.models.KlarnaPaymentStep.PaymentSessionFinalized
8
+ import io.primer.android.klarna.api.composable.KlarnaPaymentStep.PaymentSessionCreated
9
+ import io.primer.android.klarna.api.composable.KlarnaPaymentStep.PaymentViewLoaded
10
+ import io.primer.android.klarna.api.composable.KlarnaPaymentStep.PaymentSessionAuthorized
11
+ import io.primer.android.klarna.api.composable.KlarnaPaymentStep.PaymentSessionFinalized
12
12
 
13
13
  internal fun PaymentSessionCreated.toPaymentSessionCreatedRN() =
14
14
  PaymentSessionCreatedRN(paymentCategories = paymentCategories.map { it.toKlarnaPaymentCategoryRN() })
@@ -34,20 +34,77 @@ extension PrimerSettings {
34
34
 
35
35
  var applePayOptions: PrimerApplePayOptions?
36
36
  if let rnApplePayOptions = ((settingsJson["paymentMethodOptions"] as? [String: Any])?["applePayOptions"] as? [String: Any]),
37
- let rnApplePayMerchantIdentifier = rnApplePayOptions["merchantIdentifier"] as? String,
38
- let rnApplePayMerchantName = rnApplePayOptions["merchantName"] as? String
37
+ let rnApplePayMerchantIdentifier = rnApplePayOptions["merchantIdentifier"] as? String
39
38
  {
39
+ let rnApplePayMerchantName = rnApplePayOptions["merchantName"] as? String
40
40
  let rnApplePayIsCaptureBillingAddressEnabled = (rnApplePayOptions["isCaptureBillingAddressEnabled"] as? Bool) ?? false
41
41
  let rnApplePayShowApplePayForUnsupportedDevice = (rnApplePayOptions["showApplePayForUnsupportedDevice"] as? Bool) ?? true
42
42
  let rnApplePayCheckProvidedNetworks = (rnApplePayOptions["checkProvidedNetworks"] as? Bool) ?? true
43
43
 
44
+ var shippingOptions: PrimerApplePayOptions.ShippingOptions? = nil
45
+ if let rnShippingOptions = rnApplePayOptions["shippingOptions"] as? [String: Any] {
46
+ let requireShippingMethod = rnShippingOptions["requireShippingMethod"] as? Bool ?? false
47
+
48
+ var shippingContactFields: [PrimerApplePayOptions.RequiredContactField]? = nil
49
+ if let requiredFieldsStrings = rnShippingOptions["shippingContactFields"] as? [String] {
50
+ shippingContactFields = requiredFieldsStrings.compactMap { fieldStr in
51
+ switch fieldStr {
52
+ case "name":
53
+ return .name
54
+ case "emailAddress":
55
+ return .emailAddress
56
+ case "phoneNumber":
57
+ return .phoneNumber
58
+ case "postalAddress":
59
+ return .postalAddress
60
+ default:
61
+ return nil // Ignore unknown values or handle accordingly
62
+ }
63
+ }
64
+ }
65
+
66
+ shippingOptions = PrimerApplePayOptions.ShippingOptions(
67
+ shippingContactFields: shippingContactFields,
68
+ requireShippingMethod: requireShippingMethod
69
+ )
70
+ }
71
+
72
+ var billingOptions: PrimerApplePayOptions.BillingOptions? = nil
73
+ if let rnBillingOptions = rnApplePayOptions["billingOptions"] as? [String: Any] {
74
+ var requiredBillingContactFields: [PrimerApplePayOptions.RequiredContactField]? = nil
75
+ if let requiredFieldsStrings = rnBillingOptions["requiredBillingContactFields"] as? [String] {
76
+ requiredBillingContactFields = requiredFieldsStrings.compactMap { fieldStr in
77
+ switch fieldStr {
78
+ case "name":
79
+ return .name
80
+ case "emailAddress":
81
+ return .emailAddress
82
+ case "phoneNumber":
83
+ return .phoneNumber
84
+ case "postalAddress":
85
+ return .postalAddress
86
+ default:
87
+ return nil // Ignore unknown values or handle accordingly
88
+ }
89
+ }
90
+ }
91
+
92
+ billingOptions = PrimerApplePayOptions.BillingOptions(
93
+ requiredBillingContactFields: requiredBillingContactFields
94
+ )
95
+ }
96
+
44
97
  applePayOptions = PrimerApplePayOptions(
45
98
  merchantIdentifier: rnApplePayMerchantIdentifier,
46
99
  merchantName: rnApplePayMerchantName,
47
100
  isCaptureBillingAddressEnabled: rnApplePayIsCaptureBillingAddressEnabled,
48
101
  showApplePayForUnsupportedDevice: rnApplePayShowApplePayForUnsupportedDevice,
49
- checkProvidedNetworks: rnApplePayCheckProvidedNetworks)
102
+ checkProvidedNetworks: rnApplePayCheckProvidedNetworks,
103
+ shippingOptions: shippingOptions,
104
+ billingOptions: billingOptions
105
+ )
50
106
  }
107
+
51
108
 
52
109
  var klarnaOptions: PrimerKlarnaOptions?
53
110
  if let rnKlarnaRecurringPaymentDescription = ((settingsJson["paymentMethodOptions"] as? [String: Any])?["klarnaOptions"] as? [String: Any])?["recurringPaymentDescription"] as? String {
@@ -18,7 +18,14 @@ RCT_EXTERN_METHOD(getPaymentMethodAsset:(NSString *)paymentMethodType
18
18
  resolver:(RCTPromiseResolveBlock)resolver
19
19
  rejecter:(RCTPromiseRejectBlock)rejecter)
20
20
 
21
+ RCT_EXTERN_METHOD(getPaymentMethodResource:(NSString *)paymentMethodType
22
+ resolver:(RCTPromiseResolveBlock)resolver
23
+ rejecter:(RCTPromiseRejectBlock)rejecter)
24
+
21
25
  RCT_EXTERN_METHOD(getPaymentMethodAssets:(RCTPromiseResolveBlock)resolver
22
26
  rejecter:(RCTPromiseRejectBlock)rejecter)
23
27
 
28
+ RCT_EXTERN_METHOD(getPaymentMethodResources:(RCTPromiseResolveBlock)resolver
29
+ rejecter:(RCTPromiseRejectBlock)rejecter)
30
+
24
31
  @end
@@ -116,4 +116,66 @@ class RNTPrimerHeadlessUniversalCheckoutAssetsManager: RCTEventEmitter {
116
116
  rejecter(error.rnError["errorId"]!, error.rnError["description"], error)
117
117
  }
118
118
  }
119
+
120
+ @objc
121
+ func getPaymentMethodResources(
122
+ _ resolver: RCTPromiseResolveBlock,
123
+ rejecter: RCTPromiseRejectBlock
124
+ ) {
125
+ do {
126
+ let paymentMethodResources = try PrimerSDK.PrimerHeadlessUniversalCheckout.AssetsManager
127
+ .getPaymentMethodAssets()
128
+
129
+ let rntPaymentMethodResources = paymentMethodResources.compactMap({
130
+ try? RNTPrimerPaymentMethodAsset(primerPaymentMethodAsset: $0).toJsonObject()
131
+ })
132
+ guard !rntPaymentMethodResources.isEmpty else {
133
+ let err = RNTNativeError(
134
+ errorId: "native-ios",
135
+ errorDescription: "Failed to find resources for this session",
136
+ recoverySuggestion: nil)
137
+ throw err
138
+ }
139
+
140
+ resolver(["paymentMethodResources": rntPaymentMethodResources])
141
+
142
+ } catch {
143
+ rejecter(error.rnError["errorId"]!, error.rnError["description"], error)
144
+ }
145
+ }
146
+
147
+ @objc
148
+ func getPaymentMethodResource(
149
+ _ paymentMethodType: String,
150
+ resolver: RCTPromiseResolveBlock,
151
+ rejecter: RCTPromiseRejectBlock
152
+ ) {
153
+ do {
154
+ guard
155
+ let paymentMethodResource = try PrimerSDK.PrimerHeadlessUniversalCheckout.AssetsManager
156
+ .getPaymentMethodAsset(for: paymentMethodType)
157
+ else {
158
+ let err = RNTNativeError(
159
+ errorId: "native-ios",
160
+ errorDescription: "Failed to find resource of \(paymentMethodType) for this session",
161
+ recoverySuggestion: nil)
162
+ throw err
163
+ }
164
+
165
+ if let rntPaymentMethodResource = try? RNTPrimerPaymentMethodAsset(
166
+ primerPaymentMethodAsset: paymentMethodResource
167
+ ).toJsonObject() {
168
+ resolver(["paymentMethodResource": rntPaymentMethodResource])
169
+ } else {
170
+ let err = RNTNativeError(
171
+ errorId: "native-ios",
172
+ errorDescription: "Failed to create the RNTPrimerPaymentMethodAsset",
173
+ recoverySuggestion: nil)
174
+ throw err
175
+ }
176
+
177
+ } catch {
178
+ rejecter(error.rnError["errorId"]!, error.rnError["description"], error)
179
+ }
180
+ }
119
181
  }
@@ -1,2 +1,2 @@
1
1
  // swiftlint:disable:next identifier_name
2
- public let PrimerReactNativeSDKVersion = "2.27.1"
2
+ public let PrimerReactNativeSDKVersion = "2.27.2"
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.PrimerGooglePayButtonConstants = exports.NativeResourceView = void 0;
7
+ var _reactNative = require("react-native");
8
+ var _PrimerGooglePayButton = require("./PrimerGooglePayButton");
9
+ var _react = _interopRequireDefault(require("react"));
10
+ var _NativeModules$Primer;
11
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
12
+ const NativeResourceView = ({
13
+ nativeViewName,
14
+ style,
15
+ onPress
16
+ }) => {
17
+ return /*#__PURE__*/_react.default.createElement(_reactNative.TouchableOpacity, {
18
+ onPress: onPress
19
+ }, nativeViewName === 'PrimerGooglePayButton' ? /*#__PURE__*/_react.default.createElement(_PrimerGooglePayButton.PrimerGooglePayButton, {
20
+ style: [styles.defaultContainer, style]
21
+ }) : null);
22
+ };
23
+ exports.NativeResourceView = NativeResourceView;
24
+ const PrimerGooglePayButtonConstants = exports.PrimerGooglePayButtonConstants = (_NativeModules$Primer = _reactNative.NativeModules.PrimerGooglePayButtonConstants) === null || _NativeModules$Primer === void 0 ? void 0 : _NativeModules$Primer.getConstants();
25
+ const styles = _reactNative.StyleSheet.create({
26
+ defaultContainer: {
27
+ minHeight: 75
28
+ }
29
+ });
30
+ //# sourceMappingURL=NativeResourceView.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"names":["_reactNative","require","_PrimerGooglePayButton","_react","_interopRequireDefault","_NativeModules$Primer","obj","__esModule","default","NativeResourceView","nativeViewName","style","onPress","createElement","TouchableOpacity","PrimerGooglePayButton","styles","defaultContainer","exports","PrimerGooglePayButtonConstants","NativeModules","getConstants","StyleSheet","create","minHeight"],"sourceRoot":"../../../../src","sources":["HeadlessUniversalCheckout/Components/NativeResourceView.tsx"],"mappings":";;;;;;AAAA,IAAAA,YAAA,GAAAC,OAAA;AACA,IAAAC,sBAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAC,sBAAA,CAAAH,OAAA;AAA0B,IAAAI,qBAAA;AAAA,SAAAD,uBAAAE,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAQnB,MAAMG,kBAAqD,GAAGA,CAAC;EAClEC,cAAc;EACdC,KAAK;EACLC;AACJ,CAAC,KAAK;EACF,oBACIT,MAAA,CAAAK,OAAA,CAAAK,aAAA,CAACb,YAAA,CAAAc,gBAAgB;IAACF,OAAO,EAAEA;EAAQ,GAC9BF,cAAc,KAAK,uBAAuB,gBACvCP,MAAA,CAAAK,OAAA,CAAAK,aAAA,CAACX,sBAAA,CAAAa,qBAAqB;IAACJ,KAAK,EAAE,CAACK,MAAM,CAACC,gBAAgB,EAAEN,KAAK;EAAE,CAAE,CAAC,GAClE,IACU,CAAC;AAE3B,CAAC;AAACO,OAAA,CAAAT,kBAAA,GAAAA,kBAAA;AAEK,MAAMU,8BAA8B,GAAAD,OAAA,CAAAC,8BAAA,IAAAd,qBAAA,GAAGe,0BAAa,CAACD,8BAA8B,cAAAd,qBAAA,uBAA5CA,qBAAA,CAA8CgB,YAAY,CAAC,CAAC;AAE1G,MAAML,MAAM,GAAGM,uBAAU,CAACC,MAAM,CAAC;EAC7BN,gBAAgB,EAAE;IACdO,SAAS,EAAE;EACf;AACJ,CAAC,CAAC"}