react-native-klarna-inapp-sdk 2.8.1 → 2.9.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.
- package/android/build.gradle +3 -1
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/WebViewResizeObserver.java +15 -28
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/standalonewebview/KlarnaStandaloneWebViewManager.java +13 -1
- package/android/src/oldarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaStandaloneWebViewSpec.java +2 -0
- package/android/src/test/java/com/klarna/mobile/sdk/reactnative/common/WebViewResizeObserverTest.java +97 -0
- package/ios/Sources/KlarnaStandaloneWebViewManager.mm +11 -0
- package/ios/Sources/view/KlarnaExpressCheckoutButtonDelegateProxy.swift +14 -11
- package/ios/Sources/view/KlarnaStandaloneWebViewWrapper.h +2 -0
- package/ios/Sources/view/newarch/KlarnaStandaloneWebViewWrapper.mm +21 -3
- package/ios/Sources/view/oldarch/KlarnaStandaloneWebViewWrapper.mm +22 -4
- package/lib/commonjs/KlarnaStandaloneWebView.js +24 -0
- package/lib/commonjs/KlarnaStandaloneWebView.js.map +1 -1
- package/lib/commonjs/specs/KlarnaStandaloneWebViewNativeComponent.js +1 -1
- package/lib/commonjs/specs/KlarnaStandaloneWebViewNativeComponent.js.map +1 -1
- package/lib/module/KlarnaStandaloneWebView.js +24 -0
- package/lib/module/KlarnaStandaloneWebView.js.map +1 -1
- package/lib/module/specs/KlarnaStandaloneWebViewNativeComponent.js +1 -1
- package/lib/module/specs/KlarnaStandaloneWebViewNativeComponent.js.map +1 -1
- package/lib/typescript/KlarnaStandaloneWebView.d.ts +2 -0
- package/lib/typescript/KlarnaStandaloneWebView.d.ts.map +1 -1
- package/lib/typescript/specs/KlarnaStandaloneWebViewNativeComponent.d.ts +1 -0
- package/lib/typescript/specs/KlarnaStandaloneWebViewNativeComponent.d.ts.map +1 -1
- package/package.json +1 -1
- package/react-native-klarna-inapp-sdk.podspec +1 -1
- package/src/KlarnaStandaloneWebView.tsx +26 -0
- package/src/specs/KlarnaStandaloneWebViewNativeComponent.ts +4 -1
package/android/build.gradle
CHANGED
|
@@ -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.
|
|
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
|
package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/WebViewResizeObserver.java
CHANGED
|
@@ -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>
|
|
@@ -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
|
|
@@ -2,16 +2,19 @@ import Foundation
|
|
|
2
2
|
import KlarnaCore
|
|
3
3
|
import KlarnaPayments
|
|
4
4
|
|
|
5
|
+
// KEC types are qualified with `KlarnaPayments.` to avoid an "ambiguous for type
|
|
6
|
+
// lookup" error: the `KlarnaMobileSDK` umbrella also re-exports them as typealiases.
|
|
7
|
+
|
|
5
8
|
/// A Swift class that implements the pure-Swift `KlarnaExpressCheckoutButtonDelegate` protocol
|
|
6
9
|
/// and forwards events to closures that can be set from Obj-C++ wrapper code.
|
|
7
|
-
@objc public class KlarnaExpressCheckoutButtonDelegateProxy: NSObject, KlarnaExpressCheckoutButtonDelegate {
|
|
10
|
+
@objc public class KlarnaExpressCheckoutButtonDelegateProxy: NSObject, KlarnaPayments.KlarnaExpressCheckoutButtonDelegate {
|
|
8
11
|
|
|
9
12
|
@objc public var onAuthorizedHandler: ((_ response: NSDictionary) -> Void)?
|
|
10
13
|
@objc public var onErrorHandler: ((_ name: String, _ message: String, _ isFatal: Bool) -> Void)?
|
|
11
14
|
|
|
12
15
|
public func onAuthorized(
|
|
13
|
-
view: KlarnaExpressCheckoutButton,
|
|
14
|
-
response: KlarnaExpressCheckoutButtonAuthorizationResponse
|
|
16
|
+
view: KlarnaPayments.KlarnaExpressCheckoutButton,
|
|
17
|
+
response: KlarnaPayments.KlarnaExpressCheckoutButtonAuthorizationResponse
|
|
15
18
|
) {
|
|
16
19
|
let responseDict: NSDictionary = [
|
|
17
20
|
"showForm": response.showForm,
|
|
@@ -28,7 +31,7 @@ import KlarnaPayments
|
|
|
28
31
|
}
|
|
29
32
|
|
|
30
33
|
public func onError(
|
|
31
|
-
view: KlarnaExpressCheckoutButton,
|
|
34
|
+
view: KlarnaPayments.KlarnaExpressCheckoutButton,
|
|
32
35
|
error: KlarnaError
|
|
33
36
|
) {
|
|
34
37
|
onErrorHandler?(error.name, error.message, error.isFatal)
|
|
@@ -54,18 +57,18 @@ import KlarnaPayments
|
|
|
54
57
|
sessionData: String?,
|
|
55
58
|
environment: String?,
|
|
56
59
|
region: String?
|
|
57
|
-
) -> KlarnaExpressCheckoutButton? {
|
|
60
|
+
) -> KlarnaPayments.KlarnaExpressCheckoutButton? {
|
|
58
61
|
// Build session options based on the explicit sessionType.
|
|
59
|
-
let sessionOptions: KlarnaExpressCheckoutSessionOptions
|
|
62
|
+
let sessionOptions: KlarnaPayments.KlarnaExpressCheckoutSessionOptions
|
|
60
63
|
if sessionType == "clientToken" {
|
|
61
|
-
sessionOptions = KlarnaExpressCheckoutSessionOptions.ServerSideSession(
|
|
64
|
+
sessionOptions = KlarnaPayments.KlarnaExpressCheckoutSessionOptions.ServerSideSession(
|
|
62
65
|
clientToken: clientToken ?? "",
|
|
63
66
|
autoFinalize: autoFinalize,
|
|
64
67
|
collectShippingAddress: collectShippingAddress,
|
|
65
68
|
sessionData: sessionData
|
|
66
69
|
)
|
|
67
70
|
} else {
|
|
68
|
-
sessionOptions = KlarnaExpressCheckoutSessionOptions.ClientSideSession(
|
|
71
|
+
sessionOptions = KlarnaPayments.KlarnaExpressCheckoutSessionOptions.ClientSideSession(
|
|
69
72
|
clientId: clientId ?? "",
|
|
70
73
|
sessionData: sessionData ?? "",
|
|
71
74
|
autoFinalize: autoFinalize,
|
|
@@ -103,7 +106,7 @@ import KlarnaPayments
|
|
|
103
106
|
}
|
|
104
107
|
}
|
|
105
108
|
|
|
106
|
-
let styleConfig = KlarnaExpressCheckoutButtonStyleConfiguration(
|
|
109
|
+
let styleConfig = KlarnaPayments.KlarnaExpressCheckoutButtonStyleConfiguration(
|
|
107
110
|
theme: buttonTheme,
|
|
108
111
|
shape: buttonShape,
|
|
109
112
|
style: klarnaButtonStyle
|
|
@@ -130,7 +133,7 @@ import KlarnaPayments
|
|
|
130
133
|
}
|
|
131
134
|
}
|
|
132
135
|
|
|
133
|
-
let options = KlarnaExpressCheckoutButtonOptions(
|
|
136
|
+
let options = KlarnaPayments.KlarnaExpressCheckoutButtonOptions(
|
|
134
137
|
sessionOptions: sessionOptions,
|
|
135
138
|
returnUrl: returnUrl,
|
|
136
139
|
delegate: delegate,
|
|
@@ -140,6 +143,6 @@ import KlarnaPayments
|
|
|
140
143
|
region: klarnaRegion
|
|
141
144
|
)
|
|
142
145
|
|
|
143
|
-
return KlarnaExpressCheckoutButton(options: options)
|
|
146
|
+
return KlarnaPayments.KlarnaExpressCheckoutButton(options: options)
|
|
144
147
|
}
|
|
145
148
|
}
|
|
@@ -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":";;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AAMA,IAAAC,uCAAA,GAAAF,uBAAA,CAAAC,OAAA;AAGwD,SAAAD,wBAAAG,CAAA,EAAAC,CAAA,6BAAAC,OAAA,MAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAL,uBAAA,YAAAA,CAAAG,CAAA,EAAAC,CAAA,SAAAA,CAAA,IAAAD,CAAA,IAAAA,CAAA,CAAAK,UAAA,SAAAL,CAAA,MAAAM,CAAA,EAAAC,CAAA,EAAAC,CAAA,KAAAC,SAAA,QAAAC,OAAA,EAAAV,CAAA,iBAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,SAAAQ,CAAA,MAAAF,CAAA,GAAAL,CAAA,GAAAG,CAAA,GAAAD,CAAA,QAAAG,CAAA,CAAAK,GAAA,CAAAX,CAAA,UAAAM,CAAA,CAAAM,GAAA,CAAAZ,CAAA,GAAAM,CAAA,CAAAO,GAAA,CAAAb,CAAA,EAAAQ,CAAA,gBAAAP,CAAA,IAAAD,CAAA,gBAAAC,CAAA,OAAAa,cAAA,CAAAC,IAAA,CAAAf,CAAA,EAAAC,CAAA,OAAAM,CAAA,IAAAD,CAAA,GAAAU,MAAA,CAAAC,cAAA,KAAAD,MAAA,CAAAE,wBAAA,CAAAlB,CAAA,EAAAC,CAAA,OAAAM,CAAA,CAAAK,GAAA,IAAAL,CAAA,CAAAM,GAAA,IAAAP,CAAA,CAAAE,CAAA,EAAAP,CAAA,EAAAM,CAAA,IAAAC,CAAA,CAAAP,CAAA,IAAAD,CAAA,CAAAC,CAAA,WAAAO,CAAA,KAAAR,CAAA,EAAAC,CAAA;AAwBjD,MAAMkB,uBAAuB,SAASC,gBAAS,CAGpD;
|
|
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;
|
|
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;
|
|
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;
|
|
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;
|
|
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
|
@@ -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>(
|