@stripe/stripe-react-native 0.21.0 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -1
- package/android/build.gradle +1 -0
- package/android/proguard-rules.txt +7 -0
- package/android/src/main/java/com/reactnativestripesdk/CardFieldView.kt +4 -0
- package/android/src/main/java/com/reactnativestripesdk/GooglePayButtonManager.kt +5 -0
- package/android/src/main/java/com/reactnativestripesdk/GooglePayButtonView.kt +46 -8
- package/android/src/main/java/com/reactnativestripesdk/GooglePayLauncherFragment.kt +132 -0
- package/android/src/main/java/com/reactnativestripesdk/GooglePayRequestHelper.kt +144 -0
- package/android/src/main/java/com/reactnativestripesdk/StripeSdkModule.kt +123 -8
- package/android/src/main/java/com/reactnativestripesdk/utils/Extensions.kt +5 -0
- package/android/src/main/res/drawable/book_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable/buy_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable/checkout_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable/donate_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable/googlepay_button_background_shape.xml +11 -0
- package/android/src/main/res/drawable/googlepay_mark_background.xml +12 -0
- package/android/src/main/res/drawable/googlepay_mark_content.xml +27 -0
- package/android/src/main/res/drawable/order_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable/pay_with_googlepay_button_content.xml +6 -6
- package/android/src/main/res/drawable/subscribe_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ar/book_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ar/buy_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ar/checkout_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ar/donate_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ar/order_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ar/pay_with_googlepay_button_content.xml +6 -6
- package/android/src/main/res/drawable-ar/subscribe_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-bg/book_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-bg/buy_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-bg/checkout_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-bg/donate_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-bg/order_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-bg/pay_with_googlepay_button_content.xml +4 -4
- package/android/src/main/res/drawable-bg/subscribe_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ca/book_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ca/buy_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ca/checkout_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ca/donate_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ca/order_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ca/pay_with_googlepay_button_content.xml +6 -6
- package/android/src/main/res/drawable-ca/subscribe_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-cs/book_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-cs/buy_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-cs/checkout_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-cs/donate_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-cs/order_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-cs/pay_with_googlepay_button_content.xml +6 -6
- package/android/src/main/res/drawable-cs/subscribe_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-da/book_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-da/buy_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-da/checkout_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-da/donate_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-da/order_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-da/pay_with_googlepay_button_content.xml +6 -6
- package/android/src/main/res/drawable-da/subscribe_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-de/book_with_googlepay_button_content.xml +15 -0
- package/android/src/main/res/drawable-de/buy_with_googlepay_button_content.xml +15 -0
- package/android/src/main/res/drawable-de/checkout_with_googlepay_button_content.xml +15 -0
- package/android/src/main/res/drawable-de/donate_with_googlepay_button_content.xml +15 -0
- package/android/src/main/res/drawable-de/order_with_googlepay_button_content.xml +15 -0
- package/android/src/main/res/drawable-de/pay_with_googlepay_button_content.xml +7 -7
- package/android/src/main/res/drawable-de/subscribe_with_googlepay_button_content.xml +15 -0
- package/android/src/main/res/drawable-el/book_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-el/buy_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-el/checkout_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-el/donate_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-el/order_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-el/pay_with_googlepay_button_content.xml +4 -4
- package/android/src/main/res/drawable-el/subscribe_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-et/book_with_googlepay_button_content.xml +15 -0
- package/android/src/main/res/drawable-et/buy_with_googlepay_button_content.xml +15 -0
- package/android/src/main/res/drawable-et/checkout_with_googlepay_button_content.xml +15 -0
- package/android/src/main/res/drawable-et/donate_with_googlepay_button_content.xml +15 -0
- package/android/src/main/res/drawable-et/order_with_googlepay_button_content.xml +15 -0
- package/android/src/main/res/drawable-et/pay_with_googlepay_button_content.xml +8 -8
- package/android/src/main/res/drawable-et/subscribe_with_googlepay_button_content.xml +15 -0
- package/android/src/main/res/drawable-fi/book_with_googlepay_button_content.xml +15 -0
- package/android/src/main/res/drawable-fi/buy_with_googlepay_button_content.xml +15 -0
- package/android/src/main/res/drawable-fi/checkout_with_googlepay_button_content.xml +15 -0
- package/android/src/main/res/drawable-fi/donate_with_googlepay_button_content.xml +15 -0
- package/android/src/main/res/drawable-fi/order_with_googlepay_button_content.xml +15 -0
- package/android/src/main/res/drawable-fi/pay_with_googlepay_button_content.xml +8 -8
- package/android/src/main/res/drawable-fi/subscribe_with_googlepay_button_content.xml +15 -0
- package/android/src/main/res/drawable-fr/book_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-fr/buy_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-fr/checkout_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-fr/donate_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-fr/order_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-fr/pay_with_googlepay_button_content.xml +5 -5
- package/android/src/main/res/drawable-fr/subscribe_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-hr/book_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-hr/buy_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-hr/checkout_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-hr/donate_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-hr/order_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-hr/pay_with_googlepay_button_content.xml +4 -4
- package/android/src/main/res/drawable-hr/subscribe_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-id/book_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-id/buy_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-id/checkout_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-id/donate_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-id/order_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-id/pay_with_googlepay_button_content.xml +4 -4
- package/android/src/main/res/drawable-id/subscribe_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-it/book_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-it/buy_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-it/checkout_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-it/donate_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-it/order_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-it/pay_with_googlepay_button_content.xml +6 -6
- package/android/src/main/res/drawable-it/subscribe_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ja/book_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ja/buy_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ja/checkout_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ja/donate_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ja/order_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ja/pay_with_googlepay_button_content.xml +5 -5
- package/android/src/main/res/drawable-ja/subscribe_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ko/book_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ko/buy_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ko/checkout_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ko/donate_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ko/order_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ko/pay_with_googlepay_button_content.xml +7 -7
- package/android/src/main/res/drawable-ko/subscribe_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ms/book_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ms/buy_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ms/checkout_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ms/donate_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ms/order_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ms/pay_with_googlepay_button_content.xml +4 -4
- package/android/src/main/res/drawable-ms/subscribe_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-nl/book_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-nl/buy_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-nl/checkout_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-nl/donate_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-nl/order_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-nl/pay_with_googlepay_button_content.xml +4 -4
- package/android/src/main/res/drawable-nl/subscribe_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-no/book_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-no/buy_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-no/checkout_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-no/donate_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-no/order_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-no/pay_with_googlepay_button_content.xml +6 -6
- package/android/src/main/res/drawable-no/subscribe_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-pl/book_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-pl/buy_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-pl/checkout_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-pl/donate_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-pl/order_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-pl/pay_with_googlepay_button_content.xml +7 -7
- package/android/src/main/res/drawable-pl/subscribe_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ru/book_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ru/buy_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ru/checkout_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ru/donate_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ru/order_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-ru/pay_with_googlepay_button_content.xml +7 -7
- package/android/src/main/res/drawable-ru/subscribe_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-sk/book_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-sk/buy_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-sk/checkout_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-sk/donate_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-sk/order_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-sk/pay_with_googlepay_button_content.xml +4 -4
- package/android/src/main/res/drawable-sk/subscribe_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-sl/book_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-sl/buy_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-sl/checkout_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-sl/donate_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-sl/order_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-sl/pay_with_googlepay_button_content.xml +4 -4
- package/android/src/main/res/drawable-sl/subscribe_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-sr/book_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-sr/buy_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-sr/checkout_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-sr/donate_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-sr/order_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-sr/pay_with_googlepay_button_content.xml +7 -7
- package/android/src/main/res/drawable-sr/subscribe_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-sv/book_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-sv/buy_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-sv/checkout_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-sv/donate_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-sv/order_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-sv/pay_with_googlepay_button_content.xml +4 -4
- package/android/src/main/res/drawable-sv/subscribe_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-th/book_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-th/buy_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-th/checkout_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-th/donate_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-th/order_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-th/pay_with_googlepay_button_content.xml +6 -6
- package/android/src/main/res/drawable-th/subscribe_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-tr/book_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-tr/buy_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-tr/checkout_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-tr/donate_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-tr/order_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-tr/pay_with_googlepay_button_content.xml +7 -7
- package/android/src/main/res/drawable-tr/subscribe_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-uk/book_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-uk/buy_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-uk/checkout_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-uk/donate_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-uk/order_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/drawable-uk/pay_with_googlepay_button_content.xml +5 -5
- package/android/src/main/res/drawable-uk/subscribe_with_googlepay_button_content.xml +14 -0
- package/android/src/main/res/layout/book_with_googlepay_button.xml +20 -0
- package/android/src/main/res/layout/buy_with_googlepay_button.xml +20 -0
- package/android/src/main/res/layout/checkout_with_googlepay_button.xml +20 -0
- package/android/src/main/res/layout/donate_with_googlepay_button.xml +20 -0
- package/android/src/main/res/layout/googlepay_mark_button.xml +18 -0
- package/android/src/main/res/layout/order_with_googlepay_button.xml +20 -0
- package/android/src/main/res/layout/pay_with_googlepay_button.xml +10 -24
- package/android/src/main/res/layout/plain_googlepay_button.xml +17 -0
- package/android/src/main/res/layout/subscribe_with_googlepay_button.xml +20 -0
- package/android/src/main/res/values/googlepay_strings.xml +3 -2
- package/ios/ApplePayButtonManager.m +5 -0
- package/ios/ApplePayButtonManager.swift +3 -1
- package/ios/ApplePayButtonView.swift +21 -0
- package/ios/ApplePayUtils.swift +187 -0
- package/ios/ApplePayViewController.swift +279 -0
- package/ios/PaymentPassFinder.swift +61 -0
- package/ios/PushProvisioning/AddToWalletButtonView.swift +10 -10
- package/ios/PushProvisioning/PushProvisioningUtils.swift +39 -16
- package/ios/StripeSdk.m +29 -0
- package/ios/StripeSdk.swift +193 -129
- package/ios/Tests/AddressSheetUtilsTests.swift +1 -7
- package/ios/Tests/PushProvisioningTests.swift +14 -11
- package/jest/mock.js +44 -0
- package/lib/commonjs/NativeStripeSdk.js.map +1 -1
- package/lib/commonjs/components/PlatformPayButton.js +2 -0
- package/lib/commonjs/components/PlatformPayButton.js.map +1 -0
- package/lib/commonjs/functions.js +1 -1
- package/lib/commonjs/functions.js.map +1 -1
- package/lib/commonjs/hooks/usePlatformPay.js +2 -0
- package/lib/commonjs/hooks/usePlatformPay.js.map +1 -0
- package/lib/commonjs/hooks/useStripe.js +1 -1
- package/lib/commonjs/hooks/useStripe.js.map +1 -1
- package/lib/commonjs/index.js +1 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/types/Errors.js +1 -1
- package/lib/commonjs/types/Errors.js.map +1 -1
- package/lib/commonjs/types/PlatformPay.js +2 -0
- package/lib/commonjs/types/PlatformPay.js.map +1 -0
- package/lib/commonjs/types/PushProvisioning.js +2 -0
- package/lib/commonjs/types/PushProvisioning.js.map +1 -0
- package/lib/commonjs/types/index.js +1 -1
- package/lib/commonjs/types/index.js.map +1 -1
- package/lib/module/NativeStripeSdk.js.map +1 -1
- package/lib/module/components/PlatformPayButton.js +2 -0
- package/lib/module/components/PlatformPayButton.js.map +1 -0
- package/lib/module/functions.js +1 -1
- package/lib/module/functions.js.map +1 -1
- package/lib/module/hooks/usePlatformPay.js +2 -0
- package/lib/module/hooks/usePlatformPay.js.map +1 -0
- package/lib/module/hooks/useStripe.js +1 -1
- package/lib/module/hooks/useStripe.js.map +1 -1
- package/lib/module/index.js +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/types/Errors.js +1 -1
- package/lib/module/types/Errors.js.map +1 -1
- package/lib/module/types/PlatformPay.js +2 -0
- package/lib/module/types/PlatformPay.js.map +1 -0
- package/lib/module/types/PushProvisioning.js +2 -0
- package/lib/module/types/PushProvisioning.js.map +1 -0
- package/lib/module/types/index.js +1 -1
- package/lib/module/types/index.js.map +1 -1
- package/lib/typescript/src/NativeStripeSdk.d.ts +8 -1
- package/lib/typescript/src/components/PlatformPayButton.d.ts +65 -0
- package/lib/typescript/src/functions.d.ts +73 -1
- package/lib/typescript/src/hooks/usePlatformPay.d.ts +70 -0
- package/lib/typescript/src/hooks/useStripe.d.ts +18 -1
- package/lib/typescript/src/index.d.ts +2 -0
- package/lib/typescript/src/types/ApplePay.d.ts +9 -0
- package/lib/typescript/src/types/Errors.d.ts +6 -1
- package/lib/typescript/src/types/GooglePay.d.ts +2 -1
- package/lib/typescript/src/types/PlatformPay.d.ts +285 -0
- package/lib/typescript/src/types/PushProvisioning.d.ts +66 -0
- package/lib/typescript/src/types/components/ApplePayButtonComponent.d.ts +2 -2
- package/lib/typescript/src/types/index.d.ts +3 -38
- package/package.json +8 -1
- package/src/NativeStripeSdk.tsx +20 -0
- package/src/components/PlatformPayButton.tsx +157 -0
- package/src/functions.ts +181 -0
- package/src/hooks/usePlatformPay.tsx +174 -0
- package/src/hooks/useStripe.tsx +77 -0
- package/src/index.tsx +6 -0
- package/src/types/ApplePay.ts +9 -0
- package/src/types/Errors.ts +7 -1
- package/src/types/GooglePay.ts +2 -1
- package/src/types/PlatformPay.ts +326 -0
- package/src/types/PushProvisioning.ts +76 -0
- package/src/types/components/ApplePayButtonComponent.ts +3 -2
- package/src/types/index.ts +3 -54
- package/android/src/main/res/drawable/googlepay_button_background.xml +0 -6
- package/android/src/main/res/drawable/googlepay_button_content.xml +0 -48
- package/android/src/main/res/drawable/googlepay_button_overlay.xml +0 -12
- package/android/src/main/res/drawable-af/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-am/pay_with_googlepay_button_content.xml +0 -15
- package/android/src/main/res/drawable-as/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-az/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-be/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-bn/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-bs/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-cy/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-en-rau/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-en-rca/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-en-rgb/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-en-rin/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-es/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-es-res/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-eu/pay_with_googlepay_button_content.xml +0 -15
- package/android/src/main/res/drawable-fa/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-fil/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-fr-rca/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-ga/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-gl/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-gu/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-hdpi/googlepay_button_background_image.9.png +0 -0
- package/android/src/main/res/drawable-hu/pay_with_googlepay_button_content.xml +0 -15
- package/android/src/main/res/drawable-hy/pay_with_googlepay_button_content.xml +0 -15
- package/android/src/main/res/drawable-is/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-iw/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-ka/pay_with_googlepay_button_content.xml +0 -15
- package/android/src/main/res/drawable-kk/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-km/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-kn/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-ky/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-lo/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-lt/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-lv/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-mdpi/googlepay_button_background_image.9.png +0 -0
- package/android/src/main/res/drawable-mk/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-ml/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-mn/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-mr/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-ne/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-pt-rbr/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-pt-rpt/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-ro/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-sq/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-sw/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-ta/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-te/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-ur/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-uz/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-v21/googlepay_button_background.xml +0 -7
- package/android/src/main/res/drawable-vi/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/drawable-xhdpi/googlepay_button_background_image.9.png +0 -0
- package/android/src/main/res/drawable-xxhdpi/googlepay_button_background_image.9.png +0 -0
- package/android/src/main/res/drawable-xxxhdpi/googlepay_button_background_image.9.png +0 -0
- package/android/src/main/res/drawable-zh-rcn/pay_with_googlepay_button_content.xml +0 -15
- package/android/src/main/res/drawable-zh-rhk/pay_with_googlepay_button_content.xml +0 -15
- package/android/src/main/res/drawable-zh-rtw/pay_with_googlepay_button_content.xml +0 -15
- package/android/src/main/res/drawable-zu/pay_with_googlepay_button_content.xml +0 -14
- package/android/src/main/res/layout/googlepay_button.xml +0 -39
package/ios/ApplePayUtils.swift
CHANGED
|
@@ -10,6 +10,114 @@ import StripePaymentSheet
|
|
|
10
10
|
|
|
11
11
|
class ApplePayUtils {
|
|
12
12
|
|
|
13
|
+
internal class func createPaymentRequest(
|
|
14
|
+
merchantIdentifier: String?,
|
|
15
|
+
params: NSDictionary
|
|
16
|
+
) -> (error: NSDictionary?, paymentRequest: PKPaymentRequest?) {
|
|
17
|
+
guard let merchantIdentifier = merchantIdentifier else {
|
|
18
|
+
return (Errors.createError(ErrorType.Failed, "You must provide merchantIdentifier"), nil)
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
if let additionalEnabledNetworks = params["additionalEnabledNetworks"] as? [String] {
|
|
22
|
+
do {
|
|
23
|
+
StripeAPI.additionalEnabledApplePayNetworks = try ApplePayUtils.mapToArrayOfPaymentNetworks(arrayOfStrings: additionalEnabledNetworks)
|
|
24
|
+
} catch {
|
|
25
|
+
return (Errors.createError(ErrorType.Failed, error.localizedDescription), nil)
|
|
26
|
+
}
|
|
27
|
+
} else if (params["jcbEnabled"] as? Bool == true) {
|
|
28
|
+
StripeAPI.additionalEnabledApplePayNetworks = [.JCB]
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
guard let summaryItems = params["cartItems"] as? NSArray else {
|
|
32
|
+
return (Errors.createError(ErrorType.Failed, "`cartItems` cannot be null."), nil)
|
|
33
|
+
}
|
|
34
|
+
if (summaryItems.count == 0) {
|
|
35
|
+
return (Errors.createError(ErrorType.Failed, "`cartItems` cannot be empty."), nil)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
guard let countryCode = ((params.object(forKey: "merchantCountryCode") != nil) ? params["merchantCountryCode"] : params["country"]) as? String else {
|
|
39
|
+
return (Errors.createError(ErrorType.Failed, "You must provide the country"), nil)
|
|
40
|
+
}
|
|
41
|
+
guard let currencyCode = ((params.object(forKey: "currencyCode") != nil) ? params["currencyCode"] : params["currency"]) as? String else {
|
|
42
|
+
return (Errors.createError(ErrorType.Failed, "You must provide the payment currency"), nil)
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
let paymentRequest = StripeAPI.paymentRequest(withMerchantIdentifier: merchantIdentifier, country: countryCode, currency: currencyCode)
|
|
46
|
+
|
|
47
|
+
let requiredShippingAddressFields = params["requiredShippingAddressFields"] as? NSArray ?? NSArray()
|
|
48
|
+
let requiredBillingContactFields = params["requiredBillingContactFields"] as? NSArray ?? NSArray()
|
|
49
|
+
let shippingMethods = params["shippingMethods"] as? NSArray ?? NSArray()
|
|
50
|
+
|
|
51
|
+
paymentRequest.requiredShippingContactFields = Set(requiredShippingAddressFields.map {
|
|
52
|
+
Mappers.mapToPKContactField(field: $0 as! String)
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
paymentRequest.requiredBillingContactFields = Set(requiredBillingContactFields.map {
|
|
56
|
+
Mappers.mapToPKContactField(field: $0 as! String)
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
paymentRequest.shippingMethods = ApplePayUtils.buildShippingMethods(items: shippingMethods as? [[String : Any]])
|
|
60
|
+
|
|
61
|
+
do {
|
|
62
|
+
paymentRequest.paymentSummaryItems = try ApplePayUtils
|
|
63
|
+
.buildPaymentSummaryItems(items: summaryItems as? [[String : Any]])
|
|
64
|
+
} catch {
|
|
65
|
+
return (Errors.createError(ErrorType.Failed, error.localizedDescription), nil)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
if let capabilities = params["merchantCapabilities"] as? [String] {
|
|
69
|
+
for capability in capabilities {
|
|
70
|
+
paymentRequest.merchantCapabilities.update(with: ApplePayUtils.getMerchantCapabilityFrom(string: capability))
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
paymentRequest.shippingType = ApplePayUtils.getShippingTypeFrom(string: params["shippingType"] as? String)
|
|
75
|
+
if let supportedCountries = params["supportedCountries"] as? Set<String> {
|
|
76
|
+
paymentRequest.supportedCountries = supportedCountries
|
|
77
|
+
}
|
|
78
|
+
if #available(iOS 15.0, *) {
|
|
79
|
+
if (params["supportsCouponCode"] as? Bool == true) {
|
|
80
|
+
paymentRequest.supportsCouponCode = true
|
|
81
|
+
}
|
|
82
|
+
if let couponCode = params["couponCode"] as? String {
|
|
83
|
+
paymentRequest.supportsCouponCode = true
|
|
84
|
+
paymentRequest.couponCode = couponCode
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
return (nil, paymentRequest)
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
internal class func getMerchantCapabilityFrom(string: String?) -> PKMerchantCapability {
|
|
92
|
+
switch string {
|
|
93
|
+
case "supportsDebit":
|
|
94
|
+
return .capabilityDebit
|
|
95
|
+
case "supportsCredit":
|
|
96
|
+
return .capabilityCredit
|
|
97
|
+
case "supportsEMV":
|
|
98
|
+
return .capabilityEMV
|
|
99
|
+
case "supports3DS":
|
|
100
|
+
fallthrough
|
|
101
|
+
default:
|
|
102
|
+
return .capability3DS
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
internal class func getShippingTypeFrom(string: String?) -> PKShippingType {
|
|
107
|
+
switch string {
|
|
108
|
+
case "delivery":
|
|
109
|
+
return .delivery
|
|
110
|
+
case "storePickup":
|
|
111
|
+
return .storePickup
|
|
112
|
+
case "servicePickup":
|
|
113
|
+
return .servicePickup
|
|
114
|
+
case "shipping":
|
|
115
|
+
fallthrough
|
|
116
|
+
default:
|
|
117
|
+
return .shipping
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
13
121
|
@available(iOS 15.0, *)
|
|
14
122
|
internal class func createDeferredPaymentSummaryItem(item: [String : Any]) throws -> PKPaymentSummaryItem {
|
|
15
123
|
let label = item["label"] as? String ?? ""
|
|
@@ -111,6 +219,79 @@ class ApplePayUtils {
|
|
|
111
219
|
}
|
|
112
220
|
}
|
|
113
221
|
|
|
222
|
+
public class func buildShippingMethods(items: [[String : Any]]?) -> [PKShippingMethod] {
|
|
223
|
+
var shippingMethods: [PKShippingMethod] = []
|
|
224
|
+
if let items = items {
|
|
225
|
+
for item in items {
|
|
226
|
+
let shippingMethod = buildShippingMethod(item: item)
|
|
227
|
+
shippingMethods.append(shippingMethod)
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
return shippingMethods
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
internal class func buildShippingMethod(item: [String : Any]) -> PKShippingMethod {
|
|
235
|
+
let label = item["label"] as? String ?? ""
|
|
236
|
+
let amount = NSDecimalNumber(string: item["amount"] as? String ?? "")
|
|
237
|
+
let shippingMethod = PKShippingMethod(
|
|
238
|
+
label: label,
|
|
239
|
+
amount: amount,
|
|
240
|
+
type: item["isPending"] as? Bool ?? false
|
|
241
|
+
? PKPaymentSummaryItemType.pending : PKPaymentSummaryItemType.final
|
|
242
|
+
)
|
|
243
|
+
shippingMethod.detail = item["detail"] as? String ?? ""
|
|
244
|
+
shippingMethod.identifier = item["identifier"] as? String ?? ""
|
|
245
|
+
if #available(iOS 15.0, *) {
|
|
246
|
+
if let startDate = item["startDate"] as? Double, let endDate = item["endDate"] as? Double {
|
|
247
|
+
let startDate = Date(timeIntervalSince1970: startDate)
|
|
248
|
+
let endDate = Date(timeIntervalSince1970: endDate)
|
|
249
|
+
shippingMethod.dateComponentsRange = PKDateComponentsRange(
|
|
250
|
+
start: Calendar.current.dateComponents([.calendar, .year, .month, .day],
|
|
251
|
+
from: startDate),
|
|
252
|
+
end: Calendar.current.dateComponents([.calendar, .year, .month, .day],
|
|
253
|
+
from: endDate)
|
|
254
|
+
)
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
return shippingMethod
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
public class func buildApplePayErrors(errorItems: [NSDictionary]) throws -> (shippingAddressErrors: [Error], couponCodeErrors: [Error]) {
|
|
261
|
+
var shippingAddressErrors: [Error] = []
|
|
262
|
+
var couponCodeErrors: [Error] = []
|
|
263
|
+
|
|
264
|
+
for item in errorItems {
|
|
265
|
+
let type = item["errorType"] as? String
|
|
266
|
+
let message = item["message"] as? String
|
|
267
|
+
switch type {
|
|
268
|
+
case "InvalidShippingAddress":
|
|
269
|
+
let field = item["field"] as? String ?? "street"
|
|
270
|
+
shippingAddressErrors.append(PKPaymentRequest.paymentShippingAddressInvalidError(withKey: field, localizedDescription: message))
|
|
271
|
+
case "UnserviceableShippingAddress":
|
|
272
|
+
shippingAddressErrors.append(PKPaymentRequest.paymentShippingAddressUnserviceableError(withLocalizedDescription: message))
|
|
273
|
+
case "ExpiredCouponCode":
|
|
274
|
+
if #available(iOS 15.0, *) {
|
|
275
|
+
couponCodeErrors.append(PKPaymentRequest.paymentCouponCodeExpiredError(localizedDescription: message))
|
|
276
|
+
}
|
|
277
|
+
case "InvalidCouponCode":
|
|
278
|
+
if #available(iOS 15.0, *) {
|
|
279
|
+
couponCodeErrors.append(PKPaymentRequest.paymentCouponCodeInvalidError(localizedDescription: message))
|
|
280
|
+
}
|
|
281
|
+
default:
|
|
282
|
+
throw ApplePayUtilsError.invalidErrorType(String(describing: type))
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
return (shippingAddressErrors, couponCodeErrors)
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
internal class func mapToArrayOfPaymentNetworks(arrayOfStrings: [String]) throws -> [PKPaymentNetwork] {
|
|
289
|
+
let validNetworks: [PKPaymentNetwork?] = try arrayOfStrings.map { networkString in
|
|
290
|
+
return PKPaymentNetwork.init(rawValue: networkString)
|
|
291
|
+
}
|
|
292
|
+
return validNetworks.compactMap { $0 }
|
|
293
|
+
}
|
|
294
|
+
|
|
114
295
|
public class func buildPaymentSheetApplePayConfig(
|
|
115
296
|
merchantIdentifier: String?,
|
|
116
297
|
merchantCountryCode: String?,
|
|
@@ -137,6 +318,8 @@ enum ApplePayUtilsError : Error, Equatable {
|
|
|
137
318
|
case invalidCartSummaryItemType(String)
|
|
138
319
|
case missingParameter(String, String)
|
|
139
320
|
case invalidTimeInterval(String)
|
|
321
|
+
case invalidPaymentNetwork(String)
|
|
322
|
+
case invalidErrorType(String)
|
|
140
323
|
case missingMerchantId
|
|
141
324
|
case missingCountryCode
|
|
142
325
|
}
|
|
@@ -150,6 +333,10 @@ extension ApplePayUtilsError: LocalizedError {
|
|
|
150
333
|
return "Failed to create Apple Pay summary item with label: \(label). The \(parameter) item parameter is required, but none was provided."
|
|
151
334
|
case .invalidTimeInterval(let providedInterval):
|
|
152
335
|
return "Failed to create Apple Pay summary item. \(providedInterval) is not a valid timeInterval, must be one of: minute, hour, day, month, or year."
|
|
336
|
+
case .invalidPaymentNetwork(let network):
|
|
337
|
+
return "Failed to create Apple Pay summary item. \(network) is not a valid/supported payment network."
|
|
338
|
+
case .invalidErrorType(let type):
|
|
339
|
+
return "Error type: '\(type)' is not supported."
|
|
153
340
|
case .missingMerchantId:
|
|
154
341
|
return "`merchantIdentifier` is required, but none was found. Ensure you are passing this to initStripe your StripeProvider."
|
|
155
342
|
case .missingCountryCode:
|
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
//
|
|
2
|
+
// ApplePayViewController.swift
|
|
3
|
+
// stripe-react-native
|
|
4
|
+
//
|
|
5
|
+
// Created by Charles Cruzan on 9/15/22.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
import Stripe
|
|
10
|
+
|
|
11
|
+
extension StripeSdk : PKPaymentAuthorizationViewControllerDelegate, STPApplePayContextDelegate {
|
|
12
|
+
func paymentAuthorizationViewController(
|
|
13
|
+
_ controller: PKPaymentAuthorizationViewController,
|
|
14
|
+
didAuthorizePayment payment: PKPayment,
|
|
15
|
+
handler completion: @escaping (PKPaymentAuthorizationResult) -> Void
|
|
16
|
+
) {
|
|
17
|
+
applePaymentMethodFlowCanBeCanceled = false
|
|
18
|
+
STPAPIClient.shared.createPaymentMethod(with: payment) { paymentMethod, error in
|
|
19
|
+
if let error = error {
|
|
20
|
+
self.createPlatformPayPaymentMethodResolver?(Errors.createError(ErrorType.Failed, error))
|
|
21
|
+
} else {
|
|
22
|
+
STPAPIClient.shared.createToken(with: payment) { token, error in
|
|
23
|
+
if let error = error {
|
|
24
|
+
self.createPlatformPayPaymentMethodResolver?(Errors.createError(ErrorType.Failed, error))
|
|
25
|
+
} else {
|
|
26
|
+
var promiseResult = ["paymentMethod": Mappers.mapFromPaymentMethod(paymentMethod?.splitApplePayAddressByNewline()) ?? [:]]
|
|
27
|
+
if let token = token {
|
|
28
|
+
promiseResult["token"] = Mappers.mapFromToken(token: token.splitApplePayAddressByNewline())
|
|
29
|
+
}
|
|
30
|
+
self.createPlatformPayPaymentMethodResolver?(promiseResult)
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
completion(PKPaymentAuthorizationResult.init(status: .success, errors: nil))
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
func paymentAuthorizationViewControllerDidFinish(
|
|
39
|
+
_ controller: PKPaymentAuthorizationViewController
|
|
40
|
+
) {
|
|
41
|
+
if (applePaymentMethodFlowCanBeCanceled) {
|
|
42
|
+
self.createPlatformPayPaymentMethodResolver?(Errors.createError(ErrorType.Canceled, "The payment has been canceled"))
|
|
43
|
+
applePaymentMethodFlowCanBeCanceled = false
|
|
44
|
+
}
|
|
45
|
+
_ = maybeDismissApplePay()
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
func maybeDismissApplePay() -> Bool {
|
|
49
|
+
if let applePaymentAuthorizationController = applePaymentAuthorizationController {
|
|
50
|
+
DispatchQueue.main.async {
|
|
51
|
+
applePaymentAuthorizationController.dismiss(animated: true)
|
|
52
|
+
}
|
|
53
|
+
return true
|
|
54
|
+
}
|
|
55
|
+
return false
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
@available(iOS 15.0, *)
|
|
59
|
+
func paymentAuthorizationViewController(
|
|
60
|
+
_ controller: PKPaymentAuthorizationViewController,
|
|
61
|
+
didChangeCouponCode couponCode: String,
|
|
62
|
+
handler completion: @escaping (PKPaymentRequestCouponCodeUpdate) -> Void
|
|
63
|
+
) {
|
|
64
|
+
if let callback = self.couponCodeEnteredJSCallback {
|
|
65
|
+
self.couponCodeUpdateCompletion = completion
|
|
66
|
+
callback(["couponCode": couponCode])
|
|
67
|
+
} else {
|
|
68
|
+
completion(
|
|
69
|
+
PKPaymentRequestCouponCodeUpdate.init(
|
|
70
|
+
errors: self.applePayCouponCodeErrors,
|
|
71
|
+
paymentSummaryItems: self.applePaySummaryItems,
|
|
72
|
+
shippingMethods: self.applePayShippingMethods
|
|
73
|
+
)
|
|
74
|
+
)
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
func paymentAuthorizationViewController(
|
|
79
|
+
_ controller: PKPaymentAuthorizationViewController,
|
|
80
|
+
didSelect shippingMethod: PKShippingMethod,
|
|
81
|
+
handler completion: @escaping (PKPaymentRequestShippingMethodUpdate) -> Void
|
|
82
|
+
) {
|
|
83
|
+
if let callback = self.shippingMethodUpdateJSCallback {
|
|
84
|
+
self.shippingMethodUpdateCompletion = completion
|
|
85
|
+
callback(["shippingMethod": Mappers.mapFromShippingMethod(shippingMethod: shippingMethod)])
|
|
86
|
+
} else {
|
|
87
|
+
completion(
|
|
88
|
+
PKPaymentRequestShippingMethodUpdate.init(paymentSummaryItems: applePaySummaryItems)
|
|
89
|
+
)
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
func paymentAuthorizationViewController(
|
|
94
|
+
_ controller: PKPaymentAuthorizationViewController,
|
|
95
|
+
didSelectShippingContact contact: PKContact,
|
|
96
|
+
handler completion: @escaping (PKPaymentRequestShippingContactUpdate) -> Void
|
|
97
|
+
) {
|
|
98
|
+
if let callback = self.shippingContactUpdateJSCallback {
|
|
99
|
+
self.shippingContactUpdateCompletion = completion
|
|
100
|
+
callback(["shippingContact": Mappers.mapFromShippingContact(shippingContact: contact)])
|
|
101
|
+
} else {
|
|
102
|
+
completion(
|
|
103
|
+
PKPaymentRequestShippingContactUpdate.init(
|
|
104
|
+
errors: applePayShippingAddressErrors,
|
|
105
|
+
paymentSummaryItems: applePaySummaryItems,
|
|
106
|
+
shippingMethods: applePayShippingMethods
|
|
107
|
+
)
|
|
108
|
+
)
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
func applePayContext(
|
|
113
|
+
_ context: STPApplePayContext,
|
|
114
|
+
didSelect shippingMethod: PKShippingMethod,
|
|
115
|
+
handler: @escaping (PKPaymentRequestShippingMethodUpdate) -> Void
|
|
116
|
+
) {
|
|
117
|
+
if let callback = self.shippingMethodUpdateJSCallback {
|
|
118
|
+
self.shippingMethodUpdateCompletion = handler
|
|
119
|
+
callback(["shippingMethod": Mappers.mapFromShippingMethod(shippingMethod: shippingMethod)])
|
|
120
|
+
if (self.hasLegacyApplePayListeners) {
|
|
121
|
+
// Legacy, remove when useApplePay hook is removed
|
|
122
|
+
sendEvent(withName: "onDidSetShippingMethod", body: ["shippingMethod": Mappers.mapFromShippingMethod(shippingMethod: shippingMethod)])
|
|
123
|
+
}
|
|
124
|
+
} else {
|
|
125
|
+
handler(
|
|
126
|
+
PKPaymentRequestShippingMethodUpdate.init(paymentSummaryItems: applePaySummaryItems)
|
|
127
|
+
)
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
func applePayContext(
|
|
132
|
+
_ context: STPApplePayContext,
|
|
133
|
+
didSelectShippingContact contact: PKContact,
|
|
134
|
+
handler: @escaping (PKPaymentRequestShippingContactUpdate) -> Void
|
|
135
|
+
) {
|
|
136
|
+
if let callback = self.shippingContactUpdateJSCallback {
|
|
137
|
+
self.shippingContactUpdateCompletion = handler
|
|
138
|
+
callback(["shippingContact": Mappers.mapFromShippingContact(shippingContact: contact)])
|
|
139
|
+
if (self.hasLegacyApplePayListeners) {
|
|
140
|
+
// Legacy, remove when useApplePay hook is removed
|
|
141
|
+
sendEvent(withName: "onDidSetShippingContact", body: ["shippingContact": Mappers.mapFromShippingContact(shippingContact: contact)])
|
|
142
|
+
}
|
|
143
|
+
} else {
|
|
144
|
+
handler(
|
|
145
|
+
PKPaymentRequestShippingContactUpdate.init(
|
|
146
|
+
errors: applePayShippingAddressErrors,
|
|
147
|
+
paymentSummaryItems: applePaySummaryItems,
|
|
148
|
+
shippingMethods: applePayShippingMethods
|
|
149
|
+
)
|
|
150
|
+
)
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
func applePayContext(
|
|
155
|
+
_ context: STPApplePayContext,
|
|
156
|
+
didCreatePaymentMethod paymentMethod: STPPaymentMethod,
|
|
157
|
+
paymentInformation: PKPayment,
|
|
158
|
+
completion: @escaping STPIntentClientSecretCompletionBlock
|
|
159
|
+
) {
|
|
160
|
+
if let clientSecret = self.confirmApplePayPaymentClientSecret {
|
|
161
|
+
completion(clientSecret, nil)
|
|
162
|
+
} else {
|
|
163
|
+
self.applePayCompletionCallback = completion
|
|
164
|
+
let method = Mappers.mapFromPaymentMethod(paymentMethod.splitApplePayAddressByNewline())
|
|
165
|
+
self.deprecatedApplePayRequestResolver?(Mappers.createResult("paymentMethod", method))
|
|
166
|
+
self.deprecatedApplePayRequestRejecter = nil
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
func applePayContext(
|
|
171
|
+
_ context: STPApplePayContext,
|
|
172
|
+
didCompleteWith status: STPPaymentStatus,
|
|
173
|
+
error: Error?
|
|
174
|
+
) {
|
|
175
|
+
switch status {
|
|
176
|
+
case .success:
|
|
177
|
+
if let resolve = self.confirmApplePayResolver {
|
|
178
|
+
if let clientSecret = self.confirmApplePayPaymentClientSecret {
|
|
179
|
+
STPAPIClient.shared.retrievePaymentIntent(withClientSecret: clientSecret) { (paymentIntent, error) in
|
|
180
|
+
guard error == nil else {
|
|
181
|
+
if let lastPaymentError = paymentIntent?.lastPaymentError {
|
|
182
|
+
resolve(Errors.createError(ErrorType.Unknown, lastPaymentError))
|
|
183
|
+
} else {
|
|
184
|
+
resolve(Errors.createError(ErrorType.Unknown, error as NSError?))
|
|
185
|
+
}
|
|
186
|
+
return
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
if let paymentIntent = paymentIntent {
|
|
190
|
+
resolve(Mappers.createResult("paymentIntent", Mappers.mapFromPaymentIntent(paymentIntent: paymentIntent)))
|
|
191
|
+
} else {
|
|
192
|
+
resolve(Mappers.createResult("paymentIntent", nil))
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
} else if let clientSecret = self.confirmApplePaySetupClientSecret {
|
|
196
|
+
STPAPIClient.shared.retrieveSetupIntent(withClientSecret: clientSecret) { (setupIntent, error) in
|
|
197
|
+
guard error == nil else {
|
|
198
|
+
if let lastSetupError = setupIntent?.lastSetupError {
|
|
199
|
+
resolve(Errors.createError(ErrorType.Unknown, lastSetupError))
|
|
200
|
+
} else {
|
|
201
|
+
resolve(Errors.createError(ErrorType.Unknown, error?.localizedDescription))
|
|
202
|
+
}
|
|
203
|
+
return
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
if let setupIntent = setupIntent {
|
|
207
|
+
resolve(Mappers.createResult("setupIntent", Mappers.mapFromSetupIntent(setupIntent: setupIntent)))
|
|
208
|
+
} else {
|
|
209
|
+
resolve(Mappers.createResult("setupIntent", nil))
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
} else {
|
|
215
|
+
deprecatedConfirmApplePayPaymentResolver?([])
|
|
216
|
+
}
|
|
217
|
+
break
|
|
218
|
+
case .error:
|
|
219
|
+
if let resolve = self.confirmApplePayResolver {
|
|
220
|
+
resolve(Errors.createError(ErrorType.Failed, error as NSError?))
|
|
221
|
+
} else {
|
|
222
|
+
let message = "Payment not completed"
|
|
223
|
+
deprecatedApplePayCompletionRejecter?(ErrorType.Failed, message, nil)
|
|
224
|
+
deprecatedApplePayRequestRejecter?(ErrorType.Failed, message, nil)
|
|
225
|
+
}
|
|
226
|
+
break
|
|
227
|
+
case .userCancellation:
|
|
228
|
+
let message = "The payment has been canceled"
|
|
229
|
+
if let resolve = self.confirmApplePayResolver {
|
|
230
|
+
resolve(Errors.createError(ErrorType.Canceled, message))
|
|
231
|
+
} else {
|
|
232
|
+
deprecatedApplePayCompletionRejecter?(ErrorType.Canceled, message, nil)
|
|
233
|
+
deprecatedApplePayRequestRejecter?(ErrorType.Canceled, message, nil)
|
|
234
|
+
}
|
|
235
|
+
break
|
|
236
|
+
@unknown default:
|
|
237
|
+
if let resolve = self.confirmApplePayResolver {
|
|
238
|
+
resolve(Errors.createError(ErrorType.Unknown, error as NSError?))
|
|
239
|
+
} else {
|
|
240
|
+
let message = "Payment not completed"
|
|
241
|
+
deprecatedApplePayCompletionRejecter?(ErrorType.Unknown, message, nil)
|
|
242
|
+
deprecatedApplePayRequestRejecter?(ErrorType.Unknown, message, nil)
|
|
243
|
+
}
|
|
244
|
+
break
|
|
245
|
+
}
|
|
246
|
+
confirmApplePayResolver = nil
|
|
247
|
+
confirmApplePayPaymentClientSecret = nil
|
|
248
|
+
confirmApplePaySetupClientSecret = nil
|
|
249
|
+
deprecatedApplePayCompletionRejecter = nil
|
|
250
|
+
deprecatedApplePayRequestRejecter = nil
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
extension STPPaymentMethod {
|
|
256
|
+
func splitApplePayAddressByNewline() -> STPPaymentMethod {
|
|
257
|
+
let address = self.billingDetails?.address?.line1?.split(whereSeparator: \.isNewline)
|
|
258
|
+
if (address?.indices.contains(0) == true) {
|
|
259
|
+
self.billingDetails?.address?.line1 = String(address?[0] ?? "")
|
|
260
|
+
}
|
|
261
|
+
if (address?.indices.contains(1) == true) {
|
|
262
|
+
self.billingDetails?.address?.line2 = String(address?[1] ?? "")
|
|
263
|
+
}
|
|
264
|
+
return self
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
extension STPToken {
|
|
269
|
+
func splitApplePayAddressByNewline() -> STPToken {
|
|
270
|
+
let address = self.card?.address?.line1?.split(whereSeparator: \.isNewline)
|
|
271
|
+
if (address?.indices.contains(0) == true) {
|
|
272
|
+
self.card?.address?.line1 = String(address?[0] ?? "")
|
|
273
|
+
}
|
|
274
|
+
if (address?.indices.contains(1) == true) {
|
|
275
|
+
self.card?.address?.line2 = String(address?[1] ?? "")
|
|
276
|
+
}
|
|
277
|
+
return self
|
|
278
|
+
}
|
|
279
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
//
|
|
2
|
+
// PKPaymentPassFinder.swift
|
|
3
|
+
// stripe-react-native
|
|
4
|
+
//
|
|
5
|
+
// Created by Charles Cruzan on 10/6/22.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
|
|
10
|
+
internal class PaymentPassFinder: NSObject {
|
|
11
|
+
enum PassLocation: String {
|
|
12
|
+
case CURRENT_DEVICE
|
|
13
|
+
case PAIRED_DEVICE
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
class func findPassWithLast4(last4: String, hasPairedAppleWatch: Bool, completion: @escaping ((Bool, [PassLocation]) -> Void)) {
|
|
17
|
+
let existingPassOnDevice: PKPass? = {
|
|
18
|
+
if #available(iOS 13.4, *) {
|
|
19
|
+
return PKPassLibrary().passes(of: PKPassType.secureElement)
|
|
20
|
+
.first(where: { $0.secureElementPass?.primaryAccountNumberSuffix == last4 && $0.secureElementPass?.passActivationState != .deactivated && !$0.isRemotePass })
|
|
21
|
+
} else {
|
|
22
|
+
return PKPassLibrary().passes(of: PKPassType.payment)
|
|
23
|
+
.first(where: { $0.paymentPass?.primaryAccountNumberSuffix == last4 && $0.paymentPass?.passActivationState != .deactivated && !$0.isRemotePass })
|
|
24
|
+
}
|
|
25
|
+
}()
|
|
26
|
+
|
|
27
|
+
var passLocations: [PassLocation] = []
|
|
28
|
+
if (existingPassOnDevice != nil) {
|
|
29
|
+
passLocations.append(.CURRENT_DEVICE)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// We're done here if the user does not have a paired Apple Watch
|
|
33
|
+
if (!hasPairedAppleWatch) {
|
|
34
|
+
completion(
|
|
35
|
+
passLocations.count < 1,
|
|
36
|
+
passLocations
|
|
37
|
+
)
|
|
38
|
+
return
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
let existingPassOnPairedDevices: PKPass? = {
|
|
42
|
+
if #available(iOS 13.4, *) {
|
|
43
|
+
return PKPassLibrary().remoteSecureElementPasses
|
|
44
|
+
.first(where: { $0.secureElementPass?.primaryAccountNumberSuffix == last4 && $0.secureElementPass?.passActivationState != .deactivated })
|
|
45
|
+
} else {
|
|
46
|
+
return PKPassLibrary().remotePaymentPasses()
|
|
47
|
+
.first(where: { $0.paymentPass?.primaryAccountNumberSuffix == last4 && $0.paymentPass?.passActivationState != .deactivated })
|
|
48
|
+
}
|
|
49
|
+
}()
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
if (existingPassOnPairedDevices != nil) {
|
|
53
|
+
passLocations.append(.PAIRED_DEVICE)
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
completion(
|
|
57
|
+
passLocations.count < 2,
|
|
58
|
+
passLocations
|
|
59
|
+
)
|
|
60
|
+
}
|
|
61
|
+
}
|
|
@@ -19,20 +19,10 @@ class AddToWalletButtonView: UIView {
|
|
|
19
19
|
@objc var ephemeralKey: NSDictionary?
|
|
20
20
|
@objc var onCompleteAction: RCTDirectEventBlock?
|
|
21
21
|
|
|
22
|
-
override init(frame: CGRect) {
|
|
23
|
-
super.init(frame: frame)
|
|
24
|
-
}
|
|
25
|
-
|
|
26
22
|
required init?(coder: NSCoder) {
|
|
27
23
|
fatalError("init(coder:) has not been implemented")
|
|
28
24
|
}
|
|
29
25
|
|
|
30
|
-
override func layoutSubviews() {
|
|
31
|
-
if let addToWalletButton = self.addToWalletButton {
|
|
32
|
-
addToWalletButton.frame = self.bounds
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
26
|
override func didSetProps(_ changedProps: [String]!) {
|
|
37
27
|
if let addToWalletButton = addToWalletButton {
|
|
38
28
|
addToWalletButton.removeFromSuperview()
|
|
@@ -96,6 +86,16 @@ class AddToWalletButtonView: UIView {
|
|
|
96
86
|
let vc = findViewControllerPresenter(from: UIApplication.shared.delegate?.window??.rootViewController ?? UIViewController())
|
|
97
87
|
vc.present(controller!, animated: true, completion: nil)
|
|
98
88
|
}
|
|
89
|
+
|
|
90
|
+
override init(frame: CGRect) {
|
|
91
|
+
super.init(frame: frame)
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
override func layoutSubviews() {
|
|
95
|
+
if let addToWalletButton = self.addToWalletButton {
|
|
96
|
+
addToWalletButton.frame = self.bounds
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
99
|
}
|
|
100
100
|
|
|
101
101
|
|
|
@@ -12,25 +12,33 @@ internal class PushProvisioningUtils {
|
|
|
12
12
|
class func canAddCardToWallet(
|
|
13
13
|
last4: String,
|
|
14
14
|
primaryAccountIdentifier: String,
|
|
15
|
-
testEnv: Bool
|
|
16
|
-
|
|
15
|
+
testEnv: Bool,
|
|
16
|
+
hasPairedAppleWatch: Bool,
|
|
17
|
+
completion: @escaping (_ canAddCard: Bool, _ status: AddCardToWalletStatus?) -> Void
|
|
18
|
+
) {
|
|
17
19
|
if (!PKAddPassesViewController.canAddPasses()) {
|
|
18
|
-
|
|
20
|
+
completion(false, AddCardToWalletStatus.UNSUPPORTED_DEVICE)
|
|
19
21
|
}
|
|
20
22
|
|
|
21
|
-
|
|
22
|
-
var canAddCard = PushProvisioningUtils.canAddPaymentPass(
|
|
23
|
+
let canAddCard = canAddPaymentPass(
|
|
23
24
|
primaryAccountIdentifier: primaryAccountIdentifier,
|
|
24
25
|
isTestMode: testEnv)
|
|
25
26
|
|
|
26
27
|
if (!canAddCard) {
|
|
27
|
-
|
|
28
|
-
} else
|
|
29
|
-
|
|
30
|
-
|
|
28
|
+
completion(canAddCard, AddCardToWalletStatus.MISSING_CONFIGURATION)
|
|
29
|
+
} else {
|
|
30
|
+
PaymentPassFinder.findPassWithLast4(last4: last4, hasPairedAppleWatch: hasPairedAppleWatch) { canAddCardToADevice, passLocations in
|
|
31
|
+
var status: AddCardToWalletStatus? = nil
|
|
32
|
+
if (!canAddCardToADevice) {
|
|
33
|
+
status = AddCardToWalletStatus.CARD_ALREADY_EXISTS
|
|
34
|
+
} else if (passLocations.contains(.PAIRED_DEVICE)) {
|
|
35
|
+
status = AddCardToWalletStatus.CARD_EXISTS_ON_PAIRED_DEVICE
|
|
36
|
+
} else if (passLocations.contains(.CURRENT_DEVICE)) {
|
|
37
|
+
status = AddCardToWalletStatus.CARD_EXISTS_ON_CURRENT_DEVICE
|
|
38
|
+
}
|
|
39
|
+
completion(canAddCardToADevice, status)
|
|
40
|
+
}
|
|
31
41
|
}
|
|
32
|
-
|
|
33
|
-
return (canAddCard, status)
|
|
34
42
|
}
|
|
35
43
|
|
|
36
44
|
class func canAddPaymentPass(primaryAccountIdentifier: String, isTestMode: Bool) -> Bool {
|
|
@@ -45,20 +53,35 @@ internal class PushProvisioningUtils {
|
|
|
45
53
|
}
|
|
46
54
|
}
|
|
47
55
|
|
|
48
|
-
class func
|
|
49
|
-
let
|
|
56
|
+
class func getPassLocation(last4: String) -> PaymentPassFinder.PassLocation? {
|
|
57
|
+
let existingPassOnDevice: PKPass? = {
|
|
50
58
|
if #available(iOS 13.4, *) {
|
|
51
|
-
return PKPassLibrary().passes(of: PKPassType.secureElement)
|
|
59
|
+
return PKPassLibrary().passes(of: PKPassType.secureElement)
|
|
60
|
+
.first(where: { $0.secureElementPass?.primaryAccountNumberSuffix == last4 && $0.secureElementPass?.passActivationState != .suspended && !$0.isRemotePass })
|
|
52
61
|
} else {
|
|
53
|
-
return PKPassLibrary().passes(of: PKPassType.payment)
|
|
62
|
+
return PKPassLibrary().passes(of: PKPassType.payment)
|
|
63
|
+
.first(where: { $0.paymentPass?.primaryAccountNumberSuffix == last4 && $0.paymentPass?.passActivationState != .suspended && !$0.isRemotePass })
|
|
54
64
|
}
|
|
55
65
|
}()
|
|
56
|
-
|
|
66
|
+
|
|
67
|
+
let existingPassOnPairedDevices: PKPass? = {
|
|
68
|
+
if #available(iOS 13.4, *) {
|
|
69
|
+
return PKPassLibrary().remoteSecureElementPasses
|
|
70
|
+
.first(where: { $0.secureElementPass?.primaryAccountNumberSuffix == last4 && $0.secureElementPass?.passActivationState != .suspended })
|
|
71
|
+
} else {
|
|
72
|
+
return PKPassLibrary().remotePaymentPasses()
|
|
73
|
+
.first(where: { $0.paymentPass?.primaryAccountNumberSuffix == last4 && $0.paymentPass?.passActivationState != .suspended })
|
|
74
|
+
}
|
|
75
|
+
}()
|
|
76
|
+
|
|
77
|
+
return existingPassOnDevice != nil ? PaymentPassFinder.PassLocation.CURRENT_DEVICE : (existingPassOnPairedDevices != nil ? PaymentPassFinder.PassLocation.PAIRED_DEVICE : nil)
|
|
57
78
|
}
|
|
58
79
|
|
|
59
80
|
enum AddCardToWalletStatus: String {
|
|
60
81
|
case UNSUPPORTED_DEVICE
|
|
61
82
|
case MISSING_CONFIGURATION
|
|
62
83
|
case CARD_ALREADY_EXISTS
|
|
84
|
+
case CARD_EXISTS_ON_CURRENT_DEVICE
|
|
85
|
+
case CARD_EXISTS_ON_PAIRED_DEVICE
|
|
63
86
|
}
|
|
64
87
|
}
|