framepayments-react-native 1.0.1 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +434 -71
- package/android/.gradle/8.9/checksums/checksums.lock +0 -0
- package/android/.gradle/8.9/fileChanges/last-build.bin +0 -0
- package/android/.gradle/8.9/fileHashes/fileHashes.lock +0 -0
- package/android/.gradle/8.9/gc.properties +0 -0
- package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
- package/android/.gradle/buildOutputCleanup/cache.properties +2 -0
- package/android/.gradle/vcs-1/gc.properties +0 -0
- package/android/.settings/org.eclipse.buildship.core.prefs +13 -0
- package/android/build/.transforms/5a2061641b1fc5518a336681809507bc/results.bin +1 -0
- package/android/build/.transforms/5a2061641b1fc5518a336681809507bc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/framepayments/reactnativeframe/BuildConfig.dex +0 -0
- package/android/build/.transforms/5a2061641b1fc5518a336681809507bc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/framepayments/reactnativeframe/FrameCheckoutActivity$Companion.dex +0 -0
- package/android/build/.transforms/{3db830673120be833016e77c88c53305/transformed/debug → 5a2061641b1fc5518a336681809507bc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex}/com/framepayments/reactnativeframe/FrameCheckoutActivity$tryShowCheckout$1.dex +0 -0
- package/android/build/.transforms/5a2061641b1fc5518a336681809507bc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/framepayments/reactnativeframe/FrameCheckoutActivity.dex +0 -0
- package/android/build/.transforms/{3db830673120be833016e77c88c53305/transformed/debug → 5a2061641b1fc5518a336681809507bc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex}/com/framepayments/reactnativeframe/FrameFlowActivity$CartItemDto.dex +0 -0
- package/android/build/.transforms/5a2061641b1fc5518a336681809507bc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/framepayments/reactnativeframe/FrameFlowActivity$Companion.dex +0 -0
- package/android/build/.transforms/5a2061641b1fc5518a336681809507bc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/framepayments/reactnativeframe/FrameFlowActivity$parseCartItems$type$1.dex +0 -0
- package/android/build/.transforms/5a2061641b1fc5518a336681809507bc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/framepayments/reactnativeframe/FrameFlowActivity.dex +0 -0
- package/android/build/.transforms/5a2061641b1fc5518a336681809507bc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/framepayments/reactnativeframe/FrameGooglePayActivity$Companion.dex +0 -0
- package/android/build/.transforms/5a2061641b1fc5518a336681809507bc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/framepayments/reactnativeframe/FrameGooglePayActivity.dex +0 -0
- package/android/build/.transforms/5a2061641b1fc5518a336681809507bc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/framepayments/reactnativeframe/FrameOnboardingActivity$Companion.dex +0 -0
- package/android/build/.transforms/5a2061641b1fc5518a336681809507bc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/framepayments/reactnativeframe/FrameOnboardingActivity$parseCapabilities$type$1.dex +0 -0
- package/android/build/.transforms/5a2061641b1fc5518a336681809507bc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/framepayments/reactnativeframe/FrameOnboardingActivity.dex +0 -0
- package/android/build/.transforms/5a2061641b1fc5518a336681809507bc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/framepayments/reactnativeframe/FrameSDKModule$Companion.dex +0 -0
- package/android/build/.transforms/5a2061641b1fc5518a336681809507bc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/framepayments/reactnativeframe/FrameSDKModule.dex +0 -0
- package/android/build/.transforms/5a2061641b1fc5518a336681809507bc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/framepayments/reactnativeframe/FrameSDKPackage.dex +0 -0
- package/android/build/.transforms/5a2061641b1fc5518a336681809507bc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_dex/com/framepayments/reactnativeframe/JsonConvertersKt.dex +0 -0
- package/android/build/.transforms/5a2061641b1fc5518a336681809507bc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_global-synthetics/com/framepayments/reactnativeframe/FrameCheckoutActivity$$InternalSyntheticLambda$2$28045340ca5b91151bb937065eeb5817c0f8f911bb460e6e7ed8bb228b67ee83$0.globals +0 -0
- package/android/build/.transforms/5a2061641b1fc5518a336681809507bc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_global-synthetics/com/framepayments/reactnativeframe/FrameFlowActivity$$InternalSyntheticLambda$2$467cdf1dabffeaa07b76e313efb66791f50d3ff264e427e91d1358ac5865a7a9$0.globals +0 -0
- package/android/build/.transforms/5a2061641b1fc5518a336681809507bc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_global-synthetics/com/framepayments/reactnativeframe/FrameFlowActivity$$InternalSyntheticLambda$2$d15cc37cc08a853958a9c0baad49f7fce1ef84e92db9baa5103646939a0fe3e5$0.globals +0 -0
- package/android/build/.transforms/5a2061641b1fc5518a336681809507bc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_global-synthetics/com/framepayments/reactnativeframe/FrameFlowActivity$$InternalSyntheticLambda$2$ee6ef8e6758d1b8e67a54e3fecfb200ac5e867541a69809ec1db49f74ffcada1$0.globals +0 -0
- package/android/build/.transforms/5a2061641b1fc5518a336681809507bc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_global-synthetics/com/framepayments/reactnativeframe/FrameGooglePayActivity$$InternalSyntheticLambda$2$46cecf303f126f7c9f20b615fc49b2714ec2eb4f046ae009cfdbce53a1759f18$0.globals +0 -0
- package/android/build/.transforms/5a2061641b1fc5518a336681809507bc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_global-synthetics/com/framepayments/reactnativeframe/FrameGooglePayActivity$$InternalSyntheticLambda$2$46cecf303f126f7c9f20b615fc49b2714ec2eb4f046ae009cfdbce53a1759f18$1.globals +0 -0
- package/android/build/.transforms/5a2061641b1fc5518a336681809507bc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_global-synthetics/com/framepayments/reactnativeframe/FrameGooglePayActivity$$InternalSyntheticLambda$2$46cecf303f126f7c9f20b615fc49b2714ec2eb4f046ae009cfdbce53a1759f18$2.globals +0 -0
- package/android/build/.transforms/5a2061641b1fc5518a336681809507bc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_global-synthetics/com/framepayments/reactnativeframe/FrameGooglePayActivity$$InternalSyntheticLambda$2$cdad629ad452b3c7f7de1310d225629dafa75285ad515d55f056371066170154$0.globals +0 -0
- package/android/build/.transforms/5a2061641b1fc5518a336681809507bc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_global-synthetics/com/framepayments/reactnativeframe/FrameOnboardingActivity$$InternalSyntheticLambda$2$5d91d018c63f48735ba5e2a00b14bd815f4ce248aa924e4a58bf6addce311837$0.globals +0 -0
- package/android/build/.transforms/5a2061641b1fc5518a336681809507bc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_global-synthetics/com/framepayments/reactnativeframe/FrameOnboardingActivity$$InternalSyntheticLambda$2$c9ac604bc80e3afcbfad7417717ae97568874f4e33246863c0d688abb3e89865$0.globals +0 -0
- package/android/build/.transforms/5a2061641b1fc5518a336681809507bc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_global-synthetics/com/framepayments/reactnativeframe/FrameSDKModule$$InternalSyntheticLambda$2$1f479ca48bf3a1c66ff65b38aaaef67a97119b29ddce703f8104188682007f0d$0.globals +0 -0
- package/android/build/.transforms/5a2061641b1fc5518a336681809507bc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_global-synthetics/com/framepayments/reactnativeframe/FrameSDKModule$$InternalSyntheticLambda$2$984ab30558bc904ed37602fa6e3ebf28f1ed69df6712b31b00c4f26fc26d3b70$0.globals +0 -0
- package/android/build/.transforms/5a2061641b1fc5518a336681809507bc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_global-synthetics/com/framepayments/reactnativeframe/FrameSDKModule$$InternalSyntheticLambda$2$f4a55b70e496f422e1e03998843d62c7208f0229c2d5d080706056e98810c892$0.globals +0 -0
- package/android/build/.transforms/5a2061641b1fc5518a336681809507bc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_global-synthetics/com/framepayments/reactnativeframe/FrameSDKModule$$InternalSyntheticLambda$2$f8d46f7169c404d37a1d505f19439b83090fbed62b5bdaf1e86717fdddebf622$0.globals +0 -0
- package/android/build/.transforms/5a2061641b1fc5518a336681809507bc/transformed/bundleLibRuntimeToDirDebug/bundleLibRuntimeToDirDebug_global-synthetics/com/framepayments/reactnativeframe/FrameSDKModule$$InternalSyntheticLambda$2$f8d46f7169c404d37a1d505f19439b83090fbed62b5bdaf1e86717fdddebf622$1.globals +0 -0
- package/android/build/generated/source/buildConfig/debug/com/framepayments/reactnativeframe/BuildConfig.java +10 -0
- package/android/build/intermediates/aapt_friendly_merged_manifests/debug/processDebugManifest/aapt/AndroidManifest.xml +26 -0
- package/android/build/intermediates/aar_metadata/debug/{aar-metadata.properties → writeDebugAarMetadata/aar-metadata.properties} +2 -1
- package/android/build/intermediates/android_res_source_set_path_map/debug/mapDebugSourceSetPaths/file-map.txt +10 -0
- package/android/build/intermediates/compile_library_classes_jar/debug/bundleLibCompileToJarDebug/classes.jar +0 -0
- package/android/build/intermediates/compile_r_class_jar/debug/generateDebugRFile/R.jar +0 -0
- package/android/build/intermediates/compile_symbol_list/debug/generateDebugRFile/R.txt +2 -0
- package/android/build/intermediates/incremental/debug/packageDebugResources/compile-file-map.properties +1 -1
- package/android/build/intermediates/incremental/debug/packageDebugResources/merged.dir/values/values.xml +10 -0
- package/android/build/intermediates/incremental/debug/packageDebugResources/merger.xml +6 -1
- package/android/build/intermediates/incremental/{packageDebugAssets → mergeDebugAssets}/merger.xml +1 -1
- package/android/build/intermediates/java_res/debug/processDebugJavaRes/out/META-INF/framepayments-react-native_debug.kotlin_module +0 -0
- package/android/build/intermediates/javac/debug/compileDebugJavaWithJavac/classes/com/framepayments/reactnativeframe/BuildConfig.class +0 -0
- package/android/build/intermediates/local_only_symbol_list/debug/parseDebugLocalResources/R-def.txt +4 -0
- package/android/build/intermediates/manifest_merge_blame_file/debug/processDebugManifest/manifest-merger-blame-debug-report.txt +45 -0
- package/android/build/intermediates/merged_manifest/debug/processDebugManifest/AndroidManifest.xml +26 -0
- package/android/build/intermediates/nested_resources_validation_report/debug/generateDebugResources/nestedResourcesValidationReport.txt +1 -0
- package/android/build/intermediates/packaged_res/debug/packageDebugResources/values/values.xml +10 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/META-INF/framepayments-react-native_debug.kotlin_module +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/framepayments/reactnativeframe/BuildConfig.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/{com → bundleLibRuntimeToDirDebug/com}/framepayments/reactnativeframe/FrameCheckoutActivity$Companion.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/{com → bundleLibRuntimeToDirDebug/com}/framepayments/reactnativeframe/FrameCheckoutActivity$tryShowCheckout$1.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/{com → bundleLibRuntimeToDirDebug/com}/framepayments/reactnativeframe/FrameCheckoutActivity.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/{com → bundleLibRuntimeToDirDebug/com}/framepayments/reactnativeframe/FrameFlowActivity$CartItemDto.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/{com → bundleLibRuntimeToDirDebug/com}/framepayments/reactnativeframe/FrameFlowActivity$Companion.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/{com → bundleLibRuntimeToDirDebug/com}/framepayments/reactnativeframe/FrameFlowActivity$parseCartItems$type$1.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/{com → bundleLibRuntimeToDirDebug/com}/framepayments/reactnativeframe/FrameFlowActivity.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/framepayments/reactnativeframe/FrameGooglePayActivity$Companion.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/framepayments/reactnativeframe/FrameGooglePayActivity.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/framepayments/reactnativeframe/FrameOnboardingActivity$Companion.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/framepayments/reactnativeframe/FrameOnboardingActivity$parseCapabilities$type$1.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/framepayments/reactnativeframe/FrameOnboardingActivity.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/framepayments/reactnativeframe/FrameSDKModule$Companion.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/framepayments/reactnativeframe/FrameSDKModule.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/{com → bundleLibRuntimeToDirDebug/com}/framepayments/reactnativeframe/FrameSDKPackage.class +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/bundleLibRuntimeToDirDebug/com/framepayments/reactnativeframe/JsonConvertersKt.class +0 -0
- package/android/build/intermediates/symbol_list_with_package_name/debug/generateDebugRFile/package-aware-r.txt +3 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/inputs/source-to-output.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-attributes.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/class-fq-name-to-source.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/constants.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/internal-name-to-source.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/package-parts.tab_i.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/proto.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/source-to-classes.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/subtypes.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/jvm/kotlin/supertypes.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/counters.tab +1 -1
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/file-to-id.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/id-to-file.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.keystream.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.len +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab.values.at +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/caches-jvm/lookups/lookups.tab_i +0 -0
- package/android/build/kotlin/compileDebugKotlin/cacheable/last-build.bin +0 -0
- package/android/build/kotlin/compileDebugKotlin/classpath-snapshot/shrunk-classpath-snapshot.bin +0 -0
- package/android/build/outputs/logs/manifest-merger-debug-report.txt +21 -5
- package/android/build/tmp/compileDebugJavaWithJavac/previous-compilation-data.bin +0 -0
- package/android/build/tmp/kotlin-classes/debug/META-INF/framepayments-react-native_debug.kotlin_module +0 -0
- package/android/build/tmp/kotlin-classes/debug/com/framepayments/reactnativeframe/FrameCheckoutActivity$Companion.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/com/framepayments/reactnativeframe/FrameCheckoutActivity$tryShowCheckout$1.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/com/framepayments/reactnativeframe/FrameCheckoutActivity.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/com/framepayments/reactnativeframe/FrameFlowActivity$CartItemDto.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/com/framepayments/reactnativeframe/FrameFlowActivity$Companion.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/com/framepayments/reactnativeframe/FrameFlowActivity$parseCartItems$type$1.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/com/framepayments/reactnativeframe/FrameFlowActivity.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/com/framepayments/reactnativeframe/FrameGooglePayActivity$Companion.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/com/framepayments/reactnativeframe/FrameGooglePayActivity.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/com/framepayments/reactnativeframe/FrameOnboardingActivity$Companion.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/com/framepayments/reactnativeframe/FrameOnboardingActivity$parseCapabilities$type$1.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/com/framepayments/reactnativeframe/FrameOnboardingActivity.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/com/framepayments/reactnativeframe/FrameSDKModule$Companion.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/com/framepayments/reactnativeframe/FrameSDKModule.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/com/framepayments/reactnativeframe/FrameSDKPackage.class +0 -0
- package/android/build/tmp/kotlin-classes/debug/com/framepayments/reactnativeframe/JsonConvertersKt.class +0 -0
- package/android/build.gradle +22 -24
- package/android/src/main/AndroidManifest.xml +10 -2
- package/android/src/main/java/com/framepayments/reactnativeframe/FrameFlowActivity.kt +2 -2
- package/android/src/main/java/com/framepayments/reactnativeframe/FrameGooglePayActivity.kt +148 -0
- package/android/src/main/java/com/framepayments/reactnativeframe/FrameOnboardingActivity.kt +68 -0
- package/android/src/main/java/com/framepayments/reactnativeframe/FrameSDKModule.kt +115 -33
- package/android/src/main/java/com/framepayments/reactnativeframe/JsonConverters.kt +39 -0
- package/android/src/main/res/values/frame_styles.xml +15 -0
- package/ios/ApplePayPresenter.swift +155 -0
- package/ios/FrameReactNative.podspec +10 -4
- package/ios/FrameSDKBridge.m +33 -4
- package/ios/FrameSDKBridge.swift +160 -26
- package/lib/components/FrameApplePayButton.d.ts +30 -0
- package/lib/components/FrameApplePayButton.d.ts.map +1 -0
- package/lib/components/FrameApplePayButton.js +42 -0
- package/lib/components/FrameGooglePayButton.d.ts +28 -0
- package/lib/components/FrameGooglePayButton.d.ts.map +1 -0
- package/lib/components/FrameGooglePayButton.js +24 -0
- package/lib/components/index.d.ts +5 -0
- package/lib/components/index.d.ts.map +1 -0
- package/lib/components/index.js +2 -0
- package/lib/index.d.ts +9 -4
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +13 -4
- package/lib/native.d.ts +9 -2
- package/lib/native.d.ts.map +1 -1
- package/lib/native.js +28 -4
- package/lib/types.d.ts +102 -7
- package/lib/types.d.ts.map +1 -1
- package/package.json +10 -15
- package/src/__tests__/native.test.ts +51 -14
- package/src/index.ts +44 -5
- package/src/native.ts +71 -6
- package/src/types.ts +133 -7
- package/android/build/.transforms/3db830673120be833016e77c88c53305/results.bin +0 -1
- package/android/build/.transforms/3db830673120be833016e77c88c53305/transformed/debug/com/framepayments/reactnativeframe/FrameCheckoutActivity$Companion.dex +0 -0
- package/android/build/.transforms/3db830673120be833016e77c88c53305/transformed/debug/com/framepayments/reactnativeframe/FrameCheckoutActivity.dex +0 -0
- package/android/build/.transforms/3db830673120be833016e77c88c53305/transformed/debug/com/framepayments/reactnativeframe/FrameFlowActivity$Companion.dex +0 -0
- package/android/build/.transforms/3db830673120be833016e77c88c53305/transformed/debug/com/framepayments/reactnativeframe/FrameFlowActivity$parseCartItems$type$1.dex +0 -0
- package/android/build/.transforms/3db830673120be833016e77c88c53305/transformed/debug/com/framepayments/reactnativeframe/FrameFlowActivity.dex +0 -0
- package/android/build/.transforms/3db830673120be833016e77c88c53305/transformed/debug/com/framepayments/reactnativeframe/FrameSDKModule.dex +0 -0
- package/android/build/.transforms/3db830673120be833016e77c88c53305/transformed/debug/com/framepayments/reactnativeframe/FrameSDKPackage.dex +0 -0
- package/android/build/.transforms/e32bd1e24a69eac3ebaf0c3a5e659207/results.bin +0 -1
- package/android/build/intermediates/aapt_friendly_merged_manifests/debug/aapt/AndroidManifest.xml +0 -18
- package/android/build/intermediates/compile_library_classes_jar/debug/classes.jar +0 -0
- package/android/build/intermediates/compile_r_class_jar/debug/R.jar +0 -0
- package/android/build/intermediates/incremental/mergeDebugShaders/merger.xml +0 -2
- package/android/build/intermediates/java_res/debug/out/META-INF/framepayments-react-native_debug.kotlin_module +0 -0
- package/android/build/intermediates/local_only_symbol_list/debug/R-def.txt +0 -2
- package/android/build/intermediates/manifest_merge_blame_file/debug/manifest-merger-blame-debug-report.txt +0 -27
- package/android/build/intermediates/merged_manifest/debug/AndroidManifest.xml +0 -18
- package/android/build/intermediates/runtime_library_classes_dir/debug/META-INF/framepayments-react-native_debug.kotlin_module +0 -0
- package/android/build/intermediates/runtime_library_classes_dir/debug/com/framepayments/reactnativeframe/FrameSDKModule.class +0 -0
- package/android/build/intermediates/runtime_library_classes_jar/debug/classes.jar +0 -0
- package/android/build/intermediates/symbol_list_with_package_name/debug/package-aware-r.txt +0 -1
- package/android/build/kotlin/compileDebugKotlin/local-state/build-history.bin +0 -0
- /package/android/{build/intermediates/compile_symbol_list/debug/R.txt → .gradle/8.9/dependencies-accessors/gc.properties} +0 -0
- /package/android/build/.transforms/{3db830673120be833016e77c88c53305/transformed/debug → 5a2061641b1fc5518a336681809507bc/transformed/bundleLibRuntimeToDirDebug}/desugar_graph.bin +0 -0
- /package/android/build/intermediates/aapt_friendly_merged_manifests/debug/{aapt → processDebugManifest/aapt}/output-metadata.json +0 -0
- /package/android/build/intermediates/annotation_processor_list/debug/{annotationProcessors.json → javaPreCompileDebug/annotationProcessors.json} +0 -0
- /package/android/build/intermediates/navigation_json/debug/{navigation.json → extractDeepLinksDebug/navigation.json} +0 -0
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
package com.framepayments.reactnativeframe
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.bridge.WritableNativeArray
|
|
4
|
+
import com.facebook.react.bridge.WritableNativeMap
|
|
5
|
+
import org.json.JSONArray
|
|
6
|
+
import org.json.JSONObject
|
|
7
|
+
|
|
8
|
+
internal fun jsonObjectToWritableMap(obj: JSONObject): WritableNativeMap {
|
|
9
|
+
val map = WritableNativeMap()
|
|
10
|
+
for (key in obj.keys()) {
|
|
11
|
+
if (obj.isNull(key)) continue
|
|
12
|
+
when (val v = obj.get(key)) {
|
|
13
|
+
is String -> map.putString(key, v)
|
|
14
|
+
is Int -> map.putInt(key, v)
|
|
15
|
+
is Long -> map.putDouble(key, v.toDouble())
|
|
16
|
+
is Double -> map.putDouble(key, v)
|
|
17
|
+
is Boolean -> map.putBoolean(key, v)
|
|
18
|
+
is JSONObject -> map.putMap(key, jsonObjectToWritableMap(v))
|
|
19
|
+
is JSONArray -> map.putArray(key, jsonArrayToWritableArray(v))
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return map
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
internal fun jsonArrayToWritableArray(arr: JSONArray): WritableNativeArray {
|
|
26
|
+
val list = WritableNativeArray()
|
|
27
|
+
for (i in 0 until arr.length()) {
|
|
28
|
+
when (val v = arr.get(i)) {
|
|
29
|
+
is String -> list.pushString(v)
|
|
30
|
+
is Int -> list.pushInt(v)
|
|
31
|
+
is Long -> list.pushDouble(v.toDouble())
|
|
32
|
+
is Double -> list.pushDouble(v)
|
|
33
|
+
is Boolean -> list.pushBoolean(v)
|
|
34
|
+
is JSONObject -> list.pushMap(jsonObjectToWritableMap(v))
|
|
35
|
+
is JSONArray -> list.pushArray(jsonArrayToWritableArray(v))
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return list
|
|
39
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="utf-8"?>
|
|
2
|
+
<resources>
|
|
3
|
+
<!-- Material theme used by all Frame host activities. Required because the Frame SDK's
|
|
4
|
+
GooglePayButton extends MaterialButton, which inflates only under a Theme.MaterialComponents
|
|
5
|
+
descendant. -->
|
|
6
|
+
<style name="Theme.Frame.NoActionBar" parent="Theme.MaterialComponents.Light.NoActionBar" />
|
|
7
|
+
|
|
8
|
+
<!-- Translucent variant for the hidden FrameGooglePayActivity host. -->
|
|
9
|
+
<style name="Theme.Frame.GooglePay.Translucent" parent="Theme.MaterialComponents.Light.NoActionBar">
|
|
10
|
+
<item name="android:windowBackground">@android:color/transparent</item>
|
|
11
|
+
<item name="android:windowIsTranslucent">true</item>
|
|
12
|
+
<item name="android:windowNoTitle">true</item>
|
|
13
|
+
<item name="android:backgroundDimEnabled">false</item>
|
|
14
|
+
</style>
|
|
15
|
+
</resources>
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
//
|
|
2
|
+
// ApplePayPresenter.swift
|
|
3
|
+
// FrameReactNative
|
|
4
|
+
//
|
|
5
|
+
// Programmatic Apple Pay presentation for Frame.presentApplePay(). Wraps
|
|
6
|
+
// PKPaymentAuthorizationController + ApplePayAPI + ChargeIntentsAPI directly
|
|
7
|
+
// so we can detect the user-cancel path (PKPaymentAuthorizationController's
|
|
8
|
+
// didFinish fires for both success and cancel; the underlying SDK's view
|
|
9
|
+
// model only delivers success, so we re-implement that flow here).
|
|
10
|
+
//
|
|
11
|
+
|
|
12
|
+
import Foundation
|
|
13
|
+
import PassKit
|
|
14
|
+
import Frame
|
|
15
|
+
|
|
16
|
+
@MainActor
|
|
17
|
+
final class ApplePayPresenter: NSObject, PKPaymentAuthorizationControllerDelegate {
|
|
18
|
+
|
|
19
|
+
private let amount: Int
|
|
20
|
+
private let currency: String
|
|
21
|
+
private let owner: FrameApplePayViewModel.PaymentMethodOwner
|
|
22
|
+
private let merchantId: String
|
|
23
|
+
private let resolve: (Any?) -> Void
|
|
24
|
+
private let reject: (String, String, Error?) -> Void
|
|
25
|
+
|
|
26
|
+
// Set to true once we've delivered a definitive result (success or backend
|
|
27
|
+
// failure). When didFinish fires without this set, treat as user cancel.
|
|
28
|
+
private var didDeliverResult = false
|
|
29
|
+
|
|
30
|
+
// Strong self-retain across the async PassKit flow. Released on didFinish.
|
|
31
|
+
private var retainCycle: ApplePayPresenter?
|
|
32
|
+
|
|
33
|
+
private static let supportedNetworks: [PKPaymentNetwork] = [
|
|
34
|
+
.visa, .masterCard, .amex, .discover, .JCB
|
|
35
|
+
]
|
|
36
|
+
|
|
37
|
+
init(amount: Int,
|
|
38
|
+
currency: String,
|
|
39
|
+
owner: FrameApplePayViewModel.PaymentMethodOwner,
|
|
40
|
+
merchantId: String,
|
|
41
|
+
resolve: @escaping (Any?) -> Void,
|
|
42
|
+
reject: @escaping (String, String, Error?) -> Void) {
|
|
43
|
+
self.amount = amount
|
|
44
|
+
self.currency = currency
|
|
45
|
+
self.owner = owner
|
|
46
|
+
self.merchantId = merchantId
|
|
47
|
+
self.resolve = resolve
|
|
48
|
+
self.reject = reject
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
static func canMakePayments() -> Bool {
|
|
52
|
+
PKPaymentAuthorizationController.canMakePayments(usingNetworks: supportedNetworks)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
func present() {
|
|
56
|
+
let request = PKPaymentRequest()
|
|
57
|
+
request.merchantIdentifier = merchantId
|
|
58
|
+
request.supportedNetworks = Self.supportedNetworks
|
|
59
|
+
request.merchantCapabilities = .threeDSecure
|
|
60
|
+
request.countryCode = "US"
|
|
61
|
+
request.currencyCode = currency.uppercased()
|
|
62
|
+
request.requiredBillingContactFields = [.postalAddress, .name, .emailAddress]
|
|
63
|
+
request.paymentSummaryItems = [
|
|
64
|
+
PKPaymentSummaryItem(
|
|
65
|
+
label: "Total",
|
|
66
|
+
amount: NSDecimalNumber(value: Double(amount) / 100.0)
|
|
67
|
+
)
|
|
68
|
+
]
|
|
69
|
+
|
|
70
|
+
let controller = PKPaymentAuthorizationController(paymentRequest: request)
|
|
71
|
+
controller.delegate = self
|
|
72
|
+
retainCycle = self
|
|
73
|
+
Task { await controller.present() }
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// MARK: - PKPaymentAuthorizationControllerDelegate
|
|
77
|
+
|
|
78
|
+
func paymentAuthorizationController(
|
|
79
|
+
_ controller: PKPaymentAuthorizationController,
|
|
80
|
+
didAuthorizePayment payment: PKPayment
|
|
81
|
+
) async -> PKPaymentAuthorizationResult {
|
|
82
|
+
do {
|
|
83
|
+
let (paymentMethod, methodError): (FrameObjects.PaymentMethod?, NetworkingError?)
|
|
84
|
+
switch owner {
|
|
85
|
+
case .customer(let customerId):
|
|
86
|
+
(paymentMethod, methodError) = try await ApplePayAPI.createPaymentMethodWithCustomerId(
|
|
87
|
+
from: payment, customerId: customerId
|
|
88
|
+
)
|
|
89
|
+
case .account(let accountId):
|
|
90
|
+
(paymentMethod, methodError) = try await ApplePayAPI.createPaymentMethodWithAccountId(
|
|
91
|
+
from: payment, accountId: accountId
|
|
92
|
+
)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
guard let paymentMethodId = paymentMethod?.id else {
|
|
96
|
+
deliverFailure(code: "PAYMENT_METHOD_FAILED", error: methodError)
|
|
97
|
+
return PKPaymentAuthorizationResult(status: .failure, errors: nil)
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
let request: ChargeIntentsRequests.CreateChargeIntentRequest
|
|
101
|
+
switch owner {
|
|
102
|
+
case .customer(let customerId):
|
|
103
|
+
request = ChargeIntentsRequests.CreateChargeIntentRequest(
|
|
104
|
+
amount: amount, currency: currency, customer: customerId,
|
|
105
|
+
paymentMethod: paymentMethodId, confirm: true, authorizationMode: .automatic
|
|
106
|
+
)
|
|
107
|
+
case .account(let accountId):
|
|
108
|
+
request = ChargeIntentsRequests.CreateChargeIntentRequest(
|
|
109
|
+
amount: amount, currency: currency, account: accountId,
|
|
110
|
+
paymentMethod: paymentMethodId, confirm: true, authorizationMode: .automatic
|
|
111
|
+
)
|
|
112
|
+
}
|
|
113
|
+
let (chargeIntent, chargeError) = try await ChargeIntentsAPI.createChargeIntent(request: request)
|
|
114
|
+
|
|
115
|
+
if let chargeIntent {
|
|
116
|
+
deliverSuccess(chargeIntent)
|
|
117
|
+
return PKPaymentAuthorizationResult(status: .success, errors: nil)
|
|
118
|
+
} else {
|
|
119
|
+
deliverFailure(code: "CHARGE_INTENT_FAILED", error: chargeError)
|
|
120
|
+
return PKPaymentAuthorizationResult(status: .failure, errors: nil)
|
|
121
|
+
}
|
|
122
|
+
} catch {
|
|
123
|
+
deliverFailure(code: "PAYMENT_FAILED", error: error)
|
|
124
|
+
return PKPaymentAuthorizationResult(status: .failure, errors: nil)
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
func paymentAuthorizationControllerDidFinish(_ controller: PKPaymentAuthorizationController) {
|
|
129
|
+
controller.dismiss()
|
|
130
|
+
if !didDeliverResult {
|
|
131
|
+
reject("USER_CANCELED", "User dismissed Apple Pay sheet without authorizing", nil)
|
|
132
|
+
didDeliverResult = true
|
|
133
|
+
}
|
|
134
|
+
retainCycle = nil
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// MARK: - Result delivery
|
|
138
|
+
|
|
139
|
+
private func deliverSuccess(_ intent: FrameObjects.ChargeIntent) {
|
|
140
|
+
guard !didDeliverResult else { return }
|
|
141
|
+
didDeliverResult = true
|
|
142
|
+
if let dict = FrameSDKBridge.encodeChargeIntent(intent) {
|
|
143
|
+
resolve(dict)
|
|
144
|
+
} else {
|
|
145
|
+
reject("ENCODE_ERROR", "Failed to encode charge intent", nil)
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
private func deliverFailure(code: String, error: Error?) {
|
|
150
|
+
guard !didDeliverResult else { return }
|
|
151
|
+
didDeliverResult = true
|
|
152
|
+
let message = error?.localizedDescription ?? "Apple Pay failed"
|
|
153
|
+
reject(code, message, error)
|
|
154
|
+
}
|
|
155
|
+
}
|
|
@@ -16,10 +16,16 @@ Pod::Spec.new do |s|
|
|
|
16
16
|
|
|
17
17
|
s.dependency 'React-Core'
|
|
18
18
|
|
|
19
|
-
# Frame-iOS SDK
|
|
20
|
-
#
|
|
21
|
-
#
|
|
22
|
-
#
|
|
19
|
+
# Frame-iOS SDK (Frame + FrameOnboarding) must be available to the app.
|
|
20
|
+
#
|
|
21
|
+
# SPM users (RN >= 0.73): add framepayments-react-native via Swift Package Manager.
|
|
22
|
+
# Frame and FrameOnboarding are declared as dependencies in Package.swift and resolve
|
|
23
|
+
# automatically — no manual step required.
|
|
24
|
+
#
|
|
25
|
+
# CocoaPods users: add frame-ios manually via Xcode:
|
|
26
|
+
# File → Add Package Dependencies → https://github.com/Frame-Payments/frame-ios
|
|
27
|
+
# Add both the "Frame-iOS" and "Frame-Onboarding" products to your app target.
|
|
28
|
+
# If Frame-iOS is published as a pod in the future, replace the above with:
|
|
23
29
|
# s.dependency 'Frame-iOS'
|
|
24
30
|
|
|
25
31
|
install_modules_dependencies(s) if respond_to?(:install_modules_dependencies)
|
package/ios/FrameSDKBridge.m
CHANGED
|
@@ -25,7 +25,8 @@
|
|
|
25
25
|
|
|
26
26
|
@interface RCT_EXTERN_MODULE(FrameSDK, FrameSDKModule)
|
|
27
27
|
|
|
28
|
-
RCT_EXTERN_METHOD(initialize:(NSString *)
|
|
28
|
+
RCT_EXTERN_METHOD(initialize:(NSString *)secretKey
|
|
29
|
+
publishableKey:(NSString *)publishableKey
|
|
29
30
|
debugMode:(BOOL)debugMode
|
|
30
31
|
resolver:(RCTPromiseResolveBlock)resolve
|
|
31
32
|
rejecter:(RCTPromiseRejectBlock)reject)
|
|
@@ -41,6 +42,19 @@ RCT_EXTERN_METHOD(presentCart:(id)customerId
|
|
|
41
42
|
resolver:(RCTPromiseResolveBlock)resolve
|
|
42
43
|
rejecter:(RCTPromiseRejectBlock)reject)
|
|
43
44
|
|
|
45
|
+
RCT_EXTERN_METHOD(presentOnboarding:(id)accountId
|
|
46
|
+
capabilities:(NSArray *)capabilities
|
|
47
|
+
resolver:(RCTPromiseResolveBlock)resolve
|
|
48
|
+
rejecter:(RCTPromiseRejectBlock)reject)
|
|
49
|
+
|
|
50
|
+
RCT_EXTERN_METHOD(presentApplePay:(NSString *)ownerType
|
|
51
|
+
ownerId:(NSString *)ownerId
|
|
52
|
+
amount:(nonnull NSNumber *)amount
|
|
53
|
+
currency:(NSString *)currency
|
|
54
|
+
merchantId:(NSString *)merchantId
|
|
55
|
+
resolver:(RCTPromiseResolveBlock)resolve
|
|
56
|
+
rejecter:(RCTPromiseRejectBlock)reject)
|
|
57
|
+
|
|
44
58
|
@end
|
|
45
59
|
|
|
46
60
|
@implementation FrameSDK
|
|
@@ -52,8 +66,8 @@ RCT_EXTERN_METHOD(presentCart:(id)customerId
|
|
|
52
66
|
return YES;
|
|
53
67
|
}
|
|
54
68
|
|
|
55
|
-
- (void)initialize:(NSString *)
|
|
56
|
-
[[[ObjCFrameSDKBridge alloc] init] initialize:
|
|
69
|
+
- (void)initialize:(NSString *)secretKey publishableKey:(NSString *)publishableKey debugMode:(BOOL)debugMode resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject {
|
|
70
|
+
[[[ObjCFrameSDKBridge alloc] init] initialize:secretKey publishableKey:publishableKey debugMode:debugMode resolver:resolve rejecter:reject];
|
|
57
71
|
}
|
|
58
72
|
|
|
59
73
|
- (void)presentCheckout:(id)customerId amount:(NSNumber *)amount resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject {
|
|
@@ -75,8 +89,23 @@ RCT_EXTERN_METHOD(presentCart:(id)customerId
|
|
|
75
89
|
reject(@"NO_ROOT_VC", @"Could not find root view controller to present cart", nil);
|
|
76
90
|
return;
|
|
77
91
|
}
|
|
78
|
-
[[[ObjCFrameSDKBridge alloc] init] presentCartFrom:topVC customerId:customerId items:items shippingAmountInCents:shippingAmountInCents resolver:resolve rejecter:reject];
|
|
92
|
+
[[[ObjCFrameSDKBridge alloc] init] presentCartFrom:topVC customerId:customerId items:items shippingAmountInCents:shippingAmountInCents.integerValue resolver:resolve rejecter:reject];
|
|
79
93
|
});
|
|
80
94
|
}
|
|
81
95
|
|
|
96
|
+
- (void)presentOnboarding:(id)accountId capabilities:(NSArray *)capabilities resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject {
|
|
97
|
+
dispatch_async(dispatch_get_main_queue(), ^{
|
|
98
|
+
UIViewController *topVC = FrameGetTopViewController();
|
|
99
|
+
if (!topVC) {
|
|
100
|
+
reject(@"NO_ROOT_VC", @"Could not find root view controller to present onboarding", nil);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
[[[ObjCFrameSDKBridge alloc] init] presentOnboardingFrom:topVC accountId:accountId capabilities:capabilities resolver:resolve rejecter:reject];
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
- (void)presentApplePay:(NSString *)ownerType ownerId:(NSString *)ownerId amount:(NSNumber *)amount currency:(NSString *)currency merchantId:(NSString *)merchantId resolver:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject {
|
|
108
|
+
[[[ObjCFrameSDKBridge alloc] init] presentApplePay:ownerType ownerId:ownerId amount:amount.intValue currency:currency merchantId:merchantId resolver:resolve rejecter:reject];
|
|
109
|
+
}
|
|
110
|
+
|
|
82
111
|
@end
|
package/ios/FrameSDKBridge.swift
CHANGED
|
@@ -10,6 +10,7 @@ import React
|
|
|
10
10
|
import UIKit
|
|
11
11
|
import SwiftUI
|
|
12
12
|
import Frame
|
|
13
|
+
import FrameOnboarding
|
|
13
14
|
|
|
14
15
|
@objc(ObjCFrameSDKBridge)
|
|
15
16
|
public class FrameSDKBridge: NSObject {
|
|
@@ -19,9 +20,9 @@ public class FrameSDKBridge: NSObject {
|
|
|
19
20
|
}
|
|
20
21
|
|
|
21
22
|
@objc public
|
|
22
|
-
func initialize(_
|
|
23
|
+
func initialize(_ secretKey: String, publishableKey: String, debugMode: Bool, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
|
|
23
24
|
DispatchQueue.main.async {
|
|
24
|
-
FrameNetworking.shared.initializeWithAPIKey(
|
|
25
|
+
FrameNetworking.shared.initializeWithAPIKey(secretKey, publishableKey: publishableKey, debugMode: debugMode)
|
|
25
26
|
resolve(nil)
|
|
26
27
|
}
|
|
27
28
|
}
|
|
@@ -40,13 +41,66 @@ public class FrameSDKBridge: NSObject {
|
|
|
40
41
|
presentCartOnMain(from: viewController, customerId: customerId as? String, cartItems: cartItems, shippingAmountInCents: shippingAmountInCents, resolve: resolve, reject: reject)
|
|
41
42
|
}
|
|
42
43
|
|
|
44
|
+
@objc public
|
|
45
|
+
func presentOnboarding(from viewController: UIViewController, accountId: NSObject?, capabilities: NSArray, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
|
|
46
|
+
let parsedCapabilities = parseCapabilities(capabilities)
|
|
47
|
+
let accountIdString = accountId as? String
|
|
48
|
+
presentOnboardingOnMain(from: viewController, accountId: accountIdString, capabilities: parsedCapabilities, resolve: resolve, reject: reject)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
@objc public
|
|
52
|
+
func presentApplePay(_ ownerType: String, ownerId: String, amount: Int, currency: String, merchantId: String, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
|
|
53
|
+
DispatchQueue.main.async {
|
|
54
|
+
Task { @MainActor in
|
|
55
|
+
let owner: FrameApplePayViewModel.PaymentMethodOwner
|
|
56
|
+
switch ownerType {
|
|
57
|
+
case "customer": owner = .customer(ownerId)
|
|
58
|
+
case "account": owner = .account(ownerId)
|
|
59
|
+
default:
|
|
60
|
+
reject("INVALID_OWNER", "owner.type must be 'customer' or 'account'", nil)
|
|
61
|
+
return
|
|
62
|
+
}
|
|
63
|
+
guard !ownerId.isEmpty else {
|
|
64
|
+
reject("INVALID_OWNER", "owner.id must be non-empty", nil)
|
|
65
|
+
return
|
|
66
|
+
}
|
|
67
|
+
guard !merchantId.isEmpty else {
|
|
68
|
+
reject("INVALID_MERCHANT_ID", "merchantId must be non-empty", nil)
|
|
69
|
+
return
|
|
70
|
+
}
|
|
71
|
+
guard ApplePayPresenter.canMakePayments() else {
|
|
72
|
+
reject("APPLE_PAY_UNAVAILABLE", "This device cannot make Apple Pay payments", nil)
|
|
73
|
+
return
|
|
74
|
+
}
|
|
75
|
+
guard DeviceAttestationManager.shared.isDeviceAttested else {
|
|
76
|
+
// Kick off attestation asynchronously so the next attempt has a chance to succeed.
|
|
77
|
+
Task { try? await DeviceAttestationManager.shared.attestDevice() }
|
|
78
|
+
reject("NOT_ATTESTED", "Device attestation has not completed yet. Please try again.", nil)
|
|
79
|
+
return
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
let presenter = ApplePayPresenter(
|
|
83
|
+
amount: amount,
|
|
84
|
+
currency: currency,
|
|
85
|
+
owner: owner,
|
|
86
|
+
merchantId: merchantId,
|
|
87
|
+
resolve: { resolve($0) },
|
|
88
|
+
reject: { code, message, error in reject(code, message, error) }
|
|
89
|
+
)
|
|
90
|
+
presenter.present()
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// MARK: - Private helpers
|
|
96
|
+
|
|
43
97
|
private func presentCheckoutOnMain(from top: UIViewController, customerId: String?, amount: Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
44
|
-
|
|
45
|
-
|
|
98
|
+
var hosting: CheckoutHostingController!
|
|
99
|
+
hosting = CheckoutHostingController(rootView: FrameCheckoutView(
|
|
46
100
|
customerId: customerId,
|
|
47
101
|
paymentAmount: amount,
|
|
48
|
-
checkoutCallback: { [weak
|
|
49
|
-
|
|
102
|
+
checkoutCallback: { [weak hosting] chargeIntent in
|
|
103
|
+
hosting?.didComplete = true
|
|
50
104
|
top.dismiss(animated: true)
|
|
51
105
|
DispatchQueue.main.async {
|
|
52
106
|
if let dict = Self.encodeChargeIntent(chargeIntent) {
|
|
@@ -56,18 +110,22 @@ public class FrameSDKBridge: NSObject {
|
|
|
56
110
|
}
|
|
57
111
|
}
|
|
58
112
|
}
|
|
59
|
-
)
|
|
60
|
-
|
|
113
|
+
))
|
|
114
|
+
hosting.onCancel = {
|
|
115
|
+
DispatchQueue.main.async {
|
|
116
|
+
reject("USER_CANCELED", "User dismissed checkout without completing payment", nil)
|
|
117
|
+
}
|
|
118
|
+
}
|
|
61
119
|
hosting.modalPresentationStyle = UIModalPresentationStyle.pageSheet
|
|
62
120
|
if let sheet = hosting.sheetPresentationController {
|
|
63
121
|
sheet.detents = [UISheetPresentationController.Detent.large()]
|
|
64
122
|
}
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
123
|
+
top.present(hosting, animated: true) {
|
|
124
|
+
hosting.presentationController?.delegate = hosting
|
|
125
|
+
}
|
|
68
126
|
}
|
|
69
127
|
|
|
70
|
-
|
|
128
|
+
internal static func encodeChargeIntent(_ intent: FrameObjects.ChargeIntent) -> [String: Any]? {
|
|
71
129
|
guard let data = try? JSONEncoder().encode(intent) else { return nil }
|
|
72
130
|
return try? JSONSerialization.jsonObject(with: data) as? [String: Any]
|
|
73
131
|
}
|
|
@@ -92,6 +150,16 @@ public class FrameSDKBridge: NSObject {
|
|
|
92
150
|
return result
|
|
93
151
|
}
|
|
94
152
|
|
|
153
|
+
private func parseCapabilities(_ capabilities: NSArray) -> [FrameObjects.Capabilities] {
|
|
154
|
+
var result: [FrameObjects.Capabilities] = []
|
|
155
|
+
for item in capabilities {
|
|
156
|
+
guard let raw = item as? String,
|
|
157
|
+
let cap = FrameObjects.Capabilities(rawValue: raw) else { continue }
|
|
158
|
+
result.append(cap)
|
|
159
|
+
}
|
|
160
|
+
return result
|
|
161
|
+
}
|
|
162
|
+
|
|
95
163
|
private func presentCartOnMain(from top: UIViewController, customerId: String?, cartItems: [RNFrameCartItem], shippingAmountInCents: Int, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
96
164
|
let cartView = FrameCartView(
|
|
97
165
|
customer: nil,
|
|
@@ -106,27 +174,73 @@ public class FrameSDKBridge: NSObject {
|
|
|
106
174
|
// When the sheet is dismissed (swipe or close), resolve. Note: FrameCartView does not expose ChargeIntent from nested checkout.
|
|
107
175
|
let delegate = CartDismissDelegate(resolve: resolve)
|
|
108
176
|
objc_setAssociatedObject(hosting, &cartDismissKey, delegate, .OBJC_ASSOCIATION_RETAIN)
|
|
109
|
-
hosting
|
|
110
|
-
|
|
177
|
+
top.present(hosting, animated: true) {
|
|
178
|
+
hosting.presentationController?.delegate = delegate
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
private func presentOnboardingOnMain(from top: UIViewController, accountId: String?, capabilities: [FrameObjects.Capabilities], resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
|
|
183
|
+
let hosting = OnboardingHostingController(
|
|
184
|
+
rootView: OnboardingContainerView(
|
|
185
|
+
accountId: accountId,
|
|
186
|
+
requiredCapabilities: capabilities
|
|
187
|
+
)
|
|
188
|
+
)
|
|
189
|
+
hosting.modalPresentationStyle = UIModalPresentationStyle.pageSheet
|
|
190
|
+
if let sheet = hosting.sheetPresentationController {
|
|
191
|
+
sheet.detents = [UISheetPresentationController.Detent.large()]
|
|
192
|
+
}
|
|
193
|
+
let delegate = OnboardingDismissDelegate(hosting: hosting, resolve: resolve)
|
|
194
|
+
objc_setAssociatedObject(hosting, &onboardingDismissKey, delegate, .OBJC_ASSOCIATION_RETAIN)
|
|
195
|
+
hosting.onProgrammaticDismiss = { [weak delegate] in
|
|
196
|
+
delegate?.finish(completed: true)
|
|
197
|
+
}
|
|
198
|
+
top.present(hosting, animated: true) {
|
|
199
|
+
hosting.presentationController?.delegate = delegate
|
|
200
|
+
}
|
|
111
201
|
}
|
|
112
202
|
}
|
|
113
203
|
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
204
|
+
// MARK: - CheckoutHostingController
|
|
205
|
+
|
|
206
|
+
private final class CheckoutHostingController: UIHostingController<FrameCheckoutView>, UIAdaptivePresentationControllerDelegate {
|
|
117
207
|
var didComplete = false
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
208
|
+
var onCancel: (() -> Void)?
|
|
209
|
+
private var cancelled = false
|
|
210
|
+
|
|
211
|
+
func cancel() {
|
|
212
|
+
guard !didComplete, !cancelled else { return }
|
|
213
|
+
cancelled = true
|
|
214
|
+
onCancel?()
|
|
121
215
|
}
|
|
216
|
+
|
|
217
|
+
override func viewDidDisappear(_ animated: Bool) {
|
|
218
|
+
super.viewDidDisappear(animated)
|
|
219
|
+
cancel()
|
|
220
|
+
}
|
|
221
|
+
|
|
122
222
|
func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
223
|
+
cancel()
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
// MARK: - OnboardingHostingController
|
|
228
|
+
|
|
229
|
+
private final class OnboardingHostingController<V: View>: UIHostingController<V> {
|
|
230
|
+
var programmaticDismiss = false
|
|
231
|
+
var onProgrammaticDismiss: (() -> Void)?
|
|
232
|
+
|
|
233
|
+
override func dismiss(animated flag: Bool, completion: (() -> Void)? = nil) {
|
|
234
|
+
programmaticDismiss = true
|
|
235
|
+
super.dismiss(animated: flag, completion: { [weak self] in
|
|
236
|
+
self?.onProgrammaticDismiss?()
|
|
237
|
+
completion?()
|
|
238
|
+
})
|
|
127
239
|
}
|
|
128
240
|
}
|
|
129
241
|
|
|
242
|
+
// MARK: - Delegates
|
|
243
|
+
|
|
130
244
|
private final class CartDismissDelegate: NSObject, UIAdaptivePresentationControllerDelegate {
|
|
131
245
|
let resolve: RCTPromiseResolveBlock
|
|
132
246
|
init(resolve: @escaping RCTPromiseResolveBlock) { self.resolve = resolve }
|
|
@@ -137,6 +251,26 @@ private final class CartDismissDelegate: NSObject, UIAdaptivePresentationControl
|
|
|
137
251
|
}
|
|
138
252
|
}
|
|
139
253
|
|
|
140
|
-
private
|
|
141
|
-
|
|
254
|
+
private final class OnboardingDismissDelegate: NSObject, UIAdaptivePresentationControllerDelegate {
|
|
255
|
+
let resolve: RCTPromiseResolveBlock
|
|
256
|
+
var didFinish = false
|
|
142
257
|
|
|
258
|
+
init(hosting: OnboardingHostingController<OnboardingContainerView>, resolve: @escaping RCTPromiseResolveBlock) {
|
|
259
|
+
self.resolve = resolve
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
func finish(completed: Bool) {
|
|
263
|
+
guard !didFinish else { return }
|
|
264
|
+
didFinish = true
|
|
265
|
+
DispatchQueue.main.async { [resolve, completed] in
|
|
266
|
+
resolve(["status": completed ? "completed" : "cancelled"])
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {
|
|
271
|
+
finish(completed: false)
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
private var cartDismissKey: UInt8 = 0
|
|
276
|
+
private var onboardingDismissKey: UInt8 = 0
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <FrameApplePayButton /> — iOS-only React Native view that wraps Frame iOS SDK's
|
|
3
|
+
* native FrameApplePayButton (PassKit + automatic device attestation).
|
|
4
|
+
*
|
|
5
|
+
* On non-iOS platforms this component renders nothing, so consumers can place it
|
|
6
|
+
* unconditionally in their JSX.
|
|
7
|
+
*/
|
|
8
|
+
import * as React from 'react';
|
|
9
|
+
import { type NativeSyntheticEvent, type ViewProps } from 'react-native';
|
|
10
|
+
import type { ApplePayButtonStyle, ApplePayButtonType, ApplePayOwner, FrameApplePayResultEvent } from '../types';
|
|
11
|
+
export interface FrameApplePayButtonProps extends ViewProps {
|
|
12
|
+
/** Payment amount in cents. */
|
|
13
|
+
amount: number;
|
|
14
|
+
/** ISO 4217 currency code. Defaults to 'usd'. */
|
|
15
|
+
currency?: string;
|
|
16
|
+
/** Customer or account that owns the resulting payment method. */
|
|
17
|
+
owner: ApplePayOwner;
|
|
18
|
+
/** Apple Pay merchant ID configured in your Apple Developer account. */
|
|
19
|
+
merchantId: string;
|
|
20
|
+
/** When true, the button renders a "Or" divider beneath itself for inline checkout layouts. */
|
|
21
|
+
addCheckoutDivider?: boolean;
|
|
22
|
+
/** PassKit button type. Defaults to 'buy'. */
|
|
23
|
+
buttonType?: ApplePayButtonType;
|
|
24
|
+
/** PassKit button style. Defaults to 'black'. */
|
|
25
|
+
buttonStyle?: ApplePayButtonStyle;
|
|
26
|
+
/** Fired when payment completes, fails, or the button reports an error. */
|
|
27
|
+
onResult: (event: NativeSyntheticEvent<FrameApplePayResultEvent>) => void;
|
|
28
|
+
}
|
|
29
|
+
export declare const FrameApplePayButton: React.FC<FrameApplePayButtonProps>;
|
|
30
|
+
//# sourceMappingURL=FrameApplePayButton.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FrameApplePayButton.d.ts","sourceRoot":"","sources":["../../src/components/FrameApplePayButton.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAIL,KAAK,oBAAoB,EACzB,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EACV,mBAAmB,EACnB,kBAAkB,EAClB,aAAa,EACb,wBAAwB,EACzB,MAAM,UAAU,CAAC;AAElB,MAAM,WAAW,wBAAyB,SAAQ,SAAS;IACzD,+BAA+B;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,iDAAiD;IACjD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kEAAkE;IAClE,KAAK,EAAE,aAAa,CAAC;IACrB,wEAAwE;IACxE,UAAU,EAAE,MAAM,CAAC;IACnB,+FAA+F;IAC/F,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,8CAA8C;IAC9C,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,iDAAiD;IACjD,WAAW,CAAC,EAAE,mBAAmB,CAAC;IAClC,2EAA2E;IAC3E,QAAQ,EAAE,CAAC,KAAK,EAAE,oBAAoB,CAAC,wBAAwB,CAAC,KAAK,IAAI,CAAC;CAC3E;AA+BD,eAAO,MAAM,mBAAmB,EAAE,KAAK,CAAC,EAAE,CAAC,wBAAwB,CAclE,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <FrameApplePayButton /> — iOS-only React Native view that wraps Frame iOS SDK's
|
|
3
|
+
* native FrameApplePayButton (PassKit + automatic device attestation).
|
|
4
|
+
*
|
|
5
|
+
* On non-iOS platforms this component renders nothing, so consumers can place it
|
|
6
|
+
* unconditionally in their JSX.
|
|
7
|
+
*/
|
|
8
|
+
import * as React from 'react';
|
|
9
|
+
import { Platform, StyleSheet, requireNativeComponent, } from 'react-native';
|
|
10
|
+
const NativeFrameApplePayButton = Platform.OS === 'ios'
|
|
11
|
+
? requireNativeComponent('FrameApplePayButtonView')
|
|
12
|
+
: null;
|
|
13
|
+
let warnedAboutOwner = false;
|
|
14
|
+
function warnIfBadOwner(owner) {
|
|
15
|
+
if (!owner ||
|
|
16
|
+
(owner.type !== 'customer' && owner.type !== 'account') ||
|
|
17
|
+
typeof owner.id !== 'string' ||
|
|
18
|
+
owner.id.length === 0) {
|
|
19
|
+
if (!warnedAboutOwner) {
|
|
20
|
+
warnedAboutOwner = true;
|
|
21
|
+
// eslint-disable-next-line no-console
|
|
22
|
+
console.warn('[FrameApplePayButton] `owner` must be { type: "customer" | "account", id: string }. The button will not render until a valid owner is provided.');
|
|
23
|
+
}
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
export const FrameApplePayButton = (props) => {
|
|
29
|
+
if (Platform.OS !== 'ios' || NativeFrameApplePayButton === null) {
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
if (!warnIfBadOwner(props.owner)) {
|
|
33
|
+
return null;
|
|
34
|
+
}
|
|
35
|
+
const { style, ...rest } = props;
|
|
36
|
+
return (<NativeFrameApplePayButton {...rest} style={[styles.button, style]}/>);
|
|
37
|
+
};
|
|
38
|
+
const styles = StyleSheet.create({
|
|
39
|
+
button: {
|
|
40
|
+
height: 50,
|
|
41
|
+
},
|
|
42
|
+
});
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <FrameGooglePayButton /> — Android-only React Native view that wraps Frame Android SDK's
|
|
3
|
+
* native FrameGooglePayButton (Google Pay PaymentsClient + readiness check).
|
|
4
|
+
*
|
|
5
|
+
* On non-Android platforms this component renders nothing, so consumers can place it
|
|
6
|
+
* unconditionally in their JSX.
|
|
7
|
+
*/
|
|
8
|
+
import * as React from 'react';
|
|
9
|
+
import { type NativeSyntheticEvent, type ViewProps } from 'react-native';
|
|
10
|
+
import type { FrameGooglePayResultEvent } from '../types';
|
|
11
|
+
export interface FrameGooglePayButtonProps extends ViewProps {
|
|
12
|
+
/** Payment amount in cents. */
|
|
13
|
+
amountCents: number;
|
|
14
|
+
/** Optional Frame customer ID to associate the resulting payment method with. */
|
|
15
|
+
customerId?: string;
|
|
16
|
+
/** ISO 4217 currency code. Defaults to 'USD'. */
|
|
17
|
+
currencyCode?: string;
|
|
18
|
+
/** Optional override for the Google Pay merchant ID. */
|
|
19
|
+
googlePayMerchantId?: string;
|
|
20
|
+
/** Fired when payment completes, fails, or the user cancels the Google Pay sheet. */
|
|
21
|
+
onResult: (event: NativeSyntheticEvent<FrameGooglePayResultEvent>) => void;
|
|
22
|
+
/** Fired when Google Pay readiness changes (button shows/hides itself accordingly). */
|
|
23
|
+
onReadinessChanged?: (event: NativeSyntheticEvent<{
|
|
24
|
+
isReady: boolean;
|
|
25
|
+
}>) => void;
|
|
26
|
+
}
|
|
27
|
+
export declare const FrameGooglePayButton: React.FC<FrameGooglePayButtonProps>;
|
|
28
|
+
//# sourceMappingURL=FrameGooglePayButton.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FrameGooglePayButton.d.ts","sourceRoot":"","sources":["../../src/components/FrameGooglePayButton.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAIL,KAAK,oBAAoB,EACzB,KAAK,SAAS,EACf,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,UAAU,CAAC;AAE1D,MAAM,WAAW,yBAA0B,SAAQ,SAAS;IAC1D,+BAA+B;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,iFAAiF;IACjF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iDAAiD;IACjD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,wDAAwD;IACxD,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,qFAAqF;IACrF,QAAQ,EAAE,CAAC,KAAK,EAAE,oBAAoB,CAAC,yBAAyB,CAAC,KAAK,IAAI,CAAC;IAC3E,uFAAuF;IACvF,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,CAAC;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,KAAK,IAAI,CAAC;CAClF;AAOD,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC,yBAAyB,CAWpE,CAAC"}
|