react-native-klarna-inapp-sdk 2.1.12 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/README.md +100 -270
  2. package/android/build.gradle +85 -107
  3. package/android/gradle.properties +7 -0
  4. package/android/src/main/AndroidManifest.xml +2 -1
  5. package/android/src/main/AndroidManifestNew.xml +4 -0
  6. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/KlarnaMobileSDKPackage.java +33 -0
  7. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/ArgumentsUtil.java +62 -0
  8. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/WebViewResizeObserver.java +100 -0
  9. package/android/src/main/java/com/klarna/{inapp/sdk → mobile/sdk/reactnative/payments}/KlarnaPaymentEvent.java +9 -19
  10. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/payments/KlarnaPaymentViewManager.java +346 -0
  11. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/payments/PaymentViewWrapper.java +78 -0
  12. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/standalonewebview/KlarnaStandaloneWebViewEvent.java +67 -0
  13. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/standalonewebview/KlarnaStandaloneWebViewEventSender.java +139 -0
  14. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/standalonewebview/KlarnaStandaloneWebViewManager.java +205 -0
  15. package/android/src/newarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaPaymentViewSpec.java +32 -0
  16. package/android/src/newarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaStandaloneWebViewSpec.java +33 -0
  17. package/android/src/oldarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaPaymentViewSpec.java +25 -0
  18. package/android/src/oldarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaStandaloneWebViewSpec.java +19 -0
  19. package/android/src/test/java/com/klarna/{inapp/sdk/KlarnaPaymentViewPackageTest.java → mobile/sdk/reactnative/KlarnaMobileSDKPackageTest.java} +9 -4
  20. package/android/src/test/java/com/klarna/{inapp/sdk → mobile/sdk/reactnative/payments}/KlarnaPaymentEventTest.java +17 -20
  21. package/android/src/test/java/com/klarna/{inapp/sdk → mobile/sdk/reactnative/payments}/KlarnaPaymentViewManagerTest.java +72 -29
  22. package/ios/{KlarnaInAppSDK.xcodeproj → RNKlarnaMobileSDK.xcodeproj}/project.pbxproj +147 -87
  23. package/ios/{KlarnaInAppSDK.xcodeproj/xcshareddata/xcschemes/KlarnaInAppSDK.xcscheme → RNKlarnaMobileSDK.xcodeproj/xcshareddata/xcschemes/RNKlarnaMobileSDK.xcscheme} +9 -9
  24. package/ios/{KlarnaInAppSDK.xcodeproj/xcshareddata/xcschemes/KlarnaInAppSDKTests.xcscheme → RNKlarnaMobileSDK.xcodeproj/xcshareddata/xcschemes/RNKlarnaMobileSDKTests.xcscheme} +3 -3
  25. package/ios/Sources/KlarnaPaymentViewManager.h +5 -0
  26. package/ios/Sources/{KlarnaPaymentView.m → KlarnaPaymentViewManager.mm} +10 -15
  27. package/ios/Sources/KlarnaStandaloneWebViewManager.h +5 -0
  28. package/ios/Sources/KlarnaStandaloneWebViewManager.mm +77 -0
  29. package/ios/Sources/view/newarch/KlarnaStandaloneWebViewWrapper.h +29 -0
  30. package/ios/Sources/view/newarch/KlarnaStandaloneWebViewWrapper.mm +265 -0
  31. package/ios/Sources/view/newarch/PaymentViewWrapper.h +33 -0
  32. package/ios/Sources/view/newarch/PaymentViewWrapper.mm +240 -0
  33. package/ios/Sources/view/oldarch/KlarnaStandaloneWebViewWrapper.h +42 -0
  34. package/ios/Sources/view/oldarch/KlarnaStandaloneWebViewWrapper.mm +195 -0
  35. package/ios/Sources/view/{PaymentViewWrapper.h → oldarch/PaymentViewWrapper.h} +9 -7
  36. package/ios/Sources/view/{PaymentViewWrapper.m → oldarch/PaymentViewWrapper.mm} +40 -27
  37. package/ios/Tests/PaymentViewWrapperTests.m +8 -10
  38. package/lib/commonjs/KlarnaPaymentView.js +192 -0
  39. package/lib/commonjs/KlarnaPaymentView.js.map +1 -0
  40. package/lib/commonjs/KlarnaStandaloneWebView.js +81 -0
  41. package/lib/commonjs/KlarnaStandaloneWebView.js.map +1 -0
  42. package/lib/commonjs/index.js +28 -0
  43. package/lib/commonjs/index.js.map +1 -0
  44. package/lib/commonjs/specs/KlarnaPaymentViewNativeComponent.js +16 -0
  45. package/lib/commonjs/specs/KlarnaPaymentViewNativeComponent.js.map +1 -0
  46. package/lib/commonjs/specs/KlarnaStandaloneWebViewNativeComponent.js +16 -0
  47. package/lib/commonjs/specs/KlarnaStandaloneWebViewNativeComponent.js.map +1 -0
  48. package/lib/module/KlarnaPaymentView.js +182 -0
  49. package/lib/module/KlarnaPaymentView.js.map +1 -0
  50. package/lib/module/KlarnaStandaloneWebView.js +71 -0
  51. package/lib/module/KlarnaStandaloneWebView.js.map +1 -0
  52. package/lib/module/index.js +3 -0
  53. package/lib/module/index.js.map +1 -0
  54. package/lib/module/specs/KlarnaPaymentViewNativeComponent.js +7 -0
  55. package/lib/module/specs/KlarnaPaymentViewNativeComponent.js.map +1 -0
  56. package/lib/module/specs/KlarnaStandaloneWebViewNativeComponent.js +7 -0
  57. package/lib/module/specs/KlarnaStandaloneWebViewNativeComponent.js.map +1 -0
  58. package/lib/typescript/KlarnaPaymentView.d.ts +51 -0
  59. package/lib/typescript/KlarnaPaymentView.d.ts.map +1 -0
  60. package/lib/typescript/KlarnaStandaloneWebView.d.ts +46 -0
  61. package/lib/typescript/KlarnaStandaloneWebView.d.ts.map +1 -0
  62. package/lib/typescript/index.d.ts +3 -0
  63. package/lib/typescript/index.d.ts.map +1 -0
  64. package/lib/typescript/specs/KlarnaPaymentViewNativeComponent.d.ts +49 -0
  65. package/lib/typescript/specs/KlarnaPaymentViewNativeComponent.d.ts.map +1 -0
  66. package/lib/typescript/specs/KlarnaStandaloneWebViewNativeComponent.d.ts +65 -0
  67. package/lib/typescript/specs/KlarnaStandaloneWebViewNativeComponent.d.ts.map +1 -0
  68. package/package.json +92 -16
  69. package/react-native-klarna-inapp-sdk.podspec +32 -13
  70. package/src/KlarnaPaymentView.tsx +323 -0
  71. package/src/KlarnaStandaloneWebView.tsx +217 -0
  72. package/src/index.tsx +2 -0
  73. package/src/specs/KlarnaPaymentViewNativeComponent.ts +99 -0
  74. package/src/specs/KlarnaStandaloneWebViewNativeComponent.ts +96 -0
  75. package/.gitattributes +0 -3
  76. package/CHANGELOG.md +0 -111
  77. package/android/README.md +0 -14
  78. package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  79. package/android/gradle/wrapper/gradle-wrapper.properties +0 -6
  80. package/android/gradlew +0 -172
  81. package/android/gradlew.bat +0 -84
  82. package/android/src/main/java/com/klarna/inapp/sdk/HeightListener.java +0 -159
  83. package/android/src/main/java/com/klarna/inapp/sdk/KlarnaPaymentViewManager.java +0 -282
  84. package/android/src/main/java/com/klarna/inapp/sdk/KlarnaPaymentViewPackage.java +0 -25
  85. package/android/src/main/java/com/klarna/inapp/sdk/Mappable.java +0 -10
  86. package/android/src/main/java/com/klarna/inapp/sdk/MappableKlarnaPaymentsSDKError.java +0 -31
  87. package/android/src/main/java/com/klarna/inapp/sdk/PaymentViewWrapper.java +0 -131
  88. package/android/src/test/java/com/klarna/inapp/sdk/MappableKlarnaPaymentsSDKErrorTest.java +0 -45
  89. package/index.js +0 -72
  90. package/integration-tests/build.gradle +0 -59
  91. package/integration-tests/gradle/wrapper/gradle-wrapper.jar +0 -0
  92. package/integration-tests/gradle/wrapper/gradle-wrapper.properties +0 -6
  93. package/integration-tests/gradlew +0 -172
  94. package/integration-tests/gradlew.bat +0 -84
  95. package/integration-tests/settings.gradle +0 -2
  96. package/integration-tests/src/test/resources/junit-platform.properties +0 -4
  97. package/ios/KlarnaInAppSDK.xcworkspace/contents.xcworkspacedata +0 -10
  98. package/ios/KlarnaInAppSDK.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  99. package/ios/Podfile +0 -73
  100. package/ios/Sources/KlarnaPaymentView.h +0 -5
  101. package/scripts/examples_postinstall.js +0 -111
@@ -1,18 +1,22 @@
1
- #import "KlarnaPaymentView.h"
1
+ #import "KlarnaPaymentViewManager.h"
2
2
 
3
3
  #import <React/RCTUIManager.h>
4
4
  #import <React/RCTLog.h>
5
5
 
6
- #import "view/PaymentViewWrapper.h"
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
- @implementation KlarnaPaymentView
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,5 @@
1
+ #import <React/RCTViewManager.h>
2
+
3
+ @interface KlarnaStandaloneWebViewManager : RCTViewManager
4
+
5
+ @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