react-native-klarna-inapp-sdk 2.4.10 → 2.5.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.
Files changed (167) hide show
  1. package/android/build.gradle +3 -1
  2. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/KlarnaMobileSDKPackage.java +5 -1
  3. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/checkout/KlarnaCheckoutViewManager.java +4 -10
  4. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/WebViewResizeObserver.java +28 -0
  5. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/event/ComponentEventSender.java +5 -1
  6. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/ui/ResizeObserverWrapperView.java +2 -2
  7. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/ui/WrapperView.java +2 -2
  8. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/ui/YogaLayoutHelper.java +39 -0
  9. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/expresscheckout/KlarnaExpressCheckoutViewCallback.kt +30 -0
  10. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/expresscheckout/KlarnaExpressCheckoutViewEventSender.kt +80 -0
  11. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/expresscheckout/KlarnaExpressCheckoutViewManager.java +544 -0
  12. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/osm/KlarnaOSMViewEventHandler.java +30 -0
  13. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/osm/KlarnaOSMViewEventSender.java +64 -0
  14. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/osm/KlarnaOSMViewManager.java +356 -0
  15. package/android/src/newarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaExpressCheckoutViewSpec.java +31 -0
  16. package/android/src/newarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaOSMViewSpec.java +31 -0
  17. package/android/src/oldarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaExpressCheckoutViewSpec.java +36 -0
  18. package/android/src/oldarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaOSMViewSpec.java +32 -0
  19. package/android/src/test/java/com/klarna/mobile/sdk/reactnative/KlarnaMobileSDKPackageTest.java +5 -1
  20. package/android/src/test/java/com/klarna/mobile/sdk/reactnative/common/ui/YogaLayoutHelperTest.java +79 -0
  21. package/android/src/test/java/com/klarna/mobile/sdk/reactnative/expresscheckout/KlarnaExpressCheckoutViewManagerTest.java +259 -0
  22. package/android/src/test/java/com/klarna/mobile/sdk/reactnative/osm/KlarnaOSMViewEventHandlerTest.java +136 -0
  23. package/android/src/test/java/com/klarna/mobile/sdk/reactnative/osm/KlarnaOSMViewEventSenderTest.java +184 -0
  24. package/android/src/test/java/com/klarna/mobile/sdk/reactnative/osm/KlarnaOSMViewManagerTest.java +385 -0
  25. package/ios/RNKlarnaMobileSDK.xcodeproj/project.pbxproj +110 -52
  26. package/ios/Sources/KlarnaExpressCheckoutViewManager.h +5 -0
  27. package/ios/Sources/KlarnaExpressCheckoutViewManager.mm +39 -0
  28. package/ios/Sources/KlarnaOSMViewManager.h +5 -0
  29. package/ios/Sources/KlarnaOSMViewManager.mm +59 -0
  30. package/ios/Sources/view/KlarnaExpressCheckoutButtonDelegateProxy.swift +145 -0
  31. package/ios/Sources/view/KlarnaExpressCheckoutViewWrapper.h +41 -0
  32. package/ios/Sources/view/KlarnaOSMViewWrapper.h +48 -0
  33. package/ios/Sources/view/newarch/KlarnaExpressCheckoutViewWrapper.mm +228 -0
  34. package/ios/Sources/view/newarch/KlarnaOSMViewWrapper.mm +294 -0
  35. package/ios/Sources/view/newarch/KlarnaStandaloneWebViewWrapper.mm +20 -13
  36. package/ios/Sources/view/oldarch/KlarnaExpressCheckoutViewWrapper.mm +222 -0
  37. package/ios/Sources/view/oldarch/KlarnaOSMViewWrapper.mm +273 -0
  38. package/ios/Sources/view/oldarch/KlarnaStandaloneWebViewWrapper.mm +11 -13
  39. package/ios/Tests/KlarnaExpressCheckoutViewWrapperTests.m +391 -0
  40. package/ios/Tests/KlarnaOSMViewWrapperTests.m +450 -0
  41. package/ios/Tests/KlarnaStandaloneWebViewWrapperTests.m +105 -0
  42. package/lib/commonjs/KlarnaCheckoutView.js +2 -4
  43. package/lib/commonjs/KlarnaCheckoutView.js.map +1 -1
  44. package/lib/commonjs/KlarnaExpressCheckoutView.js +73 -0
  45. package/lib/commonjs/KlarnaExpressCheckoutView.js.map +1 -0
  46. package/lib/commonjs/KlarnaOSMView.js +92 -0
  47. package/lib/commonjs/KlarnaOSMView.js.map +1 -0
  48. package/lib/commonjs/KlarnaPaymentView.js +32 -55
  49. package/lib/commonjs/KlarnaPaymentView.js.map +1 -1
  50. package/lib/commonjs/KlarnaSignInSDK.js +1 -1
  51. package/lib/commonjs/KlarnaSignInSDK.js.map +1 -1
  52. package/lib/commonjs/KlarnaStandaloneWebView.js +2 -4
  53. package/lib/commonjs/KlarnaStandaloneWebView.js.map +1 -1
  54. package/lib/commonjs/index.js +128 -0
  55. package/lib/commonjs/index.js.map +1 -1
  56. package/lib/commonjs/specs/KlarnaCheckoutViewNativeComponent.js +3 -5
  57. package/lib/commonjs/specs/KlarnaCheckoutViewNativeComponent.js.map +1 -1
  58. package/lib/commonjs/specs/KlarnaExpressCheckoutViewNativeComponent.js +10 -0
  59. package/lib/commonjs/specs/KlarnaExpressCheckoutViewNativeComponent.js.map +1 -0
  60. package/lib/commonjs/specs/KlarnaOSMViewNativeComponent.js +14 -0
  61. package/lib/commonjs/specs/KlarnaOSMViewNativeComponent.js.map +1 -0
  62. package/lib/commonjs/specs/KlarnaPaymentViewNativeComponent.js +3 -5
  63. package/lib/commonjs/specs/KlarnaPaymentViewNativeComponent.js.map +1 -1
  64. package/lib/commonjs/specs/KlarnaStandaloneWebViewNativeComponent.js +3 -5
  65. package/lib/commonjs/specs/KlarnaStandaloneWebViewNativeComponent.js.map +1 -1
  66. package/lib/commonjs/specs/NativeKlarnaSignIn.js +1 -2
  67. package/lib/commonjs/specs/NativeKlarnaSignIn.js.map +1 -1
  68. package/lib/commonjs/types/button/KlarnaButtonShape.js +13 -0
  69. package/lib/commonjs/types/button/KlarnaButtonShape.js.map +1 -0
  70. package/lib/commonjs/types/button/KlarnaButtonStyle.js +12 -0
  71. package/lib/commonjs/types/button/KlarnaButtonStyle.js.map +1 -0
  72. package/lib/commonjs/types/button/KlarnaButtonTheme.js +13 -0
  73. package/lib/commonjs/types/button/KlarnaButtonTheme.js.map +1 -0
  74. package/lib/commonjs/types/common/KlarnaEnvironment.js +1 -2
  75. package/lib/commonjs/types/common/KlarnaEnvironment.js.map +1 -1
  76. package/lib/commonjs/types/common/KlarnaExpressCheckoutSessionOptions.js +8 -0
  77. package/lib/commonjs/types/common/KlarnaExpressCheckoutSessionOptions.js.map +1 -0
  78. package/lib/commonjs/types/common/KlarnaMobileSDKError.js.map +1 -1
  79. package/lib/commonjs/types/common/KlarnaOSMPlacementKey.js +2 -0
  80. package/lib/commonjs/types/common/KlarnaOSMPlacementKey.js.map +1 -0
  81. package/lib/commonjs/types/common/KlarnaProductEvent.js.map +1 -1
  82. package/lib/commonjs/types/common/KlarnaRegion.js +1 -2
  83. package/lib/commonjs/types/common/KlarnaRegion.js.map +1 -1
  84. package/lib/commonjs/types/common/KlarnaTheme.js +13 -0
  85. package/lib/commonjs/types/common/KlarnaTheme.js.map +1 -0
  86. package/lib/module/KlarnaCheckoutView.js.map +1 -1
  87. package/lib/module/KlarnaExpressCheckoutView.js +64 -0
  88. package/lib/module/KlarnaExpressCheckoutView.js.map +1 -0
  89. package/lib/module/KlarnaOSMView.js +84 -0
  90. package/lib/module/KlarnaOSMView.js.map +1 -0
  91. package/lib/module/KlarnaPaymentView.js +30 -51
  92. package/lib/module/KlarnaPaymentView.js.map +1 -1
  93. package/lib/module/KlarnaSignInSDK.js.map +1 -1
  94. package/lib/module/KlarnaStandaloneWebView.js.map +1 -1
  95. package/lib/module/index.js +11 -0
  96. package/lib/module/index.js.map +1 -1
  97. package/lib/module/specs/KlarnaCheckoutViewNativeComponent.js.map +1 -1
  98. package/lib/module/specs/KlarnaExpressCheckoutViewNativeComponent.js +3 -0
  99. package/lib/module/specs/KlarnaExpressCheckoutViewNativeComponent.js.map +1 -0
  100. package/lib/module/specs/KlarnaOSMViewNativeComponent.js +7 -0
  101. package/lib/module/specs/KlarnaOSMViewNativeComponent.js.map +1 -0
  102. package/lib/module/specs/KlarnaPaymentViewNativeComponent.js.map +1 -1
  103. package/lib/module/specs/KlarnaStandaloneWebViewNativeComponent.js.map +1 -1
  104. package/lib/module/specs/NativeKlarnaSignIn.js.map +1 -1
  105. package/lib/module/types/button/KlarnaButtonShape.js +7 -0
  106. package/lib/module/types/button/KlarnaButtonShape.js.map +1 -0
  107. package/lib/module/types/button/KlarnaButtonStyle.js +6 -0
  108. package/lib/module/types/button/KlarnaButtonStyle.js.map +1 -0
  109. package/lib/module/types/button/KlarnaButtonTheme.js +7 -0
  110. package/lib/module/types/button/KlarnaButtonTheme.js.map +1 -0
  111. package/lib/module/types/common/KlarnaEnvironment.js.map +1 -1
  112. package/lib/module/types/common/KlarnaExpressCheckoutSessionOptions.js +2 -0
  113. package/lib/module/types/common/KlarnaExpressCheckoutSessionOptions.js.map +1 -0
  114. package/lib/module/types/common/KlarnaMobileSDKError.js.map +1 -1
  115. package/lib/module/types/common/KlarnaOSMPlacementKey.js +2 -0
  116. package/lib/module/types/common/KlarnaOSMPlacementKey.js.map +1 -0
  117. package/lib/module/types/common/KlarnaProductEvent.js.map +1 -1
  118. package/lib/module/types/common/KlarnaRegion.js.map +1 -1
  119. package/lib/module/types/common/KlarnaTheme.js +7 -0
  120. package/lib/module/types/common/KlarnaTheme.js.map +1 -0
  121. package/lib/typescript/KlarnaCheckoutView.d.ts.map +1 -1
  122. package/lib/typescript/KlarnaExpressCheckoutView.d.ts +47 -0
  123. package/lib/typescript/KlarnaExpressCheckoutView.d.ts.map +1 -0
  124. package/lib/typescript/KlarnaOSMView.d.ts +36 -0
  125. package/lib/typescript/KlarnaOSMView.d.ts.map +1 -0
  126. package/lib/typescript/KlarnaPaymentView.d.ts.map +1 -1
  127. package/lib/typescript/KlarnaStandaloneWebView.d.ts.map +1 -1
  128. package/lib/typescript/index.d.ts +11 -0
  129. package/lib/typescript/index.d.ts.map +1 -1
  130. package/lib/typescript/specs/KlarnaCheckoutViewNativeComponent.d.ts.map +1 -1
  131. package/lib/typescript/specs/KlarnaExpressCheckoutViewNativeComponent.d.ts +45 -0
  132. package/lib/typescript/specs/KlarnaExpressCheckoutViewNativeComponent.d.ts.map +1 -0
  133. package/lib/typescript/specs/KlarnaOSMViewNativeComponent.d.ts +35 -0
  134. package/lib/typescript/specs/KlarnaOSMViewNativeComponent.d.ts.map +1 -0
  135. package/lib/typescript/specs/KlarnaPaymentViewNativeComponent.d.ts.map +1 -1
  136. package/lib/typescript/specs/KlarnaStandaloneWebViewNativeComponent.d.ts.map +1 -1
  137. package/lib/typescript/specs/NativeKlarnaSignIn.d.ts +1 -1
  138. package/lib/typescript/specs/NativeKlarnaSignIn.d.ts.map +1 -1
  139. package/lib/typescript/types/button/KlarnaButtonShape.d.ts +6 -0
  140. package/lib/typescript/types/button/KlarnaButtonShape.d.ts.map +1 -0
  141. package/lib/typescript/types/button/KlarnaButtonStyle.d.ts +5 -0
  142. package/lib/typescript/types/button/KlarnaButtonStyle.d.ts.map +1 -0
  143. package/lib/typescript/types/button/KlarnaButtonTheme.d.ts +6 -0
  144. package/lib/typescript/types/button/KlarnaButtonTheme.d.ts.map +1 -0
  145. package/lib/typescript/types/common/KlarnaExpressCheckoutSessionOptions.d.ts +10 -0
  146. package/lib/typescript/types/common/KlarnaExpressCheckoutSessionOptions.d.ts.map +1 -0
  147. package/lib/typescript/types/common/KlarnaOSMPlacementKey.d.ts +2 -0
  148. package/lib/typescript/types/common/KlarnaOSMPlacementKey.d.ts.map +1 -0
  149. package/lib/typescript/types/common/KlarnaTheme.d.ts +6 -0
  150. package/lib/typescript/types/common/KlarnaTheme.d.ts.map +1 -0
  151. package/package.json +17 -16
  152. package/react-native-klarna-inapp-sdk.podspec +2 -1
  153. package/src/KlarnaExpressCheckoutView.tsx +169 -0
  154. package/src/KlarnaOSMView.tsx +157 -0
  155. package/src/KlarnaStandaloneWebView.tsx +1 -2
  156. package/src/index.tsx +11 -0
  157. package/src/specs/KlarnaExpressCheckoutViewNativeComponent.ts +66 -0
  158. package/src/specs/KlarnaOSMViewNativeComponent.ts +50 -0
  159. package/src/specs/NativeKlarnaSignIn.ts +1 -1
  160. package/src/types/button/KlarnaButtonShape.ts +5 -0
  161. package/src/types/button/KlarnaButtonStyle.ts +4 -0
  162. package/src/types/button/KlarnaButtonTheme.ts +5 -0
  163. package/src/types/common/KlarnaExpressCheckoutSessionOptions.ts +13 -0
  164. package/src/types/common/KlarnaOSMPlacementKey.ts +3 -0
  165. package/src/types/common/KlarnaTheme.ts +5 -0
  166. package/LICENSE +0 -201
  167. package/README.md +0 -93
@@ -0,0 +1,273 @@
1
+ #if !RCT_NEW_ARCH_ENABLED
2
+
3
+ #import <React/RCTLog.h>
4
+ #import "../KlarnaOSMViewWrapper.h"
5
+ #import "../../common/RNMobileSDKUtils.h"
6
+ #import <KlarnaMobileSDK/KlarnaMobileSDK.h>
7
+ #import <KlarnaMobileSDK/KlarnaMobileSDK-Swift.h>
8
+
9
+ @interface KlarnaOSMViewWrapper () <KlarnaEventHandler, KlarnaSizingDelegate>
10
+
11
+ @property (nonatomic, strong) KlarnaOSMView* klarnaOSMView;
12
+ @property (nonatomic, assign) BOOL isOSMViewReadyEventSent;
13
+
14
+ @end
15
+
16
+ @implementation KlarnaOSMViewWrapper
17
+
18
+ #pragma mark - Initialization
19
+
20
+ - (instancetype)initWithFrame:(CGRect)frame
21
+ {
22
+ self = [super initWithFrame:frame];
23
+ if (self) {
24
+ self.isOSMViewReadyEventSent = NO;
25
+ self.backgroundColor = [UIColor clearColor];
26
+ [self initializeActualOSMView];
27
+ }
28
+ return self;
29
+ }
30
+
31
+ #pragma mark - React Native Property Setters
32
+
33
+ - (void)setClientId:(NSString *)clientId {
34
+ _clientId = clientId;
35
+ self.klarnaOSMView.clientId = clientId;
36
+ }
37
+
38
+ - (void)setPlacementKey:(NSString *)placementKey {
39
+ _placementKey = placementKey;
40
+ self.klarnaOSMView.placementKey = placementKey;
41
+ }
42
+
43
+ - (void)setLocale:(NSString *)locale {
44
+ _locale = locale;
45
+ if (locale.length > 0) {
46
+ self.klarnaOSMView.locale = locale;
47
+ }
48
+ }
49
+
50
+ - (void)setPurchaseAmount:(NSString *)purchaseAmount {
51
+ _purchaseAmount = purchaseAmount;
52
+ if (purchaseAmount.length > 0) {
53
+ NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
54
+ formatter.numberStyle = NSNumberFormatterDecimalStyle;
55
+ NSNumber *amount = [formatter numberFromString:purchaseAmount];
56
+ if (amount != nil) {
57
+ [self.klarnaOSMView setPurchaseAmount:amount];
58
+ }
59
+ }
60
+ }
61
+
62
+ - (void)setEnvironment:(NSString *)environment {
63
+ _environment = environment;
64
+ if (environment.length > 0) {
65
+ if ([environment isEqualToString:@"playground"]) {
66
+ self.klarnaOSMView.environment = KlarnaEnvironment.playground;
67
+ } else if ([environment isEqualToString:@"production"]) {
68
+ self.klarnaOSMView.environment = KlarnaEnvironment.production;
69
+ } else if ([environment isEqualToString:@"staging"]) {
70
+ self.klarnaOSMView.environment = KlarnaEnvironment.staging;
71
+ }
72
+ }
73
+ }
74
+
75
+ - (void)setRegion:(NSString *)region {
76
+ _region = region;
77
+ if (region.length > 0) {
78
+ if ([region isEqualToString:@"eu"]) {
79
+ self.klarnaOSMView.region = KlarnaRegion.eu;
80
+ } else if ([region isEqualToString:@"na"]) {
81
+ self.klarnaOSMView.region = KlarnaRegion.na;
82
+ } else if ([region isEqualToString:@"oc"]) {
83
+ self.klarnaOSMView.region = KlarnaRegion.oc;
84
+ }
85
+ }
86
+ }
87
+
88
+ - (void)setTheme:(NSString *)theme {
89
+ _theme = theme;
90
+ if (theme.length > 0) {
91
+ if ([theme isEqualToString:@"light"]) {
92
+ self.klarnaOSMView.theme = KlarnaThemeLight;
93
+ } else if ([theme isEqualToString:@"dark"]) {
94
+ self.klarnaOSMView.theme = KlarnaThemeDark;
95
+ } else if ([theme isEqualToString:@"automatic"]) {
96
+ self.klarnaOSMView.theme = KlarnaThemeAutomatic;
97
+ }
98
+ }
99
+ }
100
+
101
+ - (void)setOsmBackgroundColor:(NSString *)osmBackgroundColor {
102
+ _osmBackgroundColor = osmBackgroundColor;
103
+ [self updateStyleConfiguration];
104
+ }
105
+
106
+ - (void)setTextColor:(NSString *)textColor {
107
+ _textColor = textColor;
108
+ [self updateStyleConfiguration];
109
+ }
110
+
111
+ - (void)setReturnUrl:(NSString *)returnUrl {
112
+ // KlarnaOSMView ignores the return URL set by merchant and uses an internally created return URL.
113
+ _returnUrl = returnUrl;
114
+ }
115
+
116
+ #pragma mark - Style Configuration
117
+
118
+ - (void)updateStyleConfiguration {
119
+ UIColor *bgColor = [self colorFromHexString:self.osmBackgroundColor];
120
+ UIColor *txtColor = [self colorFromHexString:self.textColor];
121
+
122
+ if (bgColor || txtColor) {
123
+ KlarnaOSMStyleBuilder *builder = [[KlarnaOSMStyleBuilder alloc] init];
124
+ if (bgColor) {
125
+ [builder setBackgroundColor:bgColor];
126
+ }
127
+ if (txtColor) {
128
+ KlarnaTextStyleBuilder *textStyleBuilder = [[KlarnaTextStyleBuilder alloc] init];
129
+ [textStyleBuilder setTextColor:txtColor];
130
+ [builder setTextStyleConfiguration:[textStyleBuilder build]];
131
+ }
132
+ self.klarnaOSMView.styleConfiguration = [builder build];
133
+ } else {
134
+ self.klarnaOSMView.styleConfiguration = nil;
135
+ }
136
+ }
137
+
138
+ - (UIColor *)colorFromHexString:(NSString *)hexString {
139
+ if (!hexString || hexString.length == 0) {
140
+ return nil;
141
+ }
142
+
143
+ NSString *cleanString = [hexString stringByReplacingOccurrencesOfString:@"#" withString:@""];
144
+ if (cleanString.length != 6 && cleanString.length != 8) {
145
+ return nil;
146
+ }
147
+
148
+ unsigned int rgbValue = 0;
149
+ NSScanner *scanner = [NSScanner scannerWithString:cleanString];
150
+ [scanner scanHexInt:&rgbValue];
151
+
152
+ if (cleanString.length == 8) {
153
+ return [UIColor colorWithRed:((rgbValue & 0xFF000000) >> 24) / 255.0
154
+ green:((rgbValue & 0x00FF0000) >> 16) / 255.0
155
+ blue:((rgbValue & 0x0000FF00) >> 8) / 255.0
156
+ alpha:(rgbValue & 0x000000FF) / 255.0];
157
+ }
158
+
159
+ return [UIColor colorWithRed:((rgbValue & 0xFF0000) >> 16) / 255.0
160
+ green:((rgbValue & 0x00FF00) >> 8) / 255.0
161
+ blue:(rgbValue & 0x0000FF) / 255.0
162
+ alpha:1.0];
163
+ }
164
+
165
+ #pragma mark - KlarnaOSMView Setup
166
+
167
+ - (void)initializeActualOSMView {
168
+ self.isOSMViewReadyEventSent = NO;
169
+ self.klarnaOSMView = [[KlarnaOSMView alloc] init];
170
+ self.klarnaOSMView.eventHandler = self;
171
+ self.klarnaOSMView.sizingDelegate = self;
172
+ self.klarnaOSMView.backgroundColor = [UIColor clearColor];
173
+
174
+ self.klarnaOSMView.translatesAutoresizingMaskIntoConstraints = NO;
175
+
176
+ [self addSubview:self.klarnaOSMView];
177
+
178
+ [NSLayoutConstraint activateConstraints:[[NSArray alloc] initWithObjects:
179
+ [self.klarnaOSMView.topAnchor constraintEqualToAnchor:self.topAnchor],
180
+ [self.klarnaOSMView.bottomAnchor constraintEqualToAnchor:self.bottomAnchor],
181
+ [self.klarnaOSMView.leadingAnchor constraintEqualToAnchor:self.leadingAnchor],
182
+ [self.klarnaOSMView.trailingAnchor constraintEqualToAnchor:self.trailingAnchor], nil
183
+ ]];
184
+ }
185
+
186
+ #pragma mark - Layout
187
+
188
+ - (void)layoutSubviews {
189
+ [super layoutSubviews];
190
+ self.klarnaOSMView.frame = self.bounds;
191
+ }
192
+
193
+ #pragma mark - UIView Lifecycle
194
+
195
+ - (void)didMoveToWindow {
196
+ [super didMoveToWindow];
197
+ if (!self.window) {
198
+ self.isOSMViewReadyEventSent = NO;
199
+ }
200
+ }
201
+
202
+ #pragma mark - React Native Lifecycle
203
+
204
+ - (void)didSetProps:(NSArray<NSString *> *)changedProps {
205
+ [super didSetProps:changedProps];
206
+ [self sendOSMViewReadyEvent];
207
+ }
208
+
209
+ - (void)sendOSMViewReadyEvent {
210
+ if (self.klarnaOSMView && self.onOSMViewReady && !self.isOSMViewReadyEventSent) {
211
+ self.isOSMViewReadyEventSent = YES;
212
+ self.onOSMViewReady(@{});
213
+ }
214
+ }
215
+
216
+ #pragma mark - Methods Exposed to React Native
217
+
218
+ - (void)render {
219
+ UIViewController *hostVC = [self reactViewController];
220
+ if (hostVC) {
221
+ self.klarnaOSMView.hostViewController = hostVC;
222
+ }
223
+ [self.klarnaOSMView render];
224
+ }
225
+
226
+ - (UIViewController *)reactViewController {
227
+ UIResponder *responder = self;
228
+ while (responder) {
229
+ if ([responder isKindOfClass:[UIViewController class]]) {
230
+ return (UIViewController *)responder;
231
+ }
232
+ responder = [responder nextResponder];
233
+ }
234
+ return nil;
235
+ }
236
+
237
+ #pragma mark - KlarnaEventHandler
238
+
239
+ - (void)klarnaComponent:(id<KlarnaComponent>)klarnaComponent dispatchedEvent:(KlarnaProductEvent *)event {
240
+ // OSM view does not emit product events, but handle for completeness
241
+ }
242
+
243
+ - (void)klarnaComponent:(id<KlarnaComponent>)klarnaComponent encounteredError:(KlarnaError *)error {
244
+ if (!self.onError) {
245
+ RCTLog(@"Missing 'onError' callback prop.");
246
+ return;
247
+ }
248
+
249
+ self.onError(@{
250
+ @"error": @{
251
+ @"name": error.name,
252
+ @"message": error.message,
253
+ @"isFatal": [NSNumber numberWithBool:error.isFatal],
254
+ }
255
+ });
256
+ }
257
+
258
+ #pragma mark - KlarnaSizingDelegate
259
+
260
+ - (void)klarnaComponent:(id<KlarnaComponent>)klarnaComponent resizedToHeight:(CGFloat)height {
261
+ if (!self.onResized) {
262
+ RCTLog(@"Missing 'onResized' callback prop.");
263
+ return;
264
+ }
265
+
266
+ self.onResized(@{
267
+ @"height": [[NSNumber numberWithFloat:height] stringValue]
268
+ });
269
+ }
270
+
271
+ @end
272
+
273
+ #endif
@@ -21,10 +21,6 @@ NSString * const PROPERTY_NAME_ESTIMATED_PROGRESS = @"estimatedProgress";
21
21
 
22
22
  - (id)init {
23
23
  self = [super init];
24
- [self initializeKlarnaStandaloneWebView];
25
- self.klarnaStandaloneWebView.delegate = self;
26
- self.klarnaStandaloneWebView.eventHandler = self;
27
- [self.klarnaStandaloneWebView addObserver:self forKeyPath:PROPERTY_NAME_ESTIMATED_PROGRESS options:NSKeyValueObservingOptionNew context:nil];
28
24
  return self;
29
25
  }
30
26
 
@@ -67,7 +63,11 @@ NSString * const PROPERTY_NAME_ESTIMATED_PROGRESS = @"estimatedProgress";
67
63
  - (void)setReturnUrl:(NSString *)returnUrl {
68
64
  _returnUrl = returnUrl;
69
65
  if (returnUrl.length > 0) {
70
- self.klarnaStandaloneWebView.returnURL = [NSURL URLWithString:self.returnUrl];
66
+ if (self.klarnaStandaloneWebView == nil) {
67
+ [self initializeKlarnaStandaloneWebView];
68
+ } else {
69
+ self.klarnaStandaloneWebView.returnURL = [NSURL URLWithString:self.returnUrl];
70
+ }
71
71
  }
72
72
  }
73
73
 
@@ -79,18 +79,16 @@ NSString * const PROPERTY_NAME_ESTIMATED_PROGRESS = @"estimatedProgress";
79
79
  }
80
80
 
81
81
  - (void)initializeKlarnaStandaloneWebView {
82
- if (self.returnUrl != nil && self.returnUrl.length > 0) {
83
- self.klarnaStandaloneWebView = [[KlarnaStandaloneWebView alloc] initWithReturnURL:[NSURL URLWithString:self.returnUrl]];
84
- } else {
85
- // TODO: initWithReturnURL expects a non-null URL. What should we do here if returnUrl is null?
86
- self.klarnaStandaloneWebView = [[KlarnaStandaloneWebView alloc] initWithReturnURL:[NSURL URLWithString:@"returnUrl://"]];
87
- }
88
-
82
+ self.klarnaStandaloneWebView = [[KlarnaStandaloneWebView alloc] initWithReturnURL:[NSURL URLWithString:self.returnUrl]];
83
+ self.klarnaStandaloneWebView.delegate = self;
84
+ self.klarnaStandaloneWebView.eventHandler = self;
85
+ [self.klarnaStandaloneWebView addObserver:self forKeyPath:PROPERTY_NAME_ESTIMATED_PROGRESS options:NSKeyValueObservingOptionNew context:nil];
86
+
89
87
  self.klarnaStandaloneWebView.translatesAutoresizingMaskIntoConstraints = NO;
90
88
 
91
89
  [self addSubview:self.klarnaStandaloneWebView];
92
90
  [self setWebViewBackgroundToTransparent];
93
-
91
+
94
92
  [NSLayoutConstraint activateConstraints:[[NSArray alloc] initWithObjects:
95
93
  [self.klarnaStandaloneWebView.topAnchor constraintEqualToAnchor:self.topAnchor],
96
94
  [self.klarnaStandaloneWebView.bottomAnchor constraintEqualToAnchor:self.bottomAnchor],