react-native-klarna-inapp-sdk 2.1.13 → 2.2.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 +100 -270
- package/android/build.gradle +84 -106
- package/android/gradle.properties +7 -0
- package/android/src/main/AndroidManifest.xml +2 -1
- package/android/src/main/AndroidManifestNew.xml +4 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/KlarnaMobileSDKPackage.java +33 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/ArgumentsUtil.java +62 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/WebViewResizeObserver.java +100 -0
- package/android/src/main/java/com/klarna/{inapp/sdk → mobile/sdk/reactnative/payments}/KlarnaPaymentEvent.java +9 -19
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/payments/KlarnaPaymentViewManager.java +343 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/payments/PaymentViewWrapper.java +78 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/standalonewebview/KlarnaStandaloneWebViewEvent.java +67 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/standalonewebview/KlarnaStandaloneWebViewEventSender.java +139 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/standalonewebview/KlarnaStandaloneWebViewManager.java +205 -0
- package/android/src/newarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaPaymentViewSpec.java +32 -0
- package/android/src/newarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaStandaloneWebViewSpec.java +33 -0
- package/android/src/oldarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaPaymentViewSpec.java +25 -0
- package/android/src/oldarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaStandaloneWebViewSpec.java +19 -0
- package/android/src/test/java/com/klarna/{inapp/sdk/KlarnaPaymentViewPackageTest.java → mobile/sdk/reactnative/KlarnaMobileSDKPackageTest.java} +9 -4
- package/android/src/test/java/com/klarna/{inapp/sdk → mobile/sdk/reactnative/payments}/KlarnaPaymentEventTest.java +17 -20
- package/android/src/test/java/com/klarna/{inapp/sdk → mobile/sdk/reactnative/payments}/KlarnaPaymentViewManagerTest.java +62 -36
- package/ios/{KlarnaInAppSDK.xcodeproj → RNKlarnaMobileSDK.xcodeproj}/project.pbxproj +147 -87
- package/ios/{KlarnaInAppSDK.xcodeproj/xcshareddata/xcschemes/KlarnaInAppSDK.xcscheme → RNKlarnaMobileSDK.xcodeproj/xcshareddata/xcschemes/RNKlarnaMobileSDK.xcscheme} +9 -9
- package/ios/{KlarnaInAppSDK.xcodeproj/xcshareddata/xcschemes/KlarnaInAppSDKTests.xcscheme → RNKlarnaMobileSDK.xcodeproj/xcshareddata/xcschemes/RNKlarnaMobileSDKTests.xcscheme} +3 -3
- package/ios/Sources/KlarnaPaymentViewManager.h +5 -0
- package/ios/Sources/{KlarnaPaymentView.m → KlarnaPaymentViewManager.mm} +10 -15
- package/ios/Sources/KlarnaStandaloneWebViewManager.h +5 -0
- package/ios/Sources/KlarnaStandaloneWebViewManager.mm +77 -0
- package/ios/Sources/view/newarch/KlarnaStandaloneWebViewWrapper.h +29 -0
- package/ios/Sources/view/newarch/KlarnaStandaloneWebViewWrapper.mm +265 -0
- package/ios/Sources/view/newarch/PaymentViewWrapper.h +33 -0
- package/ios/Sources/view/newarch/PaymentViewWrapper.mm +240 -0
- package/ios/Sources/view/oldarch/KlarnaStandaloneWebViewWrapper.h +42 -0
- package/ios/Sources/view/oldarch/KlarnaStandaloneWebViewWrapper.mm +195 -0
- package/ios/Sources/view/{PaymentViewWrapper.h → oldarch/PaymentViewWrapper.h} +9 -7
- package/ios/Sources/view/{PaymentViewWrapper.m → oldarch/PaymentViewWrapper.mm} +40 -27
- package/ios/Tests/PaymentViewWrapperTests.m +8 -10
- package/lib/commonjs/KlarnaPaymentView.js +192 -0
- package/lib/commonjs/KlarnaPaymentView.js.map +1 -0
- package/lib/commonjs/KlarnaStandaloneWebView.js +81 -0
- package/lib/commonjs/KlarnaStandaloneWebView.js.map +1 -0
- package/lib/commonjs/index.js +28 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/specs/KlarnaPaymentViewNativeComponent.js +16 -0
- package/lib/commonjs/specs/KlarnaPaymentViewNativeComponent.js.map +1 -0
- package/lib/commonjs/specs/KlarnaStandaloneWebViewNativeComponent.js +16 -0
- package/lib/commonjs/specs/KlarnaStandaloneWebViewNativeComponent.js.map +1 -0
- package/lib/module/KlarnaPaymentView.js +182 -0
- package/lib/module/KlarnaPaymentView.js.map +1 -0
- package/lib/module/KlarnaStandaloneWebView.js +71 -0
- package/lib/module/KlarnaStandaloneWebView.js.map +1 -0
- package/lib/module/index.js +3 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/specs/KlarnaPaymentViewNativeComponent.js +7 -0
- package/lib/module/specs/KlarnaPaymentViewNativeComponent.js.map +1 -0
- package/lib/module/specs/KlarnaStandaloneWebViewNativeComponent.js +7 -0
- package/lib/module/specs/KlarnaStandaloneWebViewNativeComponent.js.map +1 -0
- package/lib/typescript/KlarnaPaymentView.d.ts +51 -0
- package/lib/typescript/KlarnaPaymentView.d.ts.map +1 -0
- package/lib/typescript/KlarnaStandaloneWebView.d.ts +46 -0
- package/lib/typescript/KlarnaStandaloneWebView.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +3 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/specs/KlarnaPaymentViewNativeComponent.d.ts +49 -0
- package/lib/typescript/specs/KlarnaPaymentViewNativeComponent.d.ts.map +1 -0
- package/lib/typescript/specs/KlarnaStandaloneWebViewNativeComponent.d.ts +65 -0
- package/lib/typescript/specs/KlarnaStandaloneWebViewNativeComponent.d.ts.map +1 -0
- package/package.json +86 -14
- package/react-native-klarna-inapp-sdk.podspec +32 -13
- package/src/KlarnaPaymentView.tsx +323 -0
- package/src/KlarnaStandaloneWebView.tsx +217 -0
- package/src/index.tsx +2 -0
- package/src/specs/KlarnaPaymentViewNativeComponent.ts +99 -0
- package/src/specs/KlarnaStandaloneWebViewNativeComponent.ts +96 -0
- package/.gitattributes +0 -3
- package/.watchmanconfig +0 -1
- package/.yarnrc +0 -5
- package/CHANGELOG.md +0 -116
- package/android/README.md +0 -14
- package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/android/gradle/wrapper/gradle-wrapper.properties +0 -6
- package/android/gradlew +0 -172
- package/android/gradlew.bat +0 -84
- package/android/src/main/java/com/klarna/inapp/sdk/HeightListener.java +0 -159
- package/android/src/main/java/com/klarna/inapp/sdk/KlarnaPaymentViewManager.java +0 -282
- package/android/src/main/java/com/klarna/inapp/sdk/KlarnaPaymentViewPackage.java +0 -25
- package/android/src/main/java/com/klarna/inapp/sdk/Mappable.java +0 -10
- package/android/src/main/java/com/klarna/inapp/sdk/MappableKlarnaPaymentsSDKError.java +0 -31
- package/android/src/main/java/com/klarna/inapp/sdk/PaymentViewWrapper.java +0 -131
- package/android/src/test/java/com/klarna/inapp/sdk/MappableKlarnaPaymentsSDKErrorTest.java +0 -45
- package/babel.config.js +0 -3
- package/integration-tests/build.gradle +0 -59
- package/integration-tests/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/integration-tests/gradle/wrapper/gradle-wrapper.properties +0 -6
- package/integration-tests/gradlew +0 -172
- package/integration-tests/gradlew.bat +0 -84
- package/integration-tests/settings.gradle +0 -2
- package/integration-tests/src/test/resources/junit-platform.properties +0 -4
- package/ios/KlarnaInAppSDK.xcworkspace/contents.xcworkspacedata +0 -10
- package/ios/KlarnaInAppSDK.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
- package/ios/Podfile +0 -73
- package/ios/Sources/KlarnaPaymentView.h +0 -5
- package/scripts/bootstrap.js +0 -29
- package/src/index.js +0 -72
|
@@ -1,18 +1,22 @@
|
|
|
1
|
-
#import "
|
|
1
|
+
#import "KlarnaPaymentViewManager.h"
|
|
2
2
|
|
|
3
3
|
#import <React/RCTUIManager.h>
|
|
4
4
|
#import <React/RCTLog.h>
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
#ifdef RCT_NEW_ARCH_ENABLED
|
|
7
|
+
#import "view/newarch/PaymentViewWrapper.h"
|
|
8
|
+
#else
|
|
9
|
+
#import "view/oldarch/PaymentViewWrapper.h"
|
|
10
|
+
#endif
|
|
7
11
|
|
|
12
|
+
@implementation KlarnaPaymentViewManager
|
|
8
13
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
RCT_EXPORT_MODULE()
|
|
14
|
+
RCT_EXPORT_MODULE(RNKlarnaPaymentView)
|
|
12
15
|
|
|
13
16
|
#pragma mark - View
|
|
14
17
|
|
|
15
18
|
RCT_EXPORT_VIEW_PROPERTY(category, NSString)
|
|
19
|
+
RCT_EXPORT_VIEW_PROPERTY(returnUrl, NSString)
|
|
16
20
|
RCT_EXPORT_VIEW_PROPERTY(onInitialized, RCTDirectEventBlock)
|
|
17
21
|
RCT_EXPORT_VIEW_PROPERTY(onLoaded, RCTDirectEventBlock)
|
|
18
22
|
RCT_EXPORT_VIEW_PROPERTY(onLoadedPaymentReview, RCTDirectEventBlock)
|
|
@@ -20,6 +24,7 @@ RCT_EXPORT_VIEW_PROPERTY(onAuthorized, RCTDirectEventBlock)
|
|
|
20
24
|
RCT_EXPORT_VIEW_PROPERTY(onReauthorized, RCTDirectEventBlock)
|
|
21
25
|
RCT_EXPORT_VIEW_PROPERTY(onFinalized, RCTDirectEventBlock)
|
|
22
26
|
RCT_EXPORT_VIEW_PROPERTY(onError, RCTDirectEventBlock)
|
|
27
|
+
RCT_EXPORT_VIEW_PROPERTY(onResized, RCTDirectEventBlock)
|
|
23
28
|
|
|
24
29
|
- (UIView *)view
|
|
25
30
|
{
|
|
@@ -31,7 +36,6 @@ RCT_EXPORT_VIEW_PROPERTY(onError, RCTDirectEventBlock)
|
|
|
31
36
|
#pragma mark - Exported Methods
|
|
32
37
|
|
|
33
38
|
RCT_EXPORT_METHOD(initialize:(nonnull NSNumber*)reactTag clientToken:(NSString*)clientToken returnUrl:(NSString*)returnUrl) {
|
|
34
|
-
|
|
35
39
|
[self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *,UIView *> *viewRegistry) {
|
|
36
40
|
PaymentViewWrapper* view = (PaymentViewWrapper*) viewRegistry[reactTag];
|
|
37
41
|
if (!view || ![view isKindOfClass:PaymentViewWrapper.class]) {
|
|
@@ -40,12 +44,9 @@ RCT_EXPORT_METHOD(initialize:(nonnull NSNumber*)reactTag clientToken:(NSString*)
|
|
|
40
44
|
}
|
|
41
45
|
[view initializePaymentViewWithClientToken:clientToken withReturnUrl:returnUrl];
|
|
42
46
|
}];
|
|
43
|
-
|
|
44
|
-
|
|
45
47
|
}
|
|
46
48
|
|
|
47
49
|
RCT_EXPORT_METHOD(load:(nonnull NSNumber*)reactTag sessionData:(nullable NSString*)sessionData) {
|
|
48
|
-
|
|
49
50
|
[self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *,UIView *> *viewRegistry) {
|
|
50
51
|
PaymentViewWrapper* view = (PaymentViewWrapper*) viewRegistry[reactTag];
|
|
51
52
|
if (!view || ![view isKindOfClass:PaymentViewWrapper.class]) {
|
|
@@ -57,7 +58,6 @@ RCT_EXPORT_METHOD(load:(nonnull NSNumber*)reactTag sessionData:(nullable NSStrin
|
|
|
57
58
|
}
|
|
58
59
|
|
|
59
60
|
RCT_EXPORT_METHOD(loadPaymentReview:(nonnull NSNumber*)reactTag) {
|
|
60
|
-
|
|
61
61
|
[self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *,UIView *> *viewRegistry) {
|
|
62
62
|
PaymentViewWrapper* view = (PaymentViewWrapper*) viewRegistry[reactTag];
|
|
63
63
|
if (!view || ![view isKindOfClass:PaymentViewWrapper.class]) {
|
|
@@ -69,7 +69,6 @@ RCT_EXPORT_METHOD(loadPaymentReview:(nonnull NSNumber*)reactTag) {
|
|
|
69
69
|
}
|
|
70
70
|
|
|
71
71
|
RCT_EXPORT_METHOD(authorize:(nonnull NSNumber*)reactTag autoFinalize:(BOOL)autoFinalize sessionData:(nullable NSString*)sessionData) {
|
|
72
|
-
|
|
73
72
|
[self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *,UIView *> *viewRegistry) {
|
|
74
73
|
PaymentViewWrapper* view = (PaymentViewWrapper*) viewRegistry[reactTag];
|
|
75
74
|
if (!view || ![view isKindOfClass:PaymentViewWrapper.class]) {
|
|
@@ -81,7 +80,6 @@ RCT_EXPORT_METHOD(authorize:(nonnull NSNumber*)reactTag autoFinalize:(BOOL)autoF
|
|
|
81
80
|
}
|
|
82
81
|
|
|
83
82
|
RCT_EXPORT_METHOD(reauthorize:(nonnull NSNumber*)reactTag sessionData:(nullable NSString*)sessionData) {
|
|
84
|
-
|
|
85
83
|
[self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *,UIView *> *viewRegistry) {
|
|
86
84
|
PaymentViewWrapper* view = (PaymentViewWrapper*) viewRegistry[reactTag];
|
|
87
85
|
if (!view || ![view isKindOfClass:PaymentViewWrapper.class]) {
|
|
@@ -93,7 +91,6 @@ RCT_EXPORT_METHOD(reauthorize:(nonnull NSNumber*)reactTag sessionData:(nullable
|
|
|
93
91
|
}
|
|
94
92
|
|
|
95
93
|
RCT_EXPORT_METHOD(finalize:(nonnull NSNumber*)reactTag sessionData:(nullable NSString*)sessionData) {
|
|
96
|
-
|
|
97
94
|
[self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *,UIView *> *viewRegistry) {
|
|
98
95
|
PaymentViewWrapper* view = (PaymentViewWrapper*) viewRegistry[reactTag];
|
|
99
96
|
if (!view || ![view isKindOfClass:PaymentViewWrapper.class]) {
|
|
@@ -102,8 +99,6 @@ RCT_EXPORT_METHOD(finalize:(nonnull NSNumber*)reactTag sessionData:(nullable NSS
|
|
|
102
99
|
}
|
|
103
100
|
[view finalizePaymentViewWithSessionData:sessionData];
|
|
104
101
|
}];
|
|
105
|
-
|
|
106
|
-
|
|
107
102
|
}
|
|
108
103
|
|
|
109
104
|
@end
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
#import "KlarnaStandaloneWebViewManager.h"
|
|
2
|
+
|
|
3
|
+
#import <React/RCTUIManager.h>
|
|
4
|
+
#import <React/RCTLog.h>
|
|
5
|
+
|
|
6
|
+
#ifdef RCT_NEW_ARCH_ENABLED
|
|
7
|
+
#import "view/newarch/KlarnaStandaloneWebViewWrapper.h"
|
|
8
|
+
#else
|
|
9
|
+
#import "view/oldarch/KlarnaStandaloneWebViewWrapper.h"
|
|
10
|
+
#endif
|
|
11
|
+
|
|
12
|
+
@implementation KlarnaStandaloneWebViewManager
|
|
13
|
+
|
|
14
|
+
RCT_EXPORT_MODULE(RNKlarnaStandaloneWebView)
|
|
15
|
+
|
|
16
|
+
#pragma mark - View
|
|
17
|
+
|
|
18
|
+
RCT_EXPORT_VIEW_PROPERTY(returnUrl, NSString)
|
|
19
|
+
RCT_EXPORT_VIEW_PROPERTY(onLoadStart, RCTDirectEventBlock)
|
|
20
|
+
RCT_EXPORT_VIEW_PROPERTY(onLoadEnd, RCTDirectEventBlock)
|
|
21
|
+
RCT_EXPORT_VIEW_PROPERTY(onError, RCTDirectEventBlock)
|
|
22
|
+
RCT_EXPORT_VIEW_PROPERTY(onLoadProgress, RCTDirectEventBlock)
|
|
23
|
+
RCT_EXPORT_VIEW_PROPERTY(onKlarnaMessage, RCTDirectEventBlock)
|
|
24
|
+
|
|
25
|
+
- (UIView *)view {
|
|
26
|
+
KlarnaStandaloneWebViewWrapper* wrapper = [KlarnaStandaloneWebViewWrapper new];
|
|
27
|
+
wrapper.uiManager = self.bridge.uiManager;
|
|
28
|
+
return wrapper;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
#pragma mark - Exported Methods
|
|
32
|
+
|
|
33
|
+
RCT_EXPORT_METHOD(load:(nonnull NSNumber*)reactTag url:(nonnull NSString*)url) {
|
|
34
|
+
[self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *,UIView *> *viewRegistry) {
|
|
35
|
+
KlarnaStandaloneWebViewWrapper* view = (KlarnaStandaloneWebViewWrapper*) viewRegistry[reactTag];
|
|
36
|
+
if (!view || ![view isKindOfClass:KlarnaStandaloneWebViewWrapper.class]) {
|
|
37
|
+
RCTLogError(@"Can't find KlarnaStandaloneWebViewWrapper with tag #%@", reactTag);
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
[view load:url];
|
|
41
|
+
}];
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
RCT_EXPORT_METHOD(goForward:(nonnull NSNumber*)reactTag) {
|
|
45
|
+
[self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *,UIView *> *viewRegistry) {
|
|
46
|
+
KlarnaStandaloneWebViewWrapper* view = (KlarnaStandaloneWebViewWrapper*) viewRegistry[reactTag];
|
|
47
|
+
if (!view || ![view isKindOfClass:KlarnaStandaloneWebViewWrapper.class]) {
|
|
48
|
+
RCTLogError(@"Can't find KlarnaStandaloneWebViewWrapper with tag #%@", reactTag);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
[view goForward];
|
|
52
|
+
}];
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
RCT_EXPORT_METHOD(goBack:(nonnull NSNumber*)reactTag) {
|
|
56
|
+
[self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *,UIView *> *viewRegistry) {
|
|
57
|
+
KlarnaStandaloneWebViewWrapper* view = (KlarnaStandaloneWebViewWrapper*) viewRegistry[reactTag];
|
|
58
|
+
if (!view || ![view isKindOfClass:KlarnaStandaloneWebViewWrapper.class]) {
|
|
59
|
+
RCTLogError(@"Can't find KlarnaStandaloneWebViewWrapper with tag #%@", reactTag);
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
[view goBack];
|
|
63
|
+
}];
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
RCT_EXPORT_METHOD(reload:(nonnull NSNumber*)reactTag) {
|
|
67
|
+
[self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *,UIView *> *viewRegistry) {
|
|
68
|
+
KlarnaStandaloneWebViewWrapper* view = (KlarnaStandaloneWebViewWrapper*) viewRegistry[reactTag];
|
|
69
|
+
if (!view || ![view isKindOfClass:KlarnaStandaloneWebViewWrapper.class]) {
|
|
70
|
+
RCTLogError(@"Can't find KlarnaStandaloneWebViewWrapper with tag #%@", reactTag);
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
[view reload];
|
|
74
|
+
}];
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
@end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
#if RCT_NEW_ARCH_ENABLED
|
|
2
|
+
|
|
3
|
+
#import <React/RCTUIManager.h>
|
|
4
|
+
#import <React/RCTViewComponentView.h>
|
|
5
|
+
#import <UIKit/UIKit.h>
|
|
6
|
+
|
|
7
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
8
|
+
|
|
9
|
+
@interface KlarnaStandaloneWebViewWrapper : RCTViewComponentView
|
|
10
|
+
|
|
11
|
+
#pragma mark - React Native Overrides
|
|
12
|
+
|
|
13
|
+
@property (nonatomic, weak) RCTUIManager* uiManager;
|
|
14
|
+
|
|
15
|
+
- (void) initializeKlarnaStandaloneWebView:(nonnull NSString*)returnUrl;
|
|
16
|
+
|
|
17
|
+
- (void)load:(nonnull NSString*)url;
|
|
18
|
+
|
|
19
|
+
- (void)goForward;
|
|
20
|
+
|
|
21
|
+
- (void)goBack;
|
|
22
|
+
|
|
23
|
+
- (void)reload;
|
|
24
|
+
|
|
25
|
+
@end
|
|
26
|
+
|
|
27
|
+
NS_ASSUME_NONNULL_END
|
|
28
|
+
|
|
29
|
+
#endif
|
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
#if RCT_NEW_ARCH_ENABLED
|
|
2
|
+
|
|
3
|
+
#import "KlarnaStandaloneWebViewWrapper.h"
|
|
4
|
+
|
|
5
|
+
#import <AVFoundation/AVFoundation.h>
|
|
6
|
+
#import <KlarnaMobileSDK/KlarnaMobileSDK-Swift.h>
|
|
7
|
+
#import <React/RCTLog.h>
|
|
8
|
+
|
|
9
|
+
#import <react/renderer/components/RNKlarnaMobileSDK/ComponentDescriptors.h>
|
|
10
|
+
#import <react/renderer/components/RNKlarnaMobileSDK/EventEmitters.h>
|
|
11
|
+
#import <react/renderer/components/RNKlarnaMobileSDK/Props.h>
|
|
12
|
+
#import <react/renderer/components/RNKlarnaMobileSDK/RCTComponentViewHelpers.h>
|
|
13
|
+
|
|
14
|
+
#import "RCTFabricComponentsPlugins.h"
|
|
15
|
+
|
|
16
|
+
using namespace facebook::react;
|
|
17
|
+
|
|
18
|
+
@interface KlarnaStandaloneWebViewWrapper () <KlarnaStandaloneWebViewDelegate, KlarnaEventHandler, RCTRNKlarnaStandaloneWebViewViewProtocol>
|
|
19
|
+
|
|
20
|
+
@property (nonatomic, strong) KlarnaStandaloneWebView* klarnaStandaloneWebView;
|
|
21
|
+
|
|
22
|
+
@end
|
|
23
|
+
|
|
24
|
+
@implementation KlarnaStandaloneWebViewWrapper
|
|
25
|
+
|
|
26
|
+
// The property name in KlarnaStandaloneWebView that we want to observe for changes
|
|
27
|
+
NSString * const PROPERTY_NAME_ESTIMATED_PROGRESS = @"estimatedProgress";
|
|
28
|
+
|
|
29
|
+
- (id)init {
|
|
30
|
+
self = [super init];
|
|
31
|
+
// TODO: What should we pass here for 'returnUrl'?
|
|
32
|
+
[self initializeKlarnaStandaloneWebView: @"returnUrl://"];
|
|
33
|
+
self.klarnaStandaloneWebView.delegate = self;
|
|
34
|
+
self.klarnaStandaloneWebView.eventHandler = self;
|
|
35
|
+
[self.klarnaStandaloneWebView addObserver:self forKeyPath:PROPERTY_NAME_ESTIMATED_PROGRESS options:NSKeyValueObservingOptionNew context:nil];
|
|
36
|
+
return self;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
-(void)dealloc {
|
|
40
|
+
[self.klarnaStandaloneWebView removeObserver:self forKeyPath:PROPERTY_NAME_ESTIMATED_PROGRESS context:nil];
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
|
|
44
|
+
if ([keyPath isEqualToString:PROPERTY_NAME_ESTIMATED_PROGRESS]) {
|
|
45
|
+
// newProgress is a value in range [0..1].
|
|
46
|
+
NSNumber * newProgress = [change objectForKey:NSKeyValueChangeNewKey];
|
|
47
|
+
// We need to convert it to an int value in range [0..100]
|
|
48
|
+
int progress = [NSNumber numberWithDouble:(newProgress.doubleValue * 100)].intValue;
|
|
49
|
+
[self sendLoadProgressEvent:progress];
|
|
50
|
+
} else {
|
|
51
|
+
[super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
- (void)sendLoadProgressEvent:(int)progress {
|
|
56
|
+
if (_eventEmitter) {
|
|
57
|
+
RCTLogInfo(@"Sending onLoadProgress event");
|
|
58
|
+
NSString * url = self.klarnaStandaloneWebView.url == nil ? @"" : self.klarnaStandaloneWebView.url.absoluteString;
|
|
59
|
+
NSString * title = self.klarnaStandaloneWebView.title == nil ? @"" : self.klarnaStandaloneWebView.title;
|
|
60
|
+
std::dynamic_pointer_cast<const RNKlarnaStandaloneWebViewEventEmitter>(_eventEmitter)
|
|
61
|
+
->onLoadProgress(RNKlarnaStandaloneWebViewEventEmitter::OnLoadProgress{
|
|
62
|
+
.progressEvent = {
|
|
63
|
+
.url = std::string([url UTF8String]),
|
|
64
|
+
.title = std::string([title UTF8String]),
|
|
65
|
+
.loading = self.klarnaStandaloneWebView.isLoading,
|
|
66
|
+
.canGoBack = self.klarnaStandaloneWebView.canGoBack,
|
|
67
|
+
.canGoForward = self.klarnaStandaloneWebView.canGoForward,
|
|
68
|
+
.progress = (double)progress
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
} else {
|
|
72
|
+
RCTLogInfo(@"_eventEmitter is nil!");
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
#pragma mark - React Native Overrides
|
|
77
|
+
|
|
78
|
+
- (void)initializeKlarnaStandaloneWebView:(nonnull NSString*)returnUrl {
|
|
79
|
+
self.klarnaStandaloneWebView = [[KlarnaStandaloneWebView alloc] initWithReturnURL:[NSURL URLWithString:returnUrl]];
|
|
80
|
+
self.klarnaStandaloneWebView.translatesAutoresizingMaskIntoConstraints = NO;
|
|
81
|
+
|
|
82
|
+
[self addSubview:self.klarnaStandaloneWebView];
|
|
83
|
+
|
|
84
|
+
[NSLayoutConstraint activateConstraints:[[NSArray alloc] initWithObjects:
|
|
85
|
+
[self.klarnaStandaloneWebView.topAnchor constraintEqualToAnchor:self.topAnchor],
|
|
86
|
+
[self.klarnaStandaloneWebView.bottomAnchor constraintEqualToAnchor:self.bottomAnchor],
|
|
87
|
+
[self.klarnaStandaloneWebView.leadingAnchor constraintEqualToAnchor:self.leadingAnchor],
|
|
88
|
+
[self.klarnaStandaloneWebView.trailingAnchor constraintEqualToAnchor:self.trailingAnchor], nil
|
|
89
|
+
]];
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
- (void)layoutSubviews {
|
|
93
|
+
[super layoutSubviews];
|
|
94
|
+
self.klarnaStandaloneWebView.frame = self.bounds;
|
|
95
|
+
[self.klarnaStandaloneWebView layoutSubviews];
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
#pragma mark - Klarna Standalone Web View Methods
|
|
99
|
+
|
|
100
|
+
- (instancetype)initWithFrame:(CGRect)frame
|
|
101
|
+
{
|
|
102
|
+
self = [super initWithFrame:frame];
|
|
103
|
+
if (self) {
|
|
104
|
+
static const auto defaultProps = std::make_shared<const RNKlarnaStandaloneWebViewProps>();
|
|
105
|
+
_props = defaultProps;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return self;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
+ (ComponentDescriptorProvider)componentDescriptorProvider
|
|
112
|
+
{
|
|
113
|
+
return concreteComponentDescriptorProvider<RNKlarnaStandaloneWebViewComponentDescriptor>();
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
Class<RCTComponentViewProtocol>RNKlarnaStandaloneWebViewCls(void)
|
|
117
|
+
{
|
|
118
|
+
return KlarnaStandaloneWebViewWrapper.class;
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
- (void)updateProps:(Props::Shared const &)props oldProps:(Props::Shared const &)oldProps
|
|
122
|
+
{
|
|
123
|
+
const auto &oldViewProps = *std::static_pointer_cast<RNKlarnaStandaloneWebViewProps const>(_props);
|
|
124
|
+
const auto &newViewProps = *std::static_pointer_cast<RNKlarnaStandaloneWebViewProps const>(props);
|
|
125
|
+
|
|
126
|
+
if (oldViewProps.returnUrl != newViewProps.returnUrl) {
|
|
127
|
+
NSString * newReturnUrl = [[NSString alloc] initWithUTF8String: newViewProps.returnUrl.c_str()];
|
|
128
|
+
self.klarnaStandaloneWebView.returnURL = [NSURL URLWithString:newReturnUrl];
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
[super updateProps:props oldProps:oldProps];
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
- (void)handleCommand:(const NSString *)commandName args:(const NSArray *)args {
|
|
135
|
+
RCTRNKlarnaStandaloneWebViewHandleCommand(self, commandName, args);
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
#pragma mark - KlarnaStandaloneWebViewDelegate methods
|
|
139
|
+
|
|
140
|
+
- (void)klarnaStandaloneWebView:(KlarnaStandaloneWebView * _Nonnull)webView didCommit:(WKNavigation * _Nonnull)navigation {
|
|
141
|
+
if (_eventEmitter) {
|
|
142
|
+
RCTLogInfo(@"Sending onLoadStart event");
|
|
143
|
+
// 'estimatedProgress' is a double value in range [0..1].
|
|
144
|
+
// We need to convert it to an int value in range [0..100].
|
|
145
|
+
std::dynamic_pointer_cast<const RNKlarnaStandaloneWebViewEventEmitter>(_eventEmitter)
|
|
146
|
+
->onLoadStart(RNKlarnaStandaloneWebViewEventEmitter::OnLoadStart{
|
|
147
|
+
.navigationEvent = {
|
|
148
|
+
.url = std::string([webView.url.absoluteString UTF8String]),
|
|
149
|
+
.title = std::string([webView.title UTF8String]),
|
|
150
|
+
.loading = self.klarnaStandaloneWebView.isLoading,
|
|
151
|
+
.canGoBack = self.klarnaStandaloneWebView.canGoBack,
|
|
152
|
+
.canGoForward = self.klarnaStandaloneWebView.canGoForward,
|
|
153
|
+
}
|
|
154
|
+
});
|
|
155
|
+
} else {
|
|
156
|
+
RCTLogInfo(@"_eventEmitter is nil!");
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
- (void)klarnaStandaloneWebView:(KlarnaStandaloneWebView * _Nonnull)webView didFinish:(WKNavigation * _Nonnull)navigation {
|
|
161
|
+
if (_eventEmitter) {
|
|
162
|
+
RCTLogInfo(@"Sending onLoadEnd event");
|
|
163
|
+
// 'estimatedProgress' is a double value in range [0..1].
|
|
164
|
+
// We need to convert it to an int value in range [0..100].
|
|
165
|
+
std::dynamic_pointer_cast<const RNKlarnaStandaloneWebViewEventEmitter>(_eventEmitter)
|
|
166
|
+
->onLoadEnd(RNKlarnaStandaloneWebViewEventEmitter::OnLoadEnd{
|
|
167
|
+
.navigationEvent = {
|
|
168
|
+
.url = std::string([webView.url.absoluteString UTF8String]),
|
|
169
|
+
.title = std::string([webView.title UTF8String]),
|
|
170
|
+
.loading = self.klarnaStandaloneWebView.isLoading,
|
|
171
|
+
.canGoBack = self.klarnaStandaloneWebView.canGoBack,
|
|
172
|
+
.canGoForward = self.klarnaStandaloneWebView.canGoForward,
|
|
173
|
+
}
|
|
174
|
+
});
|
|
175
|
+
} else {
|
|
176
|
+
RCTLogInfo(@"_eventEmitter is nil!");
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
- (void)klarnaStandaloneWebView:(KlarnaStandaloneWebView * _Nonnull)webView didFailProvisionalNavigation:(WKNavigation * _Nonnull)navigation withError:(NSError * _Nonnull)error {
|
|
181
|
+
if (_eventEmitter) {
|
|
182
|
+
RCTLogInfo(@"Sending onError event");
|
|
183
|
+
std::dynamic_pointer_cast<const RNKlarnaStandaloneWebViewEventEmitter>(_eventEmitter)
|
|
184
|
+
->onError(RNKlarnaStandaloneWebViewEventEmitter::OnError{
|
|
185
|
+
.error = {
|
|
186
|
+
.url = std::string([webView.url.absoluteString UTF8String]),
|
|
187
|
+
.title = std::string([webView.title UTF8String]),
|
|
188
|
+
.loading = self.klarnaStandaloneWebView.isLoading,
|
|
189
|
+
.canGoBack = self.klarnaStandaloneWebView.canGoBack,
|
|
190
|
+
.canGoForward = self.klarnaStandaloneWebView.canGoForward,
|
|
191
|
+
.code = (int)error.code,
|
|
192
|
+
.description = std::string([[error localizedDescription] UTF8String])
|
|
193
|
+
}
|
|
194
|
+
});
|
|
195
|
+
} else {
|
|
196
|
+
RCTLogInfo(@"_eventEmitter is nil!");
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
- (void)klarnaStandaloneWebView:(KlarnaStandaloneWebView * _Nonnull)webView didFail:(WKNavigation * _Nonnull)navigation withError:(NSError * _Nonnull)error {
|
|
201
|
+
if (_eventEmitter) {
|
|
202
|
+
RCTLogInfo(@"Sending onError event");
|
|
203
|
+
std::dynamic_pointer_cast<const RNKlarnaStandaloneWebViewEventEmitter>(_eventEmitter)
|
|
204
|
+
->onError(RNKlarnaStandaloneWebViewEventEmitter::OnError{
|
|
205
|
+
.error = {
|
|
206
|
+
.url = std::string([webView.url.absoluteString UTF8String]),
|
|
207
|
+
.title = std::string([webView.title UTF8String]),
|
|
208
|
+
.loading = self.klarnaStandaloneWebView.isLoading,
|
|
209
|
+
.canGoBack = self.klarnaStandaloneWebView.canGoBack,
|
|
210
|
+
.canGoForward = self.klarnaStandaloneWebView.canGoForward,
|
|
211
|
+
.code = (int)error.code,
|
|
212
|
+
.description = std::string([[error localizedDescription] UTF8String])
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
} else {
|
|
216
|
+
RCTLogInfo(@"_eventEmitter is nil!");
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
#pragma mark - RCTRNKlarnaStandaloneWebViewViewProtocol methods
|
|
221
|
+
|
|
222
|
+
- (void)klarnaComponent:(id <KlarnaComponent> _Nonnull)klarnaComponent dispatchedEvent:(KlarnaProductEvent * _Nonnull)event {
|
|
223
|
+
if (_eventEmitter) {
|
|
224
|
+
RCTLogInfo(@"Sending onKlarnaMessage event");
|
|
225
|
+
std::dynamic_pointer_cast<const RNKlarnaStandaloneWebViewEventEmitter>(_eventEmitter)
|
|
226
|
+
->onKlarnaMessage(RNKlarnaStandaloneWebViewEventEmitter::OnKlarnaMessage{
|
|
227
|
+
.klarnaMessageEvent = {
|
|
228
|
+
.action = std::string([[event action] UTF8String]),
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
} else {
|
|
232
|
+
RCTLogInfo(@"_eventEmitter is nil!");
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
- (void)klarnaComponent:(id <KlarnaComponent> _Nonnull)klarnaComponent encounteredError:(KlarnaError * _Nonnull)error {
|
|
237
|
+
// Not used as of now
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
#pragma mark - RCTRNKlarnaStandaloneWebViewViewProtocol methods
|
|
241
|
+
|
|
242
|
+
- (void)load:(nonnull NSString *)url {
|
|
243
|
+
NSURL *urlToLoad = [NSURL URLWithString:url];
|
|
244
|
+
if ([urlToLoad scheme] && [urlToLoad host] && urlToLoad) {
|
|
245
|
+
[self.klarnaStandaloneWebView loadURL:urlToLoad];
|
|
246
|
+
} else {
|
|
247
|
+
RCTLogInfo(@"url is not a valid URL");
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
- (void)goForward {
|
|
252
|
+
[self.klarnaStandaloneWebView goForward];
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
- (void)goBack {
|
|
256
|
+
[self.klarnaStandaloneWebView goBack];
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
- (void)reload {
|
|
260
|
+
[self.klarnaStandaloneWebView reload];
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
@end
|
|
264
|
+
|
|
265
|
+
#endif
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
#if RCT_NEW_ARCH_ENABLED
|
|
2
|
+
|
|
3
|
+
#import <React/RCTUIManager.h>
|
|
4
|
+
#import <React/RCTViewComponentView.h>
|
|
5
|
+
#import <UIKit/UIKit.h>
|
|
6
|
+
|
|
7
|
+
NS_ASSUME_NONNULL_BEGIN
|
|
8
|
+
|
|
9
|
+
@interface PaymentViewWrapper : RCTViewComponentView
|
|
10
|
+
|
|
11
|
+
#pragma mark - React Native Overrides
|
|
12
|
+
- (void) initializeActualPaymentView:(NSString*)category withReturnUrl:(NSString*)returnUrl;
|
|
13
|
+
|
|
14
|
+
@property (nonatomic, weak) RCTUIManager* uiManager;
|
|
15
|
+
|
|
16
|
+
- (void)initializePaymentViewWithClientToken:(NSString*)clientToken withReturnUrl:(NSString*)returnUrl;
|
|
17
|
+
|
|
18
|
+
- (void)loadPaymentViewWithSessionData:(nullable NSString*)sessionData;
|
|
19
|
+
|
|
20
|
+
- (void)loadPaymentReview;
|
|
21
|
+
|
|
22
|
+
- (void)authorizePaymentViewWithAutoFinalize:(BOOL)autoFinalize sessionData:(nullable NSString*)sessionData;
|
|
23
|
+
|
|
24
|
+
- (void)reauthorizePaymentViewWithSessionData:(nullable NSString*)sessionData;
|
|
25
|
+
|
|
26
|
+
- (void)finalizePaymentViewWithSessionData:(nullable NSString*)sessionData;
|
|
27
|
+
|
|
28
|
+
@end
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
NS_ASSUME_NONNULL_END
|
|
32
|
+
|
|
33
|
+
#endif
|