@gmisoftware/react-native-pay 0.0.4

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 (203) hide show
  1. package/NitroPay.podspec +31 -0
  2. package/README.md +455 -0
  3. package/android/CMakeLists.txt +29 -0
  4. package/android/build.gradle +144 -0
  5. package/android/fix-prefab.gradle +51 -0
  6. package/android/gradle.properties +8 -0
  7. package/android/src/main/AndroidManifest.xml +2 -0
  8. package/android/src/main/cpp/cpp-adapter.cpp +6 -0
  9. package/android/src/main/java/com/margelo/nitro/pay/Constants.kt +49 -0
  10. package/android/src/main/java/com/margelo/nitro/pay/GooglePayButtonFactory.kt +95 -0
  11. package/android/src/main/java/com/margelo/nitro/pay/GooglePayRequestBuilder.kt +170 -0
  12. package/android/src/main/java/com/margelo/nitro/pay/HybridGooglePayButton.kt +146 -0
  13. package/android/src/main/java/com/margelo/nitro/pay/HybridPaymentHandler.kt +184 -0
  14. package/android/src/main/java/com/margelo/nitro/pay/NitroPayPackage.kt +26 -0
  15. package/android/src/main/java/com/margelo/nitro/pay/PaymentMapper.kt +89 -0
  16. package/app.plugin.js +1 -0
  17. package/ios/ApplePayButtonFactory.swift +53 -0
  18. package/ios/Bridge.h +8 -0
  19. package/ios/HybridApplePayButton.swift +60 -0
  20. package/ios/HybridPaymentHandler.swift +248 -0
  21. package/ios/PassKitTypeMapper.swift +192 -0
  22. package/lib/hooks/index.d.ts +7 -0
  23. package/lib/hooks/index.js +10 -0
  24. package/lib/hooks/usePaymentCheckout.d.ts +95 -0
  25. package/lib/hooks/usePaymentCheckout.js +183 -0
  26. package/lib/index.d.ts +10 -0
  27. package/lib/index.js +29 -0
  28. package/lib/plugin/index.d.ts +4 -0
  29. package/lib/plugin/index.js +10 -0
  30. package/lib/plugin/type.d.ts +4 -0
  31. package/lib/plugin/type.js +2 -0
  32. package/lib/plugin/withApplePay.d.ts +4 -0
  33. package/lib/plugin/withApplePay.js +32 -0
  34. package/lib/plugin/withGooglePay.d.ts +4 -0
  35. package/lib/plugin/withGooglePay.js +24 -0
  36. package/lib/specs/ApplePayButton.nitro.d.ts +13 -0
  37. package/lib/specs/ApplePayButton.nitro.js +2 -0
  38. package/lib/specs/GooglePayButton.nitro.d.ts +14 -0
  39. package/lib/specs/GooglePayButton.nitro.js +2 -0
  40. package/lib/specs/PaymentHandler.nitro.d.ts +10 -0
  41. package/lib/specs/PaymentHandler.nitro.js +2 -0
  42. package/lib/types/Contact.d.ts +51 -0
  43. package/lib/types/Contact.js +6 -0
  44. package/lib/types/Payment.d.ts +67 -0
  45. package/lib/types/Payment.js +6 -0
  46. package/lib/types/index.d.ts +2 -0
  47. package/lib/types/index.js +18 -0
  48. package/lib/utils/index.d.ts +4 -0
  49. package/lib/utils/index.js +20 -0
  50. package/lib/utils/paymentHelpers.d.ts +144 -0
  51. package/lib/utils/paymentHelpers.js +190 -0
  52. package/nitro.json +30 -0
  53. package/nitrogen/generated/.gitattributes +1 -0
  54. package/nitrogen/generated/android/NitroPay+autolinking.cmake +87 -0
  55. package/nitrogen/generated/android/NitroPay+autolinking.gradle +27 -0
  56. package/nitrogen/generated/android/NitroPayOnLoad.cpp +58 -0
  57. package/nitrogen/generated/android/NitroPayOnLoad.hpp +25 -0
  58. package/nitrogen/generated/android/c++/JCNContact.hpp +202 -0
  59. package/nitrogen/generated/android/c++/JCNContactType.hpp +59 -0
  60. package/nitrogen/generated/android/c++/JCNLabeledEmailAddress.hpp +62 -0
  61. package/nitrogen/generated/android/c++/JCNLabeledPhoneNumber.hpp +64 -0
  62. package/nitrogen/generated/android/c++/JCNLabeledPostalAddress.hpp +64 -0
  63. package/nitrogen/generated/android/c++/JCNPhoneNumber.hpp +57 -0
  64. package/nitrogen/generated/android/c++/JCNPostalAddress.hpp +78 -0
  65. package/nitrogen/generated/android/c++/JFunc_void.hpp +74 -0
  66. package/nitrogen/generated/android/c++/JGooglePayButtonTheme.hpp +59 -0
  67. package/nitrogen/generated/android/c++/JGooglePayButtonType.hpp +77 -0
  68. package/nitrogen/generated/android/c++/JGooglePayEnvironment.hpp +59 -0
  69. package/nitrogen/generated/android/c++/JHybridGooglePayButtonSpec.cpp +96 -0
  70. package/nitrogen/generated/android/c++/JHybridGooglePayButtonSpec.hpp +71 -0
  71. package/nitrogen/generated/android/c++/JHybridPaymentHandlerSpec.cpp +154 -0
  72. package/nitrogen/generated/android/c++/JHybridPaymentHandlerSpec.hpp +66 -0
  73. package/nitrogen/generated/android/c++/JPKSecureElementPass.hpp +96 -0
  74. package/nitrogen/generated/android/c++/JPassActivationState.hpp +68 -0
  75. package/nitrogen/generated/android/c++/JPayServiceStatus.hpp +61 -0
  76. package/nitrogen/generated/android/c++/JPaymentItem.hpp +67 -0
  77. package/nitrogen/generated/android/c++/JPaymentItemType.hpp +59 -0
  78. package/nitrogen/generated/android/c++/JPaymentMethod.hpp +97 -0
  79. package/nitrogen/generated/android/c++/JPaymentMethodType.hpp +68 -0
  80. package/nitrogen/generated/android/c++/JPaymentNetwork.hpp +86 -0
  81. package/nitrogen/generated/android/c++/JPaymentRequest.hpp +181 -0
  82. package/nitrogen/generated/android/c++/JPaymentResult.hpp +97 -0
  83. package/nitrogen/generated/android/c++/JPaymentToken.hpp +91 -0
  84. package/nitrogen/generated/android/c++/views/JHybridGooglePayButtonStateUpdater.cpp +68 -0
  85. package/nitrogen/generated/android/c++/views/JHybridGooglePayButtonStateUpdater.hpp +49 -0
  86. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/CNContact.kt +96 -0
  87. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/CNContactType.kt +21 -0
  88. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/CNLabeledEmailAddress.kt +39 -0
  89. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/CNLabeledPhoneNumber.kt +39 -0
  90. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/CNLabeledPostalAddress.kt +39 -0
  91. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/CNPhoneNumber.kt +36 -0
  92. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/CNPostalAddress.kt +51 -0
  93. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/Func_void.kt +80 -0
  94. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/GooglePayButtonTheme.kt +21 -0
  95. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/GooglePayButtonType.kt +27 -0
  96. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/GooglePayEnvironment.kt +21 -0
  97. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/HybridGooglePayButtonSpec.kt +80 -0
  98. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/HybridPaymentHandlerSpec.kt +61 -0
  99. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/NitroPayOnLoad.kt +35 -0
  100. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/PKSecureElementPass.kt +63 -0
  101. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/PassActivationState.kt +24 -0
  102. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/PayServiceStatus.kt +39 -0
  103. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/PaymentItem.kt +42 -0
  104. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/PaymentItemType.kt +21 -0
  105. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/PaymentMethod.kt +48 -0
  106. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/PaymentMethodType.kt +24 -0
  107. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/PaymentNetwork.kt +30 -0
  108. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/PaymentRequest.kt +72 -0
  109. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/PaymentResult.kt +45 -0
  110. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/PaymentToken.kt +42 -0
  111. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/views/HybridGooglePayButtonManager.kt +50 -0
  112. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/views/HybridGooglePayButtonStateUpdater.kt +23 -0
  113. package/nitrogen/generated/ios/NitroPay+autolinking.rb +60 -0
  114. package/nitrogen/generated/ios/NitroPay-Swift-Cxx-Bridge.cpp +73 -0
  115. package/nitrogen/generated/ios/NitroPay-Swift-Cxx-Bridge.hpp +415 -0
  116. package/nitrogen/generated/ios/NitroPay-Swift-Cxx-Umbrella.hpp +116 -0
  117. package/nitrogen/generated/ios/NitroPayAutolinking.mm +41 -0
  118. package/nitrogen/generated/ios/NitroPayAutolinking.swift +40 -0
  119. package/nitrogen/generated/ios/c++/HybridApplePayButtonSpecSwift.cpp +11 -0
  120. package/nitrogen/generated/ios/c++/HybridApplePayButtonSpecSwift.hpp +92 -0
  121. package/nitrogen/generated/ios/c++/HybridPaymentHandlerSpecSwift.cpp +11 -0
  122. package/nitrogen/generated/ios/c++/HybridPaymentHandlerSpecSwift.hpp +148 -0
  123. package/nitrogen/generated/ios/c++/views/HybridApplePayButtonComponent.mm +106 -0
  124. package/nitrogen/generated/ios/swift/ApplePayButtonStyle.swift +44 -0
  125. package/nitrogen/generated/ios/swift/ApplePayButtonType.swift +84 -0
  126. package/nitrogen/generated/ios/swift/CNContact.swift +329 -0
  127. package/nitrogen/generated/ios/swift/CNContactType.swift +40 -0
  128. package/nitrogen/generated/ios/swift/CNLabeledEmailAddress.swift +65 -0
  129. package/nitrogen/generated/ios/swift/CNLabeledPhoneNumber.swift +65 -0
  130. package/nitrogen/generated/ios/swift/CNLabeledPostalAddress.swift +65 -0
  131. package/nitrogen/generated/ios/swift/CNPhoneNumber.swift +35 -0
  132. package/nitrogen/generated/ios/swift/CNPostalAddress.swift +204 -0
  133. package/nitrogen/generated/ios/swift/Func_void.swift +47 -0
  134. package/nitrogen/generated/ios/swift/Func_void_PaymentResult.swift +47 -0
  135. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +47 -0
  136. package/nitrogen/generated/ios/swift/GooglePayEnvironment.swift +40 -0
  137. package/nitrogen/generated/ios/swift/HybridApplePayButtonSpec.swift +51 -0
  138. package/nitrogen/generated/ios/swift/HybridApplePayButtonSpec_cxx.swift +175 -0
  139. package/nitrogen/generated/ios/swift/HybridPaymentHandlerSpec.swift +52 -0
  140. package/nitrogen/generated/ios/swift/HybridPaymentHandlerSpec_cxx.swift +155 -0
  141. package/nitrogen/generated/ios/swift/PKSecureElementPass.swift +191 -0
  142. package/nitrogen/generated/ios/swift/PassActivationState.swift +52 -0
  143. package/nitrogen/generated/ios/swift/PayServiceStatus.swift +46 -0
  144. package/nitrogen/generated/ios/swift/PaymentItem.swift +57 -0
  145. package/nitrogen/generated/ios/swift/PaymentItemType.swift +40 -0
  146. package/nitrogen/generated/ios/swift/PaymentMethod.swift +134 -0
  147. package/nitrogen/generated/ios/swift/PaymentMethodType.swift +52 -0
  148. package/nitrogen/generated/ios/swift/PaymentNetwork.swift +76 -0
  149. package/nitrogen/generated/ios/swift/PaymentRequest.swift +341 -0
  150. package/nitrogen/generated/ios/swift/PaymentResult.swift +118 -0
  151. package/nitrogen/generated/ios/swift/PaymentToken.swift +57 -0
  152. package/nitrogen/generated/shared/c++/ApplePayButtonStyle.hpp +80 -0
  153. package/nitrogen/generated/shared/c++/ApplePayButtonType.hpp +120 -0
  154. package/nitrogen/generated/shared/c++/CNContact.hpp +168 -0
  155. package/nitrogen/generated/shared/c++/CNContactType.hpp +76 -0
  156. package/nitrogen/generated/shared/c++/CNLabeledEmailAddress.hpp +80 -0
  157. package/nitrogen/generated/shared/c++/CNLabeledPhoneNumber.hpp +82 -0
  158. package/nitrogen/generated/shared/c++/CNLabeledPostalAddress.hpp +82 -0
  159. package/nitrogen/generated/shared/c++/CNPhoneNumber.hpp +75 -0
  160. package/nitrogen/generated/shared/c++/CNPostalAddress.hpp +96 -0
  161. package/nitrogen/generated/shared/c++/GooglePayButtonTheme.hpp +76 -0
  162. package/nitrogen/generated/shared/c++/GooglePayButtonType.hpp +100 -0
  163. package/nitrogen/generated/shared/c++/GooglePayEnvironment.hpp +76 -0
  164. package/nitrogen/generated/shared/c++/HybridApplePayButtonSpec.cpp +26 -0
  165. package/nitrogen/generated/shared/c++/HybridApplePayButtonSpec.hpp +73 -0
  166. package/nitrogen/generated/shared/c++/HybridGooglePayButtonSpec.cpp +28 -0
  167. package/nitrogen/generated/shared/c++/HybridGooglePayButtonSpec.hpp +75 -0
  168. package/nitrogen/generated/shared/c++/HybridPaymentHandlerSpec.cpp +23 -0
  169. package/nitrogen/generated/shared/c++/HybridPaymentHandlerSpec.hpp +74 -0
  170. package/nitrogen/generated/shared/c++/PKSecureElementPass.hpp +114 -0
  171. package/nitrogen/generated/shared/c++/PassActivationState.hpp +88 -0
  172. package/nitrogen/generated/shared/c++/PayServiceStatus.hpp +79 -0
  173. package/nitrogen/generated/shared/c++/PaymentItem.hpp +85 -0
  174. package/nitrogen/generated/shared/c++/PaymentItemType.hpp +76 -0
  175. package/nitrogen/generated/shared/c++/PaymentMethod.hpp +103 -0
  176. package/nitrogen/generated/shared/c++/PaymentMethodType.hpp +88 -0
  177. package/nitrogen/generated/shared/c++/PaymentNetwork.hpp +112 -0
  178. package/nitrogen/generated/shared/c++/PaymentRequest.hpp +130 -0
  179. package/nitrogen/generated/shared/c++/PaymentResult.hpp +90 -0
  180. package/nitrogen/generated/shared/c++/PaymentToken.hpp +85 -0
  181. package/nitrogen/generated/shared/c++/views/HybridApplePayButtonComponent.cpp +111 -0
  182. package/nitrogen/generated/shared/c++/views/HybridApplePayButtonComponent.hpp +111 -0
  183. package/nitrogen/generated/shared/c++/views/HybridGooglePayButtonComponent.cpp +123 -0
  184. package/nitrogen/generated/shared/c++/views/HybridGooglePayButtonComponent.hpp +112 -0
  185. package/nitrogen/generated/shared/json/ApplePayButtonConfig.json +12 -0
  186. package/nitrogen/generated/shared/json/GooglePayButtonConfig.json +13 -0
  187. package/package.json +116 -0
  188. package/react-native.config.js +16 -0
  189. package/src/hooks/index.ts +12 -0
  190. package/src/hooks/usePaymentCheckout.ts +281 -0
  191. package/src/index.ts +32 -0
  192. package/src/plugin/index.ts +17 -0
  193. package/src/plugin/type.ts +4 -0
  194. package/src/plugin/withApplePay.ts +44 -0
  195. package/src/plugin/withGooglePay.ts +41 -0
  196. package/src/specs/ApplePayButton.nitro.ts +37 -0
  197. package/src/specs/GooglePayButton.nitro.ts +34 -0
  198. package/src/specs/PaymentHandler.nitro.ts +13 -0
  199. package/src/types/Contact.ts +58 -0
  200. package/src/types/Payment.ts +104 -0
  201. package/src/types/index.ts +2 -0
  202. package/src/utils/index.ts +5 -0
  203. package/src/utils/paymentHelpers.ts +215 -0
@@ -0,0 +1,89 @@
1
+ package com.margelo.nitro.pay
2
+
3
+ import com.google.android.gms.wallet.PaymentData
4
+ import org.json.JSONException
5
+ import org.json.JSONObject
6
+ import java.util.UUID
7
+
8
+ /**
9
+ * Mapper for converting between Google Pay and app payment types
10
+ */
11
+ object PaymentMapper {
12
+
13
+ /**
14
+ * Maps Google Pay PaymentData to PaymentResult
15
+ */
16
+ fun mapPaymentDataToResult(paymentData: PaymentData): PaymentResult {
17
+ return try {
18
+ val paymentInfo = paymentData.toJson()
19
+ val paymentMethodData = JSONObject(paymentInfo).getJSONObject("paymentMethodData")
20
+
21
+ // Extract token
22
+ val tokenData = paymentMethodData.getJSONObject("tokenizationData")
23
+ val token = tokenData.getString("token")
24
+
25
+ // Extract payment method info
26
+ val info = paymentMethodData.getJSONObject("info")
27
+ val cardNetwork = info.optString("cardNetwork", "unknown")
28
+ val cardDetails = info.optString("cardDetails", "****")
29
+
30
+ // Create payment method
31
+ val paymentMethod = PaymentMethod(
32
+ displayName = "$cardNetwork $cardDetails",
33
+ network = mapCardNetwork(cardNetwork),
34
+ type = PaymentMethodType.UNKNOWN,
35
+ secureElementPass = null,
36
+ billingAddress = null
37
+ )
38
+
39
+ // Create payment token
40
+ val paymentToken = PaymentToken(
41
+ paymentMethod = paymentMethod,
42
+ transactionIdentifier = UUID.randomUUID().toString(),
43
+ paymentData = token
44
+ )
45
+
46
+ // Create successful result
47
+ PaymentResult(
48
+ success = true,
49
+ transactionId = UUID.randomUUID().toString(),
50
+ token = paymentToken,
51
+ error = null
52
+ )
53
+ } catch (e: JSONException) {
54
+ createErrorResult("Failed to parse payment data: ${e.message}")
55
+ }
56
+ }
57
+
58
+ /**
59
+ * Maps card network string to PaymentNetwork enum
60
+ */
61
+ fun mapCardNetwork(network: String): PaymentNetwork {
62
+ return when (network.uppercase()) {
63
+ "VISA" -> PaymentNetwork.VISA
64
+ "MASTERCARD" -> PaymentNetwork.MASTERCARD
65
+ "AMEX" -> PaymentNetwork.AMEX
66
+ "DISCOVER" -> PaymentNetwork.DISCOVER
67
+ "JCB" -> PaymentNetwork.JCB
68
+ "MAESTRO" -> PaymentNetwork.MAESTRO
69
+ "ELECTRON" -> PaymentNetwork.ELECTRON
70
+ "ELO" -> PaymentNetwork.ELO
71
+ "INTERAC" -> PaymentNetwork.INTERAC
72
+ else -> PaymentNetwork.VISA // Default fallback
73
+ }
74
+ }
75
+
76
+ /**
77
+ * Creates an error PaymentResult
78
+ */
79
+ fun createErrorResult(errorMessage: String): PaymentResult {
80
+ return PaymentResult(
81
+ success = false,
82
+ transactionId = null,
83
+ token = null,
84
+ error = errorMessage
85
+ )
86
+ }
87
+ }
88
+
89
+
package/app.plugin.js ADDED
@@ -0,0 +1 @@
1
+ module.exports = require('./lib/plugin/index.js')
@@ -0,0 +1,53 @@
1
+ import UIKit
2
+ import PassKit
3
+
4
+ // MARK: - Button Type Mapping
5
+
6
+ enum ApplePayButtonFactory {
7
+
8
+ /// Maps ApplePayButtonType to PKPaymentButtonType
9
+ static func mapButtonType(_ type: ApplePayButtonType) -> PKPaymentButtonType {
10
+ switch type {
11
+ case .buy: return .buy
12
+ case .setup: return .setUp
13
+ case .book: return .book
14
+ case .donate: return .donate
15
+ case .continue: return .continue
16
+ case .reload: return .reload
17
+ case .addmoney: return .addMoney
18
+ case .topup: return .topUp
19
+ case .order: return .order
20
+ case .rent: return .rent
21
+ case .support: return .support
22
+ case .contribute: return .contribute
23
+ case .tip: return .tip
24
+ }
25
+ }
26
+
27
+ /// Maps ApplePayButtonStyle to PKPaymentButtonStyle
28
+ static func mapButtonStyle(_ style: ApplePayButtonStyle) -> PKPaymentButtonStyle {
29
+ switch style {
30
+ case .white: return .white
31
+ case .whiteoutline: return .whiteOutline
32
+ case .black: return .black
33
+ default: return .automatic
34
+ }
35
+ }
36
+
37
+ /// Creates a configured PKPaymentButton
38
+ static func createButton(
39
+ type: ApplePayButtonType,
40
+ style: ApplePayButtonStyle,
41
+ target: Any?,
42
+ action: Selector
43
+ ) -> PKPaymentButton {
44
+ let pkButtonType = mapButtonType(type)
45
+ let pkButtonStyle = mapButtonStyle(style)
46
+ let button = PKPaymentButton(paymentButtonType: pkButtonType, paymentButtonStyle: pkButtonStyle)
47
+ button.addTarget(target, action: action, for: .touchUpInside)
48
+ button.translatesAutoresizingMaskIntoConstraints = false
49
+ return button
50
+ }
51
+ }
52
+
53
+
package/ios/Bridge.h ADDED
@@ -0,0 +1,8 @@
1
+ //
2
+ // Bridge.h
3
+ // NitroPay
4
+ //
5
+ // Created by Marc Rousavy on 22.07.24.
6
+ //
7
+
8
+ #pragma once
@@ -0,0 +1,60 @@
1
+ import UIKit
2
+ import PassKit
3
+
4
+ /**
5
+ * Hybrid implementation of ApplePayButton view component
6
+ */
7
+ class HybridApplePayButton: HybridApplePayButtonSpec {
8
+
9
+ // Props
10
+ var buttonType: ApplePayButtonType = .buy
11
+ var buttonStyle: ApplePayButtonStyle = .black
12
+ var onPress: (() -> Void)?
13
+
14
+ // View
15
+ var view: UIView = UIView()
16
+
17
+ // Internal state
18
+ private var paymentButton: PKPaymentButton?
19
+
20
+ override init() {
21
+ super.init()
22
+ setupButton()
23
+ }
24
+
25
+ func afterUpdate() {
26
+ setupButton()
27
+ }
28
+
29
+ // MARK: - Private Methods
30
+
31
+ private func setupButton() {
32
+ // Remove existing button if any
33
+ paymentButton?.removeFromSuperview()
34
+
35
+ // Create new button
36
+ let button = ApplePayButtonFactory.createButton(
37
+ type: buttonType,
38
+ style: buttonStyle,
39
+ target: self,
40
+ action: #selector(buttonPressed)
41
+ )
42
+
43
+ paymentButton = button
44
+
45
+ // Add to view
46
+ view.addSubview(button)
47
+
48
+ // Set up constraints to fill the view
49
+ NSLayoutConstraint.activate([
50
+ button.topAnchor.constraint(equalTo: view.topAnchor),
51
+ button.leadingAnchor.constraint(equalTo: view.leadingAnchor),
52
+ button.trailingAnchor.constraint(equalTo: view.trailingAnchor),
53
+ button.bottomAnchor.constraint(equalTo: view.bottomAnchor)
54
+ ])
55
+ }
56
+
57
+ @objc private func buttonPressed() {
58
+ onPress?()
59
+ }
60
+ }
@@ -0,0 +1,248 @@
1
+ import PassKit
2
+ import UIKit
3
+ import NitroModules
4
+
5
+ // MARK: - Constants
6
+
7
+ private enum ErrorMessage {
8
+ static let paymentCancelled = "Payment cancelled by user"
9
+ static let unableToPresent = "Unable to present payment authorization"
10
+ static let unableToCreate = "Unable to create payment authorization"
11
+ }
12
+
13
+ // MARK: - Payment Request Builder
14
+
15
+ private struct PaymentRequestBuilder {
16
+
17
+ static func build(from request: PaymentRequest) -> PKPaymentRequest {
18
+ let paymentRequest = PKPaymentRequest()
19
+
20
+ paymentRequest.merchantIdentifier = request.merchantIdentifier
21
+ paymentRequest.countryCode = request.countryCode
22
+ paymentRequest.currencyCode = request.currencyCode
23
+ paymentRequest.paymentSummaryItems = buildPaymentItems(request.paymentItems)
24
+ paymentRequest.merchantCapabilities = buildMerchantCapabilities(request.merchantCapabilities)
25
+ paymentRequest.supportedNetworks = buildSupportedNetworks(request.supportedNetworks)
26
+
27
+ if let shippingType = request.shippingType {
28
+ paymentRequest.shippingType = convertShippingType(shippingType)
29
+ }
30
+
31
+ configureContactRequirements(paymentRequest, request: request)
32
+
33
+ return paymentRequest
34
+ }
35
+
36
+ private static func buildPaymentItems(_ items: [PaymentItem]) -> [PKPaymentSummaryItem] {
37
+ return items.map { item in
38
+ let pkItem = PKPaymentSummaryItem(
39
+ label: item.label,
40
+ amount: NSDecimalNumber(decimal: Decimal(item.amount))
41
+ )
42
+ pkItem.type = item.type == .final ? .final : .pending
43
+ return pkItem
44
+ }
45
+ }
46
+
47
+ private static func buildMerchantCapabilities(_ capabilities: [String]) -> PKMerchantCapability {
48
+ var merchantCapabilities: PKMerchantCapability = []
49
+ for capability in capabilities {
50
+ switch capability {
51
+ case "3DS": merchantCapabilities.insert(.capability3DS)
52
+ case "EMV": merchantCapabilities.insert(.capabilityEMV)
53
+ case "Credit": merchantCapabilities.insert(.capabilityCredit)
54
+ case "Debit": merchantCapabilities.insert(.capabilityDebit)
55
+ default: break
56
+ }
57
+ }
58
+ return merchantCapabilities
59
+ }
60
+
61
+ private static func buildSupportedNetworks(_ networks: [String]) -> [PKPaymentNetwork] {
62
+ return networks.compactMap { PassKitTypeMapper.convertToPKPaymentNetwork($0) }
63
+ }
64
+
65
+ private static func convertShippingType(_ type: String) -> PKShippingType {
66
+ switch type {
67
+ case "shipping": return .shipping
68
+ case "delivery": return .delivery
69
+ case "storePickup": return .storePickup
70
+ case "servicePickup": return .servicePickup
71
+ default: return .shipping
72
+ }
73
+ }
74
+
75
+ private static func configureContactRequirements(_ paymentRequest: PKPaymentRequest, request: PaymentRequest) {
76
+ if request.billingContactRequired == true {
77
+ paymentRequest.requiredBillingContactFields = [.postalAddress, .name]
78
+ }
79
+
80
+ if request.shippingContactRequired == true {
81
+ paymentRequest.requiredShippingContactFields = [.postalAddress, .name]
82
+ }
83
+ }
84
+ }
85
+
86
+ // MARK: - Payment Token Converter
87
+
88
+ private struct PaymentTokenConverter {
89
+
90
+ static func convert(_ pkToken: PKPaymentToken) -> PaymentToken {
91
+ let paymentMethod = convertPaymentMethod(pkToken.paymentMethod)
92
+
93
+ return PaymentToken.init(
94
+ paymentMethod: paymentMethod,
95
+ transactionIdentifier: pkToken.transactionIdentifier,
96
+ paymentData: pkToken.paymentData.base64EncodedString()
97
+ )
98
+ }
99
+
100
+ private static func convertPaymentMethod(_ pkMethod: PKPaymentMethod) -> PaymentMethod {
101
+ return PaymentMethod.init(
102
+ displayName: pkMethod.displayName,
103
+ network: pkMethod.network.map { PassKitTypeMapper.convert($0) },
104
+ type: PassKitTypeMapper.convert(pkMethod.type),
105
+ secureElementPass: convertSecureElementPass(pkMethod),
106
+ billingAddress: convertBillingAddress(pkMethod)
107
+ )
108
+ }
109
+
110
+ private static func convertSecureElementPass(_ pkMethod: PKPaymentMethod) -> PKSecureElementPass? {
111
+ if #available(iOS 13.4, *) {
112
+ guard let pkSecureElementPass = pkMethod.secureElementPass else { return nil }
113
+ return PassKitTypeMapper.convert(pkSecureElementPass)
114
+ }
115
+ return nil
116
+ }
117
+
118
+ private static func convertBillingAddress(_ pkMethod: PKPaymentMethod) -> CNContact? {
119
+ if #available(iOS 13.0, *) {
120
+ guard let billingAddress = pkMethod.billingAddress else { return nil }
121
+ return PassKitTypeMapper.convert(billingAddress)
122
+ }
123
+ return nil
124
+ }
125
+ }
126
+
127
+ // MARK: - Payment Delegate
128
+
129
+ private class PaymentDelegate: NSObject, PKPaymentAuthorizationViewControllerDelegate {
130
+ private weak var paymentHandler: HybridPaymentHandler?
131
+ private var paymentAuthorized: Bool = false
132
+
133
+ init(paymentHandler: HybridPaymentHandler) {
134
+ self.paymentHandler = paymentHandler
135
+ }
136
+
137
+ func paymentAuthorizationViewController(
138
+ _ controller: PKPaymentAuthorizationViewController,
139
+ didAuthorizePayment payment: PKPayment,
140
+ handler completion: @escaping (PKPaymentAuthorizationResult) -> Void
141
+ ) {
142
+ paymentAuthorized = true
143
+
144
+ // Simulate payment processing
145
+ let workItem = DispatchWorkItem {
146
+ completion(PKPaymentAuthorizationResult(status: .success, errors: nil))
147
+
148
+ let paymentToken = PaymentTokenConverter.convert(payment.token)
149
+ let transactionId = UUID().uuidString
150
+ let result = PaymentResult.init(
151
+ success: true,
152
+ transactionId: transactionId,
153
+ token: paymentToken,
154
+ error: nil
155
+ )
156
+
157
+ self.paymentHandler?.handlePaymentResult(result)
158
+ }
159
+
160
+ DispatchQueue.main.asyncAfter(deadline: .now() + 1.0, execute: workItem)
161
+ }
162
+
163
+ func paymentAuthorizationViewControllerDidFinish(_ controller: PKPaymentAuthorizationViewController) {
164
+ controller.dismiss(animated: true) {
165
+ if !self.paymentAuthorized {
166
+ let result = PaymentResult.init(
167
+ success: false,
168
+ transactionId: nil,
169
+ token: nil,
170
+ error: ErrorMessage.paymentCancelled
171
+ )
172
+ self.paymentHandler?.handlePaymentResult(result)
173
+ }
174
+ }
175
+ }
176
+ }
177
+
178
+ // MARK: - Hybrid Payment Handler
179
+
180
+ class HybridPaymentHandler: HybridPaymentHandlerSpec {
181
+ private var currentPaymentRequest: PKPaymentRequest?
182
+ private var paymentCompletion: ((PaymentResult) -> Void)?
183
+ private var delegate: PaymentDelegate?
184
+
185
+ // MARK: - Public Methods
186
+
187
+ func payServiceStatus() throws -> PayServiceStatus {
188
+ let canMakePayments = PKPaymentAuthorizationViewController.canMakePayments()
189
+ let canSetupCards = PKPaymentAuthorizationViewController.canMakePayments(usingNetworks: [])
190
+ return PayServiceStatus.init(canMakePayments, canSetupCards)
191
+ }
192
+
193
+ func canMakePayments(usingNetworks: [String]) throws -> Bool {
194
+ let networks = usingNetworks.compactMap { PassKitTypeMapper.convertToPKPaymentNetwork($0) }
195
+ return PKPaymentAuthorizationViewController.canMakePayments(usingNetworks: networks)
196
+ }
197
+
198
+ func startPayment(request: PaymentRequest) throws -> Promise<PaymentResult> {
199
+ let promise = Promise<PaymentResult>()
200
+
201
+ DispatchQueue.main.async {
202
+ self.performPayment(request: request) { result in
203
+ promise.resolve(withResult: result)
204
+ }
205
+ }
206
+
207
+ return promise
208
+ }
209
+
210
+ // MARK: - Internal Methods
211
+
212
+ func handlePaymentResult(_ result: PaymentResult) {
213
+ paymentCompletion?(result)
214
+ }
215
+
216
+ // MARK: - Private Methods
217
+
218
+ private func performPayment(request: PaymentRequest, completion: @escaping (PaymentResult) -> Void) {
219
+ let paymentRequest = PaymentRequestBuilder.build(from: request)
220
+
221
+ paymentCompletion = completion
222
+ currentPaymentRequest = paymentRequest
223
+ delegate = PaymentDelegate(paymentHandler: self)
224
+
225
+ guard let paymentAuthVC = PKPaymentAuthorizationViewController(paymentRequest: paymentRequest) else {
226
+ completion(createErrorResult(ErrorMessage.unableToCreate))
227
+ return
228
+ }
229
+
230
+ paymentAuthVC.delegate = delegate
231
+
232
+ guard let rootViewController = UIApplication.shared.windows.first?.rootViewController else {
233
+ completion(createErrorResult(ErrorMessage.unableToPresent))
234
+ return
235
+ }
236
+
237
+ rootViewController.present(paymentAuthVC, animated: true)
238
+ }
239
+
240
+ private func createErrorResult(_ error: String) -> PaymentResult {
241
+ return PaymentResult.init(
242
+ success: false,
243
+ transactionId: nil,
244
+ token: nil,
245
+ error: error
246
+ )
247
+ }
248
+ }
@@ -0,0 +1,192 @@
1
+ import PassKit
2
+ import Contacts
3
+ import NitroModules
4
+
5
+ // MARK: - Constants
6
+
7
+ private enum PaymentNetworkString {
8
+ static let visa = "visa"
9
+ static let mastercard = "mastercard"
10
+ static let amex = "amex"
11
+ static let discover = "discover"
12
+ static let jcb = "jcb"
13
+ static let maestro = "maestro"
14
+ static let electron = "electron"
15
+ static let elo = "elo"
16
+ static let idcredit = "idcredit"
17
+ static let interac = "interac"
18
+ static let privateLabel = "privateLabel"
19
+ }
20
+
21
+ // MARK: - Type Converter
22
+
23
+ /// Converts Apple PassKit and Contacts types to Nitro-generated types
24
+ enum PassKitTypeMapper {
25
+
26
+ // MARK: - Enum Conversions
27
+
28
+ static func convert(_ network: PKPaymentNetwork) -> PaymentNetwork {
29
+ switch network {
30
+ case .visa: return .visa
31
+ case .masterCard: return .mastercard
32
+ case .amex: return .amex
33
+ case .discover: return .discover
34
+ case .JCB: return .jcb
35
+ case .maestro: return .maestro
36
+ case .electron: return .electron
37
+ case .elo: return .elo
38
+ case .idCredit: return .idcredit
39
+ case .interac: return .interac
40
+ case .privateLabel: return .privatelabel
41
+ default: return .visa
42
+ }
43
+ }
44
+
45
+ static func convert(_ type: PKPaymentMethodType) -> PaymentMethodType {
46
+ switch type {
47
+ case .unknown: return .unknown
48
+ case .debit: return .debit
49
+ case .credit: return .credit
50
+ case .prepaid: return .prepaid
51
+ case .store: return .store
52
+ default: return .unknown
53
+ }
54
+ }
55
+
56
+
57
+ static func convertContactType(_ type: Contacts.CNContactType) -> CNContactType {
58
+ switch type {
59
+ case .person: return .person
60
+ case .organization: return .organization
61
+ @unknown default: return .person
62
+ }
63
+ }
64
+
65
+ // MARK: - String to Enum Conversions
66
+
67
+ static func convertToPKPaymentNetwork(_ string: String) -> PKPaymentNetwork? {
68
+ switch string {
69
+ case PaymentNetworkString.visa: return .visa
70
+ case PaymentNetworkString.mastercard: return .masterCard
71
+ case PaymentNetworkString.amex: return .amex
72
+ case PaymentNetworkString.discover: return .discover
73
+ case PaymentNetworkString.jcb: return .JCB
74
+ case PaymentNetworkString.maestro: return .maestro
75
+ case PaymentNetworkString.electron: return .electron
76
+ case PaymentNetworkString.elo: return .elo
77
+ case PaymentNetworkString.idcredit: return .idCredit
78
+ case PaymentNetworkString.interac: return .interac
79
+ case PaymentNetworkString.privateLabel: return .privateLabel
80
+ default: return nil
81
+ }
82
+ }
83
+
84
+ // MARK: - Struct Conversions
85
+
86
+ @available(iOS 13.4, *)
87
+ static func convert(_ pkPass: PassKit.PKSecureElementPass) -> PKSecureElementPass {
88
+ // Convert passActivationState using type inference from the property
89
+ let activationState: PassActivationState
90
+ switch pkPass.passActivationState {
91
+ case .activated: activationState = .activated
92
+ case .requiresActivation: activationState = .requiresactivation
93
+ case .activating: activationState = .activating
94
+ case .suspended: activationState = .suspended
95
+ case .deactivated: activationState = .deactivated
96
+ @unknown default: activationState = .deactivated
97
+ }
98
+
99
+ return PKSecureElementPass.init(
100
+ primaryAccountIdentifier: pkPass.primaryAccountIdentifier,
101
+ primaryAccountNumberSuffix: pkPass.primaryAccountNumberSuffix,
102
+ deviceAccountIdentifier: pkPass.deviceAccountIdentifier,
103
+ deviceAccountNumberSuffix: pkPass.deviceAccountNumberSuffix,
104
+ passActivationState: activationState,
105
+ devicePassIdentifier: pkPass.devicePassIdentifier,
106
+ pairedTerminalIdentifier: pkPass.pairedTerminalIdentifier,
107
+ passTypeIdentifier: pkPass.passTypeIdentifier,
108
+ serialNumber: pkPass.serialNumber,
109
+ organizationName: pkPass.organizationName
110
+ )
111
+ }
112
+
113
+ @available(iOS 13.0, *)
114
+ static func convert(_ contact: Contacts.CNContact) -> CNContact {
115
+ let contactType = convertContactType(contact.contactType)
116
+
117
+ return CNContact.init(
118
+ identifier: contact.identifier,
119
+ contactType: contactType,
120
+ namePrefix: contact.namePrefix,
121
+ givenName: contact.givenName,
122
+ middleName: contact.middleName,
123
+ familyName: contact.familyName,
124
+ previousFamilyName: contact.previousFamilyName,
125
+ nameSuffix: contact.nameSuffix,
126
+ nickname: contact.nickname,
127
+ organizationName: contact.organizationName,
128
+ departmentName: contact.departmentName,
129
+ jobTitle: contact.jobTitle,
130
+ phoneticGivenName: contact.phoneticGivenName,
131
+ phoneticMiddleName: contact.phoneticMiddleName,
132
+ phoneticFamilyName: contact.phoneticFamilyName,
133
+ phoneticOrganizationName: contact.phoneticOrganizationName,
134
+ note: contact.note,
135
+ imageDataAvailable: contact.imageDataAvailable,
136
+ phoneNumbers: convertPhoneNumbers(contact.phoneNumbers),
137
+ emailAddresses: convertEmailAddresses(contact.emailAddresses),
138
+ postalAddresses: convertPostalAddresses(contact.postalAddresses)
139
+ )
140
+ }
141
+
142
+ // MARK: - Private Helpers
143
+
144
+ @available(iOS 13.0, *)
145
+ private static func convertPhoneNumbers(_ phoneNumbers: [Contacts.CNLabeledValue<Contacts.CNPhoneNumber>]) -> [CNLabeledPhoneNumber] {
146
+ return phoneNumbers.map { labeledValue in
147
+ let contactsPhoneNumber = labeledValue.value
148
+ let nitroPhoneNumber = CNPhoneNumber.init(stringValue: contactsPhoneNumber.stringValue)
149
+
150
+ return CNLabeledPhoneNumber.init(
151
+ label: labeledValue.label,
152
+ value: nitroPhoneNumber
153
+ )
154
+ }
155
+ }
156
+
157
+ @available(iOS 13.0, *)
158
+ private static func convertEmailAddresses(_ emailAddresses: [Contacts.CNLabeledValue<NSString>]) -> [CNLabeledEmailAddress] {
159
+ return emailAddresses.map { labeledValue in
160
+ // Extract the NSString value and convert to Swift String
161
+ let emailString = String(labeledValue.value)
162
+ let labelString = labeledValue.label
163
+
164
+ // Create Nitro CNLabeledEmailAddress with Swift String values
165
+ return CNLabeledEmailAddress.init(
166
+ label: labelString,
167
+ value: emailString
168
+ )
169
+ }
170
+ }
171
+
172
+ @available(iOS 13.0, *)
173
+ private static func convertPostalAddresses(_ postalAddresses: [Contacts.CNLabeledValue<Contacts.CNPostalAddress>]) -> [CNLabeledPostalAddress] {
174
+ return postalAddresses.map { labeledValue in
175
+ let contactsAddress = labeledValue.value
176
+ let nitroAddress = CNPostalAddress.init(
177
+ street: contactsAddress.street,
178
+ city: contactsAddress.city,
179
+ state: contactsAddress.state,
180
+ postalCode: contactsAddress.postalCode,
181
+ country: contactsAddress.country,
182
+ isoCountryCode: contactsAddress.isoCountryCode
183
+ )
184
+
185
+ return CNLabeledPostalAddress.init(
186
+ label: labeledValue.label,
187
+ value: nitroAddress
188
+ )
189
+ }
190
+ }
191
+ }
192
+
@@ -0,0 +1,7 @@
1
+ /**
2
+ * React hooks for payment operations
3
+ *
4
+ * @module hooks
5
+ */
6
+ export { usePaymentCheckout } from './usePaymentCheckout';
7
+ export type { UsePaymentCheckoutConfig, UsePaymentCheckoutReturn, } from './usePaymentCheckout';
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ /**
3
+ * React hooks for payment operations
4
+ *
5
+ * @module hooks
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.usePaymentCheckout = void 0;
9
+ var usePaymentCheckout_1 = require("./usePaymentCheckout");
10
+ Object.defineProperty(exports, "usePaymentCheckout", { enumerable: true, get: function () { return usePaymentCheckout_1.usePaymentCheckout; } });