react-native-hyperswitch-dev-sdk 0.4.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/HyperswitchSdkReactNative.podspec +42 -0
- package/LICENSE +201 -0
- package/android/build.gradle +161 -0
- package/android/gradle.properties +5 -0
- package/android/hyperswitch_autolinking.gradle +378 -0
- package/android/proguard-rules.pro +72 -0
- package/android/src/legacy/java/com/facebook/react/viewmanagers/GooglePayButtonManagerDelegate.java +41 -0
- package/android/src/legacy/java/com/facebook/react/viewmanagers/GooglePayButtonManagerInterface.java +20 -0
- package/android/src/legacy/java/com/facebook/react/viewmanagers/NativePaymentWidgetManagerDelegate.java +38 -0
- package/android/src/legacy/java/com/facebook/react/viewmanagers/NativePaymentWidgetManagerInterface.java +21 -0
- package/android/src/legacy/java/com/hyperswitchsdkreactnative/NativeHyperswitchSdkNativeSpec.java +106 -0
- package/android/src/legacy/java/com/hyperswitchsdkreactnative/NativeHyperswitchSdkReactNativeSpec.java +77 -0
- package/android/src/legacy/java/com/hyperswitchsdkreactnative/NativePaymentWidgetNativeSpec.java +36 -0
- package/android/src/main/AndroidManifest.xml +15 -0
- package/android/src/main/assets/hyperswitch.bundle +1535 -0
- package/android/src/main/java/com/hyperswitchsdkreactnative/HyperswitchSdkReactNativePackage.kt +47 -0
- package/android/src/main/java/com/hyperswitchsdkreactnative/modules/NativePaymentWidgetModule.kt +173 -0
- package/android/src/main/java/com/hyperswitchsdkreactnative/modules/ReactNativeHyperswitchModule.kt +396 -0
- package/android/src/main/java/com/hyperswitchsdkreactnative/views/PaymentElementViewManager.kt +99 -0
- package/android/src/main/java/io/hyperswitch/HyperswitchReactPackageProvider.kt +19 -0
- package/android/src/main/java/io/hyperswitch/PaymentEventType.kt +18 -0
- package/android/src/main/java/io/hyperswitch/model/ElementConfiguration.kt +58 -0
- package/android/src/main/java/io/hyperswitch/paymentsession/ExitHeadlessCallBackManager.kt +47 -0
- package/android/src/main/java/io/hyperswitch/paymentsession/GetPaymentSessionCallBackManager.kt +23 -0
- package/android/src/main/java/io/hyperswitch/paymentsession/PaymentMethod.kt +167 -0
- package/android/src/main/java/io/hyperswitch/paymentsession/PaymentSessionHandler.kt +68 -0
- package/android/src/main/java/io/hyperswitch/paymentsession/PaymentSessionHandlerImpl.kt +179 -0
- package/android/src/main/java/io/hyperswitch/paymentsession/PaymentSessionReactLauncher.kt +226 -0
- package/android/src/main/java/io/hyperswitch/paymentsession/PaymentSheetCallbackManager.kt +40 -0
- package/android/src/main/java/io/hyperswitch/paymentsheet/PaymentResult.kt +63 -0
- package/android/src/main/java/io/hyperswitch/react/GooglePayButtonManager.kt +54 -0
- package/android/src/main/java/io/hyperswitch/react/HyperActivity.kt +73 -0
- package/android/src/main/java/io/hyperswitch/react/HyperEventEmitter.kt +144 -0
- package/android/src/main/java/io/hyperswitch/react/HyperFragment.kt +429 -0
- package/android/src/main/java/io/hyperswitch/react/HyperFragmentManager.kt +155 -0
- package/android/src/main/java/io/hyperswitch/react/HyperHeadlessModule.kt +43 -0
- package/android/src/main/java/io/hyperswitch/react/HyperModule.kt +405 -0
- package/android/src/main/java/io/hyperswitch/react/HyperPackage.kt +16 -0
- package/android/src/main/java/io/hyperswitch/react/ReactNativeController.kt +251 -0
- package/android/src/main/java/io/hyperswitch/utils/ConversionUtils.kt +256 -0
- package/android/src/main/java/io/hyperswitch/utils/StandardResult.kt +45 -0
- package/android/src/main/java/io/hyperswitch/view/GooglePayButtonView.kt +59 -0
- package/android/src/main/java/io/hyperswitch/view/PaymentWidgetView.kt +405 -0
- package/android/src/main/res/values/attrs.xml +6 -0
- package/android/src/main/res/values/strings.xml +5 -0
- package/android/src/main/res/values/theme.xml +16 -0
- package/ios/Modules/ReactNative/HyperswitchModule.swift +470 -0
- package/ios/Modules/ReactNative/HyperswitchSdkReactNative.h +5 -0
- package/ios/Modules/ReactNative/HyperswitchSdkReactNative.mm +121 -0
- package/ios/Modules/ReactNative/NativeHyperswitchModule.h +18 -0
- package/ios/Modules/ReactNative/NativeHyperswitchModule.mm +165 -0
- package/ios/Modules/ReactNative/NativeHyperswitchModuleImpl.swift +290 -0
- package/ios/Modules/ReactNative/NativePaymentElementModule.mm +129 -0
- package/ios/Views/Fabric/ApplePayView.h +14 -0
- package/ios/Views/Fabric/ApplePayView.mm +89 -0
- package/ios/Views/Fabric/NativePaymentElementView.h +21 -0
- package/ios/Views/Fabric/NativePaymentElementView.mm +200 -0
- package/ios/Views/Fabric/NativePaymentWidgetViewRegistry.h +37 -0
- package/ios/Views/Fabric/NativePaymentWidgetViewRegistry.m +45 -0
- package/ios/Views/Native/NativePaymentWidget.m +26 -0
- package/ios/Views/Native/NativePaymentWidget.swift +420 -0
- package/ios/hyperswitchSDK/Core/ApplePay/ApplePayHandler.swift +261 -0
- package/ios/hyperswitchSDK/Core/ApplePay/ApplePayViewManager.m +18 -0
- package/ios/hyperswitchSDK/Core/ApplePay/ApplePayViewManager.swift +126 -0
- package/ios/hyperswitchSDK/Core/DeviceDataCollection/HeadlessWebView.swift +144 -0
- package/ios/hyperswitchSDK/Core/HyperCVCWidget/CVCWidget.swift +136 -0
- package/ios/hyperswitchSDK/Core/HyperExpressCheckout/ExpressCheckoutLauncher.swift +116 -0
- package/ios/hyperswitchSDK/Core/HyperExpressCheckout/ExpressCheckoutWidget.swift +42 -0
- package/ios/hyperswitchSDK/Core/HyperPaymentCardTextField/PaymentCardTextField+SwiftUI.swift +67 -0
- package/ios/hyperswitchSDK/Core/HyperPaymentCardTextField/PaymentCardTextField.swift +44 -0
- package/ios/hyperswitchSDK/Core/HyperPaymentCardTextField/PaymentHandler.swift +59 -0
- package/ios/hyperswitchSDK/Core/HyperPaymentCardTextField/PaymentIntentParams.swift +31 -0
- package/ios/hyperswitchSDK/Core/HyperPaymentCardTextField/PaymentMethodParams.swift +25 -0
- package/ios/hyperswitchSDK/Core/HyperPaymentMethodManagement/PaymentManagementConfiguration.swift +213 -0
- package/ios/hyperswitchSDK/Core/HyperPaymentMethodManagement/PaymentMethodManagementWidget.swift +92 -0
- package/ios/hyperswitchSDK/Core/HyperPaymentSheet/PaymentSheet+Events.swift +36 -0
- package/ios/hyperswitchSDK/Core/HyperPaymentSheet/PaymentSheetView+SwiftUI.swift +49 -0
- package/ios/hyperswitchSDK/Core/HyperPaymentSheet/PaymentSheetView+UIKit.swift +49 -0
- package/ios/hyperswitchSDK/Core/HyperPaymentSheet/PaymentSheetView.swift +68 -0
- package/ios/hyperswitchSDK/Core/HyperPaymentWidget/PaymentWidget.swift +212 -0
- package/ios/hyperswitchSDK/Core/HyperSession/PaymentSession+UIKit.swift +228 -0
- package/ios/hyperswitchSDK/Core/HyperSession/PaymentSessionTypes.swift +174 -0
- package/ios/hyperswitchSDK/Core/NativeModule/HyperHeadless.m +15 -0
- package/ios/hyperswitchSDK/Core/NativeModule/HyperHeadless.swift +108 -0
- package/ios/hyperswitchSDK/Core/NativeModule/HyperModule.m +31 -0
- package/ios/hyperswitchSDK/Core/NativeModule/HyperModule.swift +343 -0
- package/ios/hyperswitchSDK/Core/NativeModule/OTAServices.swift +117 -0
- package/ios/hyperswitchSDK/Core/NativeModule/RNHeadlessManager.swift +47 -0
- package/ios/hyperswitchSDK/Core/NativeModule/RNResponseHandler.swift +12 -0
- package/ios/hyperswitchSDK/Core/NativeModule/RNViewManager.swift +55 -0
- package/ios/hyperswitchSDK/Core/NativeModule/WidgetAction.swift +30 -0
- package/ios/hyperswitchSDK/Core/NativeModule/WidgetResponseRegistry.swift +92 -0
- package/ios/hyperswitchSDK/Core/NativeModule/hyper-Bridging-Header.h +12 -0
- package/ios/hyperswitchSDK/Core/Resources/HyperOTA.plist +20 -0
- package/ios/hyperswitchSDK/Core/Resources/hyperswitch.bundle +1531 -0
- package/ios/hyperswitchSDK/CoreLite/ApplePayHandlerLite.swift +251 -0
- package/ios/hyperswitchSDK/CoreLite/PaymentSession+Lite.swift +25 -0
- package/ios/hyperswitchSDK/CoreLite/PaymentSheetView+Lite.swift +45 -0
- package/ios/hyperswitchSDK/CoreLite/SwiftUI+Lite.swift +48 -0
- package/ios/hyperswitchSDK/CoreLite/WebViewController.swift +278 -0
- package/ios/hyperswitchSDK/Shared/APIClient.swift +22 -0
- package/ios/hyperswitchSDK/Shared/Codable+UIKit.swift +75 -0
- package/ios/hyperswitchSDK/Shared/CustomEndpointConfiguration.swift +67 -0
- package/ios/hyperswitchSDK/Shared/DictionaryConverter.swift +104 -0
- package/ios/hyperswitchSDK/Shared/Environment.swift +24 -0
- package/ios/hyperswitchSDK/Shared/Extensions.swift +101 -0
- package/ios/hyperswitchSDK/Shared/Helper.swift +40 -0
- package/ios/hyperswitchSDK/Shared/HyperEvents/PaymentEventData.swift +125 -0
- package/ios/hyperswitchSDK/Shared/HyperEvents/PaymentEventSubscriptionBuilder.swift +45 -0
- package/ios/hyperswitchSDK/Shared/HyperEvents/PaymentEventType.swift +30 -0
- package/ios/hyperswitchSDK/Shared/HyperNetworking.swift +151 -0
- package/ios/hyperswitchSDK/Shared/HyperParams.swift +44 -0
- package/ios/hyperswitchSDK/Shared/HyperUIViewController.swift +27 -0
- package/ios/hyperswitchSDK/Shared/Hyperswitch.swift +20 -0
- package/ios/hyperswitchSDK/Shared/HyperswitchConfigurationSchema.swift +54 -0
- package/ios/hyperswitchSDK/Shared/HyperswitchEnvironment.swift +11 -0
- package/ios/hyperswitchSDK/Shared/NativeLogger/Debouncer.swift +37 -0
- package/ios/hyperswitchSDK/Shared/NativeLogger/LogBuilder.swift +113 -0
- package/ios/hyperswitchSDK/Shared/NativeLogger/LogFileManager.swift +76 -0
- package/ios/hyperswitchSDK/Shared/NativeLogger/LogManager.swift +113 -0
- package/ios/hyperswitchSDK/Shared/NativeLogger/LogPayload.swift +91 -0
- package/ios/hyperswitchSDK/Shared/PaymentMethodType.swift +15 -0
- package/ios/hyperswitchSDK/Shared/PaymentSession.swift +98 -0
- package/ios/hyperswitchSDK/Shared/PaymentSessionConfiguration.swift +14 -0
- package/ios/hyperswitchSDK/Shared/PaymentSheet.swift +33 -0
- package/ios/hyperswitchSDK/Shared/PaymentSheetAppearance+Codable.swift +182 -0
- package/ios/hyperswitchSDK/Shared/PaymentSheetAppearance.swift +238 -0
- package/ios/hyperswitchSDK/Shared/PaymentSheetConfiguration.swift +161 -0
- package/ios/hyperswitchSDK/Shared/SDKParams.swift +43 -0
- package/ios/hyperswitchSDK/Shared/SavedPaymentMethodsConfiguration.swift +20 -0
- package/ios/hyperswitchSDK/Shared/SwiftUIManager.swift +28 -0
- package/ios/hyperswitchSDK/Shared/Version.swift +12 -0
- package/lib/bs/JuspayTechReactNativeHyperswitch.cmi +0 -0
- package/lib/bs/JuspayTechReactNativeHyperswitch.cmj +0 -0
- package/lib/bs/JuspayTechReactNativeHyperswitch.cmt +0 -0
- package/lib/bs/JuspayTechReactNativeHyperswitch.mlmap +0 -0
- package/lib/bs/build.ninja +8 -0
- package/lib/bs/install.ninja +9 -0
- package/lib/bs/src/context/HyperProvider-JuspayTechReactNativeHyperswitch.cmt +0 -0
- package/lib/bs/src/context/WidgetRegistry-JuspayTechReactNativeHyperswitch.cmt +0 -0
- package/lib/bs/src/core/Hyper-JuspayTechReactNativeHyperswitch.cmt +0 -0
- package/lib/bs/src/core/HyperElements-JuspayTechReactNativeHyperswitch.cmt +0 -0
- package/lib/bs/src/hooks/usePaymentSession-JuspayTechReactNativeHyperswitch.cmt +0 -0
- package/lib/bs/src/hooks/useWidget-JuspayTechReactNativeHyperswitch.cmt +0 -0
- package/lib/bs/src/modules/NativeHyperswitchSdk-JuspayTechReactNativeHyperswitch.cmt +0 -0
- package/lib/bs/src/types/HyperTypes-JuspayTechReactNativeHyperswitch.cmt +0 -0
- package/lib/bs/src/types/NativeModuleTypes-JuspayTechReactNativeHyperswitch.cmt +0 -0
- package/lib/bs/src/types/PaymentSheetConfiguration-JuspayTechReactNativeHyperswitch.cmt +0 -0
- package/lib/bs/src/utils/AppearanceTransformer-JuspayTechReactNativeHyperswitch.cmt +0 -0
- package/lib/bs/src/utils/EventValidator-JuspayTechReactNativeHyperswitch.cmt +0 -0
- package/lib/bs/src/utils/NewArchUtils-JuspayTechReactNativeHyperswitch.cmt +0 -0
- package/lib/bs/src/utils/PaymentSheetEventManager-JuspayTechReactNativeHyperswitch.cmt +0 -0
- package/lib/bs/src/utils/ReactNativeUtils-JuspayTechReactNativeHyperswitch.cmt +0 -0
- package/lib/bs/src/utils/ResponseHandler-JuspayTechReactNativeHyperswitch.cmt +0 -0
- package/lib/bs/src/views/CVCElement-JuspayTechReactNativeHyperswitch.cmt +0 -0
- package/lib/bs/src/views/NativePaymentWidget-JuspayTechReactNativeHyperswitch.cmt +0 -0
- package/lib/bs/src/views/NativePaymentWidgetImpl-JuspayTechReactNativeHyperswitch.cmt +0 -0
- package/lib/bs/src/views/PaymentElement-JuspayTechReactNativeHyperswitch.cmt +0 -0
- package/lib/commonjs/index.bundle.js +2 -0
- package/lib/commonjs/index.bundle.js.map +1 -0
- package/lib/module/index.bundle.js +2 -0
- package/lib/module/index.bundle.js.map +1 -0
- package/lib/typescript/babel.config.d.ts +10 -0
- package/lib/typescript/babel.config.d.ts.map +1 -0
- package/lib/typescript/eslint.config.d.mts +3 -0
- package/lib/typescript/eslint.config.d.mts.map +1 -0
- package/lib/typescript/rollup.config.d.ts +23 -0
- package/lib/typescript/rollup.config.d.ts.map +1 -0
- package/lib/typescript/scripts/bootstrap.d.ts +2 -0
- package/lib/typescript/scripts/bootstrap.d.ts.map +1 -0
- package/lib/typescript/src/context/Elements.d.ts +7 -0
- package/lib/typescript/src/context/Elements.d.ts.map +1 -0
- package/lib/typescript/src/context/HyperElements.d.ts +23 -0
- package/lib/typescript/src/context/HyperElements.d.ts.map +1 -0
- package/lib/typescript/src/context/PaymentSession.d.ts +15 -0
- package/lib/typescript/src/context/PaymentSession.d.ts.map +1 -0
- package/lib/typescript/src/context/SavedPaymentMethods.d.ts +5 -0
- package/lib/typescript/src/context/SavedPaymentMethods.d.ts.map +1 -0
- package/lib/typescript/src/context/WidgetRegistry.d.ts +8 -0
- package/lib/typescript/src/context/WidgetRegistry.d.ts.map +1 -0
- package/lib/typescript/src/context/hooks.d.ts +5 -0
- package/lib/typescript/src/context/hooks.d.ts.map +1 -0
- package/lib/typescript/src/index.d.ts +10 -0
- package/lib/typescript/src/index.d.ts.map +1 -0
- package/lib/typescript/src/modules/NativeHyperswitchSdk.d.ts +61 -0
- package/lib/typescript/src/modules/NativeHyperswitchSdk.d.ts.map +1 -0
- package/lib/typescript/src/specs/ApplePayViewNativeComponent.d.ts +10 -0
- package/lib/typescript/src/specs/ApplePayViewNativeComponent.d.ts.map +1 -0
- package/lib/typescript/src/specs/NativeHyperHeadless.d.ts +14 -0
- package/lib/typescript/src/specs/NativeHyperHeadless.d.ts.map +1 -0
- package/lib/typescript/src/specs/NativeHyperswitchModule.d.ts +32 -0
- package/lib/typescript/src/specs/NativeHyperswitchModule.d.ts.map +1 -0
- package/lib/typescript/src/specs/NativeHyperswitchSdkNative.d.ts +33 -0
- package/lib/typescript/src/specs/NativeHyperswitchSdkNative.d.ts.map +1 -0
- package/lib/typescript/src/specs/NativePaymentElementModule.d.ts +9 -0
- package/lib/typescript/src/specs/NativePaymentElementModule.d.ts.map +1 -0
- package/lib/typescript/src/specs/PaymentElementNativeComponent.d.ts +19 -0
- package/lib/typescript/src/specs/PaymentElementNativeComponent.d.ts.map +1 -0
- package/lib/typescript/src/specs/utils.d.ts +15 -0
- package/lib/typescript/src/specs/utils.d.ts.map +1 -0
- package/lib/typescript/src/types/NativeModuleTypes.d.ts +67 -0
- package/lib/typescript/src/types/NativeModuleTypes.d.ts.map +1 -0
- package/lib/typescript/src/types/PaymentSheetConfiguration.d.ts +255 -0
- package/lib/typescript/src/types/PaymentSheetConfiguration.d.ts.map +1 -0
- package/lib/typescript/src/types/definitions.d.ts +85 -0
- package/lib/typescript/src/types/definitions.d.ts.map +1 -0
- package/lib/typescript/src/types/elements/index.d.ts +23 -0
- package/lib/typescript/src/types/elements/index.d.ts.map +1 -0
- package/lib/typescript/src/types/paymentresult/index.d.ts +5 -0
- package/lib/typescript/src/types/paymentresult/index.d.ts.map +1 -0
- package/lib/typescript/src/types/savedPaymentMethods/index.d.ts +69 -0
- package/lib/typescript/src/types/savedPaymentMethods/index.d.ts.map +1 -0
- package/lib/typescript/src/utils/EventValidator.d.ts +9 -0
- package/lib/typescript/src/utils/EventValidator.d.ts.map +1 -0
- package/lib/typescript/src/utils/InitializationState.d.ts +13 -0
- package/lib/typescript/src/utils/InitializationState.d.ts.map +1 -0
- package/lib/typescript/src/utils/LaunchOptions.d.ts +7 -0
- package/lib/typescript/src/utils/LaunchOptions.d.ts.map +1 -0
- package/lib/typescript/src/utils/NewArchUtils.d.ts +7 -0
- package/lib/typescript/src/utils/NewArchUtils.d.ts.map +1 -0
- package/lib/typescript/src/utils/ReactNativeUtils.d.ts +3 -0
- package/lib/typescript/src/utils/ReactNativeUtils.d.ts.map +1 -0
- package/lib/typescript/src/views/CVCElement.d.ts +15 -0
- package/lib/typescript/src/views/CVCElement.d.ts.map +1 -0
- package/lib/typescript/src/views/NativePaymentWidget.d.ts +3 -0
- package/lib/typescript/src/views/NativePaymentWidget.d.ts.map +1 -0
- package/lib/typescript/src/views/NativePaymentWidgetImpl.d.ts +5 -0
- package/lib/typescript/src/views/NativePaymentWidgetImpl.d.ts.map +1 -0
- package/lib/typescript/src/views/PaymentElement.d.ts +18 -0
- package/lib/typescript/src/views/PaymentElement.d.ts.map +1 -0
- package/package.json +184 -0
- package/src/context/Elements.ts +80 -0
- package/src/context/HyperElements.tsx +81 -0
- package/src/context/PaymentSession.ts +121 -0
- package/src/context/SavedPaymentMethods.ts +80 -0
- package/src/context/WidgetRegistry.ts +74 -0
- package/src/context/hooks.ts +79 -0
- package/src/index.ts +53 -0
- package/src/modules/NativeHyperswitchSdk.ts +155 -0
- package/src/specs/ApplePayViewNativeComponent.ts +11 -0
- package/src/specs/NativeHyperHeadless.ts +22 -0
- package/src/specs/NativeHyperswitchModule.ts +51 -0
- package/src/specs/NativeHyperswitchSdkNative.ts +62 -0
- package/src/specs/NativePaymentElementModule.ts +25 -0
- package/src/specs/PaymentElementNativeComponent.ts +21 -0
- package/src/specs/utils.ts +15 -0
- package/src/types/NativeModuleTypes.ts +73 -0
- package/src/types/PaymentSheetConfiguration.ts +360 -0
- package/src/types/definitions.ts +109 -0
- package/src/types/elements/index.ts +33 -0
- package/src/types/paymentresult/index.ts +4 -0
- package/src/types/savedPaymentMethods/index.ts +74 -0
- package/src/utils/EventValidator.ts +39 -0
- package/src/utils/InitializationState.ts +28 -0
- package/src/utils/LaunchOptions.ts +41 -0
- package/src/utils/NewArchUtils.ts +18 -0
- package/src/utils/ReactNativeUtils.ts +13 -0
- package/src/views/CVCElement.tsx +122 -0
- package/src/views/NativePaymentWidget.ts +2 -0
- package/src/views/NativePaymentWidgetImpl.ts +16 -0
- package/src/views/PaymentElement.tsx +189 -0
- package/tsconfig.build.json +21 -0
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
//
|
|
2
|
+
// HyperHeadless.swift
|
|
3
|
+
// Hyperswitch
|
|
4
|
+
//
|
|
5
|
+
// Created by Shivam Shashank on 06/03/24.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
import React
|
|
10
|
+
import WebKit
|
|
11
|
+
|
|
12
|
+
@objc(HyperHeadless)
|
|
13
|
+
internal class HyperHeadless: RCTEventEmitter {
|
|
14
|
+
|
|
15
|
+
internal static var shared: HyperHeadless?
|
|
16
|
+
|
|
17
|
+
private var setNativeProps: RCTResponseSenderBlock?
|
|
18
|
+
private var confirmWithDefault: RCTResponseSenderBlock?
|
|
19
|
+
private var defaultPMData: ((NSDictionary?) -> Void)?
|
|
20
|
+
|
|
21
|
+
internal override init() {
|
|
22
|
+
super.init()
|
|
23
|
+
HyperHeadless.shared = self
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
@objc
|
|
27
|
+
internal override static func requiresMainQueueSetup() -> Bool {
|
|
28
|
+
return true
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
@objc
|
|
32
|
+
internal override func supportedEvents() -> [String] {
|
|
33
|
+
return ["test"]
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
@objc
|
|
37
|
+
private func confirm(data: [String: Any]) {
|
|
38
|
+
self.sendEvent(withName: "test", body: data)
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
@objc
|
|
42
|
+
private func getPaymentSession(
|
|
43
|
+
_ rootTag: NSNumber,
|
|
44
|
+
_ rnMessage: NSDictionary,
|
|
45
|
+
_ rnMessage2: NSDictionary,
|
|
46
|
+
_ rnMessage3: NSArray,
|
|
47
|
+
_ rnCallback: @escaping RCTResponseSenderBlock
|
|
48
|
+
) {
|
|
49
|
+
PaymentSession.getPaymentSession(
|
|
50
|
+
getPaymentMethodData: rnMessage,
|
|
51
|
+
getPaymentMethodData2: rnMessage2,
|
|
52
|
+
getPaymentMethodDataArray: rnMessage3,
|
|
53
|
+
callback: rnCallback
|
|
54
|
+
)
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
@objc
|
|
58
|
+
private func exitHeadless(_ rootTag: NSNumber, _ rnMessage: String) {
|
|
59
|
+
PaymentSession.exitHeadless(rnMessage: rnMessage)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
private func paymentResult(from rnMessage: String) -> PaymentResult {
|
|
63
|
+
guard let data = rnMessage.data(using: .utf8) else {
|
|
64
|
+
return .failed(
|
|
65
|
+
error: NSError(
|
|
66
|
+
domain: "UNKNOWN_ERROR",
|
|
67
|
+
code: 0,
|
|
68
|
+
userInfo: ["message": "An error has occurred."]
|
|
69
|
+
)
|
|
70
|
+
)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
do {
|
|
74
|
+
guard let jsonDictionary = try JSONSerialization.jsonObject(with: data, options: []) as? [String: String] else {
|
|
75
|
+
return .failed(
|
|
76
|
+
error: NSError(
|
|
77
|
+
domain: "UNKNOWN_ERROR",
|
|
78
|
+
code: 0,
|
|
79
|
+
userInfo: ["message": "An error has occurred."]
|
|
80
|
+
)
|
|
81
|
+
)
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
let status = jsonDictionary["status"]
|
|
85
|
+
|
|
86
|
+
if status == "failed" || status == "requires_payment_method" {
|
|
87
|
+
let error = NSError(
|
|
88
|
+
domain: (jsonDictionary["code"] ?? "") != "" ? jsonDictionary["code"]! : "UNKNOWN_ERROR",
|
|
89
|
+
code: 0,
|
|
90
|
+
userInfo: ["message": jsonDictionary["message"] ?? "An error has occurred."]
|
|
91
|
+
)
|
|
92
|
+
return .failed(error: error)
|
|
93
|
+
} else if status == "cancelled" {
|
|
94
|
+
return .canceled(data: "cancelled")
|
|
95
|
+
} else {
|
|
96
|
+
return .completed(data: status ?? "failed")
|
|
97
|
+
}
|
|
98
|
+
} catch {
|
|
99
|
+
return .failed(
|
|
100
|
+
error: NSError(
|
|
101
|
+
domain: "UNKNOWN_ERROR",
|
|
102
|
+
code: 0,
|
|
103
|
+
userInfo: ["message": "An error has occurred."]
|
|
104
|
+
)
|
|
105
|
+
)
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
#import <React/RCTEventEmitter.h>
|
|
2
|
+
|
|
3
|
+
@interface RCT_EXTERN_MODULE(HyperModule, RCTEventEmitter)
|
|
4
|
+
|
|
5
|
+
RCT_EXTERN_METHOD(sendMessageToNative: (NSString)rnMessage)
|
|
6
|
+
RCT_EXTERN_METHOD(exitPaymentsheet: (nonnull NSNumber *)reactTag :(NSString)rnMessage :(BOOL)reset)
|
|
7
|
+
RCT_EXTERN_METHOD(exitPaymentMethodManagement: (nonnull NSNumber *)reactTag :(NSString)rnMessage :(BOOL)reset)
|
|
8
|
+
RCT_EXTERN_METHOD(exitCardForm: (NSString)rnMessage)
|
|
9
|
+
RCT_EXTERN_METHOD(launchWidgetPaymentSheet: (NSDictionary) rnMessage :(RCTResponseSenderBlock)rnCallback)
|
|
10
|
+
RCT_EXTERN_METHOD(onAddPaymentMethod: (NSString)rnMessage)
|
|
11
|
+
RCT_EXTERN_METHOD(exitWidgetPaymentsheet: (nonnull NSNumber *)reactTag :(NSString)rnMessage :(BOOL)reset)
|
|
12
|
+
RCT_EXTERN_METHOD(launchApplePay: (NSString)rnMessage :(RCTResponseSenderBlock)rnCallback)
|
|
13
|
+
RCT_EXTERN_METHOD(startApplePay: (NSString)rnMessage :(RCTResponseSenderBlock)startCallback)
|
|
14
|
+
RCT_EXTERN_METHOD(presentApplePay: (NSString)rnMessage :(RCTResponseSenderBlock)presentCallback)
|
|
15
|
+
RCT_EXTERN_METHOD(notifyWidgetPaymentResult: (nonnull NSNumber *)rootTag :(NSString)rnMessage)
|
|
16
|
+
RCT_EXTERN_METHOD(emitPaymentEvent: (nonnull NSNumber *)rootTag :(NSString)eventType :(NSDictionary)payload)
|
|
17
|
+
RCT_EXTERN_METHOD(onUpdateIntentEvent: (nonnull NSNumber *)rootTag :(NSString)type :(NSString)result)
|
|
18
|
+
RCT_EXTERN_METHOD(onPaymentConfirmButtonClick: (nonnull NSNumber *)rootTag :(NSString)payload :(RCTResponseSenderBlock)callback)
|
|
19
|
+
RCT_EXTERN_METHOD(openIframeBridge: (NSString)url :(nonnull NSNumber *)timeoutMs :(RCTResponseSenderBlock)callback)
|
|
20
|
+
|
|
21
|
+
+ (BOOL)requiresMainQueueSetup
|
|
22
|
+
{
|
|
23
|
+
return YES;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
- (dispatch_queue_t)methodQueue
|
|
27
|
+
{
|
|
28
|
+
return dispatch_get_main_queue();
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
@end
|
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
//
|
|
2
|
+
// HyperModule.swift
|
|
3
|
+
// Hyperswitch
|
|
4
|
+
//
|
|
5
|
+
// Created by Harshit Srivastava on 07/03/24.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
import React
|
|
10
|
+
|
|
11
|
+
@objc(HyperModule)
|
|
12
|
+
internal class HyperModule: RCTEventEmitter {
|
|
13
|
+
|
|
14
|
+
private let applePayPaymentHandler = ApplePayHandler()
|
|
15
|
+
private let expressCheckoutHandler = ExpressCheckoutLauncher()
|
|
16
|
+
private var presentCallback: RCTResponseSenderBlock? = nil
|
|
17
|
+
internal static var shared: HyperModule?
|
|
18
|
+
|
|
19
|
+
override init() {
|
|
20
|
+
super.init()
|
|
21
|
+
HyperModule.shared = self
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
@objc
|
|
25
|
+
internal override static func requiresMainQueueSetup() -> Bool {
|
|
26
|
+
return true
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@objc
|
|
30
|
+
internal override func supportedEvents() -> [String] {
|
|
31
|
+
return ["confirm", "confirmEC", "triggerWidgetAction", "updateIntentInit", "updateIntentComplete"]
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
@objc
|
|
35
|
+
internal func confirm(data: [String: Any]) {
|
|
36
|
+
self.sendEvent(withName: "confirm", body: data)
|
|
37
|
+
}
|
|
38
|
+
// MARK: WIP
|
|
39
|
+
// @objc func confirmEC(data: [String: Any]) {
|
|
40
|
+
// self.sendEvent(withName: "confirmEC", body: data)
|
|
41
|
+
// }
|
|
42
|
+
|
|
43
|
+
@objc
|
|
44
|
+
private func sendMessageToNative(_ rnMessage: String) {}
|
|
45
|
+
|
|
46
|
+
@objc
|
|
47
|
+
private func launchWidgetPaymentSheet(_ request: NSMutableDictionary, _ callback: @escaping RCTResponseSenderBlock) {
|
|
48
|
+
expressCheckoutHandler.launchPaymentSheet(paymentResult: request, callBack: callback)
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
@objc
|
|
52
|
+
private func onAddPaymentMethod(_ rnMessage: String) {
|
|
53
|
+
PaymentMethodManagementWidget.onAddPaymentMethod?()
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
@objc
|
|
57
|
+
private func launchApplePay(_ rnMessage: String, _ rnCallback: @escaping RCTResponseSenderBlock) {
|
|
58
|
+
applePayPaymentHandler.startPayment(rnMessage: rnMessage, rnCallback: rnCallback, presentCallback: self.presentCallback)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
@objc
|
|
62
|
+
private func startApplePay(_ rnMessage: String, _ rnCallback: @escaping RCTResponseSenderBlock) {
|
|
63
|
+
rnCallback([])
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
@objc
|
|
67
|
+
private func presentApplePay(_ rnMessage: String, _ rnCallback: @escaping RCTResponseSenderBlock) {
|
|
68
|
+
self.presentCallback = rnCallback
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
@objc
|
|
72
|
+
private func exitPaymentsheet(_ reactTag: NSNumber, _ rnMessage: String, _ reset: Bool) {
|
|
73
|
+
let result = paymentResult(from: rnMessage)
|
|
74
|
+
withPaymentSheet(reactTag) { vc, sheet in
|
|
75
|
+
sheet?.completion?(result)
|
|
76
|
+
vc?.dismiss(animated: false, completion: nil)
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
@objc
|
|
81
|
+
private func exitWidgetPaymentsheet(_ reactTag: NSNumber, _ rnMessage: String, _ reset: Bool) {
|
|
82
|
+
let result = paymentResult(from: rnMessage)
|
|
83
|
+
withWidget(reactTag) { w in
|
|
84
|
+
w.handleConfirmPaymentResponse(result)
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
private func paymentResult(from rnMessage: String) -> PaymentResult {
|
|
89
|
+
guard let data = rnMessage.data(using: .utf8) else {
|
|
90
|
+
return .failed(
|
|
91
|
+
error: NSError(
|
|
92
|
+
domain: "UNKNOWN_ERROR",
|
|
93
|
+
code: 0,
|
|
94
|
+
userInfo: ["message": "An error has occurred."]
|
|
95
|
+
)
|
|
96
|
+
)
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
do {
|
|
100
|
+
guard let jsonDictionary = try JSONSerialization.jsonObject(with: data, options: []) as? [String: String] else {
|
|
101
|
+
return .failed(
|
|
102
|
+
error: NSError(
|
|
103
|
+
domain: "UNKNOWN_ERROR",
|
|
104
|
+
code: 0,
|
|
105
|
+
userInfo: ["message": "An error has occurred."]
|
|
106
|
+
)
|
|
107
|
+
)
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
let status = jsonDictionary["status"]
|
|
111
|
+
|
|
112
|
+
if status == "success" || status == "succeeded" || status == "completed" {
|
|
113
|
+
return .completed(data: status ?? "success")
|
|
114
|
+
} else if status == "cancelled" || status == "canceled" {
|
|
115
|
+
return .canceled(data: status ?? "cancelled")
|
|
116
|
+
} else {
|
|
117
|
+
let error = NSError(
|
|
118
|
+
domain: (jsonDictionary["code"] ?? "") != "" ? jsonDictionary["code"]! : "UNKNOWN_ERROR",
|
|
119
|
+
code: 0,
|
|
120
|
+
userInfo: ["message": jsonDictionary["message"] ?? status ?? "An error has occurred."]
|
|
121
|
+
)
|
|
122
|
+
return .failed(error: error)
|
|
123
|
+
}
|
|
124
|
+
} catch {
|
|
125
|
+
return .failed(
|
|
126
|
+
error: NSError(
|
|
127
|
+
domain: "UNKNOWN_ERROR",
|
|
128
|
+
code: 0,
|
|
129
|
+
userInfo: ["message": "An error has occurred."]
|
|
130
|
+
)
|
|
131
|
+
)
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
@objc
|
|
136
|
+
private func exitPaymentMethodManagement(_ reactTag: NSNumber, _ rnMessage: String, _ reset: Bool) {
|
|
137
|
+
exitSheet(rnMessage)
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
@objc
|
|
141
|
+
private func notifyWidgetPaymentResult(_ rootTag: NSNumber, _ rnMessage: String) {
|
|
142
|
+
let result = paymentResult(from: rnMessage)
|
|
143
|
+
guard case .failed = result else { return }
|
|
144
|
+
withNativePaymentWidgetView(rootTag) { view in
|
|
145
|
+
view.handleConfirmPaymentNotification(result)
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
@objc
|
|
150
|
+
private func onUpdateIntentEvent(_ rootTag: NSNumber, _ type: String, _ result: String) {
|
|
151
|
+
withWidget(rootTag) { widget in
|
|
152
|
+
widget.handleUpdateIntentEvent(type: type, result: result)
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
@objc func emitPaymentEvent(_ rootTag: NSNumber, _ eventType: String, _ payload: NSDictionary) {
|
|
157
|
+
let map = (payload as? [String: Any]) ?? [:]
|
|
158
|
+
resolveSubscribingTarget(rootTag) { target in
|
|
159
|
+
if let widget = target as? PaymentWidget, widget.paymentEventListener != nil {
|
|
160
|
+
widget.dispatchPaymentEvent(type: eventType, payload: map)
|
|
161
|
+
} else if let cvc = target as? CVCWidget, cvc.paymentEventListener != nil {
|
|
162
|
+
cvc.dispatchPaymentEvent(type: eventType, payload: map)
|
|
163
|
+
} else if let sheet = target as? PaymentSheet, sheet.paymentEventListener != nil {
|
|
164
|
+
sheet.dispatchPaymentEvent(type: eventType, payload: map)
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
@objc
|
|
170
|
+
private func exitCardForm(_ rnMessage: String) {
|
|
171
|
+
var response: String?
|
|
172
|
+
var error: NSError?
|
|
173
|
+
|
|
174
|
+
if let data = rnMessage.data(using: .utf8) {
|
|
175
|
+
do {
|
|
176
|
+
if let jsonDictionary = try JSONSerialization.jsonObject(with: data, options: []) as? [String: String] {
|
|
177
|
+
let status = jsonDictionary["status"]
|
|
178
|
+
|
|
179
|
+
if status == "failed" || status == "requires_payment_method" {
|
|
180
|
+
error = NSError(
|
|
181
|
+
domain: (jsonDictionary["code"] ?? "") != "" ? jsonDictionary["code"]! : "UNKNOWN_ERROR",
|
|
182
|
+
code: 0,
|
|
183
|
+
userInfo: ["message": jsonDictionary["message"] ?? "An error has occurred."]
|
|
184
|
+
)
|
|
185
|
+
} else {
|
|
186
|
+
response = status
|
|
187
|
+
}
|
|
188
|
+
RNViewManager.sharedInstance.responseHandler?.didReceiveResponse(response: response, error: error)
|
|
189
|
+
} else {
|
|
190
|
+
RNViewManager.sharedInstance.responseHandler?.didReceiveResponse(
|
|
191
|
+
response: "failed",
|
|
192
|
+
error: NSError(domain: "UNKNOWN_ERROR", code: 0, userInfo: ["message": "An error has occurred."])
|
|
193
|
+
)
|
|
194
|
+
}
|
|
195
|
+
} catch {
|
|
196
|
+
RNViewManager.sharedInstance.responseHandler?.didReceiveResponse(
|
|
197
|
+
response: "failed",
|
|
198
|
+
error: NSError(domain: "UNKNOWN_ERROR", code: 0, userInfo: ["message": "An error has occurred."])
|
|
199
|
+
)
|
|
200
|
+
}
|
|
201
|
+
} else {
|
|
202
|
+
RNViewManager.sharedInstance.responseHandler?.didReceiveResponse(
|
|
203
|
+
response: "failed",
|
|
204
|
+
error: NSError(domain: "UNKNOWN_ERROR", code: 0, userInfo: ["message": "An error has occurred."])
|
|
205
|
+
)
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
@objc
|
|
210
|
+
private func exitSheet(_ rnMessage: String) {
|
|
211
|
+
var response: String?
|
|
212
|
+
var error: NSError?
|
|
213
|
+
|
|
214
|
+
if let data = rnMessage.data(using: .utf8) {
|
|
215
|
+
do {
|
|
216
|
+
if let jsonDictionary = try JSONSerialization.jsonObject(with: data, options: []) as? [String: String] {
|
|
217
|
+
let status = jsonDictionary["status"]
|
|
218
|
+
|
|
219
|
+
if status == "failed" || status == "requires_payment_method" {
|
|
220
|
+
error = NSError(
|
|
221
|
+
domain: (jsonDictionary["code"] ?? "") != "" ? jsonDictionary["code"]! : "UNKNOWN_ERROR",
|
|
222
|
+
code: 0,
|
|
223
|
+
userInfo: ["message": jsonDictionary["message"] ?? "An error has occurred."]
|
|
224
|
+
)
|
|
225
|
+
} else {
|
|
226
|
+
response = status
|
|
227
|
+
}
|
|
228
|
+
RNViewManager.sharedInstance.responseHandler?.didReceiveResponse(response: response, error: error)
|
|
229
|
+
} else {
|
|
230
|
+
RNViewManager.sharedInstance.responseHandler?.didReceiveResponse(
|
|
231
|
+
response: "failed",
|
|
232
|
+
error: NSError(domain: "UNKNOWN_ERROR", code: 0, userInfo: ["message": "An error has occurred."])
|
|
233
|
+
)
|
|
234
|
+
}
|
|
235
|
+
} catch {
|
|
236
|
+
RNViewManager.sharedInstance.responseHandler?.didReceiveResponse(
|
|
237
|
+
response: "failed",
|
|
238
|
+
error: NSError(domain: "UNKNOWN_ERROR", code: 0, userInfo: ["message": "An error has occurred."])
|
|
239
|
+
)
|
|
240
|
+
}
|
|
241
|
+
} else {
|
|
242
|
+
RNViewManager.sharedInstance.responseHandler?.didReceiveResponse(
|
|
243
|
+
response: "failed",
|
|
244
|
+
error: NSError(domain: "UNKNOWN_ERROR", code: 0, userInfo: ["message": "An error has occurred."])
|
|
245
|
+
)
|
|
246
|
+
}
|
|
247
|
+
DispatchQueue.main.async {
|
|
248
|
+
if let view = RNViewManager.sharedInstance.rootView {
|
|
249
|
+
let reactNativeVC: UIViewController? = view.reactViewController()
|
|
250
|
+
reactNativeVC?.dismiss(animated: false, completion: nil)
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
@objc
|
|
256
|
+
private func onPaymentConfirmButtonClick(_ rootTag: NSNumber, _ payload: String, _ callback: @escaping RCTResponseSenderBlock) {
|
|
257
|
+
resolveSubscribingTarget(rootTag) { target in
|
|
258
|
+
if let widget = target as? PaymentWidget {
|
|
259
|
+
widget.handleShouldProceedWithPayment(payload: payload) { shouldProceed in
|
|
260
|
+
callback([shouldProceed])
|
|
261
|
+
}
|
|
262
|
+
} else if let sheet = target as? PaymentSheet {
|
|
263
|
+
sheet.handleShouldProceedWithPayment(payload: payload) { shouldProceed in
|
|
264
|
+
callback([shouldProceed])
|
|
265
|
+
}
|
|
266
|
+
} else {
|
|
267
|
+
callback([true])
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
@objc
|
|
273
|
+
private func openIframeBridge(_ url: String, _ timeoutMs: NSNumber, _ callback: @escaping RCTResponseSenderBlock) {
|
|
274
|
+
DispatchQueue.main.async {
|
|
275
|
+
let headlessWebView = HeadlessWebView(url: url, timeoutMs: timeoutMs, callback: callback)
|
|
276
|
+
headlessWebView.startFlow()
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
private func withWidget(_ rootTag: NSNumber, _ block: @escaping (PaymentWidget) -> Void) {
|
|
281
|
+
RCTGetUIManagerQueue().async {
|
|
282
|
+
self.bridge.uiManager.addUIBlock { _, viewRegistry in
|
|
283
|
+
guard let view = viewRegistry?[rootTag] else { return }
|
|
284
|
+
var current: UIView? = view
|
|
285
|
+
while let v = current {
|
|
286
|
+
if let widget = v as? PaymentWidget {
|
|
287
|
+
block(widget)
|
|
288
|
+
return
|
|
289
|
+
}
|
|
290
|
+
current = v.superview
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
private func withNativePaymentWidgetView(_ rootTag: NSNumber, _ block: @escaping (NativePaymentWidgetView) -> Void) {
|
|
297
|
+
RCTGetUIManagerQueue().async {
|
|
298
|
+
self.bridge.uiManager.addUIBlock { _, viewRegistry in
|
|
299
|
+
guard let view = viewRegistry?[rootTag] else { return }
|
|
300
|
+
var current: UIView? = view
|
|
301
|
+
while let v = current {
|
|
302
|
+
if let nativeWidget = v as? NativePaymentWidgetView {
|
|
303
|
+
block(nativeWidget)
|
|
304
|
+
return
|
|
305
|
+
}
|
|
306
|
+
current = v.superview
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
private func resolveSubscribingTarget(_ rootTag: NSNumber, _ block: @escaping (AnyObject?) -> Void) {
|
|
313
|
+
RCTGetUIManagerQueue().async {
|
|
314
|
+
self.bridge.uiManager.addUIBlock { _, viewRegistry in
|
|
315
|
+
guard let view = viewRegistry?[rootTag] else {
|
|
316
|
+
DispatchQueue.main.async { block(nil) }
|
|
317
|
+
return
|
|
318
|
+
}
|
|
319
|
+
var current: UIView? = view
|
|
320
|
+
while let v = current {
|
|
321
|
+
if v is PaymentWidget || v is CVCWidget {
|
|
322
|
+
DispatchQueue.main.async { block(v) }
|
|
323
|
+
return
|
|
324
|
+
}
|
|
325
|
+
current = v.superview
|
|
326
|
+
}
|
|
327
|
+
let sheet = (view.reactViewController() as? HyperUIViewController)?.paymentSheet
|
|
328
|
+
DispatchQueue.main.async { block(sheet) }
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
private func withPaymentSheet(_ rootTag: NSNumber, _ block: @escaping (UIViewController?, PaymentSheet?) -> Void) {
|
|
334
|
+
RCTGetUIManagerQueue().async {
|
|
335
|
+
self.bridge.uiManager.addUIBlock { _, viewRegistry in
|
|
336
|
+
let view = viewRegistry?[rootTag]
|
|
337
|
+
let vc = view?.reactViewController() as? HyperUIViewController
|
|
338
|
+
let sheet = vc?.paymentSheet
|
|
339
|
+
DispatchQueue.main.async { block(vc, sheet) }
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
//
|
|
2
|
+
// OTAServices.swift
|
|
3
|
+
// hyperswitch
|
|
4
|
+
//
|
|
5
|
+
// Created by Kuntimaddi Manideep on 24/01/25.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
#if canImport(HyperOTA)
|
|
9
|
+
import HyperOTA
|
|
10
|
+
import Foundation
|
|
11
|
+
|
|
12
|
+
private func getHyperOTAPlist(_ key: String) -> String? {
|
|
13
|
+
guard let path = Bundle(for: RNViewManager.self).path(forResource: "HyperOTA", ofType: "plist"),
|
|
14
|
+
let dict = NSDictionary(contentsOfFile: path),
|
|
15
|
+
let value = dict[key] as? String, !value.isEmpty
|
|
16
|
+
else {
|
|
17
|
+
return nil
|
|
18
|
+
}
|
|
19
|
+
return value
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
internal class EventLogger: NSObject, HPJPLoggerDelegate {
|
|
23
|
+
private func isJSONSerializable(_ value: Any) -> Bool {
|
|
24
|
+
return JSONSerialization.isValidJSONObject(["key": value])
|
|
25
|
+
}
|
|
26
|
+
internal func addLog(eventData: [String: Any], logLevel: String, key: String?) {
|
|
27
|
+
do {
|
|
28
|
+
let jsonData = try JSONSerialization.data(withJSONObject: eventData, options: [])
|
|
29
|
+
guard let jsonString = String(data: jsonData, encoding: .utf8) else {
|
|
30
|
+
print("Error: JSON data encoding failed.")
|
|
31
|
+
return
|
|
32
|
+
}
|
|
33
|
+
var log = LogBuilder()
|
|
34
|
+
.setLogType(logLevel)
|
|
35
|
+
.setValue(jsonString)
|
|
36
|
+
|
|
37
|
+
switch key {
|
|
38
|
+
case "init_with_local_config_versions":
|
|
39
|
+
log = log.setEventName(.hyperOTAInit)
|
|
40
|
+
break
|
|
41
|
+
case "init":
|
|
42
|
+
log = log.setEventName(.hyperOTAInit)
|
|
43
|
+
break
|
|
44
|
+
case "update_end":
|
|
45
|
+
log = log.setEventName(.hyperOTAFinish)
|
|
46
|
+
case "end":
|
|
47
|
+
log = log.setEventName(.hyperOTAFinish)
|
|
48
|
+
break
|
|
49
|
+
default:
|
|
50
|
+
log = log.setEventName(.hyperOTAEvent)
|
|
51
|
+
}
|
|
52
|
+
LogManager.addLog(log.build())
|
|
53
|
+
|
|
54
|
+
} catch {
|
|
55
|
+
print("Error serializing event data: \(error.localizedDescription)")
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
func trackEvent(
|
|
59
|
+
withLevel logLevel: String,
|
|
60
|
+
label eventLabel: String,
|
|
61
|
+
key eventKey: String? = nil,
|
|
62
|
+
value eventValue: Any,
|
|
63
|
+
category eventCategory: String,
|
|
64
|
+
subcategory eventSubcategory: String
|
|
65
|
+
) {
|
|
66
|
+
let eventData: [String: Any] = [
|
|
67
|
+
"label": eventLabel,
|
|
68
|
+
"value": isJSONSerializable(eventValue) ? eventValue : String(describing: eventValue),
|
|
69
|
+
"key": eventKey ?? "",
|
|
70
|
+
"category": eventCategory,
|
|
71
|
+
"subcategory": eventSubcategory,
|
|
72
|
+
]
|
|
73
|
+
addLog(eventData: eventData, logLevel: logLevel, key: eventKey)
|
|
74
|
+
}
|
|
75
|
+
func trackEvent(
|
|
76
|
+
withLevel logLevel: String,
|
|
77
|
+
label eventLabel: String,
|
|
78
|
+
value eventValue: Any,
|
|
79
|
+
category eventCategory: String,
|
|
80
|
+
subcategory eventSubcategory: String
|
|
81
|
+
) {
|
|
82
|
+
let eventData: [String: Any] = [
|
|
83
|
+
"label": eventLabel,
|
|
84
|
+
"value": isJSONSerializable(eventValue) ? eventValue : String(describing: eventValue),
|
|
85
|
+
"category": eventCategory,
|
|
86
|
+
"subcategory": eventSubcategory,
|
|
87
|
+
]
|
|
88
|
+
addLog(eventData: eventData, logLevel: logLevel, key: eventLabel)
|
|
89
|
+
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
public final class OTAServices {
|
|
94
|
+
public static var shared = OTAServices()
|
|
95
|
+
public var otaServices: HyperOTAServices? = nil
|
|
96
|
+
let logger = EventLogger()
|
|
97
|
+
public func initialize(publishableKey: String) {
|
|
98
|
+
if self.otaServices == nil {
|
|
99
|
+
let environment = SDKEnvironment.getEnvironment(publishableKey)
|
|
100
|
+
let configKey = (environment == .SANDBOX) ? "sandBoxReleaseConfigURL" : "releaseConfigURL"
|
|
101
|
+
let payload =
|
|
102
|
+
[
|
|
103
|
+
"clientId": getHyperOTAPlist("clientId") ?? "",
|
|
104
|
+
"namespace": getHyperOTAPlist("namespace") ?? "",
|
|
105
|
+
"forceUpdate": true,
|
|
106
|
+
"localAssets": (getHyperOTAPlist(configKey) ?? "releaseConfigURL") == "releaseConfigURL",
|
|
107
|
+
"fileName": getHyperOTAPlist("fileName") ?? "",
|
|
108
|
+
"releaseConfigURL": (getHyperOTAPlist(configKey) ?? "") + "/mobile-ota/ios/" + SDKVersion.current + "/config.json",
|
|
109
|
+
] as [String: Any]
|
|
110
|
+
self.otaServices = HyperOTAServices(payload: payload, loggerDelegate: logger, baseBundle: Bundle(for: OTAServices.self))
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
public func getBundleURL() -> URL? {
|
|
114
|
+
return otaServices?.bundleURL() ?? Bundle(for: OTAServices.self).url(forResource: "hyperswitch", withExtension: "bundle")
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
#endif
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
//
|
|
2
|
+
// RNHeadlessManager.swift
|
|
3
|
+
// Hyperswitch
|
|
4
|
+
//
|
|
5
|
+
// Created by Shivam Shashank on 09/11/22.
|
|
6
|
+
//
|
|
7
|
+
|
|
8
|
+
import Foundation
|
|
9
|
+
import React
|
|
10
|
+
|
|
11
|
+
internal class RNHeadlessManager: NSObject {
|
|
12
|
+
|
|
13
|
+
internal var responseHandler: RNResponseHandler?
|
|
14
|
+
internal var rootView: RCTRootView?
|
|
15
|
+
|
|
16
|
+
internal lazy var bridgeHeadless: RCTBridge = {
|
|
17
|
+
RCTBridge.init(delegate: self, launchOptions: nil)
|
|
18
|
+
}()
|
|
19
|
+
|
|
20
|
+
internal static let sharedInstance = RNHeadlessManager()
|
|
21
|
+
|
|
22
|
+
internal func viewForModule(_ moduleName: String, initialProperties: [String: Any]?) -> RCTRootView {
|
|
23
|
+
let rootView: RCTRootView = RCTRootView(
|
|
24
|
+
bridge: self.bridgeHeadless,
|
|
25
|
+
moduleName: moduleName,
|
|
26
|
+
initialProperties: initialProperties
|
|
27
|
+
)
|
|
28
|
+
self.rootView = rootView
|
|
29
|
+
return rootView
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
internal func reinvalidateBridge() {
|
|
33
|
+
self.bridgeHeadless.invalidate()
|
|
34
|
+
self.bridgeHeadless = RCTBridge.init(delegate: self, launchOptions: nil)
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
extension RNHeadlessManager: RCTBridgeDelegate {
|
|
39
|
+
func sourceURL(for bridge: RCTBridge) -> URL? {
|
|
40
|
+
switch Helper.getInfoPlist("HyperswitchSource") {
|
|
41
|
+
case "LocalHosted":
|
|
42
|
+
return RCTBundleURLProvider.sharedSettings().jsBundleURL(forBundleRoot: "index")
|
|
43
|
+
default:
|
|
44
|
+
return Bundle(for: RNHeadlessManager.self).url(forResource: "hyperswitch", withExtension: "bundle")
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|