@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.
Files changed (261) hide show
  1. package/README.md +143 -29
  2. package/android/build.gradle +95 -0
  3. package/android/src/main/AndroidManifest.xml +1 -0
  4. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaNetworkPaymentButtonViewSpec.kt +22 -0
  5. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaNetworkPaymentModule.kt +46 -0
  6. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaNetworkPaymentModuleImpl.kt +163 -0
  7. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaNetworkPaymentPackage.kt +30 -0
  8. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentButtonPressEvent.kt +19 -0
  9. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentButtonViewManager.kt +276 -0
  10. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentPresentationMapper.kt +132 -0
  11. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentRequestMapper.kt +328 -0
  12. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentResponseMapper.kt +145 -0
  13. package/android/src/test/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaNetworkPaymentModuleImplTest.kt +361 -0
  14. package/android/src/test/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentButtonViewManagerTest.kt +155 -0
  15. package/android/src/test/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentPresentationMapperTest.kt +447 -0
  16. package/android/src/test/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentRequestMapperTest.kt +489 -0
  17. package/android/src/test/java/com/klarna/mobile/sdk/reactnative/klarnanetwork/payment/KlarnaPaymentResponseMapperTest.kt +456 -0
  18. package/ios/Sources/KlarnaNetworkPayment.h +5 -0
  19. package/ios/Sources/KlarnaNetworkPayment.mm +110 -0
  20. package/ios/Sources/KlarnaNetworkPaymentModuleImpl.swift +196 -0
  21. package/ios/Sources/KlarnaPaymentButtonComponentView.mm +147 -0
  22. package/ios/Sources/KlarnaPaymentButtonViewImpl.swift +77 -0
  23. package/ios/Sources/KlarnaPaymentPresentationMapping.swift +102 -0
  24. package/ios/Sources/KlarnaPaymentRequestDataMapping.swift +232 -0
  25. package/ios/Sources/KlarnaPaymentRequestMapping.swift +103 -0
  26. package/ios/Tests/KlarnaNetworkPaymentModuleImplTests.swift +143 -0
  27. package/ios/Tests/KlarnaPaymentButtonViewImplTests.swift +122 -0
  28. package/ios/Tests/KlarnaPaymentPresentationMappingTests.swift +335 -0
  29. package/lib/commonjs/KlarnaNetworkPayment.js +6 -0
  30. package/lib/commonjs/KlarnaNetworkPayment.js.map +1 -0
  31. package/lib/commonjs/KlarnaNetworkPaymentImpl.js +44 -0
  32. package/lib/commonjs/KlarnaNetworkPaymentImpl.js.map +1 -0
  33. package/lib/commonjs/KlarnaNetworkPaymentMapper.js +164 -0
  34. package/lib/commonjs/KlarnaNetworkPaymentMapper.js.map +1 -0
  35. package/lib/commonjs/KlarnaPaymentButton.js +43 -0
  36. package/lib/commonjs/KlarnaPaymentButton.js.map +1 -0
  37. package/lib/commonjs/Specs/KlarnaPaymentButtonNativeComponent.js +10 -0
  38. package/lib/commonjs/Specs/KlarnaPaymentButtonNativeComponent.js.map +1 -0
  39. package/lib/commonjs/Specs/NativeKlarnaNetworkPayment.js +13 -0
  40. package/lib/commonjs/Specs/NativeKlarnaNetworkPayment.js.map +1 -0
  41. package/lib/commonjs/index.js +51 -0
  42. package/lib/commonjs/index.js.map +1 -0
  43. package/lib/commonjs/types/KlarnaPaymentRequest.js +6 -0
  44. package/lib/commonjs/types/KlarnaPaymentRequest.js.map +1 -0
  45. package/lib/commonjs/types/KlarnaPaymentRequestState.js +2 -0
  46. package/lib/commonjs/types/KlarnaPaymentRequestState.js.map +1 -0
  47. package/lib/commonjs/types/KlarnaPaymentRequestStateContext.js +6 -0
  48. package/lib/commonjs/types/KlarnaPaymentRequestStateContext.js.map +1 -0
  49. package/lib/commonjs/types/KlarnaPaymentRequestStateReason.js +2 -0
  50. package/lib/commonjs/types/KlarnaPaymentRequestStateReason.js.map +1 -0
  51. package/lib/commonjs/types/models/KlarnaBillingPlan.js +6 -0
  52. package/lib/commonjs/types/models/KlarnaBillingPlan.js.map +1 -0
  53. package/lib/commonjs/types/models/KlarnaCollectCustomerProfileType.js +2 -0
  54. package/lib/commonjs/types/models/KlarnaCollectCustomerProfileType.js.map +1 -0
  55. package/lib/commonjs/types/models/KlarnaCustomer.js +6 -0
  56. package/lib/commonjs/types/models/KlarnaCustomer.js.map +1 -0
  57. package/lib/commonjs/types/models/KlarnaFreeTrial.js +2 -0
  58. package/lib/commonjs/types/models/KlarnaFreeTrial.js.map +1 -0
  59. package/lib/commonjs/types/models/KlarnaInterval.js +2 -0
  60. package/lib/commonjs/types/models/KlarnaInterval.js.map +1 -0
  61. package/lib/commonjs/types/models/KlarnaLineItem.js +2 -0
  62. package/lib/commonjs/types/models/KlarnaLineItem.js.map +1 -0
  63. package/lib/commonjs/types/models/KlarnaOndemandService.js +6 -0
  64. package/lib/commonjs/types/models/KlarnaOndemandService.js.map +1 -0
  65. package/lib/commonjs/types/models/KlarnaPartnerCustomer.js +6 -0
  66. package/lib/commonjs/types/models/KlarnaPartnerCustomer.js.map +1 -0
  67. package/lib/commonjs/types/models/KlarnaPaymentPresentation.js +6 -0
  68. package/lib/commonjs/types/models/KlarnaPaymentPresentation.js.map +1 -0
  69. package/lib/commonjs/types/models/KlarnaPaymentRequestData.js +6 -0
  70. package/lib/commonjs/types/models/KlarnaPaymentRequestData.js.map +1 -0
  71. package/lib/commonjs/types/models/KlarnaRequestCustomerToken.js +6 -0
  72. package/lib/commonjs/types/models/KlarnaRequestCustomerToken.js.map +1 -0
  73. package/lib/commonjs/types/models/KlarnaRequestCustomerTokenScope.js +2 -0
  74. package/lib/commonjs/types/models/KlarnaRequestCustomerTokenScope.js.map +1 -0
  75. package/lib/commonjs/types/models/KlarnaShipping.js +6 -0
  76. package/lib/commonjs/types/models/KlarnaShipping.js.map +1 -0
  77. package/lib/commonjs/types/models/KlarnaShippingConfig.js +6 -0
  78. package/lib/commonjs/types/models/KlarnaShippingConfig.js.map +1 -0
  79. package/lib/commonjs/types/models/KlarnaShippingConfigMode.js +2 -0
  80. package/lib/commonjs/types/models/KlarnaShippingConfigMode.js.map +1 -0
  81. package/lib/commonjs/types/models/KlarnaShippingOption.js +6 -0
  82. package/lib/commonjs/types/models/KlarnaShippingOption.js.map +1 -0
  83. package/lib/commonjs/types/models/KlarnaShippingRecipient.js +2 -0
  84. package/lib/commonjs/types/models/KlarnaShippingRecipient.js.map +1 -0
  85. package/lib/commonjs/types/models/KlarnaShippingType.js +2 -0
  86. package/lib/commonjs/types/models/KlarnaShippingType.js.map +1 -0
  87. package/lib/commonjs/types/models/KlarnaShippingTypeAttribute.js +2 -0
  88. package/lib/commonjs/types/models/KlarnaShippingTypeAttribute.js.map +1 -0
  89. package/lib/commonjs/types/models/KlarnaSubscription.js +6 -0
  90. package/lib/commonjs/types/models/KlarnaSubscription.js.map +1 -0
  91. package/lib/commonjs/types/models/KlarnaSupplementaryPurchaseData.js +6 -0
  92. package/lib/commonjs/types/models/KlarnaSupplementaryPurchaseData.js.map +1 -0
  93. package/lib/commonjs/types/models/index.js +2 -0
  94. package/lib/commonjs/types/models/index.js.map +1 -0
  95. package/lib/module/KlarnaNetworkPayment.js +2 -0
  96. package/lib/module/KlarnaNetworkPayment.js.map +1 -0
  97. package/lib/module/KlarnaNetworkPaymentImpl.js +36 -0
  98. package/lib/module/KlarnaNetworkPaymentImpl.js.map +1 -0
  99. package/lib/module/KlarnaNetworkPaymentMapper.js +146 -0
  100. package/lib/module/KlarnaNetworkPaymentMapper.js.map +1 -0
  101. package/lib/module/KlarnaPaymentButton.js +37 -0
  102. package/lib/module/KlarnaPaymentButton.js.map +1 -0
  103. package/lib/module/Specs/KlarnaPaymentButtonNativeComponent.js +3 -0
  104. package/lib/module/Specs/KlarnaPaymentButtonNativeComponent.js.map +1 -0
  105. package/lib/module/Specs/NativeKlarnaNetworkPayment.js +9 -0
  106. package/lib/module/Specs/NativeKlarnaNetworkPayment.js.map +1 -0
  107. package/lib/module/index.js +40 -0
  108. package/lib/module/index.js.map +1 -0
  109. package/lib/module/types/KlarnaPaymentRequest.js +2 -0
  110. package/lib/module/types/KlarnaPaymentRequest.js.map +1 -0
  111. package/lib/module/types/KlarnaPaymentRequestState.js +2 -0
  112. package/lib/module/types/KlarnaPaymentRequestState.js.map +1 -0
  113. package/lib/module/types/KlarnaPaymentRequestStateContext.js +2 -0
  114. package/lib/module/types/KlarnaPaymentRequestStateContext.js.map +1 -0
  115. package/lib/module/types/KlarnaPaymentRequestStateReason.js +2 -0
  116. package/lib/module/types/KlarnaPaymentRequestStateReason.js.map +1 -0
  117. package/lib/module/types/models/KlarnaBillingPlan.js +2 -0
  118. package/lib/module/types/models/KlarnaBillingPlan.js.map +1 -0
  119. package/lib/module/types/models/KlarnaCollectCustomerProfileType.js +2 -0
  120. package/lib/module/types/models/KlarnaCollectCustomerProfileType.js.map +1 -0
  121. package/lib/module/types/models/KlarnaCustomer.js +2 -0
  122. package/lib/module/types/models/KlarnaCustomer.js.map +1 -0
  123. package/lib/module/types/models/KlarnaFreeTrial.js +2 -0
  124. package/lib/module/types/models/KlarnaFreeTrial.js.map +1 -0
  125. package/lib/module/types/models/KlarnaInterval.js +2 -0
  126. package/lib/module/types/models/KlarnaInterval.js.map +1 -0
  127. package/lib/module/types/models/KlarnaLineItem.js +2 -0
  128. package/lib/module/types/models/KlarnaLineItem.js.map +1 -0
  129. package/lib/module/types/models/KlarnaOndemandService.js +2 -0
  130. package/lib/module/types/models/KlarnaOndemandService.js.map +1 -0
  131. package/lib/module/types/models/KlarnaPartnerCustomer.js +2 -0
  132. package/lib/module/types/models/KlarnaPartnerCustomer.js.map +1 -0
  133. package/lib/module/types/models/KlarnaPaymentPresentation.js +2 -0
  134. package/lib/module/types/models/KlarnaPaymentPresentation.js.map +1 -0
  135. package/lib/module/types/models/KlarnaPaymentRequestData.js +2 -0
  136. package/lib/module/types/models/KlarnaPaymentRequestData.js.map +1 -0
  137. package/lib/module/types/models/KlarnaRequestCustomerToken.js +2 -0
  138. package/lib/module/types/models/KlarnaRequestCustomerToken.js.map +1 -0
  139. package/lib/module/types/models/KlarnaRequestCustomerTokenScope.js +2 -0
  140. package/lib/module/types/models/KlarnaRequestCustomerTokenScope.js.map +1 -0
  141. package/lib/module/types/models/KlarnaShipping.js +2 -0
  142. package/lib/module/types/models/KlarnaShipping.js.map +1 -0
  143. package/lib/module/types/models/KlarnaShippingConfig.js +2 -0
  144. package/lib/module/types/models/KlarnaShippingConfig.js.map +1 -0
  145. package/lib/module/types/models/KlarnaShippingConfigMode.js +2 -0
  146. package/lib/module/types/models/KlarnaShippingConfigMode.js.map +1 -0
  147. package/lib/module/types/models/KlarnaShippingOption.js +2 -0
  148. package/lib/module/types/models/KlarnaShippingOption.js.map +1 -0
  149. package/lib/module/types/models/KlarnaShippingRecipient.js +2 -0
  150. package/lib/module/types/models/KlarnaShippingRecipient.js.map +1 -0
  151. package/lib/module/types/models/KlarnaShippingType.js +2 -0
  152. package/lib/module/types/models/KlarnaShippingType.js.map +1 -0
  153. package/lib/module/types/models/KlarnaShippingTypeAttribute.js +2 -0
  154. package/lib/module/types/models/KlarnaShippingTypeAttribute.js.map +1 -0
  155. package/lib/module/types/models/KlarnaSubscription.js +2 -0
  156. package/lib/module/types/models/KlarnaSubscription.js.map +1 -0
  157. package/lib/module/types/models/KlarnaSupplementaryPurchaseData.js +2 -0
  158. package/lib/module/types/models/KlarnaSupplementaryPurchaseData.js.map +1 -0
  159. package/lib/module/types/models/index.js +2 -0
  160. package/lib/module/types/models/index.js.map +1 -0
  161. package/lib/typescript/KlarnaNetworkPayment.d.ts +22 -0
  162. package/lib/typescript/KlarnaNetworkPayment.d.ts.map +1 -0
  163. package/lib/typescript/KlarnaNetworkPaymentImpl.d.ts +12 -0
  164. package/lib/typescript/KlarnaNetworkPaymentImpl.d.ts.map +1 -0
  165. package/lib/typescript/KlarnaNetworkPaymentMapper.d.ts +273 -0
  166. package/lib/typescript/KlarnaNetworkPaymentMapper.d.ts.map +1 -0
  167. package/lib/typescript/KlarnaPaymentButton.d.ts +51 -0
  168. package/lib/typescript/KlarnaPaymentButton.d.ts.map +1 -0
  169. package/lib/typescript/Specs/KlarnaPaymentButtonNativeComponent.d.ts +16 -0
  170. package/lib/typescript/Specs/KlarnaPaymentButtonNativeComponent.d.ts.map +1 -0
  171. package/lib/typescript/Specs/NativeKlarnaNetworkPayment.d.ts +13 -0
  172. package/lib/typescript/Specs/NativeKlarnaNetworkPayment.d.ts.map +1 -0
  173. package/lib/typescript/index.d.ts +14 -0
  174. package/lib/typescript/index.d.ts.map +1 -0
  175. package/lib/typescript/types/KlarnaPaymentRequest.d.ts +19 -0
  176. package/lib/typescript/types/KlarnaPaymentRequest.d.ts.map +1 -0
  177. package/lib/typescript/types/KlarnaPaymentRequestState.d.ts +15 -0
  178. package/lib/typescript/types/KlarnaPaymentRequestState.d.ts.map +1 -0
  179. package/lib/typescript/types/KlarnaPaymentRequestStateContext.d.ts +12 -0
  180. package/lib/typescript/types/KlarnaPaymentRequestStateContext.d.ts.map +1 -0
  181. package/lib/typescript/types/KlarnaPaymentRequestStateReason.d.ts +13 -0
  182. package/lib/typescript/types/KlarnaPaymentRequestStateReason.d.ts.map +1 -0
  183. package/lib/typescript/types/models/KlarnaBillingPlan.d.ts +17 -0
  184. package/lib/typescript/types/models/KlarnaBillingPlan.d.ts.map +1 -0
  185. package/lib/typescript/types/models/KlarnaCollectCustomerProfileType.d.ts +19 -0
  186. package/lib/typescript/types/models/KlarnaCollectCustomerProfileType.d.ts.map +1 -0
  187. package/lib/typescript/types/models/KlarnaCustomer.d.ts +11 -0
  188. package/lib/typescript/types/models/KlarnaCustomer.d.ts.map +1 -0
  189. package/lib/typescript/types/models/KlarnaFreeTrial.d.ts +7 -0
  190. package/lib/typescript/types/models/KlarnaFreeTrial.d.ts.map +1 -0
  191. package/lib/typescript/types/models/KlarnaInterval.d.ts +11 -0
  192. package/lib/typescript/types/models/KlarnaInterval.d.ts.map +1 -0
  193. package/lib/typescript/types/models/KlarnaLineItem.d.ts +28 -0
  194. package/lib/typescript/types/models/KlarnaLineItem.d.ts.map +1 -0
  195. package/lib/typescript/types/models/KlarnaOndemandService.d.ts +17 -0
  196. package/lib/typescript/types/models/KlarnaOndemandService.d.ts.map +1 -0
  197. package/lib/typescript/types/models/KlarnaPartnerCustomer.d.ts +15 -0
  198. package/lib/typescript/types/models/KlarnaPartnerCustomer.d.ts.map +1 -0
  199. package/lib/typescript/types/models/KlarnaPaymentPresentation.d.ts +119 -0
  200. package/lib/typescript/types/models/KlarnaPaymentPresentation.d.ts.map +1 -0
  201. package/lib/typescript/types/models/KlarnaPaymentRequestData.d.ts +24 -0
  202. package/lib/typescript/types/models/KlarnaPaymentRequestData.d.ts.map +1 -0
  203. package/lib/typescript/types/models/KlarnaRequestCustomerToken.d.ts +9 -0
  204. package/lib/typescript/types/models/KlarnaRequestCustomerToken.d.ts.map +1 -0
  205. package/lib/typescript/types/models/KlarnaRequestCustomerTokenScope.d.ts +9 -0
  206. package/lib/typescript/types/models/KlarnaRequestCustomerTokenScope.d.ts.map +1 -0
  207. package/lib/typescript/types/models/KlarnaShipping.d.ts +15 -0
  208. package/lib/typescript/types/models/KlarnaShipping.d.ts.map +1 -0
  209. package/lib/typescript/types/models/KlarnaShippingConfig.d.ts +9 -0
  210. package/lib/typescript/types/models/KlarnaShippingConfig.d.ts.map +1 -0
  211. package/lib/typescript/types/models/KlarnaShippingConfigMode.d.ts +5 -0
  212. package/lib/typescript/types/models/KlarnaShippingConfigMode.d.ts.map +1 -0
  213. package/lib/typescript/types/models/KlarnaShippingOption.d.ts +12 -0
  214. package/lib/typescript/types/models/KlarnaShippingOption.d.ts.map +1 -0
  215. package/lib/typescript/types/models/KlarnaShippingRecipient.d.ts +14 -0
  216. package/lib/typescript/types/models/KlarnaShippingRecipient.d.ts.map +1 -0
  217. package/lib/typescript/types/models/KlarnaShippingType.d.ts +25 -0
  218. package/lib/typescript/types/models/KlarnaShippingType.d.ts.map +1 -0
  219. package/lib/typescript/types/models/KlarnaShippingTypeAttribute.d.ts +21 -0
  220. package/lib/typescript/types/models/KlarnaShippingTypeAttribute.d.ts.map +1 -0
  221. package/lib/typescript/types/models/KlarnaSubscription.d.ts +14 -0
  222. package/lib/typescript/types/models/KlarnaSubscription.d.ts.map +1 -0
  223. package/lib/typescript/types/models/KlarnaSupplementaryPurchaseData.d.ts +21 -0
  224. package/lib/typescript/types/models/KlarnaSupplementaryPurchaseData.d.ts.map +1 -0
  225. package/lib/typescript/types/models/index.d.ts +22 -0
  226. package/lib/typescript/types/models/index.d.ts.map +1 -0
  227. package/package.json +120 -6
  228. package/react-native-klarna-network-payment.podspec +28 -0
  229. package/src/KlarnaNetworkPayment.ts +30 -0
  230. package/src/KlarnaNetworkPaymentImpl.ts +79 -0
  231. package/src/KlarnaNetworkPaymentMapper.ts +204 -0
  232. package/src/KlarnaPaymentButton.tsx +80 -0
  233. package/src/Specs/KlarnaPaymentButtonNativeComponent.ts +22 -0
  234. package/src/Specs/NativeKlarnaNetworkPayment.ts +17 -0
  235. package/src/index.tsx +63 -0
  236. package/src/types/KlarnaPaymentRequest.ts +19 -0
  237. package/src/types/KlarnaPaymentRequestState.ts +14 -0
  238. package/src/types/KlarnaPaymentRequestStateContext.ts +12 -0
  239. package/src/types/KlarnaPaymentRequestStateReason.ts +12 -0
  240. package/src/types/models/KlarnaBillingPlan.ts +17 -0
  241. package/src/types/models/KlarnaCollectCustomerProfileType.ts +18 -0
  242. package/src/types/models/KlarnaCustomer.ts +11 -0
  243. package/src/types/models/KlarnaFreeTrial.ts +6 -0
  244. package/src/types/models/KlarnaInterval.ts +10 -0
  245. package/src/types/models/KlarnaLineItem.ts +27 -0
  246. package/src/types/models/KlarnaOndemandService.ts +17 -0
  247. package/src/types/models/KlarnaPartnerCustomer.ts +15 -0
  248. package/src/types/models/KlarnaPaymentPresentation.ts +135 -0
  249. package/src/types/models/KlarnaPaymentRequestData.ts +24 -0
  250. package/src/types/models/KlarnaRequestCustomerToken.ts +9 -0
  251. package/src/types/models/KlarnaRequestCustomerTokenScope.ts +8 -0
  252. package/src/types/models/KlarnaShipping.ts +15 -0
  253. package/src/types/models/KlarnaShippingConfig.ts +9 -0
  254. package/src/types/models/KlarnaShippingConfigMode.ts +4 -0
  255. package/src/types/models/KlarnaShippingOption.ts +12 -0
  256. package/src/types/models/KlarnaShippingRecipient.ts +13 -0
  257. package/src/types/models/KlarnaShippingType.ts +24 -0
  258. package/src/types/models/KlarnaShippingTypeAttribute.ts +20 -0
  259. package/src/types/models/KlarnaSubscription.ts +14 -0
  260. package/src/types/models/KlarnaSupplementaryPurchaseData.ts +21 -0
  261. 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
+ }