@gmisoftware/react-native-pay 0.0.12 → 0.0.13

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 (162) hide show
  1. package/README.md +223 -220
  2. package/android/src/main/java/com/margelo/nitro/pay/GooglePayRequestBuilder.kt +37 -10
  3. package/android/src/main/java/com/margelo/nitro/pay/HybridPaymentHandler.kt +27 -8
  4. package/ios/HybridPaymentHandler.swift +90 -6
  5. package/lib/hooks/__tests__/usePaymentCheckout.integration.test.d.ts +1 -0
  6. package/lib/hooks/__tests__/usePaymentCheckout.integration.test.js +191 -0
  7. package/lib/hooks/usePaymentCheckout.d.ts +47 -3
  8. package/lib/hooks/usePaymentCheckout.js +6 -4
  9. package/lib/plugin/__tests__/index.test.d.ts +1 -0
  10. package/lib/plugin/__tests__/index.test.js +33 -0
  11. package/lib/plugin/__tests__/withApplePay.test.d.ts +1 -0
  12. package/lib/plugin/__tests__/withApplePay.test.js +58 -0
  13. package/lib/plugin/__tests__/withGooglePay.test.d.ts +1 -0
  14. package/lib/plugin/__tests__/withGooglePay.test.js +45 -0
  15. package/lib/plugin/withApplePay.d.ts +1 -0
  16. package/lib/plugin/withApplePay.js +19 -4
  17. package/lib/types/Payment.d.ts +2 -1
  18. package/lib/utils/__tests__/paymentHelpers.test.d.ts +1 -0
  19. package/lib/utils/__tests__/paymentHelpers.test.js +75 -0
  20. package/lib/utils/paymentHelpers.d.ts +1 -4
  21. package/lib/utils/paymentHelpers.js +2 -5
  22. package/nitrogen/generated/android/NitroPay+autolinking.cmake +1 -1
  23. package/nitrogen/generated/android/NitroPay+autolinking.gradle +1 -1
  24. package/nitrogen/generated/android/NitroPayOnLoad.cpp +1 -1
  25. package/nitrogen/generated/android/NitroPayOnLoad.hpp +1 -1
  26. package/nitrogen/generated/android/c++/JCNContact.hpp +1 -1
  27. package/nitrogen/generated/android/c++/JCNContactType.hpp +1 -1
  28. package/nitrogen/generated/android/c++/JCNLabeledEmailAddress.hpp +1 -1
  29. package/nitrogen/generated/android/c++/JCNLabeledPhoneNumber.hpp +1 -1
  30. package/nitrogen/generated/android/c++/JCNLabeledPostalAddress.hpp +1 -1
  31. package/nitrogen/generated/android/c++/JCNPhoneNumber.hpp +1 -1
  32. package/nitrogen/generated/android/c++/JCNPostalAddress.hpp +1 -1
  33. package/nitrogen/generated/android/c++/JFunc_void.hpp +1 -1
  34. package/nitrogen/generated/android/c++/JGooglePayButtonTheme.hpp +1 -1
  35. package/nitrogen/generated/android/c++/JGooglePayButtonType.hpp +1 -1
  36. package/nitrogen/generated/android/c++/JGooglePayEnvironment.hpp +1 -1
  37. package/nitrogen/generated/android/c++/JHybridGooglePayButtonSpec.cpp +1 -1
  38. package/nitrogen/generated/android/c++/JHybridGooglePayButtonSpec.hpp +1 -1
  39. package/nitrogen/generated/android/c++/JHybridPaymentHandlerSpec.cpp +1 -1
  40. package/nitrogen/generated/android/c++/JHybridPaymentHandlerSpec.hpp +1 -1
  41. package/nitrogen/generated/android/c++/JPKSecureElementPass.hpp +1 -1
  42. package/nitrogen/generated/android/c++/JPassActivationState.hpp +1 -1
  43. package/nitrogen/generated/android/c++/JPayServiceStatus.hpp +1 -1
  44. package/nitrogen/generated/android/c++/JPaymentItem.hpp +1 -1
  45. package/nitrogen/generated/android/c++/JPaymentItemType.hpp +1 -1
  46. package/nitrogen/generated/android/c++/JPaymentMethod.hpp +1 -1
  47. package/nitrogen/generated/android/c++/JPaymentMethodType.hpp +1 -1
  48. package/nitrogen/generated/android/c++/JPaymentNetwork.hpp +1 -1
  49. package/nitrogen/generated/android/c++/JPaymentRequest.hpp +10 -6
  50. package/nitrogen/generated/android/c++/JPaymentResult.hpp +1 -1
  51. package/nitrogen/generated/android/c++/JPaymentToken.hpp +1 -1
  52. package/nitrogen/generated/android/c++/views/JHybridGooglePayButtonStateUpdater.cpp +1 -1
  53. package/nitrogen/generated/android/c++/views/JHybridGooglePayButtonStateUpdater.hpp +1 -1
  54. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/CNContact.kt +1 -1
  55. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/CNContactType.kt +1 -1
  56. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/CNLabeledEmailAddress.kt +1 -1
  57. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/CNLabeledPhoneNumber.kt +1 -1
  58. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/CNLabeledPostalAddress.kt +1 -1
  59. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/CNPhoneNumber.kt +1 -1
  60. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/CNPostalAddress.kt +1 -1
  61. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/Func_void.kt +1 -1
  62. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/GooglePayButtonTheme.kt +1 -1
  63. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/GooglePayButtonType.kt +1 -1
  64. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/GooglePayEnvironment.kt +1 -1
  65. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/HybridGooglePayButtonSpec.kt +1 -1
  66. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/HybridPaymentHandlerSpec.kt +1 -1
  67. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/NitroPayOnLoad.kt +1 -1
  68. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/PKSecureElementPass.kt +1 -1
  69. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/PassActivationState.kt +1 -1
  70. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/PayServiceStatus.kt +1 -1
  71. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/PaymentItem.kt +1 -1
  72. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/PaymentItemType.kt +1 -1
  73. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/PaymentMethod.kt +1 -1
  74. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/PaymentMethodType.kt +1 -1
  75. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/PaymentNetwork.kt +1 -1
  76. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/PaymentRequest.kt +7 -4
  77. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/PaymentResult.kt +1 -1
  78. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/PaymentToken.kt +1 -1
  79. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/views/HybridGooglePayButtonManager.kt +1 -1
  80. package/nitrogen/generated/android/kotlin/com/margelo/nitro/pay/views/HybridGooglePayButtonStateUpdater.kt +1 -1
  81. package/nitrogen/generated/ios/NitroPay+autolinking.rb +1 -1
  82. package/nitrogen/generated/ios/NitroPay-Swift-Cxx-Bridge.cpp +1 -1
  83. package/nitrogen/generated/ios/NitroPay-Swift-Cxx-Bridge.hpp +1 -1
  84. package/nitrogen/generated/ios/NitroPay-Swift-Cxx-Umbrella.hpp +1 -1
  85. package/nitrogen/generated/ios/NitroPayAutolinking.mm +1 -1
  86. package/nitrogen/generated/ios/NitroPayAutolinking.swift +1 -1
  87. package/nitrogen/generated/ios/c++/HybridApplePayButtonSpecSwift.cpp +1 -1
  88. package/nitrogen/generated/ios/c++/HybridApplePayButtonSpecSwift.hpp +1 -1
  89. package/nitrogen/generated/ios/c++/HybridPaymentHandlerSpecSwift.cpp +1 -1
  90. package/nitrogen/generated/ios/c++/HybridPaymentHandlerSpecSwift.hpp +1 -1
  91. package/nitrogen/generated/ios/c++/views/HybridApplePayButtonComponent.mm +1 -1
  92. package/nitrogen/generated/ios/swift/ApplePayButtonStyle.swift +1 -1
  93. package/nitrogen/generated/ios/swift/ApplePayButtonType.swift +1 -1
  94. package/nitrogen/generated/ios/swift/CNContact.swift +1 -1
  95. package/nitrogen/generated/ios/swift/CNContactType.swift +1 -1
  96. package/nitrogen/generated/ios/swift/CNLabeledEmailAddress.swift +1 -1
  97. package/nitrogen/generated/ios/swift/CNLabeledPhoneNumber.swift +1 -1
  98. package/nitrogen/generated/ios/swift/CNLabeledPostalAddress.swift +1 -1
  99. package/nitrogen/generated/ios/swift/CNPhoneNumber.swift +1 -1
  100. package/nitrogen/generated/ios/swift/CNPostalAddress.swift +1 -1
  101. package/nitrogen/generated/ios/swift/Func_void.swift +1 -1
  102. package/nitrogen/generated/ios/swift/Func_void_PaymentResult.swift +1 -1
  103. package/nitrogen/generated/ios/swift/Func_void_std__exception_ptr.swift +1 -1
  104. package/nitrogen/generated/ios/swift/GooglePayEnvironment.swift +1 -1
  105. package/nitrogen/generated/ios/swift/HybridApplePayButtonSpec.swift +1 -1
  106. package/nitrogen/generated/ios/swift/HybridApplePayButtonSpec_cxx.swift +1 -1
  107. package/nitrogen/generated/ios/swift/HybridPaymentHandlerSpec.swift +1 -1
  108. package/nitrogen/generated/ios/swift/HybridPaymentHandlerSpec_cxx.swift +1 -1
  109. package/nitrogen/generated/ios/swift/PKSecureElementPass.swift +1 -1
  110. package/nitrogen/generated/ios/swift/PassActivationState.swift +1 -1
  111. package/nitrogen/generated/ios/swift/PayServiceStatus.swift +1 -1
  112. package/nitrogen/generated/ios/swift/PaymentItem.swift +1 -1
  113. package/nitrogen/generated/ios/swift/PaymentItemType.swift +1 -1
  114. package/nitrogen/generated/ios/swift/PaymentMethod.swift +1 -1
  115. package/nitrogen/generated/ios/swift/PaymentMethodType.swift +1 -1
  116. package/nitrogen/generated/ios/swift/PaymentNetwork.swift +1 -1
  117. package/nitrogen/generated/ios/swift/PaymentRequest.swift +55 -6
  118. package/nitrogen/generated/ios/swift/PaymentResult.swift +1 -1
  119. package/nitrogen/generated/ios/swift/PaymentToken.swift +1 -1
  120. package/nitrogen/generated/shared/c++/ApplePayButtonStyle.hpp +1 -1
  121. package/nitrogen/generated/shared/c++/ApplePayButtonType.hpp +1 -1
  122. package/nitrogen/generated/shared/c++/CNContact.hpp +1 -1
  123. package/nitrogen/generated/shared/c++/CNContactType.hpp +1 -1
  124. package/nitrogen/generated/shared/c++/CNLabeledEmailAddress.hpp +1 -1
  125. package/nitrogen/generated/shared/c++/CNLabeledPhoneNumber.hpp +1 -1
  126. package/nitrogen/generated/shared/c++/CNLabeledPostalAddress.hpp +1 -1
  127. package/nitrogen/generated/shared/c++/CNPhoneNumber.hpp +1 -1
  128. package/nitrogen/generated/shared/c++/CNPostalAddress.hpp +1 -1
  129. package/nitrogen/generated/shared/c++/GooglePayButtonTheme.hpp +1 -1
  130. package/nitrogen/generated/shared/c++/GooglePayButtonType.hpp +1 -1
  131. package/nitrogen/generated/shared/c++/GooglePayEnvironment.hpp +1 -1
  132. package/nitrogen/generated/shared/c++/HybridApplePayButtonSpec.cpp +1 -1
  133. package/nitrogen/generated/shared/c++/HybridApplePayButtonSpec.hpp +1 -1
  134. package/nitrogen/generated/shared/c++/HybridGooglePayButtonSpec.cpp +1 -1
  135. package/nitrogen/generated/shared/c++/HybridGooglePayButtonSpec.hpp +1 -1
  136. package/nitrogen/generated/shared/c++/HybridPaymentHandlerSpec.cpp +1 -1
  137. package/nitrogen/generated/shared/c++/HybridPaymentHandlerSpec.hpp +1 -1
  138. package/nitrogen/generated/shared/c++/PKSecureElementPass.hpp +1 -1
  139. package/nitrogen/generated/shared/c++/PassActivationState.hpp +1 -1
  140. package/nitrogen/generated/shared/c++/PayServiceStatus.hpp +1 -1
  141. package/nitrogen/generated/shared/c++/PaymentItem.hpp +1 -1
  142. package/nitrogen/generated/shared/c++/PaymentItemType.hpp +1 -1
  143. package/nitrogen/generated/shared/c++/PaymentMethod.hpp +1 -1
  144. package/nitrogen/generated/shared/c++/PaymentMethodType.hpp +1 -1
  145. package/nitrogen/generated/shared/c++/PaymentNetwork.hpp +1 -1
  146. package/nitrogen/generated/shared/c++/PaymentRequest.hpp +10 -6
  147. package/nitrogen/generated/shared/c++/PaymentResult.hpp +1 -1
  148. package/nitrogen/generated/shared/c++/PaymentToken.hpp +1 -1
  149. package/nitrogen/generated/shared/c++/views/HybridApplePayButtonComponent.cpp +1 -1
  150. package/nitrogen/generated/shared/c++/views/HybridApplePayButtonComponent.hpp +1 -1
  151. package/nitrogen/generated/shared/c++/views/HybridGooglePayButtonComponent.cpp +1 -1
  152. package/nitrogen/generated/shared/c++/views/HybridGooglePayButtonComponent.hpp +1 -1
  153. package/package.json +11 -4
  154. package/src/hooks/__tests__/usePaymentCheckout.integration.test.ts +244 -0
  155. package/src/hooks/usePaymentCheckout.ts +60 -5
  156. package/src/plugin/__tests__/index.test.ts +37 -0
  157. package/src/plugin/__tests__/withApplePay.test.ts +83 -0
  158. package/src/plugin/__tests__/withGooglePay.test.ts +66 -0
  159. package/src/plugin/withApplePay.ts +34 -6
  160. package/src/types/Payment.ts +4 -1
  161. package/src/utils/__tests__/paymentHelpers.test.ts +93 -0
  162. package/src/utils/paymentHelpers.ts +1 -6
@@ -0,0 +1,66 @@
1
+ const mockAddMetaDataItemToMainApplication = jest.fn()
2
+ const mockGetMainApplicationOrThrow = jest.fn()
3
+ const mockRemoveMetaDataItemFromMainApplication = jest.fn()
4
+ const mockWithAndroidManifest = jest.fn(
5
+ (config: Record<string, unknown>, action: (input: any) => any) =>
6
+ action({ modResults: config })
7
+ )
8
+
9
+ jest.mock('expo/config-plugins', () => ({
10
+ AndroidConfig: {
11
+ Manifest: {
12
+ addMetaDataItemToMainApplication: (...args: any[]) =>
13
+ mockAddMetaDataItemToMainApplication(...args),
14
+ getMainApplicationOrThrow: (...args: any[]) =>
15
+ mockGetMainApplicationOrThrow(...args),
16
+ removeMetaDataItemFromMainApplication: (...args: any[]) =>
17
+ mockRemoveMetaDataItemFromMainApplication(...args),
18
+ },
19
+ },
20
+ withAndroidManifest: (config: any, action: (input: any) => any) =>
21
+ mockWithAndroidManifest(config, action),
22
+ }))
23
+
24
+ import { setGooglePayMetaData, withGooglePay } from '../withGooglePay'
25
+
26
+ describe('withGooglePay', () => {
27
+ beforeEach(() => {
28
+ mockGetMainApplicationOrThrow.mockReturnValue({ name: 'main-app' })
29
+ })
30
+
31
+ it('enables Google Pay metadata when enabled=true', () => {
32
+ const manifest = { application: [] }
33
+ const result = setGooglePayMetaData(true, manifest as any)
34
+
35
+ expect(result).toBe(manifest)
36
+ expect(mockGetMainApplicationOrThrow).toHaveBeenCalledWith(manifest)
37
+ expect(mockAddMetaDataItemToMainApplication).toHaveBeenCalledWith(
38
+ { name: 'main-app' },
39
+ 'com.google.android.gms.wallet.api.enabled',
40
+ 'true'
41
+ )
42
+ expect(mockRemoveMetaDataItemFromMainApplication).not.toHaveBeenCalled()
43
+ })
44
+
45
+ it('removes Google Pay metadata when enabled=false', () => {
46
+ const manifest = { application: [] }
47
+ const result = setGooglePayMetaData(false, manifest as any)
48
+
49
+ expect(result).toBe(manifest)
50
+ expect(mockGetMainApplicationOrThrow).toHaveBeenCalledWith(manifest)
51
+ expect(mockRemoveMetaDataItemFromMainApplication).toHaveBeenCalledWith(
52
+ { name: 'main-app' },
53
+ 'com.google.android.gms.wallet.api.enabled'
54
+ )
55
+ expect(mockAddMetaDataItemToMainApplication).not.toHaveBeenCalled()
56
+ })
57
+
58
+ it('wires withAndroidManifest and applies metadata by plugin prop', () => {
59
+ const config = { name: 'app' }
60
+ const result = withGooglePay(config as any, { enableGooglePay: true })
61
+
62
+ expect(mockWithAndroidManifest).toHaveBeenCalledTimes(1)
63
+ expect(result).toEqual({ modResults: { name: 'app' } })
64
+ expect(mockAddMetaDataItemToMainApplication).toHaveBeenCalled()
65
+ })
66
+ })
@@ -1,13 +1,18 @@
1
- import { withEntitlementsPlist, type ConfigPlugin } from 'expo/config-plugins'
1
+ import {
2
+ withEntitlementsPlist,
3
+ withInfoPlist,
4
+ type ConfigPlugin,
5
+ } from 'expo/config-plugins'
2
6
  import type { ReactNativePayPluginProps } from './type'
3
7
 
8
+ const APPLE_PAY_ENTITLEMENT_KEY = 'com.apple.developer.in-app-payments'
9
+ const APPLE_PAY_INFO_PLIST_KEY = 'ReactNativePayApplePayMerchantIdentifiers'
10
+
4
11
  export function setApplePayEntitlement(
5
12
  merchantIdentifiers: string | string[],
6
13
  entitlements: Record<string, any>
7
14
  ): Record<string, any> {
8
- const key = 'com.apple.developer.in-app-payments'
9
-
10
- const merchants: string[] = entitlements[key] ?? []
15
+ const merchants: string[] = entitlements[APPLE_PAY_ENTITLEMENT_KEY] ?? []
11
16
 
12
17
  if (!Array.isArray(merchantIdentifiers)) {
13
18
  merchantIdentifiers = [merchantIdentifiers]
@@ -20,11 +25,26 @@ export function setApplePayEntitlement(
20
25
  }
21
26
 
22
27
  if (merchants.length) {
23
- entitlements[key] = merchants
28
+ entitlements[APPLE_PAY_ENTITLEMENT_KEY] = merchants
24
29
  }
25
30
  return entitlements
26
31
  }
27
32
 
33
+ export function setApplePayMerchantIdentifiersInInfoPlist(
34
+ merchantIdentifiers: string | string[],
35
+ infoPlist: Record<string, any>
36
+ ): Record<string, any> {
37
+ const merchants: string[] = Array.isArray(merchantIdentifiers)
38
+ ? merchantIdentifiers.filter(Boolean)
39
+ : [merchantIdentifiers].filter(Boolean)
40
+
41
+ if (merchants.length) {
42
+ infoPlist[APPLE_PAY_INFO_PLIST_KEY] = [...new Set(merchants)]
43
+ }
44
+
45
+ return infoPlist
46
+ }
47
+
28
48
  export const withApplePay: ConfigPlugin<ReactNativePayPluginProps> = (
29
49
  expoConfig,
30
50
  { merchantIdentifier }
@@ -34,11 +54,19 @@ export const withApplePay: ConfigPlugin<ReactNativePayPluginProps> = (
34
54
  return expoConfig
35
55
  }
36
56
 
37
- return withEntitlementsPlist(expoConfig, (config) => {
57
+ const withEntitlements = withEntitlementsPlist(expoConfig, (config) => {
38
58
  config.modResults = setApplePayEntitlement(
39
59
  merchantIdentifier,
40
60
  config.modResults
41
61
  )
42
62
  return config
43
63
  })
64
+
65
+ return withInfoPlist(withEntitlements, (config) => {
66
+ config.modResults = setApplePayMerchantIdentifiersInInfoPlist(
67
+ merchantIdentifier,
68
+ config.modResults
69
+ )
70
+ return config
71
+ })
44
72
  }
@@ -72,7 +72,9 @@ export interface PaymentToken {
72
72
  paymentData: string // Base64 encoded Data from PKPaymentToken
73
73
  }
74
74
  export interface PaymentRequest {
75
- merchantIdentifier: string
75
+ // Optional Apple Pay override for apps with multiple configured merchant IDs.
76
+ // When omitted, iOS resolves the first configured entitlement automatically.
77
+ applePayMerchantIdentifier?: string
76
78
  merchantName?: string
77
79
  countryCode: string
78
80
  currencyCode: string
@@ -84,6 +86,7 @@ export interface PaymentRequest {
84
86
  billingContactRequired?: boolean
85
87
  shippingContactRequired?: boolean
86
88
  // Google Pay specific configuration (Android only)
89
+ googlePayMerchantId?: string
87
90
  googlePayEnvironment?: GooglePayEnvironment
88
91
  googlePayGateway?: string
89
92
  googlePayGatewayMerchantId?: string
@@ -0,0 +1,93 @@
1
+ import {
2
+ CommonNetworks,
3
+ calculateTotal,
4
+ createPaymentItem,
5
+ createPaymentRequest,
6
+ formatAmount,
7
+ formatNetworkName,
8
+ isNetworkSupported,
9
+ parseAmount,
10
+ } from '../paymentHelpers'
11
+
12
+ describe('paymentHelpers', () => {
13
+ it('creates payment items with default and explicit type', () => {
14
+ expect(createPaymentItem('Coffee', 4.99)).toEqual({
15
+ label: 'Coffee',
16
+ amount: 4.99,
17
+ type: 'final',
18
+ })
19
+ expect(createPaymentItem('Shipping', 2.5, 'pending')).toEqual({
20
+ label: 'Shipping',
21
+ amount: 2.5,
22
+ type: 'pending',
23
+ })
24
+ })
25
+
26
+ it('calculates totals from line items', () => {
27
+ expect(
28
+ calculateTotal([
29
+ createPaymentItem('Product', 10),
30
+ createPaymentItem('Tax', 2.15),
31
+ createPaymentItem('Shipping', 3.35),
32
+ ])
33
+ ).toBeCloseTo(15.5)
34
+ })
35
+
36
+ it('creates payment requests with sane defaults', () => {
37
+ const request = createPaymentRequest({
38
+ amount: 19.99,
39
+ label: 'Pro Plan',
40
+ })
41
+
42
+ expect(request).toEqual({
43
+ countryCode: 'US',
44
+ currencyCode: 'USD',
45
+ paymentItems: [{ label: 'Pro Plan', amount: 19.99, type: 'final' }],
46
+ supportedNetworks: [
47
+ CommonNetworks.VISA,
48
+ CommonNetworks.MASTERCARD,
49
+ CommonNetworks.AMEX,
50
+ CommonNetworks.DISCOVER,
51
+ ],
52
+ merchantCapabilities: ['3DS'],
53
+ })
54
+ })
55
+
56
+ it('allows overriding defaults in payment requests', () => {
57
+ const request = createPaymentRequest({
58
+ amount: 39.99,
59
+ label: 'Deluxe',
60
+ countryCode: 'PL',
61
+ currencyCode: 'PLN',
62
+ supportedNetworks: ['visa'],
63
+ merchantCapabilities: ['EMV'],
64
+ merchantName: 'My Store',
65
+ applePayMerchantIdentifier: 'merchant.com.apple.override',
66
+ googlePayMerchantId: 'google-pay-merchant-id',
67
+ })
68
+
69
+ expect(request.countryCode).toBe('PL')
70
+ expect(request.currencyCode).toBe('PLN')
71
+ expect(request.supportedNetworks).toEqual(['visa'])
72
+ expect(request.merchantCapabilities).toEqual(['EMV'])
73
+ expect(request.merchantName).toBe('My Store')
74
+ expect(request.applePayMerchantIdentifier).toBe('merchant.com.apple.override')
75
+ expect(request.googlePayMerchantId).toBe('google-pay-merchant-id')
76
+ })
77
+
78
+ it('formats and parses amount values', () => {
79
+ expect(formatAmount(29.9)).toBe('29.90')
80
+ expect(parseAmount('29.90')).toBeCloseTo(29.9)
81
+ })
82
+
83
+ it('checks network support using case-insensitive matching', () => {
84
+ expect(isNetworkSupported('AMEX', ['visa', 'amex'])).toBe(true)
85
+ expect(isNetworkSupported('discover', ['visa', 'mastercard'])).toBe(false)
86
+ })
87
+
88
+ it('formats known payment networks for display', () => {
89
+ expect(formatNetworkName('visa')).toBe('Visa')
90
+ expect(formatNetworkName('amex')).toBe('American Express')
91
+ expect(formatNetworkName('privateLabel')).toBe('Private Label')
92
+ })
93
+ })
@@ -11,7 +11,6 @@
11
11
  * import { createPaymentRequest, calculateTotal } from 'react-native-pay'
12
12
  *
13
13
  * const request = createPaymentRequest({
14
- * merchantIdentifier: 'merchant.com.example',
15
14
  * amount: 29.99,
16
15
  * label: 'Coffee Subscription'
17
16
  * })
@@ -80,13 +79,12 @@ export function calculateTotal(items: PaymentItem[]): number {
80
79
  * - supportedNetworks: ['visa', 'mastercard', 'amex', 'discover']
81
80
  * - merchantCapabilities: ['3DS']
82
81
  *
83
- * @param options - Payment request options (merchantIdentifier, amount, label required)
82
+ * @param options - Payment request options (amount and label required)
84
83
  * @returns Complete PaymentRequest object
85
84
  *
86
85
  * @example
87
86
  * ```typescript
88
87
  * const request = createPaymentRequest({
89
- * merchantIdentifier: 'merchant.com.example',
90
88
  * amount: 29.99,
91
89
  * label: 'Coffee Subscription',
92
90
  * countryCode: 'CA', // override default
@@ -96,13 +94,11 @@ export function calculateTotal(items: PaymentItem[]): number {
96
94
  */
97
95
  export function createPaymentRequest(
98
96
  options: Partial<PaymentRequest> & {
99
- merchantIdentifier: string
100
97
  amount: number
101
98
  label: string
102
99
  }
103
100
  ): PaymentRequest {
104
101
  const {
105
- merchantIdentifier,
106
102
  amount,
107
103
  label,
108
104
  countryCode = 'US',
@@ -118,7 +114,6 @@ export function createPaymentRequest(
118
114
  } = options
119
115
 
120
116
  return {
121
- merchantIdentifier,
122
117
  countryCode,
123
118
  currencyCode,
124
119
  paymentItems: [createPaymentItem(label, amount, 'final')],