react-native-klarna-inapp-sdk 2.4.10 → 2.5.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/README.md +2 -1
- package/android/build.gradle +3 -1
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/KlarnaMobileSDKPackage.java +5 -1
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/checkout/KlarnaCheckoutViewManager.java +4 -10
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/WebViewResizeObserver.java +28 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/event/ComponentEventSender.java +5 -1
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/ui/ResizeObserverWrapperView.java +2 -2
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/ui/WrapperView.java +2 -2
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/ui/YogaLayoutHelper.java +39 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/expresscheckout/KlarnaExpressCheckoutViewCallback.kt +30 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/expresscheckout/KlarnaExpressCheckoutViewEventSender.kt +80 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/expresscheckout/KlarnaExpressCheckoutViewManager.java +544 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/osm/KlarnaOSMViewEventHandler.java +30 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/osm/KlarnaOSMViewEventSender.java +64 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/osm/KlarnaOSMViewManager.java +356 -0
- package/android/src/newarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaExpressCheckoutViewSpec.java +31 -0
- package/android/src/newarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaOSMViewSpec.java +31 -0
- package/android/src/oldarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaExpressCheckoutViewSpec.java +36 -0
- package/android/src/oldarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaOSMViewSpec.java +32 -0
- package/android/src/test/java/com/klarna/mobile/sdk/reactnative/KlarnaMobileSDKPackageTest.java +5 -1
- package/android/src/test/java/com/klarna/mobile/sdk/reactnative/common/ui/YogaLayoutHelperTest.java +79 -0
- package/android/src/test/java/com/klarna/mobile/sdk/reactnative/expresscheckout/KlarnaExpressCheckoutViewManagerTest.java +259 -0
- package/android/src/test/java/com/klarna/mobile/sdk/reactnative/osm/KlarnaOSMViewEventHandlerTest.java +136 -0
- package/android/src/test/java/com/klarna/mobile/sdk/reactnative/osm/KlarnaOSMViewEventSenderTest.java +184 -0
- package/android/src/test/java/com/klarna/mobile/sdk/reactnative/osm/KlarnaOSMViewManagerTest.java +385 -0
- package/ios/RNKlarnaMobileSDK.xcodeproj/project.pbxproj +55 -1
- package/ios/Sources/KlarnaExpressCheckoutViewManager.h +5 -0
- package/ios/Sources/KlarnaExpressCheckoutViewManager.mm +39 -0
- package/ios/Sources/KlarnaOSMViewManager.h +5 -0
- package/ios/Sources/KlarnaOSMViewManager.mm +59 -0
- package/ios/Sources/view/KlarnaExpressCheckoutButtonDelegateProxy.swift +145 -0
- package/ios/Sources/view/KlarnaExpressCheckoutViewWrapper.h +41 -0
- package/ios/Sources/view/KlarnaOSMViewWrapper.h +48 -0
- package/ios/Sources/view/newarch/KlarnaExpressCheckoutViewWrapper.mm +228 -0
- package/ios/Sources/view/newarch/KlarnaOSMViewWrapper.mm +294 -0
- package/ios/Sources/view/newarch/KlarnaStandaloneWebViewWrapper.mm +20 -13
- package/ios/Sources/view/oldarch/KlarnaExpressCheckoutViewWrapper.mm +222 -0
- package/ios/Sources/view/oldarch/KlarnaOSMViewWrapper.mm +273 -0
- package/ios/Sources/view/oldarch/KlarnaStandaloneWebViewWrapper.mm +11 -13
- package/ios/Tests/KlarnaExpressCheckoutViewWrapperTests.m +391 -0
- package/ios/Tests/KlarnaOSMViewWrapperTests.m +450 -0
- package/ios/Tests/KlarnaStandaloneWebViewWrapperTests.m +105 -0
- package/lib/commonjs/KlarnaExpressCheckoutView.js +75 -0
- package/lib/commonjs/KlarnaExpressCheckoutView.js.map +1 -0
- package/lib/commonjs/KlarnaOSMView.js +94 -0
- package/lib/commonjs/KlarnaOSMView.js.map +1 -0
- package/lib/commonjs/index.js +99 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/specs/KlarnaExpressCheckoutViewNativeComponent.js +11 -0
- package/lib/commonjs/specs/KlarnaExpressCheckoutViewNativeComponent.js.map +1 -0
- package/lib/commonjs/specs/KlarnaOSMViewNativeComponent.js +16 -0
- package/lib/commonjs/specs/KlarnaOSMViewNativeComponent.js.map +1 -0
- package/lib/commonjs/types/button/KlarnaButtonShape.js +14 -0
- package/lib/commonjs/types/button/KlarnaButtonShape.js.map +1 -0
- package/lib/commonjs/types/button/KlarnaButtonStyle.js +13 -0
- package/lib/commonjs/types/button/KlarnaButtonStyle.js.map +1 -0
- package/lib/commonjs/types/button/KlarnaButtonTheme.js +14 -0
- package/lib/commonjs/types/button/KlarnaButtonTheme.js.map +1 -0
- package/lib/commonjs/types/common/KlarnaExpressCheckoutSessionOptions.js +9 -0
- package/lib/commonjs/types/common/KlarnaExpressCheckoutSessionOptions.js.map +1 -0
- package/lib/commonjs/types/common/KlarnaOSMPlacementKey.js +2 -0
- package/lib/commonjs/types/common/KlarnaOSMPlacementKey.js.map +1 -0
- package/lib/commonjs/types/common/KlarnaTheme.js +14 -0
- package/lib/commonjs/types/common/KlarnaTheme.js.map +1 -0
- package/lib/module/KlarnaExpressCheckoutView.js +64 -0
- package/lib/module/KlarnaExpressCheckoutView.js.map +1 -0
- package/lib/module/KlarnaOSMView.js +84 -0
- package/lib/module/KlarnaOSMView.js.map +1 -0
- package/lib/module/index.js +9 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/specs/KlarnaExpressCheckoutViewNativeComponent.js +3 -0
- package/lib/module/specs/KlarnaExpressCheckoutViewNativeComponent.js.map +1 -0
- package/lib/module/specs/KlarnaOSMViewNativeComponent.js +7 -0
- package/lib/module/specs/KlarnaOSMViewNativeComponent.js.map +1 -0
- package/lib/module/types/button/KlarnaButtonShape.js +7 -0
- package/lib/module/types/button/KlarnaButtonShape.js.map +1 -0
- package/lib/module/types/button/KlarnaButtonStyle.js +6 -0
- package/lib/module/types/button/KlarnaButtonStyle.js.map +1 -0
- package/lib/module/types/button/KlarnaButtonTheme.js +7 -0
- package/lib/module/types/button/KlarnaButtonTheme.js.map +1 -0
- package/lib/module/types/common/KlarnaExpressCheckoutSessionOptions.js +2 -0
- package/lib/module/types/common/KlarnaExpressCheckoutSessionOptions.js.map +1 -0
- package/lib/module/types/common/KlarnaOSMPlacementKey.js +2 -0
- package/lib/module/types/common/KlarnaOSMPlacementKey.js.map +1 -0
- package/lib/module/types/common/KlarnaTheme.js +7 -0
- package/lib/module/types/common/KlarnaTheme.js.map +1 -0
- package/lib/typescript/KlarnaExpressCheckoutView.d.ts +47 -0
- package/lib/typescript/KlarnaExpressCheckoutView.d.ts.map +1 -0
- package/lib/typescript/KlarnaOSMView.d.ts +36 -0
- package/lib/typescript/KlarnaOSMView.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +9 -0
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/specs/KlarnaExpressCheckoutViewNativeComponent.d.ts +45 -0
- package/lib/typescript/specs/KlarnaExpressCheckoutViewNativeComponent.d.ts.map +1 -0
- package/lib/typescript/specs/KlarnaOSMViewNativeComponent.d.ts +35 -0
- package/lib/typescript/specs/KlarnaOSMViewNativeComponent.d.ts.map +1 -0
- package/lib/typescript/types/button/KlarnaButtonShape.d.ts +6 -0
- package/lib/typescript/types/button/KlarnaButtonShape.d.ts.map +1 -0
- package/lib/typescript/types/button/KlarnaButtonStyle.d.ts +5 -0
- package/lib/typescript/types/button/KlarnaButtonStyle.d.ts.map +1 -0
- package/lib/typescript/types/button/KlarnaButtonTheme.d.ts +6 -0
- package/lib/typescript/types/button/KlarnaButtonTheme.d.ts.map +1 -0
- package/lib/typescript/types/common/KlarnaExpressCheckoutSessionOptions.d.ts +10 -0
- package/lib/typescript/types/common/KlarnaExpressCheckoutSessionOptions.d.ts.map +1 -0
- package/lib/typescript/types/common/KlarnaOSMPlacementKey.d.ts +2 -0
- package/lib/typescript/types/common/KlarnaOSMPlacementKey.d.ts.map +1 -0
- package/lib/typescript/types/common/KlarnaTheme.d.ts +6 -0
- package/lib/typescript/types/common/KlarnaTheme.d.ts.map +1 -0
- package/package.json +5 -3
- package/react-native-klarna-inapp-sdk.podspec +2 -1
- package/src/KlarnaExpressCheckoutView.tsx +169 -0
- package/src/KlarnaOSMView.tsx +157 -0
- package/src/index.tsx +9 -0
- package/src/specs/KlarnaExpressCheckoutViewNativeComponent.ts +66 -0
- package/src/specs/KlarnaOSMViewNativeComponent.ts +50 -0
- package/src/types/button/KlarnaButtonShape.ts +5 -0
- package/src/types/button/KlarnaButtonStyle.ts +4 -0
- package/src/types/button/KlarnaButtonTheme.ts +5 -0
- package/src/types/common/KlarnaExpressCheckoutSessionOptions.ts +13 -0
- package/src/types/common/KlarnaOSMPlacementKey.ts +3 -0
- package/src/types/common/KlarnaTheme.ts +5 -0
package/README.md
CHANGED
|
@@ -12,7 +12,8 @@ currently has the following components:
|
|
|
12
12
|
- `KlarnaStandaloneWebView` to integrate Klarna Standalone WebView
|
|
13
13
|
- `KlarnaCheckoutView` to integrate Klarna Checkout
|
|
14
14
|
- `KlarnaSignInSDK` to integrate Klarna Sign In
|
|
15
|
-
|
|
15
|
+
- `KlarnaOSMView` to integrate Klarna On-site Messaging
|
|
16
|
+
- `KlarnaExpressCheckoutView` to integrate Klarna Express Checkout
|
|
16
17
|
This repository also includes a test application that you can use to see how it works.
|
|
17
18
|
|
|
18
19
|
### SDK for Other Platforms
|
package/android/build.gradle
CHANGED
|
@@ -114,7 +114,9 @@ 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.11.1'
|
|
118
|
+
// Required: KlarnaExpressCheckoutButton extends ConstraintLayout.
|
|
119
|
+
implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
|
|
118
120
|
|
|
119
121
|
testImplementation "junit:junit:4.13.2"
|
|
120
122
|
testImplementation 'androidx.test:core:1.5.0'
|
|
@@ -9,6 +9,8 @@ import com.facebook.react.uimanager.ViewManager;
|
|
|
9
9
|
import com.klarna.mobile.sdk.reactnative.checkout.KlarnaCheckoutViewManager;
|
|
10
10
|
import com.klarna.mobile.sdk.reactnative.payments.KlarnaPaymentViewManager;
|
|
11
11
|
import com.klarna.mobile.sdk.reactnative.spec.RNKlarnaSignInModuleSpec;
|
|
12
|
+
import com.klarna.mobile.sdk.reactnative.expresscheckout.KlarnaExpressCheckoutViewManager;
|
|
13
|
+
import com.klarna.mobile.sdk.reactnative.osm.KlarnaOSMViewManager;
|
|
12
14
|
import com.klarna.mobile.sdk.reactnative.standalonewebview.KlarnaStandaloneWebViewManager;
|
|
13
15
|
|
|
14
16
|
import java.util.List;
|
|
@@ -27,7 +29,9 @@ public class KlarnaMobileSDKPackage implements ReactPackage {
|
|
|
27
29
|
return List.of(
|
|
28
30
|
new KlarnaPaymentViewManager(reactContext),
|
|
29
31
|
new KlarnaStandaloneWebViewManager(reactContext),
|
|
30
|
-
new KlarnaCheckoutViewManager(
|
|
32
|
+
new KlarnaCheckoutViewManager(),
|
|
33
|
+
new KlarnaExpressCheckoutViewManager(),
|
|
34
|
+
new KlarnaOSMViewManager()
|
|
31
35
|
);
|
|
32
36
|
}
|
|
33
37
|
}
|
|
@@ -33,7 +33,6 @@ public class KlarnaCheckoutViewManager extends RNKlarnaCheckoutViewSpec<ResizeOb
|
|
|
33
33
|
public static final String COMMAND_SUSPEND = "suspend";
|
|
34
34
|
public static final String COMMAND_RESUME = "resume";
|
|
35
35
|
|
|
36
|
-
private final ReactApplicationContext reactAppContext;
|
|
37
36
|
/**
|
|
38
37
|
* Store a map of views to event dispatchers so we send up events via the right views.
|
|
39
38
|
*/
|
|
@@ -47,10 +46,9 @@ public class KlarnaCheckoutViewManager extends RNKlarnaCheckoutViewSpec<ResizeOb
|
|
|
47
46
|
private final Handler handler = new Handler(Looper.getMainLooper());
|
|
48
47
|
private Runnable javascriptInterfaceInjectionRunnable;
|
|
49
48
|
|
|
50
|
-
public KlarnaCheckoutViewManager(
|
|
49
|
+
public KlarnaCheckoutViewManager() {
|
|
51
50
|
super();
|
|
52
51
|
viewToDispatcher = new WeakHashMap<>();
|
|
53
|
-
reactAppContext = reactApplicationContext;
|
|
54
52
|
eventSender = new KlarnaCheckoutViewEventSender(viewToDispatcher);
|
|
55
53
|
eventHandler = new KlarnaCheckoutViewEventHandler(eventSender, klarnaCheckoutView -> {
|
|
56
54
|
ResizeObserverWrapperView<KlarnaCheckoutView> resizeObserverWrapperView =
|
|
@@ -74,11 +72,7 @@ public class KlarnaCheckoutViewManager extends RNKlarnaCheckoutViewSpec<ResizeOb
|
|
|
74
72
|
return;
|
|
75
73
|
}
|
|
76
74
|
|
|
77
|
-
boolean shouldRetry =
|
|
78
|
-
|
|
79
|
-
if (klarnaCheckoutView.getHeight() == 0) {
|
|
80
|
-
shouldRetry = true;
|
|
81
|
-
}
|
|
75
|
+
boolean shouldRetry = klarnaCheckoutView.getHeight() == 0;
|
|
82
76
|
|
|
83
77
|
if (klarnaCheckoutView.getChildAt(0) instanceof WebView) {
|
|
84
78
|
WebView internalWebView = (WebView) klarnaCheckoutView.getChildAt(0);
|
|
@@ -104,8 +98,8 @@ public class KlarnaCheckoutViewManager extends RNKlarnaCheckoutViewSpec<ResizeOb
|
|
|
104
98
|
@NonNull
|
|
105
99
|
@Override
|
|
106
100
|
protected ResizeObserverWrapperView<KlarnaCheckoutView> createViewInstance(@NonNull ThemedReactContext themedReactContext) {
|
|
107
|
-
KlarnaCheckoutView klarnaCheckoutView = new KlarnaCheckoutView(
|
|
108
|
-
ResizeObserverWrapperView<KlarnaCheckoutView> view = new ResizeObserverWrapperView<>(
|
|
101
|
+
KlarnaCheckoutView klarnaCheckoutView = new KlarnaCheckoutView(themedReactContext.getCurrentActivity(), null, 0, eventHandler);
|
|
102
|
+
ResizeObserverWrapperView<KlarnaCheckoutView> view = new ResizeObserverWrapperView<>(themedReactContext, null, klarnaCheckoutView);
|
|
109
103
|
|
|
110
104
|
checkoutViewToResizeObserverWrapperMap.put(klarnaCheckoutView, view);
|
|
111
105
|
|
package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/WebViewResizeObserver.java
CHANGED
|
@@ -140,6 +140,34 @@ public class WebViewResizeObserver {
|
|
|
140
140
|
" });\n");
|
|
141
141
|
break;
|
|
142
142
|
}
|
|
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
|
+
|
|
143
171
|
return scriptBuilder.toString();
|
|
144
172
|
}
|
|
145
173
|
}
|
|
@@ -28,6 +28,7 @@ public abstract class ComponentEventSender<T extends View> {
|
|
|
28
28
|
}
|
|
29
29
|
}
|
|
30
30
|
|
|
31
|
+
@Nullable
|
|
31
32
|
protected ComponentEvent createEvent(@Nullable View view, @NonNull String eventName, @Nullable WritableMap params) {
|
|
32
33
|
T viewReference = getView(view);
|
|
33
34
|
if (viewReference == null) {
|
|
@@ -40,7 +41,10 @@ public abstract class ComponentEventSender<T extends View> {
|
|
|
40
41
|
T viewReference = getView(view);
|
|
41
42
|
if (viewReference != null) {
|
|
42
43
|
EventDispatcher eventDispatcher = UIManagerHelper.getEventDispatcherForReactTag((ReactContext) viewReference.getContext(), viewReference.getId());
|
|
43
|
-
|
|
44
|
+
ComponentEvent event = createEvent(viewReference, eventName, params);
|
|
45
|
+
if (event != null) {
|
|
46
|
+
postEvent(eventDispatcher, event);
|
|
47
|
+
}
|
|
44
48
|
}
|
|
45
49
|
}
|
|
46
50
|
|
|
@@ -12,7 +12,7 @@ import android.webkit.WebView;
|
|
|
12
12
|
import androidx.annotation.NonNull;
|
|
13
13
|
import androidx.annotation.Nullable;
|
|
14
14
|
|
|
15
|
-
import com.facebook.react.bridge.
|
|
15
|
+
import com.facebook.react.bridge.ReactContext;
|
|
16
16
|
import com.klarna.mobile.sdk.reactnative.common.WebViewResizeObserver;
|
|
17
17
|
|
|
18
18
|
import java.lang.ref.WeakReference;
|
|
@@ -32,7 +32,7 @@ public class ResizeObserverWrapperView<T extends ViewGroup> extends WrapperView<
|
|
|
32
32
|
super(context, attrs, defStyleAttr);
|
|
33
33
|
}
|
|
34
34
|
|
|
35
|
-
public ResizeObserverWrapperView(
|
|
35
|
+
public ResizeObserverWrapperView(ReactContext context, AttributeSet attrs, T view) {
|
|
36
36
|
super(context, attrs, view);
|
|
37
37
|
}
|
|
38
38
|
|
|
@@ -9,7 +9,7 @@ import android.widget.FrameLayout;
|
|
|
9
9
|
import androidx.annotation.NonNull;
|
|
10
10
|
import androidx.annotation.Nullable;
|
|
11
11
|
|
|
12
|
-
import com.facebook.react.bridge.
|
|
12
|
+
import com.facebook.react.bridge.ReactContext;
|
|
13
13
|
|
|
14
14
|
public class WrapperView<T extends View> extends FrameLayout {
|
|
15
15
|
|
|
@@ -19,7 +19,7 @@ public class WrapperView<T extends View> extends FrameLayout {
|
|
|
19
19
|
super(context, attrs, defStyleAttr);
|
|
20
20
|
}
|
|
21
21
|
|
|
22
|
-
public WrapperView(
|
|
22
|
+
public WrapperView(ReactContext context, AttributeSet attrs, T view) {
|
|
23
23
|
super(context, attrs);
|
|
24
24
|
this.view = view;
|
|
25
25
|
ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
|
package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/ui/YogaLayoutHelper.java
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
package com.klarna.mobile.sdk.reactnative.common.ui;
|
|
2
|
+
|
|
3
|
+
import android.view.View;
|
|
4
|
+
import android.view.ViewGroup;
|
|
5
|
+
|
|
6
|
+
import androidx.annotation.NonNull;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Shared layout helper for native child views hosted inside React Native's Yoga layout engine.
|
|
10
|
+
*
|
|
11
|
+
* <p>Yoga suppresses {@code requestLayout()} from native child views, so SDK-provided views
|
|
12
|
+
* (e.g. KlarnaExpressCheckoutButton, KlarnaOSMView) won't measure or layout correctly without
|
|
13
|
+
* a manual pass. Both the Express Checkout and OSM view managers use this helper to perform
|
|
14
|
+
* that manual measure+layout.
|
|
15
|
+
*/
|
|
16
|
+
public final class YogaLayoutHelper {
|
|
17
|
+
|
|
18
|
+
private YogaLayoutHelper() {
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Measures and lays out a child view to fill the wrapper's width while using its own
|
|
23
|
+
* intrinsic height.
|
|
24
|
+
*
|
|
25
|
+
* @param wrapper the parent container whose width determines the child's width
|
|
26
|
+
* @param child the native child view to measure and lay out
|
|
27
|
+
*/
|
|
28
|
+
public static void measureAndLayout(@NonNull ViewGroup wrapper, @NonNull View child) {
|
|
29
|
+
int width = wrapper.getMeasuredWidth();
|
|
30
|
+
if (width <= 0) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
child.measure(
|
|
34
|
+
View.MeasureSpec.makeMeasureSpec(width, View.MeasureSpec.EXACTLY),
|
|
35
|
+
View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)
|
|
36
|
+
);
|
|
37
|
+
child.layout(0, 0, width, child.getMeasuredHeight());
|
|
38
|
+
}
|
|
39
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
package com.klarna.mobile.sdk.reactnative.expresscheckout
|
|
2
|
+
|
|
3
|
+
import com.klarna.mobile.sdk.api.expresscheckout.KlarnaExpressCheckoutButton
|
|
4
|
+
import com.klarna.mobile.sdk.api.expresscheckout.KlarnaExpressCheckoutButtonAuthorizationResponse
|
|
5
|
+
import com.klarna.mobile.sdk.api.expresscheckout.KlarnaExpressCheckoutButtonCallback
|
|
6
|
+
import com.klarna.mobile.sdk.api.expresscheckout.KlarnaExpressCheckoutError
|
|
7
|
+
import android.widget.FrameLayout
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Implements the SDK's callback interface and forwards events to the React Native event sender.
|
|
11
|
+
*/
|
|
12
|
+
internal class KlarnaExpressCheckoutViewCallback(
|
|
13
|
+
private val containerView: FrameLayout,
|
|
14
|
+
private val eventSender: KlarnaExpressCheckoutViewEventSender
|
|
15
|
+
) : KlarnaExpressCheckoutButtonCallback {
|
|
16
|
+
|
|
17
|
+
override fun onAuthorized(
|
|
18
|
+
view: KlarnaExpressCheckoutButton,
|
|
19
|
+
response: KlarnaExpressCheckoutButtonAuthorizationResponse
|
|
20
|
+
) {
|
|
21
|
+
eventSender.sendOnAuthorizedEvent(containerView, response)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
override fun onError(
|
|
25
|
+
view: KlarnaExpressCheckoutButton,
|
|
26
|
+
error: KlarnaExpressCheckoutError
|
|
27
|
+
) {
|
|
28
|
+
eventSender.sendKlarnaExpressCheckoutError(containerView, error)
|
|
29
|
+
}
|
|
30
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
package com.klarna.mobile.sdk.reactnative.expresscheckout
|
|
2
|
+
|
|
3
|
+
import com.facebook.react.uimanager.events.EventDispatcher
|
|
4
|
+
import com.klarna.mobile.sdk.api.expresscheckout.KlarnaExpressCheckoutButtonAuthorizationResponse
|
|
5
|
+
import com.klarna.mobile.sdk.api.expresscheckout.KlarnaExpressCheckoutError
|
|
6
|
+
import com.klarna.mobile.sdk.reactnative.common.event.ComponentEventSender
|
|
7
|
+
import android.widget.FrameLayout
|
|
8
|
+
import com.klarna.mobile.sdk.reactnative.common.util.ArgumentsUtil
|
|
9
|
+
|
|
10
|
+
internal class KlarnaExpressCheckoutViewEventSender(
|
|
11
|
+
viewToDispatcher: Map<FrameLayout, EventDispatcher>
|
|
12
|
+
) : ComponentEventSender<FrameLayout>(viewToDispatcher) {
|
|
13
|
+
|
|
14
|
+
override fun getCallbackEventNames(): Collection<String> = listOf(
|
|
15
|
+
EVENT_NAME_ON_AUTHORIZED,
|
|
16
|
+
EVENT_NAME_ON_ERROR,
|
|
17
|
+
EVENT_NAME_ON_RESIZED
|
|
18
|
+
)
|
|
19
|
+
|
|
20
|
+
fun sendOnAuthorizedEvent(
|
|
21
|
+
view: FrameLayout,
|
|
22
|
+
response: KlarnaExpressCheckoutButtonAuthorizationResponse
|
|
23
|
+
) {
|
|
24
|
+
val responseMap = mapOf<String, Any>(
|
|
25
|
+
"showForm" to response.showForm,
|
|
26
|
+
"approved" to response.approved,
|
|
27
|
+
"finalizedRequired" to response.finalizeRequired,
|
|
28
|
+
"clientToken" to (response.clientToken ?: ""),
|
|
29
|
+
"authorizationToken" to (response.authorizationToken ?: ""),
|
|
30
|
+
"sessionId" to (response.sessionId ?: ""),
|
|
31
|
+
"collectedShippingAddress" to (response.collectedShippingAddress ?: ""),
|
|
32
|
+
"merchantReference1" to (response.merchantReference1 ?: ""),
|
|
33
|
+
"merchantReference2" to (response.merchantReference2 ?: "")
|
|
34
|
+
)
|
|
35
|
+
val authorizationResponseMap = ArgumentsUtil.createMap(responseMap)
|
|
36
|
+
val params = ArgumentsUtil.createMap(
|
|
37
|
+
mapOf<String, Any>("authorizationResponse" to authorizationResponseMap)
|
|
38
|
+
)
|
|
39
|
+
postEventForView(view, EVENT_NAME_ON_AUTHORIZED, params)
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
fun sendKlarnaExpressCheckoutError(
|
|
43
|
+
view: FrameLayout,
|
|
44
|
+
error: KlarnaExpressCheckoutError
|
|
45
|
+
) {
|
|
46
|
+
sendKlarnaExpressCheckoutError(view, error.name, error.message, error.isFatal)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
fun sendKlarnaExpressCheckoutError(
|
|
50
|
+
view: FrameLayout,
|
|
51
|
+
name: String,
|
|
52
|
+
message: String,
|
|
53
|
+
isFatal: Boolean
|
|
54
|
+
) {
|
|
55
|
+
val errorMap = ArgumentsUtil.createMap(
|
|
56
|
+
mapOf<String, Any>(
|
|
57
|
+
"name" to name,
|
|
58
|
+
"message" to message,
|
|
59
|
+
"isFatal" to isFatal
|
|
60
|
+
)
|
|
61
|
+
)
|
|
62
|
+
val params = ArgumentsUtil.createMap(
|
|
63
|
+
mapOf<String, Any>("error" to errorMap)
|
|
64
|
+
)
|
|
65
|
+
postEventForView(view, EVENT_NAME_ON_ERROR, params)
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
fun sendOnResizedEvent(view: FrameLayout, height: Int) {
|
|
69
|
+
val params = ArgumentsUtil.createMap(
|
|
70
|
+
mapOf<String, Any>("height" to height.toString())
|
|
71
|
+
)
|
|
72
|
+
postEventForView(view, EVENT_NAME_ON_RESIZED, params)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
companion object {
|
|
76
|
+
private const val EVENT_NAME_ON_AUTHORIZED = "onAuthorized"
|
|
77
|
+
private const val EVENT_NAME_ON_ERROR = "onError"
|
|
78
|
+
private const val EVENT_NAME_ON_RESIZED = "onResized"
|
|
79
|
+
}
|
|
80
|
+
}
|