@klarna/react-native-klarna-network-payment 0.0.1 → 2.7.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/README.md +143 -29
- package/android/build.gradle +95 -0
- package/android/src/main/AndroidManifest.xml +1 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaNetworkPaymentButtonViewSpec.kt +22 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaNetworkPaymentModule.kt +46 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaNetworkPaymentModuleImpl.kt +163 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaNetworkPaymentPackage.kt +30 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentButtonPressEvent.kt +19 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentButtonViewManager.kt +276 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentPresentationMapper.kt +132 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentRequestMapper.kt +328 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentResponseMapper.kt +145 -0
- package/android/src/test/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaNetworkPaymentModuleImplTest.kt +361 -0
- package/android/src/test/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentButtonViewManagerTest.kt +155 -0
- package/android/src/test/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentPresentationMapperTest.kt +447 -0
- package/android/src/test/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentRequestMapperTest.kt +489 -0
- package/android/src/test/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentResponseMapperTest.kt +456 -0
- package/ios/Sources/KlarnaNetworkPayment.h +5 -0
- package/ios/Sources/KlarnaNetworkPayment.mm +110 -0
- package/ios/Sources/KlarnaNetworkPaymentModuleImpl.swift +196 -0
- package/ios/Sources/KlarnaPaymentButtonComponentView.mm +147 -0
- package/ios/Sources/KlarnaPaymentButtonViewImpl.swift +77 -0
- package/ios/Sources/KlarnaPaymentPresentationMapping.swift +102 -0
- package/ios/Sources/KlarnaPaymentRequestDataMapping.swift +232 -0
- package/ios/Sources/KlarnaPaymentRequestMapping.swift +103 -0
- package/ios/Tests/KlarnaNetworkPaymentModuleImplTests.swift +143 -0
- package/ios/Tests/KlarnaPaymentButtonViewImplTests.swift +122 -0
- package/ios/Tests/KlarnaPaymentPresentationMappingTests.swift +335 -0
- package/lib/commonjs/KlarnaNetworkPayment.js +6 -0
- package/lib/commonjs/KlarnaNetworkPayment.js.map +1 -0
- package/lib/commonjs/KlarnaNetworkPaymentImpl.js +44 -0
- package/lib/commonjs/KlarnaNetworkPaymentImpl.js.map +1 -0
- package/lib/commonjs/KlarnaNetworkPaymentMapper.js +164 -0
- package/lib/commonjs/KlarnaNetworkPaymentMapper.js.map +1 -0
- package/lib/commonjs/KlarnaPaymentButton.js +43 -0
- package/lib/commonjs/KlarnaPaymentButton.js.map +1 -0
- package/lib/commonjs/Specs/KlarnaPaymentButtonNativeComponent.js +10 -0
- package/lib/commonjs/Specs/KlarnaPaymentButtonNativeComponent.js.map +1 -0
- package/lib/commonjs/Specs/NativeKlarnaNetworkPayment.js +13 -0
- package/lib/commonjs/Specs/NativeKlarnaNetworkPayment.js.map +1 -0
- package/lib/commonjs/index.js +51 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/types/KlarnaPaymentRequest.js +6 -0
- package/lib/commonjs/types/KlarnaPaymentRequest.js.map +1 -0
- package/lib/commonjs/types/KlarnaPaymentRequestState.js +2 -0
- package/lib/commonjs/types/KlarnaPaymentRequestState.js.map +1 -0
- package/lib/commonjs/types/KlarnaPaymentRequestStateContext.js +6 -0
- package/lib/commonjs/types/KlarnaPaymentRequestStateContext.js.map +1 -0
- package/lib/commonjs/types/KlarnaPaymentRequestStateReason.js +2 -0
- package/lib/commonjs/types/KlarnaPaymentRequestStateReason.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaBillingPlan.js +6 -0
- package/lib/commonjs/types/models/KlarnaBillingPlan.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaCollectCustomerProfileType.js +2 -0
- package/lib/commonjs/types/models/KlarnaCollectCustomerProfileType.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaCustomer.js +6 -0
- package/lib/commonjs/types/models/KlarnaCustomer.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaFreeTrial.js +2 -0
- package/lib/commonjs/types/models/KlarnaFreeTrial.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaInterval.js +2 -0
- package/lib/commonjs/types/models/KlarnaInterval.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaLineItem.js +2 -0
- package/lib/commonjs/types/models/KlarnaLineItem.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaOndemandService.js +6 -0
- package/lib/commonjs/types/models/KlarnaOndemandService.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaPartnerCustomer.js +6 -0
- package/lib/commonjs/types/models/KlarnaPartnerCustomer.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaPaymentPresentation.js +6 -0
- package/lib/commonjs/types/models/KlarnaPaymentPresentation.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaPaymentRequestData.js +6 -0
- package/lib/commonjs/types/models/KlarnaPaymentRequestData.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaRequestCustomerToken.js +6 -0
- package/lib/commonjs/types/models/KlarnaRequestCustomerToken.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaRequestCustomerTokenScope.js +2 -0
- package/lib/commonjs/types/models/KlarnaRequestCustomerTokenScope.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaShipping.js +6 -0
- package/lib/commonjs/types/models/KlarnaShipping.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaShippingConfig.js +6 -0
- package/lib/commonjs/types/models/KlarnaShippingConfig.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaShippingConfigMode.js +2 -0
- package/lib/commonjs/types/models/KlarnaShippingConfigMode.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaShippingOption.js +6 -0
- package/lib/commonjs/types/models/KlarnaShippingOption.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaShippingRecipient.js +2 -0
- package/lib/commonjs/types/models/KlarnaShippingRecipient.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaShippingType.js +2 -0
- package/lib/commonjs/types/models/KlarnaShippingType.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaShippingTypeAttribute.js +2 -0
- package/lib/commonjs/types/models/KlarnaShippingTypeAttribute.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaSubscription.js +6 -0
- package/lib/commonjs/types/models/KlarnaSubscription.js.map +1 -0
- package/lib/commonjs/types/models/KlarnaSupplementaryPurchaseData.js +6 -0
- package/lib/commonjs/types/models/KlarnaSupplementaryPurchaseData.js.map +1 -0
- package/lib/commonjs/types/models/index.js +2 -0
- package/lib/commonjs/types/models/index.js.map +1 -0
- package/lib/module/KlarnaNetworkPayment.js +2 -0
- package/lib/module/KlarnaNetworkPayment.js.map +1 -0
- package/lib/module/KlarnaNetworkPaymentImpl.js +36 -0
- package/lib/module/KlarnaNetworkPaymentImpl.js.map +1 -0
- package/lib/module/KlarnaNetworkPaymentMapper.js +146 -0
- package/lib/module/KlarnaNetworkPaymentMapper.js.map +1 -0
- package/lib/module/KlarnaPaymentButton.js +37 -0
- package/lib/module/KlarnaPaymentButton.js.map +1 -0
- package/lib/module/Specs/KlarnaPaymentButtonNativeComponent.js +3 -0
- package/lib/module/Specs/KlarnaPaymentButtonNativeComponent.js.map +1 -0
- package/lib/module/Specs/NativeKlarnaNetworkPayment.js +9 -0
- package/lib/module/Specs/NativeKlarnaNetworkPayment.js.map +1 -0
- package/lib/module/index.js +40 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/types/KlarnaPaymentRequest.js +2 -0
- package/lib/module/types/KlarnaPaymentRequest.js.map +1 -0
- package/lib/module/types/KlarnaPaymentRequestState.js +2 -0
- package/lib/module/types/KlarnaPaymentRequestState.js.map +1 -0
- package/lib/module/types/KlarnaPaymentRequestStateContext.js +2 -0
- package/lib/module/types/KlarnaPaymentRequestStateContext.js.map +1 -0
- package/lib/module/types/KlarnaPaymentRequestStateReason.js +2 -0
- package/lib/module/types/KlarnaPaymentRequestStateReason.js.map +1 -0
- package/lib/module/types/models/KlarnaBillingPlan.js +2 -0
- package/lib/module/types/models/KlarnaBillingPlan.js.map +1 -0
- package/lib/module/types/models/KlarnaCollectCustomerProfileType.js +2 -0
- package/lib/module/types/models/KlarnaCollectCustomerProfileType.js.map +1 -0
- package/lib/module/types/models/KlarnaCustomer.js +2 -0
- package/lib/module/types/models/KlarnaCustomer.js.map +1 -0
- package/lib/module/types/models/KlarnaFreeTrial.js +2 -0
- package/lib/module/types/models/KlarnaFreeTrial.js.map +1 -0
- package/lib/module/types/models/KlarnaInterval.js +2 -0
- package/lib/module/types/models/KlarnaInterval.js.map +1 -0
- package/lib/module/types/models/KlarnaLineItem.js +2 -0
- package/lib/module/types/models/KlarnaLineItem.js.map +1 -0
- package/lib/module/types/models/KlarnaOndemandService.js +2 -0
- package/lib/module/types/models/KlarnaOndemandService.js.map +1 -0
- package/lib/module/types/models/KlarnaPartnerCustomer.js +2 -0
- package/lib/module/types/models/KlarnaPartnerCustomer.js.map +1 -0
- package/lib/module/types/models/KlarnaPaymentPresentation.js +2 -0
- package/lib/module/types/models/KlarnaPaymentPresentation.js.map +1 -0
- package/lib/module/types/models/KlarnaPaymentRequestData.js +2 -0
- package/lib/module/types/models/KlarnaPaymentRequestData.js.map +1 -0
- package/lib/module/types/models/KlarnaRequestCustomerToken.js +2 -0
- package/lib/module/types/models/KlarnaRequestCustomerToken.js.map +1 -0
- package/lib/module/types/models/KlarnaRequestCustomerTokenScope.js +2 -0
- package/lib/module/types/models/KlarnaRequestCustomerTokenScope.js.map +1 -0
- package/lib/module/types/models/KlarnaShipping.js +2 -0
- package/lib/module/types/models/KlarnaShipping.js.map +1 -0
- package/lib/module/types/models/KlarnaShippingConfig.js +2 -0
- package/lib/module/types/models/KlarnaShippingConfig.js.map +1 -0
- package/lib/module/types/models/KlarnaShippingConfigMode.js +2 -0
- package/lib/module/types/models/KlarnaShippingConfigMode.js.map +1 -0
- package/lib/module/types/models/KlarnaShippingOption.js +2 -0
- package/lib/module/types/models/KlarnaShippingOption.js.map +1 -0
- package/lib/module/types/models/KlarnaShippingRecipient.js +2 -0
- package/lib/module/types/models/KlarnaShippingRecipient.js.map +1 -0
- package/lib/module/types/models/KlarnaShippingType.js +2 -0
- package/lib/module/types/models/KlarnaShippingType.js.map +1 -0
- package/lib/module/types/models/KlarnaShippingTypeAttribute.js +2 -0
- package/lib/module/types/models/KlarnaShippingTypeAttribute.js.map +1 -0
- package/lib/module/types/models/KlarnaSubscription.js +2 -0
- package/lib/module/types/models/KlarnaSubscription.js.map +1 -0
- package/lib/module/types/models/KlarnaSupplementaryPurchaseData.js +2 -0
- package/lib/module/types/models/KlarnaSupplementaryPurchaseData.js.map +1 -0
- package/lib/module/types/models/index.js +2 -0
- package/lib/module/types/models/index.js.map +1 -0
- package/lib/typescript/KlarnaNetworkPayment.d.ts +22 -0
- package/lib/typescript/KlarnaNetworkPayment.d.ts.map +1 -0
- package/lib/typescript/KlarnaNetworkPaymentImpl.d.ts +12 -0
- package/lib/typescript/KlarnaNetworkPaymentImpl.d.ts.map +1 -0
- package/lib/typescript/KlarnaNetworkPaymentMapper.d.ts +273 -0
- package/lib/typescript/KlarnaNetworkPaymentMapper.d.ts.map +1 -0
- package/lib/typescript/KlarnaPaymentButton.d.ts +51 -0
- package/lib/typescript/KlarnaPaymentButton.d.ts.map +1 -0
- package/lib/typescript/Specs/KlarnaPaymentButtonNativeComponent.d.ts +16 -0
- package/lib/typescript/Specs/KlarnaPaymentButtonNativeComponent.d.ts.map +1 -0
- package/lib/typescript/Specs/NativeKlarnaNetworkPayment.d.ts +13 -0
- package/lib/typescript/Specs/NativeKlarnaNetworkPayment.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +14 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/types/KlarnaPaymentRequest.d.ts +19 -0
- package/lib/typescript/types/KlarnaPaymentRequest.d.ts.map +1 -0
- package/lib/typescript/types/KlarnaPaymentRequestState.d.ts +15 -0
- package/lib/typescript/types/KlarnaPaymentRequestState.d.ts.map +1 -0
- package/lib/typescript/types/KlarnaPaymentRequestStateContext.d.ts +12 -0
- package/lib/typescript/types/KlarnaPaymentRequestStateContext.d.ts.map +1 -0
- package/lib/typescript/types/KlarnaPaymentRequestStateReason.d.ts +13 -0
- package/lib/typescript/types/KlarnaPaymentRequestStateReason.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaBillingPlan.d.ts +17 -0
- package/lib/typescript/types/models/KlarnaBillingPlan.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaCollectCustomerProfileType.d.ts +19 -0
- package/lib/typescript/types/models/KlarnaCollectCustomerProfileType.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaCustomer.d.ts +11 -0
- package/lib/typescript/types/models/KlarnaCustomer.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaFreeTrial.d.ts +7 -0
- package/lib/typescript/types/models/KlarnaFreeTrial.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaInterval.d.ts +11 -0
- package/lib/typescript/types/models/KlarnaInterval.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaLineItem.d.ts +28 -0
- package/lib/typescript/types/models/KlarnaLineItem.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaOndemandService.d.ts +17 -0
- package/lib/typescript/types/models/KlarnaOndemandService.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaPartnerCustomer.d.ts +15 -0
- package/lib/typescript/types/models/KlarnaPartnerCustomer.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaPaymentPresentation.d.ts +119 -0
- package/lib/typescript/types/models/KlarnaPaymentPresentation.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaPaymentRequestData.d.ts +24 -0
- package/lib/typescript/types/models/KlarnaPaymentRequestData.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaRequestCustomerToken.d.ts +9 -0
- package/lib/typescript/types/models/KlarnaRequestCustomerToken.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaRequestCustomerTokenScope.d.ts +9 -0
- package/lib/typescript/types/models/KlarnaRequestCustomerTokenScope.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaShipping.d.ts +15 -0
- package/lib/typescript/types/models/KlarnaShipping.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaShippingConfig.d.ts +9 -0
- package/lib/typescript/types/models/KlarnaShippingConfig.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaShippingConfigMode.d.ts +5 -0
- package/lib/typescript/types/models/KlarnaShippingConfigMode.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaShippingOption.d.ts +12 -0
- package/lib/typescript/types/models/KlarnaShippingOption.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaShippingRecipient.d.ts +14 -0
- package/lib/typescript/types/models/KlarnaShippingRecipient.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaShippingType.d.ts +25 -0
- package/lib/typescript/types/models/KlarnaShippingType.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaShippingTypeAttribute.d.ts +21 -0
- package/lib/typescript/types/models/KlarnaShippingTypeAttribute.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaSubscription.d.ts +14 -0
- package/lib/typescript/types/models/KlarnaSubscription.d.ts.map +1 -0
- package/lib/typescript/types/models/KlarnaSupplementaryPurchaseData.d.ts +21 -0
- package/lib/typescript/types/models/KlarnaSupplementaryPurchaseData.d.ts.map +1 -0
- package/lib/typescript/types/models/index.d.ts +22 -0
- package/lib/typescript/types/models/index.d.ts.map +1 -0
- package/package.json +120 -6
- package/react-native-klarna-network-payment.podspec +28 -0
- package/src/KlarnaNetworkPayment.ts +30 -0
- package/src/KlarnaNetworkPaymentImpl.ts +79 -0
- package/src/KlarnaNetworkPaymentMapper.ts +204 -0
- package/src/KlarnaPaymentButton.tsx +80 -0
- package/src/Specs/KlarnaPaymentButtonNativeComponent.ts +22 -0
- package/src/Specs/NativeKlarnaNetworkPayment.ts +17 -0
- package/src/index.tsx +63 -0
- package/src/types/KlarnaPaymentRequest.ts +19 -0
- package/src/types/KlarnaPaymentRequestState.ts +14 -0
- package/src/types/KlarnaPaymentRequestStateContext.ts +12 -0
- package/src/types/KlarnaPaymentRequestStateReason.ts +12 -0
- package/src/types/models/KlarnaBillingPlan.ts +17 -0
- package/src/types/models/KlarnaCollectCustomerProfileType.ts +18 -0
- package/src/types/models/KlarnaCustomer.ts +11 -0
- package/src/types/models/KlarnaFreeTrial.ts +6 -0
- package/src/types/models/KlarnaInterval.ts +10 -0
- package/src/types/models/KlarnaLineItem.ts +27 -0
- package/src/types/models/KlarnaOndemandService.ts +17 -0
- package/src/types/models/KlarnaPartnerCustomer.ts +15 -0
- package/src/types/models/KlarnaPaymentPresentation.ts +135 -0
- package/src/types/models/KlarnaPaymentRequestData.ts +24 -0
- package/src/types/models/KlarnaRequestCustomerToken.ts +9 -0
- package/src/types/models/KlarnaRequestCustomerTokenScope.ts +8 -0
- package/src/types/models/KlarnaShipping.ts +15 -0
- package/src/types/models/KlarnaShippingConfig.ts +9 -0
- package/src/types/models/KlarnaShippingConfigMode.ts +4 -0
- package/src/types/models/KlarnaShippingOption.ts +12 -0
- package/src/types/models/KlarnaShippingRecipient.ts +13 -0
- package/src/types/models/KlarnaShippingType.ts +24 -0
- package/src/types/models/KlarnaShippingTypeAttribute.ts +20 -0
- package/src/types/models/KlarnaSubscription.ts +14 -0
- package/src/types/models/KlarnaSupplementaryPurchaseData.ts +21 -0
- package/src/types/models/index.ts +35 -0
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
import KlarnaNetworkPayment
|
|
3
|
+
@_spi(RNKlarnaNetworkCore) import react_native_klarna_network_core
|
|
4
|
+
|
|
5
|
+
// MARK: - PresentationContentStore
|
|
6
|
+
|
|
7
|
+
// Written and read from the JS thread and SDK callbacks (arbitrary threads).
|
|
8
|
+
// A serial queue serializes all access to prevent data races.
|
|
9
|
+
final class PresentationContentStore {
|
|
10
|
+
private let queue = DispatchQueue(label: "com.klarna.rnnetworkpayment.presentationcontent")
|
|
11
|
+
private var storage: [String: KlarnaPaymentPresentationContent] = [:]
|
|
12
|
+
|
|
13
|
+
subscript(key: String) -> KlarnaPaymentPresentationContent? {
|
|
14
|
+
get { queue.sync { storage[key] } }
|
|
15
|
+
set { queue.sync { storage[key] = newValue } }
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
@discardableResult
|
|
19
|
+
func removeValue(forKey key: String) -> KlarnaPaymentPresentationContent? {
|
|
20
|
+
queue.sync { storage.removeValue(forKey: key) }
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// MARK: - KlarnaNetworkPaymentModuleImpl
|
|
25
|
+
|
|
26
|
+
@objc(KlarnaNetworkPaymentModuleImpl)
|
|
27
|
+
public class KlarnaNetworkPaymentModuleImpl: NSObject {
|
|
28
|
+
|
|
29
|
+
private static let moduleName = "KlarnaNetworkPayment"
|
|
30
|
+
private static let errorInstanceNotFound = "No instance found for the given instanceId. Call initialize first."
|
|
31
|
+
private static let errorInvalidData = "Invalid payment request data."
|
|
32
|
+
private static let errorNoPresentationContent = "No presentation content found. Call presentationFetch first."
|
|
33
|
+
private static let errorAmountRequired = "Amount is required"
|
|
34
|
+
private static let errorCurrencyRequired = "Currency is required"
|
|
35
|
+
|
|
36
|
+
private static let storedPresentationContent = PresentationContentStore()
|
|
37
|
+
|
|
38
|
+
@objc public func initiateWithId(
|
|
39
|
+
instanceId: String,
|
|
40
|
+
paymentRequestId: String,
|
|
41
|
+
resolve: @escaping (Any?) -> Void,
|
|
42
|
+
reject: @escaping (String?, String?, Error?) -> Void
|
|
43
|
+
) {
|
|
44
|
+
guard let sdk = KlarnaNetworkCoreModuleImpl.getInstance(instanceId: instanceId) else {
|
|
45
|
+
reject(Self.moduleName, Self.errorInstanceNotFound, nil)
|
|
46
|
+
return
|
|
47
|
+
}
|
|
48
|
+
sdk.payment.initiate(paymentRequestId: paymentRequestId) { result in
|
|
49
|
+
switch result {
|
|
50
|
+
case .success(let paymentRequest):
|
|
51
|
+
resolve(paymentRequest.toDictionary())
|
|
52
|
+
case .failure(let error):
|
|
53
|
+
reject(error.name, error.message, nil)
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
@objc public func initiateWithData(
|
|
59
|
+
instanceId: String,
|
|
60
|
+
data: NSDictionary,
|
|
61
|
+
resolve: @escaping (Any?) -> Void,
|
|
62
|
+
reject: @escaping (String?, String?, Error?) -> Void
|
|
63
|
+
) {
|
|
64
|
+
guard let sdk = KlarnaNetworkCoreModuleImpl.getInstance(instanceId: instanceId) else {
|
|
65
|
+
reject(Self.moduleName, Self.errorInstanceNotFound, nil)
|
|
66
|
+
return
|
|
67
|
+
}
|
|
68
|
+
guard data["amount"] is NSNumber else {
|
|
69
|
+
reject(Self.moduleName, Self.errorAmountRequired, nil)
|
|
70
|
+
return
|
|
71
|
+
}
|
|
72
|
+
guard let currency = data["currency"] as? String, !currency.isEmpty else {
|
|
73
|
+
reject(Self.moduleName, Self.errorCurrencyRequired, nil)
|
|
74
|
+
return
|
|
75
|
+
}
|
|
76
|
+
guard let paymentRequestData = klarnaPaymentRequestData(from: data) else {
|
|
77
|
+
reject(Self.moduleName, Self.errorInvalidData, nil)
|
|
78
|
+
return
|
|
79
|
+
}
|
|
80
|
+
sdk.payment.initiate(paymentRequestData: paymentRequestData) { result in
|
|
81
|
+
switch result {
|
|
82
|
+
case .success(let paymentRequest):
|
|
83
|
+
resolve(paymentRequest.toDictionary())
|
|
84
|
+
case .failure(let error):
|
|
85
|
+
reject(error.name, error.message, nil)
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
@objc public func fetch(
|
|
91
|
+
instanceId: String,
|
|
92
|
+
paymentRequestId: String,
|
|
93
|
+
resolve: @escaping (Any?) -> Void,
|
|
94
|
+
reject: @escaping (String?, String?, Error?) -> Void
|
|
95
|
+
) {
|
|
96
|
+
guard let sdk = KlarnaNetworkCoreModuleImpl.getInstance(instanceId: instanceId) else {
|
|
97
|
+
reject(Self.moduleName, Self.errorInstanceNotFound, nil)
|
|
98
|
+
return
|
|
99
|
+
}
|
|
100
|
+
sdk.payment.fetch(paymentRequestId: paymentRequestId) { result in
|
|
101
|
+
switch result {
|
|
102
|
+
case .success(let paymentRequest):
|
|
103
|
+
resolve(paymentRequest.toDictionary())
|
|
104
|
+
case .failure(let error):
|
|
105
|
+
reject(error.name, error.message, nil)
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
@objc public func cancel(
|
|
111
|
+
instanceId: String,
|
|
112
|
+
paymentRequestId: String,
|
|
113
|
+
resolve: @escaping (Any?) -> Void,
|
|
114
|
+
reject: @escaping (String?, String?, Error?) -> Void
|
|
115
|
+
) {
|
|
116
|
+
guard let sdk = KlarnaNetworkCoreModuleImpl.getInstance(instanceId: instanceId) else {
|
|
117
|
+
reject(Self.moduleName, Self.errorInstanceNotFound, nil)
|
|
118
|
+
return
|
|
119
|
+
}
|
|
120
|
+
sdk.payment.cancel(paymentRequestId: paymentRequestId) { result in
|
|
121
|
+
switch result {
|
|
122
|
+
case .success(let paymentRequest):
|
|
123
|
+
resolve(paymentRequest.toDictionary())
|
|
124
|
+
case .failure(let error):
|
|
125
|
+
reject(error.name, error.message, nil)
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
@objc public func presentationFetch(
|
|
131
|
+
instanceId: String,
|
|
132
|
+
data: NSDictionary,
|
|
133
|
+
resolve: @escaping (Any?) -> Void,
|
|
134
|
+
reject: @escaping (String?, String?, Error?) -> Void
|
|
135
|
+
) {
|
|
136
|
+
guard let sdk = KlarnaNetworkCoreModuleImpl.getInstance(instanceId: instanceId) else {
|
|
137
|
+
reject(Self.moduleName, Self.errorInstanceNotFound, nil)
|
|
138
|
+
return
|
|
139
|
+
}
|
|
140
|
+
guard let presentationData = klarnaPaymentPresentationData(from: data) else {
|
|
141
|
+
reject(Self.moduleName, Self.errorInvalidData, nil)
|
|
142
|
+
return
|
|
143
|
+
}
|
|
144
|
+
DispatchQueue.main.async {
|
|
145
|
+
sdk.payment.presentation.fetch(data: presentationData) { result in
|
|
146
|
+
switch result {
|
|
147
|
+
case .success(let content):
|
|
148
|
+
if KlarnaNetworkCoreModuleImpl.getInstance(instanceId: instanceId) != nil {
|
|
149
|
+
Self.storedPresentationContent[instanceId] = content
|
|
150
|
+
}
|
|
151
|
+
resolve(content.toDictionary())
|
|
152
|
+
case .failure(let error):
|
|
153
|
+
reject(error.name, error.message, nil)
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
@objc public func dispose(
|
|
160
|
+
instanceId: String,
|
|
161
|
+
resolve: @escaping (Any?) -> Void,
|
|
162
|
+
reject: @escaping (String?, String?, Error?) -> Void
|
|
163
|
+
) {
|
|
164
|
+
Self.storedPresentationContent.removeValue(forKey: instanceId)
|
|
165
|
+
resolve(nil)
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
@objc public func presentationHandleLink(
|
|
169
|
+
instanceId: String,
|
|
170
|
+
url: String,
|
|
171
|
+
resolve: @escaping (Any?) -> Void,
|
|
172
|
+
reject: @escaping (String?, String?, Error?) -> Void
|
|
173
|
+
) {
|
|
174
|
+
guard let sdk = KlarnaNetworkCoreModuleImpl.getInstance(instanceId: instanceId) else {
|
|
175
|
+
reject(Self.moduleName, Self.errorInstanceNotFound, nil)
|
|
176
|
+
return
|
|
177
|
+
}
|
|
178
|
+
guard let content = Self.storedPresentationContent[instanceId] else {
|
|
179
|
+
reject(Self.moduleName, Self.errorNoPresentationContent, nil)
|
|
180
|
+
return
|
|
181
|
+
}
|
|
182
|
+
DispatchQueue.main.async {
|
|
183
|
+
sdk.payment.presentation.handleLink(content: content, url: url) { result in
|
|
184
|
+
switch result {
|
|
185
|
+
case .success(let newContent):
|
|
186
|
+
if KlarnaNetworkCoreModuleImpl.getInstance(instanceId: instanceId) != nil {
|
|
187
|
+
Self.storedPresentationContent[instanceId] = newContent
|
|
188
|
+
}
|
|
189
|
+
resolve(newContent.toDictionary())
|
|
190
|
+
case .failure(let error):
|
|
191
|
+
reject(error.name, error.message, nil)
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
#import <React/RCTViewComponentView.h>
|
|
2
|
+
#import <UIKit/UIKit.h>
|
|
3
|
+
#import <react/renderer/components/KlarnaNetworkPaymentSpec/ComponentDescriptors.h>
|
|
4
|
+
#import <react/renderer/components/KlarnaNetworkPaymentSpec/EventEmitters.h>
|
|
5
|
+
#import <react/renderer/components/KlarnaNetworkPaymentSpec/Props.h>
|
|
6
|
+
#import <react/renderer/components/KlarnaNetworkPaymentSpec/RCTComponentViewHelpers.h>
|
|
7
|
+
#import "RCTFabricComponentsPlugins.h"
|
|
8
|
+
#import "RCTConversions.h"
|
|
9
|
+
// Framework form resolves under use_frameworks!; quoted form is the headermap fallback for static builds.
|
|
10
|
+
#if __has_include(<react_native_klarna_network_payment/react_native_klarna_network_payment-Swift.h>)
|
|
11
|
+
#import <react_native_klarna_network_payment/react_native_klarna_network_payment-Swift.h>
|
|
12
|
+
#else
|
|
13
|
+
#import "react_native_klarna_network_payment-Swift.h"
|
|
14
|
+
#endif
|
|
15
|
+
|
|
16
|
+
using namespace facebook::react;
|
|
17
|
+
|
|
18
|
+
@interface KlarnaPaymentButtonComponentView : RCTViewComponentView <UIGestureRecognizerDelegate>
|
|
19
|
+
@property (nonatomic, strong) UIView *buttonView;
|
|
20
|
+
@end
|
|
21
|
+
|
|
22
|
+
@implementation KlarnaPaymentButtonComponentView
|
|
23
|
+
|
|
24
|
+
- (instancetype)initWithFrame:(CGRect)frame
|
|
25
|
+
{
|
|
26
|
+
self = [super initWithFrame:frame];
|
|
27
|
+
if (self) {
|
|
28
|
+
self.backgroundColor = [UIColor clearColor];
|
|
29
|
+
static const auto defaultProps = std::make_shared<const KlarnaNetworkPaymentButtonProps>();
|
|
30
|
+
_props = defaultProps;
|
|
31
|
+
}
|
|
32
|
+
return self;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
+ (ComponentDescriptorProvider)componentDescriptorProvider
|
|
36
|
+
{
|
|
37
|
+
return concreteComponentDescriptorProvider<KlarnaNetworkPaymentButtonComponentDescriptor>();
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
Class<RCTComponentViewProtocol> KlarnaNetworkPaymentButtonCls(void)
|
|
41
|
+
{
|
|
42
|
+
return KlarnaPaymentButtonComponentView.class;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
- (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps
|
|
46
|
+
{
|
|
47
|
+
const auto &newViewProps = *std::static_pointer_cast<KlarnaNetworkPaymentButtonProps const>(props);
|
|
48
|
+
const auto &oldViewProps = *std::static_pointer_cast<KlarnaNetworkPaymentButtonProps const>(_props);
|
|
49
|
+
|
|
50
|
+
BOOL propsChanged = (newViewProps.instanceId != oldViewProps.instanceId)
|
|
51
|
+
|| (newViewProps.intent != oldViewProps.intent)
|
|
52
|
+
|| (newViewProps.shape != oldViewProps.shape)
|
|
53
|
+
|| (newViewProps.buttonStyle != oldViewProps.buttonStyle)
|
|
54
|
+
|| (newViewProps.theme != oldViewProps.theme);
|
|
55
|
+
|
|
56
|
+
if (propsChanged) {
|
|
57
|
+
[self _tearDown];
|
|
58
|
+
|
|
59
|
+
NSString *instanceId = [[NSString alloc] initWithUTF8String: newViewProps.instanceId.c_str()];
|
|
60
|
+
NSString *state = newViewProps.state.empty() ? nil : [[NSString alloc] initWithUTF8String: newViewProps.state.c_str()];
|
|
61
|
+
NSString *intent = newViewProps.intent.empty() ? nil : [[NSString alloc] initWithUTF8String: newViewProps.intent.c_str()];
|
|
62
|
+
NSString *shape = newViewProps.shape.empty() ? nil : [[NSString alloc] initWithUTF8String:newViewProps.shape.c_str()];
|
|
63
|
+
NSString *buttonStyle = newViewProps.buttonStyle.empty() ? nil : [[NSString alloc] initWithUTF8String: newViewProps.buttonStyle.c_str()];
|
|
64
|
+
NSString *theme = newViewProps.theme.empty() ? nil : [[NSString alloc] initWithUTF8String: newViewProps.theme.c_str()];
|
|
65
|
+
|
|
66
|
+
[self _createButtonWithInstanceId: instanceId
|
|
67
|
+
state: state
|
|
68
|
+
intent: intent
|
|
69
|
+
shape: shape
|
|
70
|
+
buttonStyle: buttonStyle
|
|
71
|
+
theme: theme];
|
|
72
|
+
} else if (newViewProps.state != oldViewProps.state) {
|
|
73
|
+
NSString *state = newViewProps.state.empty() ? nil : [[NSString alloc] initWithUTF8String: newViewProps.state.c_str()];
|
|
74
|
+
[KlarnaPaymentButtonViewImpl updateState: state onButton: _buttonView];
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
[super updateProps: props oldProps: oldProps];
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
- (void)updateLayoutMetrics:(const facebook::react::LayoutMetrics &)layoutMetrics oldLayoutMetrics:(const facebook::react::LayoutMetrics &)oldLayoutMetrics {
|
|
81
|
+
[super updateLayoutMetrics: layoutMetrics oldLayoutMetrics: oldLayoutMetrics];
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
- (void)_createButtonWithInstanceId:(NSString *)instanceId
|
|
85
|
+
state:(NSString *)state
|
|
86
|
+
intent:(NSString *)intent
|
|
87
|
+
shape:(NSString *)shape
|
|
88
|
+
buttonStyle:(NSString *)buttonStyle
|
|
89
|
+
theme:(NSString *)theme
|
|
90
|
+
{
|
|
91
|
+
UIView *button = [KlarnaPaymentButtonViewImpl makeButtonWithInstanceId: instanceId
|
|
92
|
+
state: state
|
|
93
|
+
intent: intent
|
|
94
|
+
shape: shape
|
|
95
|
+
buttonStyle: buttonStyle
|
|
96
|
+
theme: theme];
|
|
97
|
+
if (!button) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
button.translatesAutoresizingMaskIntoConstraints = NO;
|
|
102
|
+
[self addSubview:button];
|
|
103
|
+
[NSLayoutConstraint activateConstraints:@[
|
|
104
|
+
[button.topAnchor constraintEqualToAnchor: self.topAnchor],
|
|
105
|
+
[button.bottomAnchor constraintEqualToAnchor: self.bottomAnchor],
|
|
106
|
+
[button.leadingAnchor constraintEqualToAnchor: self.leadingAnchor],
|
|
107
|
+
[button.trailingAnchor constraintEqualToAnchor: self.trailingAnchor],
|
|
108
|
+
]];
|
|
109
|
+
|
|
110
|
+
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
|
|
111
|
+
initWithTarget: self action: @selector(_onButtonTapped)];
|
|
112
|
+
tap.cancelsTouchesInView = NO;
|
|
113
|
+
tap.delegate = self;
|
|
114
|
+
[button addGestureRecognizer: tap];
|
|
115
|
+
|
|
116
|
+
_buttonView = button;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
- (void)_tearDown
|
|
120
|
+
{
|
|
121
|
+
[_buttonView removeFromSuperview];
|
|
122
|
+
_buttonView = nil;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
- (void)_onButtonTapped
|
|
126
|
+
{
|
|
127
|
+
if (_eventEmitter) {
|
|
128
|
+
std::dynamic_pointer_cast<const KlarnaNetworkPaymentButtonEventEmitter>(_eventEmitter)
|
|
129
|
+
->onButtonPress(KlarnaNetworkPaymentButtonEventEmitter::OnButtonPress{});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
- (void)layoutSubviews {
|
|
134
|
+
[super layoutSubviews];
|
|
135
|
+
CGRect rect = RCTCGRectFromRect(_layoutMetrics.frame);
|
|
136
|
+
_buttonView.frame.size = rect.size;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
#pragma mark - UIGestureRecognizerDelegate
|
|
140
|
+
|
|
141
|
+
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
|
|
142
|
+
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
|
|
143
|
+
{
|
|
144
|
+
return YES;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
@end
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
import KlarnaCore
|
|
3
|
+
import KlarnaNetworkCore
|
|
4
|
+
import KlarnaNetworkPayment
|
|
5
|
+
@_spi(RNKlarnaNetworkCore) import react_native_klarna_network_core
|
|
6
|
+
|
|
7
|
+
@objc(KlarnaPaymentButtonViewImpl)
|
|
8
|
+
public class KlarnaPaymentButtonViewImpl: NSObject {
|
|
9
|
+
|
|
10
|
+
@objc public static func updateState(_ state: String?, onButton button: UIView?) {
|
|
11
|
+
guard let paymentButton = button as? KlarnaPaymentButton else { return }
|
|
12
|
+
paymentButton.state = parseState(state)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
@objc public static func makeButton(
|
|
16
|
+
instanceId: String,
|
|
17
|
+
state: String?,
|
|
18
|
+
intent: String?,
|
|
19
|
+
shape: String?,
|
|
20
|
+
buttonStyle: String?,
|
|
21
|
+
theme: String?
|
|
22
|
+
) -> UIView? {
|
|
23
|
+
guard let klarna = KlarnaNetworkCoreModuleImpl.getInstance(instanceId: instanceId) else {
|
|
24
|
+
return nil
|
|
25
|
+
}
|
|
26
|
+
let configuration = KlarnaPaymentButtonConfiguration(
|
|
27
|
+
state: parseState(state),
|
|
28
|
+
intent: parseIntent(intent),
|
|
29
|
+
shape: parseShape(shape),
|
|
30
|
+
style: parseStyle(buttonStyle),
|
|
31
|
+
theme: parseTheme(theme)
|
|
32
|
+
)
|
|
33
|
+
return KlarnaPaymentButton(klarna: klarna, configuration: configuration)
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
static func parseState(_ value: String?) -> KlarnaButtonState {
|
|
37
|
+
switch value {
|
|
38
|
+
case "disabled": return .disabled
|
|
39
|
+
case "loading": return .loading
|
|
40
|
+
default: return .default
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
static func parseIntent(_ value: String?) -> KlarnaPaymentButtonIntent {
|
|
45
|
+
switch value {
|
|
46
|
+
case "subscribe": return .subscribe
|
|
47
|
+
case "addToWallet": return .addToWallet
|
|
48
|
+
default: return .pay
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
static func parseShape(_ value: String?) -> KlarnaButtonShape {
|
|
53
|
+
switch value {
|
|
54
|
+
case "roundedRect": return .roundedRect
|
|
55
|
+
case "pill": return .pill
|
|
56
|
+
case "rectangle": return .rectangle
|
|
57
|
+
default: return .roundedRect
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
static func parseStyle(_ value: String?) -> KlarnaButtonStyle {
|
|
62
|
+
switch value {
|
|
63
|
+
case "filled": return .filled
|
|
64
|
+
case "outlined": return .outlined
|
|
65
|
+
default: return .filled
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
static func parseTheme(_ value: String?) -> KlarnaTheme {
|
|
70
|
+
switch value {
|
|
71
|
+
case "light": return .light
|
|
72
|
+
case "dark": return .dark
|
|
73
|
+
case "automatic": return .automatic
|
|
74
|
+
default: return .dark
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
import KlarnaNetworkPayment
|
|
3
|
+
|
|
4
|
+
// MARK: - Input mapping (NSDictionary → KlarnaPaymentPresentationData)
|
|
5
|
+
|
|
6
|
+
func klarnaPaymentPresentationData(from dict: NSDictionary) -> KlarnaPaymentPresentationData? {
|
|
7
|
+
guard let amount = dict["amount"] as? NSNumber,
|
|
8
|
+
let currency = dict["currency"] as? String else { return nil }
|
|
9
|
+
return KlarnaPaymentPresentationData(
|
|
10
|
+
amount: amount.int64Value,
|
|
11
|
+
currency: currency,
|
|
12
|
+
intent: (dict["intent"] as? String).flatMap { KlarnaPaymentPresentationIntent(rawValue: $0) },
|
|
13
|
+
paymentProgramEnablementCodes: dict["paymentProgramEnablementCodes"] as? [String],
|
|
14
|
+
subscriptionBillingInterval: (dict["subscriptionBillingInterval"] as? String)
|
|
15
|
+
.flatMap { KlarnaInterval(rawValue: $0) },
|
|
16
|
+
subscriptionBillingIntervalFrequency: (dict["subscriptionBillingIntervalFrequency"] as? Double)
|
|
17
|
+
.map { Int($0) }
|
|
18
|
+
)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// MARK: - Output mapping (KlarnaPaymentPresentationContent → NSDictionary)
|
|
22
|
+
|
|
23
|
+
extension KlarnaPaymentPresentationContent {
|
|
24
|
+
func toDictionary() -> NSDictionary {
|
|
25
|
+
let dict = NSMutableDictionary()
|
|
26
|
+
dict["instruction"] = instruction.rawValue
|
|
27
|
+
dict["paymentStatus"] = paymentStatus?.rawValue ?? NSNull()
|
|
28
|
+
dict["paymentOption"] = paymentOption?.toDictionary() ?? NSNull()
|
|
29
|
+
dict["savedPaymentOption"] = savedPaymentOption?.toDictionary() ?? NSNull()
|
|
30
|
+
return dict
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
private extension KlarnaPaymentPresentationPaymentOption {
|
|
35
|
+
func toDictionary() -> NSDictionary {
|
|
36
|
+
let dict = NSMutableDictionary()
|
|
37
|
+
dict["paymentOptionId"] = paymentOptionId
|
|
38
|
+
dict["header"] = header?.toDictionary() ?? NSNull()
|
|
39
|
+
dict["badge"] = badge?.toDictionary() ?? NSNull()
|
|
40
|
+
dict["subheader"] = subheader?.toDictionary() ?? NSNull()
|
|
41
|
+
dict["message"] = message?.toDictionary() ?? NSNull()
|
|
42
|
+
dict["terms"] = terms?.toDictionary() ?? NSNull()
|
|
43
|
+
dict["paymentButton"] = paymentButton?.toDictionary() ?? NSNull()
|
|
44
|
+
dict["icon"] = icon?.toDictionary() ?? NSNull()
|
|
45
|
+
return dict
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
private extension KlarnaPaymentPresentationText {
|
|
50
|
+
func toDictionary() -> NSDictionary {
|
|
51
|
+
let dict = NSMutableDictionary()
|
|
52
|
+
switch self {
|
|
53
|
+
case .plainText(let text):
|
|
54
|
+
dict["type"] = "plainText"
|
|
55
|
+
dict["text"] = text
|
|
56
|
+
case .attributedText(let parts):
|
|
57
|
+
dict["type"] = "attributedText"
|
|
58
|
+
dict["parts"] = parts?.map { $0.toDictionary() } ?? NSNull()
|
|
59
|
+
}
|
|
60
|
+
return dict
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
private extension KlarnaPaymentPresentationTextPart {
|
|
65
|
+
func toDictionary() -> NSDictionary {
|
|
66
|
+
let dict = NSMutableDictionary()
|
|
67
|
+
switch self {
|
|
68
|
+
case .plain(let styles, let text):
|
|
69
|
+
dict["type"] = "plain"
|
|
70
|
+
dict["text"] = text
|
|
71
|
+
dict["styles"] = styles?.map { $0.rawValue } ?? NSNull()
|
|
72
|
+
case .link(let styles, let text, let url, let context):
|
|
73
|
+
dict["type"] = "link"
|
|
74
|
+
dict["text"] = text
|
|
75
|
+
dict["url"] = url ?? NSNull()
|
|
76
|
+
dict["context"] = context?.rawValue as Any? ?? NSNull()
|
|
77
|
+
dict["styles"] = styles?.map { $0.rawValue } ?? NSNull()
|
|
78
|
+
}
|
|
79
|
+
return dict
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
private extension KlarnaPaymentPresentationPaymentButton {
|
|
84
|
+
func toDictionary() -> NSDictionary {
|
|
85
|
+
let dict = NSMutableDictionary()
|
|
86
|
+
dict["text"] = text
|
|
87
|
+
dict["imageUrl"] = imageUrl ?? NSNull()
|
|
88
|
+
dict["imageAlignment"] = imageAlignment?.rawValue ?? NSNull()
|
|
89
|
+
return dict
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
private extension KlarnaPaymentPresentationIcon {
|
|
94
|
+
func toDictionary() -> NSDictionary {
|
|
95
|
+
let dict = NSMutableDictionary()
|
|
96
|
+
dict["alt"] = alt ?? NSNull()
|
|
97
|
+
dict["badgeImageUrl"] = badgeImageUrl ?? NSNull()
|
|
98
|
+
dict["rectangleImageUrl"] = rectangleImageUrl ?? NSNull()
|
|
99
|
+
dict["squareImageUrl"] = squareImageUrl ?? NSNull()
|
|
100
|
+
return dict
|
|
101
|
+
}
|
|
102
|
+
}
|