react-native-klarna-inapp-sdk 2.8.2 → 2.9.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 (25) hide show
  1. package/android/build.gradle +3 -1
  2. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/WebViewResizeObserver.java +15 -28
  3. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/standalonewebview/KlarnaStandaloneWebViewManager.java +13 -1
  4. package/android/src/oldarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaStandaloneWebViewSpec.java +2 -0
  5. package/android/src/test/java/com/klarna/mobile/sdk/reactnative/common/WebViewResizeObserverTest.java +97 -0
  6. package/ios/Sources/KlarnaStandaloneWebViewManager.mm +11 -0
  7. package/ios/Sources/view/KlarnaStandaloneWebViewWrapper.h +2 -0
  8. package/ios/Sources/view/newarch/KlarnaStandaloneWebViewWrapper.mm +21 -3
  9. package/ios/Sources/view/oldarch/KlarnaStandaloneWebViewWrapper.mm +22 -4
  10. package/lib/commonjs/KlarnaStandaloneWebView.js +24 -0
  11. package/lib/commonjs/KlarnaStandaloneWebView.js.map +1 -1
  12. package/lib/commonjs/specs/KlarnaStandaloneWebViewNativeComponent.js +1 -1
  13. package/lib/commonjs/specs/KlarnaStandaloneWebViewNativeComponent.js.map +1 -1
  14. package/lib/module/KlarnaStandaloneWebView.js +24 -0
  15. package/lib/module/KlarnaStandaloneWebView.js.map +1 -1
  16. package/lib/module/specs/KlarnaStandaloneWebViewNativeComponent.js +1 -1
  17. package/lib/module/specs/KlarnaStandaloneWebViewNativeComponent.js.map +1 -1
  18. package/lib/typescript/KlarnaStandaloneWebView.d.ts +2 -0
  19. package/lib/typescript/KlarnaStandaloneWebView.d.ts.map +1 -1
  20. package/lib/typescript/specs/KlarnaStandaloneWebViewNativeComponent.d.ts +1 -0
  21. package/lib/typescript/specs/KlarnaStandaloneWebViewNativeComponent.d.ts.map +1 -1
  22. package/package.json +1 -1
  23. package/react-native-klarna-inapp-sdk.podspec +1 -1
  24. package/src/KlarnaStandaloneWebView.tsx +26 -0
  25. package/src/specs/KlarnaStandaloneWebViewNativeComponent.ts +4 -1
@@ -114,7 +114,7 @@ dependencies {
114
114
  implementation "org.jetbrains.kotlin:kotlin-reflect:${getExtOrDefault('kotlinVersion')}"
115
115
  implementation 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.6.3'
116
116
 
117
- implementation 'com.klarna.mobile:sdk:2.13.1'
117
+ implementation 'com.klarna.mobile:sdk:2.14.1'
118
118
  // Required: KlarnaExpressCheckoutButton extends ConstraintLayout.
119
119
  implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
120
120
 
@@ -125,6 +125,8 @@ dependencies {
125
125
  testImplementation "org.mockito:mockito-inline:3.12.4"
126
126
  testImplementation "org.jetbrains.kotlin:kotlin-test-junit:${getExtOrDefault('kotlinVersion')}"
127
127
  testImplementation "io.mockk:mockk:1.14.5"
128
+ // JavaScript engine, so tests can parse the scripts we inject into web views.
129
+ testImplementation "org.mozilla:rhino:1.7.15.1"
128
130
  }
129
131
 
130
132
  // removed from the docs but we can keep it
@@ -4,6 +4,8 @@ import android.os.Build;
4
4
  import android.webkit.JavascriptInterface;
5
5
  import android.webkit.WebView;
6
6
 
7
+ import androidx.annotation.VisibleForTesting;
8
+
7
9
  import java.lang.ref.WeakReference;
8
10
 
9
11
  public class WebViewResizeObserver {
@@ -21,6 +23,8 @@ public class WebViewResizeObserver {
21
23
  }
22
24
 
23
25
  private static final String JS_INTERFACE_NAME = "NativeResizeObserver";
26
+ @VisibleForTesting
27
+ static final String JS_PAYMENT_OBSERVER_HANDLE = "__klarnaRnPaymentResizeObserver";
24
28
  private final WeakReference<WebViewResizeObserverCallback> callback;
25
29
  private final TargetElement targetElement;
26
30
 
@@ -106,14 +110,25 @@ public class WebViewResizeObserver {
106
110
  " if (listener != null) {\n" +
107
111
  " listener.onResized(height);\n" +
108
112
  " console.log('Container size sent to native: ', height);\n" +
113
+ " } else {\n" +
114
+ " console.error('Native resize observer not found.');\n" +
109
115
  " }\n" +
116
+ " } else {\n" +
117
+ " console.error('Content rect not found.');\n" +
110
118
  " }\n" +
111
119
  " }\n" +
112
120
  "});\n");
113
121
  scriptBuilder.append("console.log('Resize observer initialized.');\n");
114
122
  scriptBuilder.append("if (container != null) {\n" +
123
+ " if (typeof (window." + JS_PAYMENT_OBSERVER_HANDLE + " || {}).disconnect === 'function') {\n" +
124
+ " window." + JS_PAYMENT_OBSERVER_HANDLE + ".disconnect();\n" +
125
+ " console.log('Previous resize observer disconnected.');\n" +
126
+ " }\n" +
127
+ " window." + JS_PAYMENT_OBSERVER_HANDLE + " = resizeObserver;\n" +
115
128
  " resizeObserver.observe(container);\n" +
116
129
  " console.log('Resize observer set to component.');\n" +
130
+ "} else {\n" +
131
+ " console.error('Resize observer container not found.');\n" +
117
132
  "}\n");
118
133
  scriptBuilder.append("console.log('Resize observer injection finished.');");
119
134
  break;
@@ -140,34 +155,6 @@ public class WebViewResizeObserver {
140
155
  " });\n");
141
156
  break;
142
157
  }
143
- scriptBuilder.append("console.log('Resize observer container selected: ', container);\n" +
144
- "const containerHeight = container.offsetHeight;\n" +
145
- "console.log('Container height: ', containerHeight);\n");
146
- scriptBuilder.append("const resizeObserver = new ResizeObserver((entries) => {\n" +
147
- " console.log('Container size changed.', entries);\n" +
148
- " for (let entry of entries) {\n" +
149
- " console.log('New dimensions found: ', entry);\n" +
150
- " if (entry.contentRect) {\n" +
151
- " const height = entry.contentRect.height;\n" +
152
- " const listener = window.NativeResizeObserver;\n" +
153
- " if (listener != null) {\n" +
154
- " listener.onResized(height);\n" +
155
- " console.log('Container size sent to native: ', height);\n" +
156
- " } else {\n" +
157
- " console.error('Native resize observer not found.');\n" +
158
- " }\n" +
159
- " } else {\n" +
160
- " console.error('Content rect not found.');\n" +
161
- " }\n" +
162
- " }\n" +
163
- "});\n");
164
- scriptBuilder.append("console.log('Resize observer initialized.');\n");
165
- scriptBuilder.append("if (container != null) {\n" +
166
- " resizeObserver.observe(container);\n" +
167
- " console.log('Resize observer set to component.');\n" +
168
- "}\n");
169
- scriptBuilder.append("console.log('Resize observer injection finished.');");
170
-
171
158
  return scriptBuilder.toString();
172
159
  }
173
160
  }
@@ -12,7 +12,6 @@ import androidx.annotation.NonNull;
12
12
  import androidx.annotation.Nullable;
13
13
 
14
14
  import com.facebook.react.bridge.ReactApplicationContext;
15
- import com.facebook.react.bridge.ReactContext;
16
15
  import com.facebook.react.bridge.ReadableArray;
17
16
  import com.facebook.react.common.MapBuilder;
18
17
  import com.facebook.react.uimanager.ThemedReactContext;
@@ -41,6 +40,7 @@ public class KlarnaStandaloneWebViewManager extends RNKlarnaStandaloneWebViewSpe
41
40
  public static final String COMMAND_GO_FORWARD = "goForward";
42
41
  public static final String COMMAND_GO_BACK = "goBack";
43
42
  public static final String COMMAND_RELOAD = "reload";
43
+ public static final String COMMAND_STOP_LOADING = "stopLoading";
44
44
 
45
45
  private static final String OVER_SCROLL_MODE_ALWAYS = "always";
46
46
  private static final String OVER_SCROLL_MODE_CONTENT = "content";
@@ -76,6 +76,10 @@ public class KlarnaStandaloneWebViewManager extends RNKlarnaStandaloneWebViewSpe
76
76
 
77
77
  @Override
78
78
  public void onReceivedError(@Nullable KlarnaStandaloneWebView view, @Nullable WebResourceRequest request, @Nullable WebResourceError error) {
79
+ // Do not send a navigation error event if the request is not for the main frame.
80
+ if (request != null && !request.isForMainFrame()) {
81
+ return;
82
+ }
79
83
  if (error != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
80
84
  klarnaStandaloneWebViewEventSender.sendNavigationErrorEvent(view, error.getErrorCode(), error.getDescription().toString());
81
85
  }
@@ -178,6 +182,9 @@ public class KlarnaStandaloneWebViewManager extends RNKlarnaStandaloneWebViewSpe
178
182
  case COMMAND_RELOAD:
179
183
  reload(root);
180
184
  break;
185
+ case COMMAND_STOP_LOADING:
186
+ stopLoading(root);
187
+ break;
181
188
  }
182
189
  }
183
190
 
@@ -201,6 +208,11 @@ public class KlarnaStandaloneWebViewManager extends RNKlarnaStandaloneWebViewSpe
201
208
  view.reload();
202
209
  }
203
210
 
211
+ @Override
212
+ public void stopLoading(KlarnaStandaloneWebView view) {
213
+ view.stopLoading();
214
+ }
215
+
204
216
  /**
205
217
  * Exposes direct event types that will be accessible as prop "callbacks" from RN.
206
218
  * <p>
@@ -20,4 +20,6 @@ public abstract class RNKlarnaStandaloneWebViewSpec<T extends View> extends Simp
20
20
  public abstract void goBack(T view);
21
21
 
22
22
  public abstract void reload(T view);
23
+
24
+ public abstract void stopLoading(T view);
23
25
  }
@@ -0,0 +1,97 @@
1
+ package com.klarna.mobile.sdk.reactnative.common;
2
+
3
+ import static org.junit.Assert.assertTrue;
4
+ import static org.junit.Assert.fail;
5
+
6
+ import android.webkit.ValueCallback;
7
+ import android.webkit.WebView;
8
+
9
+ import org.junit.Test;
10
+ import org.junit.runner.RunWith;
11
+ import org.mockito.ArgumentCaptor;
12
+ import org.mockito.Mockito;
13
+ import org.mozilla.javascript.Context;
14
+ import org.mozilla.javascript.EvaluatorException;
15
+ import org.robolectric.RobolectricTestRunner;
16
+
17
+ /**
18
+ * The injected script is a Java string, so a syntax error in it reaches neither the Java
19
+ * compiler nor the script's own try/catch — the web view discards it whole at parse time.
20
+ */
21
+ @RunWith(RobolectricTestRunner.class)
22
+ public class WebViewResizeObserverTest {
23
+
24
+ /** Captures the payload as handed to the web view, so nothing can drift from the source. */
25
+ private String injectedScriptFor(WebViewResizeObserver.TargetElement targetElement) {
26
+ WebViewResizeObserver observer = new WebViewResizeObserver(value -> { }, targetElement);
27
+ WebView webView = Mockito.mock(WebView.class);
28
+
29
+ observer.injectListener(webView);
30
+
31
+ ArgumentCaptor<String> script = ArgumentCaptor.forClass(String.class);
32
+ Mockito.verify(webView).evaluateJavascript(script.capture(), Mockito.<ValueCallback<String>>isNull());
33
+ return script.getValue();
34
+ }
35
+
36
+ /** Compiles without executing, so early errors surface with their identifier and line. */
37
+ private void assertParses(String script) {
38
+ Context context = Context.enter();
39
+ try {
40
+ context.setLanguageVersion(Context.VERSION_ES6);
41
+ context.compileString(script, "injected.js", 1, null);
42
+ } catch (EvaluatorException e) {
43
+ fail("Injected script does not parse: " + e.details() + " (line " + e.lineNumber() + ")\n\n" + script);
44
+ } finally {
45
+ Context.exit();
46
+ }
47
+ }
48
+
49
+ // region parses
50
+
51
+ @Test
52
+ public void testInjectListener_paymentContainerScriptParses() {
53
+ // Given
54
+ WebViewResizeObserver.TargetElement targetElement = WebViewResizeObserver.TargetElement.PAYMENT_CONTAINER;
55
+
56
+ // When
57
+ String script = injectedScriptFor(targetElement);
58
+
59
+ // Then
60
+ assertParses(script);
61
+ }
62
+
63
+ @Test
64
+ public void testInjectListener_checkoutContainerScriptParses() {
65
+ // Given
66
+ WebViewResizeObserver.TargetElement targetElement = WebViewResizeObserver.TargetElement.CHECKOUT_CONTAINER;
67
+
68
+ // When
69
+ String script = injectedScriptFor(targetElement);
70
+
71
+ // Then
72
+ assertParses(script);
73
+ }
74
+
75
+ // endregion
76
+
77
+ // region re-injection
78
+
79
+ /**
80
+ * Re-injecting does not redeclare, since the script's declarations are scoped to the try
81
+ * block wrapping them. Without a reachable handle it would stack observers on one element.
82
+ */
83
+ @Test
84
+ public void testInjectListener_paymentContainerDisconnectsPreviousObserver() {
85
+ // Given
86
+ String handle = "window." + WebViewResizeObserver.JS_PAYMENT_OBSERVER_HANDLE;
87
+
88
+ // When
89
+ String script = injectedScriptFor(WebViewResizeObserver.TargetElement.PAYMENT_CONTAINER);
90
+
91
+ // Then
92
+ assertTrue("a previously stored observer must be disconnected", script.contains(handle + ".disconnect()"));
93
+ assertTrue("the new observer must be stored for the next injection", script.contains(handle + " = "));
94
+ }
95
+
96
+ // endregion
97
+ }
@@ -71,4 +71,15 @@ RCT_EXPORT_METHOD(reload:(nonnull NSNumber*)reactTag) {
71
71
  }];
72
72
  }
73
73
 
74
+ RCT_EXPORT_METHOD(stopLoading:(nonnull NSNumber*)reactTag) {
75
+ [self.bridge.uiManager addUIBlock:^(RCTUIManager *uiManager, NSDictionary<NSNumber *,UIView *> *viewRegistry) {
76
+ KlarnaStandaloneWebViewWrapper* view = (KlarnaStandaloneWebViewWrapper*) viewRegistry[reactTag];
77
+ if (!view || ![view isKindOfClass:KlarnaStandaloneWebViewWrapper.class]) {
78
+ RCTLogError(@"Can't find KlarnaStandaloneWebViewWrapper with tag #%@", reactTag);
79
+ return;
80
+ }
81
+ [view stopLoading];
82
+ }];
83
+ }
84
+
74
85
  @end
@@ -37,6 +37,8 @@ NS_ASSUME_NONNULL_BEGIN
37
37
 
38
38
  - (void)reload;
39
39
 
40
+ - (void)stopLoading;
41
+
40
42
  @end
41
43
 
42
44
  NS_ASSUME_NONNULL_END
@@ -123,7 +123,7 @@ NSString *const PROPERTY_NAME_ESTIMATED_PROGRESS = @"estimatedProgress";
123
123
  static const auto defaultProps = std::make_shared<const RNKlarnaStandaloneWebViewProps>();
124
124
  _props = defaultProps;
125
125
  }
126
-
126
+
127
127
  return self;
128
128
  }
129
129
 
@@ -209,6 +209,13 @@ Class<RCTComponentViewProtocol>RNKlarnaStandaloneWebViewCls(void)
209
209
  }
210
210
 
211
211
  - (void)klarnaStandaloneWebView:(KlarnaStandaloneWebView * _Nonnull)webView didFailProvisionalNavigation:(WKNavigation * _Nonnull)navigation withError:(NSError * _Nonnull)error {
212
+ // A cancelled navigation is not a failure. WebKit reports NSURLErrorCancelled for a
213
+ // deliberate stopLoading, for redirects, and when a new load starts before the previous
214
+ // one finished, so reporting it as onError would send false errors to integrators.
215
+ if ([error.domain isEqualToString:NSURLErrorDomain] && error.code == NSURLErrorCancelled) {
216
+ return;
217
+ }
218
+
212
219
  if (_eventEmitter) {
213
220
  RCTLogInfo(@"Sending onError event");
214
221
  std::dynamic_pointer_cast<const RNKlarnaStandaloneWebViewEventEmitter>(_eventEmitter)
@@ -229,6 +236,13 @@ Class<RCTComponentViewProtocol>RNKlarnaStandaloneWebViewCls(void)
229
236
  }
230
237
 
231
238
  - (void)klarnaStandaloneWebView:(KlarnaStandaloneWebView * _Nonnull)webView didFail:(WKNavigation * _Nonnull)navigation withError:(NSError * _Nonnull)error {
239
+ // A cancelled navigation is not a failure. WebKit reports NSURLErrorCancelled for a
240
+ // deliberate stopLoading, for redirects, and when a new load starts before the previous
241
+ // one finished, so reporting it as onError would send false errors to integrators.
242
+ if ([error.domain isEqualToString:NSURLErrorDomain] && error.code == NSURLErrorCancelled) {
243
+ return;
244
+ }
245
+
232
246
  if (_eventEmitter) {
233
247
  RCTLogInfo(@"Sending onError event");
234
248
  std::dynamic_pointer_cast<const RNKlarnaStandaloneWebViewEventEmitter>(_eventEmitter)
@@ -292,15 +306,19 @@ Class<RCTComponentViewProtocol>RNKlarnaStandaloneWebViewCls(void)
292
306
  [self.klarnaStandaloneWebView reload];
293
307
  }
294
308
 
309
+ - (void)stopLoading {
310
+ [self.klarnaStandaloneWebView stopLoading];
311
+ }
312
+
295
313
  - (NSString *)serializeDictionaryToJsonString:(NSDictionary<NSString *, id<NSCoding>> *)dictionary {
296
314
  if (!dictionary) {
297
315
  RCTLog(@"Dictionary is nil");
298
316
  return @"{}";
299
317
  }
300
-
318
+
301
319
  NSError *error;
302
320
  NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:&error];
303
-
321
+
304
322
  if (!jsonData) {
305
323
  return @"{}";
306
324
  } else {
@@ -53,7 +53,7 @@ NSString * const PROPERTY_NAME_ESTIMATED_PROGRESS = @"estimatedProgress";
53
53
  [event addEntriesFromDictionary:@{
54
54
  @"progress": [NSNumber numberWithDouble: progress] // could use self.klarnaStandaloneWebView.estimatedProgress
55
55
  }];
56
-
56
+
57
57
  self.onLoadProgress(@{@"progressEvent": event});
58
58
 
59
59
  }
@@ -137,6 +137,10 @@ NSString * const PROPERTY_NAME_ESTIMATED_PROGRESS = @"estimatedProgress";
137
137
  [self.klarnaStandaloneWebView reload];
138
138
  }
139
139
 
140
+ - (void)stopLoading {
141
+ [self.klarnaStandaloneWebView stopLoading];
142
+ }
143
+
140
144
  #pragma mark - KlarnaStandaloneWebViewDelegate methods
141
145
 
142
146
  - (void)klarnaStandaloneWebView:(KlarnaStandaloneWebView * _Nonnull)webView didCommit:(WKNavigation * _Nonnull)navigation {
@@ -158,6 +162,13 @@ NSString * const PROPERTY_NAME_ESTIMATED_PROGRESS = @"estimatedProgress";
158
162
  }
159
163
 
160
164
  - (void)klarnaStandaloneWebView:(KlarnaStandaloneWebView * _Nonnull)webView didFailProvisionalNavigation:(WKNavigation * _Nonnull)navigation withError:(NSError * _Nonnull)error {
165
+ // A cancelled navigation is not a failure. WebKit reports NSURLErrorCancelled for a
166
+ // deliberate stopLoading, for redirects, and when a new load starts before the previous
167
+ // one finished, so reporting it as onError would send false errors to integrators.
168
+ if ([error.domain isEqualToString:NSURLErrorDomain] && error.code == NSURLErrorCancelled) {
169
+ return;
170
+ }
171
+
161
172
  if (!self.onError) {
162
173
  RCTLog(@"Missing 'onError' callback prop.");
163
174
  return;
@@ -171,6 +182,13 @@ NSString * const PROPERTY_NAME_ESTIMATED_PROGRESS = @"estimatedProgress";
171
182
  }
172
183
 
173
184
  - (void)klarnaStandaloneWebView:(KlarnaStandaloneWebView * _Nonnull)webView didFail:(WKNavigation * _Nonnull)navigation withError:(NSError * _Nonnull)error {
185
+ // A cancelled navigation is not a failure. WebKit reports NSURLErrorCancelled for a
186
+ // deliberate stopLoading, for redirects, and when a new load starts before the previous
187
+ // one finished, so reporting it as onError would send false errors to integrators.
188
+ if ([error.domain isEqualToString:NSURLErrorDomain] && error.code == NSURLErrorCancelled) {
189
+ return;
190
+ }
191
+
174
192
  if (!self.onError) {
175
193
  RCTLog(@"Missing 'onError' callback prop.");
176
194
  return;
@@ -190,7 +208,7 @@ NSString * const PROPERTY_NAME_ESTIMATED_PROGRESS = @"estimatedProgress";
190
208
  RCTLog(@"Missing 'onKlarnaMessage' callback prop.");
191
209
  return;
192
210
  }
193
-
211
+
194
212
  self.onKlarnaMessage(@{
195
213
  @"klarnaMessageEvent": @{
196
214
  @"action": event.action,
@@ -210,10 +228,10 @@ NSString * const PROPERTY_NAME_ESTIMATED_PROGRESS = @"estimatedProgress";
210
228
  RCTLog(@"Dictionary is nil");
211
229
  return @"{}";
212
230
  }
213
-
231
+
214
232
  NSError *error;
215
233
  NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionary options:NSJSONWritingPrettyPrinted error:&error];
216
-
234
+
217
235
  if (!jsonData) {
218
236
  return @"{}";
219
237
  } else {
@@ -8,6 +8,7 @@ var _react = _interopRequireWildcard(require("react"));
8
8
  var _KlarnaStandaloneWebViewNativeComponent = _interopRequireWildcard(require("./specs/KlarnaStandaloneWebViewNativeComponent"));
9
9
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
10
10
  class KlarnaStandaloneWebView extends _react.Component {
11
+ shouldSuppressStopEvent = false;
11
12
  constructor(props) {
12
13
  super(props);
13
14
  this.standaloneWebViewRef = /*#__PURE__*/_react.default.createRef();
@@ -20,21 +21,37 @@ class KlarnaStandaloneWebView extends _react.Component {
20
21
  overScrollMode: this.props.overScrollMode ?? 'always',
21
22
  bounces: this.props.bounces ?? true,
22
23
  onLoadStart: event => {
24
+ this.shouldSuppressStopEvent = false;
23
25
  if (this.props.onLoadStart != null) {
24
26
  this.props.onLoadStart(event.nativeEvent.navigationEvent);
25
27
  }
26
28
  },
27
29
  onLoadEnd: event => {
30
+ // On Android, stopping a load triggers the platform's page finished
31
+ // callback, which arrives here as onLoadEnd alongside onLoadProgress
32
+ // updates of 100. All of them are dropped so that stopLoading()
33
+ // emits nothing on either platform.
34
+ if (this.shouldSuppressStopEvent) {
35
+ return;
36
+ }
28
37
  if (this.props.onLoadEnd != null) {
29
38
  this.props.onLoadEnd(event.nativeEvent.navigationEvent);
30
39
  }
31
40
  },
32
41
  onError: event => {
42
+ this.shouldSuppressStopEvent = false;
33
43
  if (this.props.onError != null) {
34
44
  this.props.onError(event.nativeEvent.error);
35
45
  }
36
46
  },
37
47
  onLoadProgress: event => {
48
+ // A stopped load reports no further progress. Android reports it as
49
+ // a finished page, with progress 100 more than once, and updates that
50
+ // were already in flight can arrive after the stop as well. The flag
51
+ // stays armed until the next load starts, so all of them are dropped.
52
+ if (this.shouldSuppressStopEvent) {
53
+ return;
54
+ }
38
55
  if (this.props.onLoadProgress != null) {
39
56
  this.props.onLoadProgress(event.nativeEvent.progressEvent);
40
57
  }
@@ -83,6 +100,13 @@ class KlarnaStandaloneWebView extends _react.Component {
83
100
  _KlarnaStandaloneWebViewNativeComponent.Commands.reload(view);
84
101
  }
85
102
  };
103
+ stopLoading = () => {
104
+ const view = this.standaloneWebViewRef.current;
105
+ if (view != null) {
106
+ this.shouldSuppressStopEvent = true;
107
+ _KlarnaStandaloneWebViewNativeComponent.Commands.stopLoading(view);
108
+ }
109
+ };
86
110
  }
87
111
  exports.KlarnaStandaloneWebView = KlarnaStandaloneWebView;
88
112
  var _default = exports.default = KlarnaStandaloneWebView;
@@ -1 +1 @@
1
- {"version":3,"names":["_react","_interopRequireWildcard","require","_KlarnaStandaloneWebViewNativeComponent","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","KlarnaStandaloneWebView","Component","constructor","props","standaloneWebViewRef","React","createRef","render","createElement","ref","style","returnUrl","overScrollMode","bounces","onLoadStart","event","nativeEvent","navigationEvent","onLoadEnd","onError","error","onLoadProgress","progressEvent","onKlarnaMessage","klarnaMessageEvent","params","JSON","parse","action","onRenderProcessGone","renderProcessGoneEvent","load","url","view","current","RNKlarnaStandaloneWebViewCommands","goForward","goBack","reload","exports","_default"],"sourceRoot":"../../src","sources":["KlarnaStandaloneWebView.tsx"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_react","_interopRequireWildcard","require","_KlarnaStandaloneWebViewNativeComponent","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","KlarnaStandaloneWebView","Component","shouldSuppressStopEvent","constructor","props","standaloneWebViewRef","React","createRef","render","createElement","ref","style","returnUrl","overScrollMode","bounces","onLoadStart","event","nativeEvent","navigationEvent","onLoadEnd","onError","error","onLoadProgress","progressEvent","onKlarnaMessage","klarnaMessageEvent","params","JSON","parse","action","onRenderProcessGone","renderProcessGoneEvent","load","url","view","current","RNKlarnaStandaloneWebViewCommands","goForward","goBack","reload","stopLoading","exports","_default"],"sourceRoot":"../../src","sources":["KlarnaStandaloneWebView.tsx"],"mappings":"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","ignoreList":[]}
@@ -8,7 +8,7 @@ var _codegenNativeComponent = _interopRequireDefault(require("react-native/Libra
8
8
  var _codegenNativeCommands = _interopRequireDefault(require("react-native/Libraries/Utilities/codegenNativeCommands"));
9
9
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
10
  const Commands = exports.Commands = (0, _codegenNativeCommands.default)({
11
- supportedCommands: ['load', 'goBack', 'goForward', 'reload']
11
+ supportedCommands: ['load', 'goBack', 'goForward', 'reload', 'stopLoading']
12
12
  });
13
13
  var _default = exports.default = (0, _codegenNativeComponent.default)('RNKlarnaStandaloneWebView');
14
14
  //# sourceMappingURL=KlarnaStandaloneWebViewNativeComponent.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["_codegenNativeComponent","_interopRequireDefault","require","_codegenNativeCommands","e","__esModule","default","Commands","exports","codegenNativeCommands","supportedCommands","_default","codegenNativeComponent"],"sourceRoot":"../../../src","sources":["specs/KlarnaStandaloneWebViewNativeComponent.ts"],"mappings":";;;;;;AAEA,IAAAA,uBAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,sBAAA,GAAAF,sBAAA,CAAAC,OAAA;AAA2F,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AA0FpF,MAAMG,QAAiD,GAAAC,OAAA,CAAAD,QAAA,GAC5D,IAAAE,8BAAqB,EAA0C;EAC7DC,iBAAiB,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ;AAC7D,CAAC,CAAC;AAAC,IAAAC,QAAA,GAAAH,OAAA,CAAAF,OAAA,GAEU,IAAAM,+BAAsB,EACnC,2BACF,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["_codegenNativeComponent","_interopRequireDefault","require","_codegenNativeCommands","e","__esModule","default","Commands","exports","codegenNativeCommands","supportedCommands","_default","codegenNativeComponent"],"sourceRoot":"../../../src","sources":["specs/KlarnaStandaloneWebViewNativeComponent.ts"],"mappings":";;;;;;AAEA,IAAAA,uBAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,sBAAA,GAAAF,sBAAA,CAAAC,OAAA;AAA2F,SAAAD,uBAAAG,CAAA,WAAAA,CAAA,IAAAA,CAAA,CAAAC,UAAA,GAAAD,CAAA,KAAAE,OAAA,EAAAF,CAAA;AA6FpF,MAAMG,QAAiD,GAAAC,OAAA,CAAAD,QAAA,GAC5D,IAAAE,8BAAqB,EAA0C;EAC7DC,iBAAiB,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa;AAC5E,CAAC,CAAC;AAAC,IAAAC,QAAA,GAAAH,OAAA,CAAAF,OAAA,GAEU,IAAAM,+BAAsB,EACnC,2BACF,CAAC","ignoreList":[]}
@@ -1,6 +1,7 @@
1
1
  import React, { Component } from 'react';
2
2
  import RNKlarnaStandaloneWebView, { Commands as RNKlarnaStandaloneWebViewCommands } from './specs/KlarnaStandaloneWebViewNativeComponent';
3
3
  export class KlarnaStandaloneWebView extends Component {
4
+ shouldSuppressStopEvent = false;
4
5
  constructor(props) {
5
6
  super(props);
6
7
  this.standaloneWebViewRef = /*#__PURE__*/React.createRef();
@@ -13,21 +14,37 @@ export class KlarnaStandaloneWebView extends Component {
13
14
  overScrollMode: this.props.overScrollMode ?? 'always',
14
15
  bounces: this.props.bounces ?? true,
15
16
  onLoadStart: event => {
17
+ this.shouldSuppressStopEvent = false;
16
18
  if (this.props.onLoadStart != null) {
17
19
  this.props.onLoadStart(event.nativeEvent.navigationEvent);
18
20
  }
19
21
  },
20
22
  onLoadEnd: event => {
23
+ // On Android, stopping a load triggers the platform's page finished
24
+ // callback, which arrives here as onLoadEnd alongside onLoadProgress
25
+ // updates of 100. All of them are dropped so that stopLoading()
26
+ // emits nothing on either platform.
27
+ if (this.shouldSuppressStopEvent) {
28
+ return;
29
+ }
21
30
  if (this.props.onLoadEnd != null) {
22
31
  this.props.onLoadEnd(event.nativeEvent.navigationEvent);
23
32
  }
24
33
  },
25
34
  onError: event => {
35
+ this.shouldSuppressStopEvent = false;
26
36
  if (this.props.onError != null) {
27
37
  this.props.onError(event.nativeEvent.error);
28
38
  }
29
39
  },
30
40
  onLoadProgress: event => {
41
+ // A stopped load reports no further progress. Android reports it as
42
+ // a finished page, with progress 100 more than once, and updates that
43
+ // were already in flight can arrive after the stop as well. The flag
44
+ // stays armed until the next load starts, so all of them are dropped.
45
+ if (this.shouldSuppressStopEvent) {
46
+ return;
47
+ }
31
48
  if (this.props.onLoadProgress != null) {
32
49
  this.props.onLoadProgress(event.nativeEvent.progressEvent);
33
50
  }
@@ -76,6 +93,13 @@ export class KlarnaStandaloneWebView extends Component {
76
93
  RNKlarnaStandaloneWebViewCommands.reload(view);
77
94
  }
78
95
  };
96
+ stopLoading = () => {
97
+ const view = this.standaloneWebViewRef.current;
98
+ if (view != null) {
99
+ this.shouldSuppressStopEvent = true;
100
+ RNKlarnaStandaloneWebViewCommands.stopLoading(view);
101
+ }
102
+ };
79
103
  }
80
104
  export default KlarnaStandaloneWebView;
81
105
  //# sourceMappingURL=KlarnaStandaloneWebView.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["React","Component","RNKlarnaStandaloneWebView","Commands","RNKlarnaStandaloneWebViewCommands","KlarnaStandaloneWebView","constructor","props","standaloneWebViewRef","createRef","render","createElement","ref","style","returnUrl","overScrollMode","bounces","onLoadStart","event","nativeEvent","navigationEvent","onLoadEnd","onError","error","onLoadProgress","progressEvent","onKlarnaMessage","klarnaMessageEvent","params","JSON","parse","e","action","onRenderProcessGone","renderProcessGoneEvent","load","url","view","current","goForward","goBack","reload"],"sourceRoot":"../../src","sources":["KlarnaStandaloneWebView.tsx"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,SAAS,QAAwB,OAAO;AAMxD,OAAOC,yBAAyB,IAC9BC,QAAQ,IAAIC,iCAAiC,QAExC,gDAAgD;AAwBvD,OAAO,MAAMC,uBAAuB,SAASJ,SAAS,CAGpD;EAKAK,WAAWA,CAACC,KAAyB,EAAE;IACrC,KAAK,CAACA,KAAK,CAAC;IACZ,IAAI,CAACC,oBAAoB,gBAAGR,KAAK,CAACS,SAAS,CAAC,CAAC;EAC/C;EAEAC,MAAMA,CAAA,EAAG;IACP,oBACEV,KAAA,CAAAW,aAAA,CAACT,yBAAyB;MACxBU,GAAG,EAAE,IAAI,CAACJ,oBAAqB;MAC/BK,KAAK,EAAE,IAAI,CAACN,KAAK,CAACM,KAAM;MACxBC,SAAS,EAAE,IAAI,CAACP,KAAK,CAACO,SAAS,IAAI,EAAG;MACtCC,cAAc,EAAE,IAAI,CAACR,KAAK,CAACQ,cAAc,IAAI,QAAS;MACtDC,OAAO,EAAE,IAAI,CAACT,KAAK,CAACS,OAAO,IAAI,IAAK;MACpCC,WAAW,EACTC,KAUC,IACE;QACH,IAAI,IAAI,CAACX,KAAK,CAACU,WAAW,IAAI,IAAI,EAAE;UAClC,IAAI,CAACV,KAAK,CAACU,WAAW,CAACC,KAAK,CAACC,WAAW,CAACC,eAAe,CAAC;QAC3D;MACF,CAAE;MACFC,SAAS,EACPH,KAUC,IACE;QACH,IAAI,IAAI,CAACX,KAAK,CAACc,SAAS,IAAI,IAAI,EAAE;UAChC,IAAI,CAACd,KAAK,CAACc,SAAS,CAACH,KAAK,CAACC,WAAW,CAACC,eAAe,CAAC;QACzD;MACF,CAAE;MACFE,OAAO,EACLJ,KAYC,IACE;QACH,IAAI,IAAI,CAACX,KAAK,CAACe,OAAO,IAAI,IAAI,EAAE;UAC9B,IAAI,CAACf,KAAK,CAACe,OAAO,CAACJ,KAAK,CAACC,WAAW,CAACI,KAAK,CAAC;QAC7C;MACF,CAAE;MACFC,cAAc,EACZN,KAWC,IACE;QACH,IAAI,IAAI,CAACX,KAAK,CAACiB,cAAc,IAAI,IAAI,EAAE;UACrC,IAAI,CAACjB,KAAK,CAACiB,cAAc,CAACN,KAAK,CAACC,WAAW,CAACM,aAAa,CAAC;QAC5D;MACF,CAAE;MACFC,eAAe,EACbR,KAOC,IACE;QACH,IAAI,IAAI,CAACX,KAAK,CAACmB,eAAe,IAAI,IAAI,EAAE;UACtC,MAAMC,kBAAkB,GAAGT,KAAK,CAACC,WAAW,CAACQ,kBAAkB;UAC/D,IAAIC,MAAM,GAAG,CAAC,CAAC;UACf,IAAI;YACFA,MAAM,GAAGC,IAAI,CAACC,KAAK,CAACH,kBAAkB,CAACC,MAAM,CAAC;UAChD,CAAC,CAAC,OAAOG,CAAC,EAAE,CAAC;UACb,IAAI,CAACxB,KAAK,CAACmB,eAAe,CAAC;YACzBM,MAAM,EAAEL,kBAAkB,CAACK,MAAM;YACjCJ,MAAM,EAAEA;UACV,CAAC,CAAC;QACJ;MACF,CAAE;MACFK,mBAAmB,EACjBf,KAMC,IACE;QACH,IAAI,IAAI,CAACX,KAAK,CAAC0B,mBAAmB,IAAI,IAAI,EAAE;UAC1C,IAAI,CAAC1B,KAAK,CAAC0B,mBAAmB,CAC5Bf,KAAK,CAACC,WAAW,CAACe,sBACpB,CAAC;QACH;MACF;IAAE,CACH,CAAC;EAEN;EAEAC,IAAI,GAAIC,GAAW,IAAK;IACtB,MAAMC,IAAI,GAAG,IAAI,CAAC7B,oBAAoB,CAAC8B,OAAO;IAC9C,IAAID,IAAI,IAAI,IAAI,EAAE;MAChBjC,iCAAiC,CAAC+B,IAAI,CAACE,IAAI,EAAED,GAAG,CAAC;IACnD;EACF,CAAC;EAEDG,SAAS,GAAGA,CAAA,KAAM;IAChB,MAAMF,IAAI,GAAG,IAAI,CAAC7B,oBAAoB,CAAC8B,OAAO;IAC9C,IAAID,IAAI,IAAI,IAAI,EAAE;MAChBjC,iCAAiC,CAACmC,SAAS,CAACF,IAAI,CAAC;IACnD;EACF,CAAC;EAEDG,MAAM,GAAGA,CAAA,KAAM;IACb,MAAMH,IAAI,GAAG,IAAI,CAAC7B,oBAAoB,CAAC8B,OAAO;IAC9C,IAAID,IAAI,IAAI,IAAI,EAAE;MAChBjC,iCAAiC,CAACoC,MAAM,CAACH,IAAI,CAAC;IAChD;EACF,CAAC;EAEDI,MAAM,GAAGA,CAAA,KAAM;IACb,MAAMJ,IAAI,GAAG,IAAI,CAAC7B,oBAAoB,CAAC8B,OAAO;IAC9C,IAAID,IAAI,IAAI,IAAI,EAAE;MAChBjC,iCAAiC,CAACqC,MAAM,CAACJ,IAAI,CAAC;IAChD;EACF,CAAC;AACH;AAgCA,eAAehC,uBAAuB","ignoreList":[]}
1
+ {"version":3,"names":["React","Component","RNKlarnaStandaloneWebView","Commands","RNKlarnaStandaloneWebViewCommands","KlarnaStandaloneWebView","shouldSuppressStopEvent","constructor","props","standaloneWebViewRef","createRef","render","createElement","ref","style","returnUrl","overScrollMode","bounces","onLoadStart","event","nativeEvent","navigationEvent","onLoadEnd","onError","error","onLoadProgress","progressEvent","onKlarnaMessage","klarnaMessageEvent","params","JSON","parse","e","action","onRenderProcessGone","renderProcessGoneEvent","load","url","view","current","goForward","goBack","reload","stopLoading"],"sourceRoot":"../../src","sources":["KlarnaStandaloneWebView.tsx"],"mappings":"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","ignoreList":[]}
@@ -1,7 +1,7 @@
1
1
  import codegenNativeComponent from 'react-native/Libraries/Utilities/codegenNativeComponent';
2
2
  import codegenNativeCommands from 'react-native/Libraries/Utilities/codegenNativeCommands';
3
3
  export const Commands = codegenNativeCommands({
4
- supportedCommands: ['load', 'goBack', 'goForward', 'reload']
4
+ supportedCommands: ['load', 'goBack', 'goForward', 'reload', 'stopLoading']
5
5
  });
6
6
  export default codegenNativeComponent('RNKlarnaStandaloneWebView');
7
7
  //# sourceMappingURL=KlarnaStandaloneWebViewNativeComponent.js.map
@@ -1 +1 @@
1
- {"version":3,"names":["codegenNativeComponent","codegenNativeCommands","Commands","supportedCommands"],"sourceRoot":"../../../src","sources":["specs/KlarnaStandaloneWebViewNativeComponent.ts"],"mappings":"AAEA,OAAOA,sBAAsB,MAAM,yDAAyD;AAC5F,OAAOC,qBAAqB,MAAM,wDAAwD;AA0F1F,OAAO,MAAMC,QAAiD,GAC5DD,qBAAqB,CAA0C;EAC7DE,iBAAiB,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ;AAC7D,CAAC,CAAC;AAEJ,eAAeH,sBAAsB,CACnC,2BACF,CAAC","ignoreList":[]}
1
+ {"version":3,"names":["codegenNativeComponent","codegenNativeCommands","Commands","supportedCommands"],"sourceRoot":"../../../src","sources":["specs/KlarnaStandaloneWebViewNativeComponent.ts"],"mappings":"AAEA,OAAOA,sBAAsB,MAAM,yDAAyD;AAC5F,OAAOC,qBAAqB,MAAM,wDAAwD;AA6F1F,OAAO,MAAMC,QAAiD,GAC5DD,qBAAqB,CAA0C;EAC7DE,iBAAiB,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,aAAa;AAC5E,CAAC,CAAC;AAEJ,eAAeH,sBAAsB,CACnC,2BACF,CAAC","ignoreList":[]}
@@ -15,12 +15,14 @@ export interface KlarnaWebViewProps {
15
15
  }
16
16
  export declare class KlarnaStandaloneWebView extends Component<KlarnaWebViewProps, any> {
17
17
  standaloneWebViewRef: RefObject<Component<RNKlarnaStandaloneWebViewProps> & Readonly<NativeMethods>>;
18
+ private shouldSuppressStopEvent;
18
19
  constructor(props: KlarnaWebViewProps);
19
20
  render(): React.JSX.Element;
20
21
  load: (url: string) => void;
21
22
  goForward: () => void;
22
23
  goBack: () => void;
23
24
  reload: () => void;
25
+ stopLoading: () => void;
24
26
  }
25
27
  interface KlarnaWebViewNativeEvent {
26
28
  readonly url: string;
@@ -1 +1 @@
1
- {"version":3,"file":"KlarnaStandaloneWebView.d.ts","sourceRoot":"","sources":["../../src/KlarnaStandaloneWebView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,KAAK,EACV,aAAa,EAEb,SAAS,EACV,MAAM,cAAc,CAAC;AACtB,OAAkC,EAEhC,KAAK,8BAA8B,EACpC,MAAM,gDAAgD,CAAC;AAGxD,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,cAAc,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;IACzD,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,CACrB,eAAe,EAAE,4BAA4B,KAC1C,IAAI,CAAC;IACV,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,eAAe,EAAE,4BAA4B,KAAK,IAAI,CAAC;IAC7E,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,eAAe,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACjE,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,aAAa,EAAE,0BAA0B,KAAK,IAAI,CAAC;IAC9E,QAAQ,CAAC,eAAe,CAAC,EAAE,CACzB,kBAAkB,EAAE,+BAA+B,KAChD,IAAI,CAAC;IAEV,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAC7B,sBAAsB,EAAE,mCAAmC,KACxD,IAAI,CAAC;CAEX;AAED,qBAAa,uBAAwB,SAAQ,SAAS,CACpD,kBAAkB,EAClB,GAAG,CACJ;IACC,oBAAoB,EAAE,SAAS,CAC7B,SAAS,CAAC,8BAA8B,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,CACpE,CAAC;gBAEU,KAAK,EAAE,kBAAkB;IAKrC,MAAM;IAwHN,IAAI,GAAI,KAAK,MAAM,UAKjB;IAEF,SAAS,aAKP;IAEF,MAAM,aAKJ;IAEF,MAAM,aAKJ;CACH;AAED,UAAU,wBAAwB;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,4BAA6B,SAAQ,wBAAwB;CAAG;AAEjF,MAAM,WAAW,kBAAmB,SAAQ,wBAAwB;IAClE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,0BAA2B,SAAQ,wBAAwB;IAC1E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;CAGzC;AAED,MAAM,WAAW,mCAAmC;IAClD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED,eAAe,uBAAuB,CAAC"}
1
+ {"version":3,"file":"KlarnaStandaloneWebView.d.ts","sourceRoot":"","sources":["../../src/KlarnaStandaloneWebView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACzD,OAAO,KAAK,EACV,aAAa,EAEb,SAAS,EACV,MAAM,cAAc,CAAC;AACtB,OAAkC,EAEhC,KAAK,8BAA8B,EACpC,MAAM,gDAAgD,CAAC;AAGxD,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,cAAc,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,OAAO,CAAC;IACzD,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,WAAW,CAAC,EAAE,CACrB,eAAe,EAAE,4BAA4B,KAC1C,IAAI,CAAC;IACV,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,eAAe,EAAE,4BAA4B,KAAK,IAAI,CAAC;IAC7E,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,eAAe,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACjE,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,aAAa,EAAE,0BAA0B,KAAK,IAAI,CAAC;IAC9E,QAAQ,CAAC,eAAe,CAAC,EAAE,CACzB,kBAAkB,EAAE,+BAA+B,KAChD,IAAI,CAAC;IAEV,QAAQ,CAAC,mBAAmB,CAAC,EAAE,CAC7B,sBAAsB,EAAE,mCAAmC,KACxD,IAAI,CAAC;CAEX;AAED,qBAAa,uBAAwB,SAAQ,SAAS,CACpD,kBAAkB,EAClB,GAAG,CACJ;IACC,oBAAoB,EAAE,SAAS,CAC7B,SAAS,CAAC,8BAA8B,CAAC,GAAG,QAAQ,CAAC,aAAa,CAAC,CACpE,CAAC;IAEF,OAAO,CAAC,uBAAuB,CAAkB;gBAErC,KAAK,EAAE,kBAAkB;IAKrC,MAAM;IAwIN,IAAI,GAAI,KAAK,MAAM,UAKjB;IAEF,SAAS,aAKP;IAEF,MAAM,aAKJ;IAEF,MAAM,aAKJ;IAEF,WAAW,aAMT;CACH;AAED,UAAU,wBAAwB;IAChC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;CAChC;AAED,MAAM,WAAW,4BAA6B,SAAQ,wBAAwB;CAAG;AAEjF,MAAM,WAAW,kBAAmB,SAAQ,wBAAwB;IAClE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,0BAA2B,SAAQ,wBAAwB;IAC1E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE;QAAE,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAE,CAAC;CAGzC;AAED,MAAM,WAAW,mCAAmC;IAClD,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B;AAED,eAAe,uBAAuB,CAAC"}
@@ -61,6 +61,7 @@ interface RNKlarnaStandaloneWebViewNativeCommands {
61
61
  goBack: (viewRef: React.ElementRef<KlarnaStandaloneWebViewNativeComponentType>) => void;
62
62
  goForward: (viewRef: React.ElementRef<KlarnaStandaloneWebViewNativeComponentType>) => void;
63
63
  reload: (viewRef: React.ElementRef<KlarnaStandaloneWebViewNativeComponentType>) => void;
64
+ stopLoading: (viewRef: React.ElementRef<KlarnaStandaloneWebViewNativeComponentType>) => void;
64
65
  }
65
66
  export declare const Commands: RNKlarnaStandaloneWebViewNativeCommands;
66
67
  declare const _default: KlarnaStandaloneWebViewNativeComponentType;
@@ -1 +1 @@
1
- {"version":3,"file":"KlarnaStandaloneWebViewNativeComponent.d.ts","sourceRoot":"","sources":["../../../src/specs/KlarnaStandaloneWebViewNativeComponent.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"KlarnaStandaloneWebViewNativeComponent.d.ts","sourceRoot":"","sources":["../../../src/specs/KlarnaStandaloneWebViewNativeComponent.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "react-native-klarna-inapp-sdk",
3
3
  "title": "Klarna Mobile SDK React Native",
4
- "version": "2.8.2",
4
+ "version": "2.9.1",
5
5
  "description": "React Native package for Klarna Mobile SDK.",
6
6
  "main": "lib/commonjs/index",
7
7
  "module": "lib/module/index",
@@ -42,7 +42,7 @@ Pod::Spec.new do |s|
42
42
  end
43
43
  end
44
44
 
45
- s.dependency 'KlarnaMobileSDK', '2.13.1'
45
+ s.dependency 'KlarnaMobileSDK', '2.14.0'
46
46
 
47
47
  s.test_spec 'Tests' do |ts|
48
48
  ts.source_files = 'ios/Tests/**/*.{h,m,mm,swift}'
@@ -39,6 +39,8 @@ export class KlarnaStandaloneWebView extends Component<
39
39
  Component<RNKlarnaStandaloneWebViewProps> & Readonly<NativeMethods>
40
40
  >;
41
41
 
42
+ private shouldSuppressStopEvent: boolean = false;
43
+
42
44
  constructor(props: KlarnaWebViewProps) {
43
45
  super(props);
44
46
  this.standaloneWebViewRef = React.createRef();
@@ -65,6 +67,7 @@ export class KlarnaStandaloneWebView extends Component<
65
67
  }>
66
68
  >
67
69
  ) => {
70
+ this.shouldSuppressStopEvent = false;
68
71
  if (this.props.onLoadStart != null) {
69
72
  this.props.onLoadStart(event.nativeEvent.navigationEvent);
70
73
  }
@@ -82,6 +85,13 @@ export class KlarnaStandaloneWebView extends Component<
82
85
  }>
83
86
  >
84
87
  ) => {
88
+ // On Android, stopping a load triggers the platform's page finished
89
+ // callback, which arrives here as onLoadEnd alongside onLoadProgress
90
+ // updates of 100. All of them are dropped so that stopLoading()
91
+ // emits nothing on either platform.
92
+ if (this.shouldSuppressStopEvent) {
93
+ return;
94
+ }
85
95
  if (this.props.onLoadEnd != null) {
86
96
  this.props.onLoadEnd(event.nativeEvent.navigationEvent);
87
97
  }
@@ -101,6 +111,7 @@ export class KlarnaStandaloneWebView extends Component<
101
111
  }>
102
112
  >
103
113
  ) => {
114
+ this.shouldSuppressStopEvent = false;
104
115
  if (this.props.onError != null) {
105
116
  this.props.onError(event.nativeEvent.error);
106
117
  }
@@ -119,6 +130,13 @@ export class KlarnaStandaloneWebView extends Component<
119
130
  }>
120
131
  >
121
132
  ) => {
133
+ // A stopped load reports no further progress. Android reports it as
134
+ // a finished page, with progress 100 more than once, and updates that
135
+ // were already in flight can arrive after the stop as well. The flag
136
+ // stays armed until the next load starts, so all of them are dropped.
137
+ if (this.shouldSuppressStopEvent) {
138
+ return;
139
+ }
122
140
  if (this.props.onLoadProgress != null) {
123
141
  this.props.onLoadProgress(event.nativeEvent.progressEvent);
124
142
  }
@@ -191,6 +209,14 @@ export class KlarnaStandaloneWebView extends Component<
191
209
  RNKlarnaStandaloneWebViewCommands.reload(view);
192
210
  }
193
211
  };
212
+
213
+ stopLoading = () => {
214
+ const view = this.standaloneWebViewRef.current;
215
+ if (view != null) {
216
+ this.shouldSuppressStopEvent = true;
217
+ RNKlarnaStandaloneWebViewCommands.stopLoading(view);
218
+ }
219
+ };
194
220
  }
195
221
 
196
222
  interface KlarnaWebViewNativeEvent {
@@ -89,11 +89,14 @@ interface RNKlarnaStandaloneWebViewNativeCommands {
89
89
  reload: (
90
90
  viewRef: React.ElementRef<KlarnaStandaloneWebViewNativeComponentType>
91
91
  ) => void;
92
+ stopLoading: (
93
+ viewRef: React.ElementRef<KlarnaStandaloneWebViewNativeComponentType>
94
+ ) => void;
92
95
  }
93
96
 
94
97
  export const Commands: RNKlarnaStandaloneWebViewNativeCommands =
95
98
  codegenNativeCommands<RNKlarnaStandaloneWebViewNativeCommands>({
96
- supportedCommands: ['load', 'goBack', 'goForward', 'reload'],
99
+ supportedCommands: ['load', 'goBack', 'goForward', 'reload', 'stopLoading'],
97
100
  });
98
101
 
99
102
  export default codegenNativeComponent<RNKlarnaStandaloneWebViewProps>(