react-native-klarna-inapp-sdk 2.4.9 → 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.
Files changed (121) hide show
  1. package/README.md +2 -1
  2. package/android/build.gradle +3 -1
  3. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/KlarnaMobileSDKPackage.java +5 -1
  4. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/checkout/KlarnaCheckoutViewManager.java +4 -10
  5. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/WebViewResizeObserver.java +28 -0
  6. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/event/ComponentEventSender.java +5 -1
  7. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/ui/ResizeObserverWrapperView.java +2 -2
  8. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/ui/WrapperView.java +2 -2
  9. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/ui/YogaLayoutHelper.java +39 -0
  10. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/expresscheckout/KlarnaExpressCheckoutViewCallback.kt +30 -0
  11. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/expresscheckout/KlarnaExpressCheckoutViewEventSender.kt +80 -0
  12. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/expresscheckout/KlarnaExpressCheckoutViewManager.java +544 -0
  13. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/osm/KlarnaOSMViewEventHandler.java +30 -0
  14. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/osm/KlarnaOSMViewEventSender.java +64 -0
  15. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/osm/KlarnaOSMViewManager.java +356 -0
  16. package/android/src/newarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaExpressCheckoutViewSpec.java +31 -0
  17. package/android/src/newarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaOSMViewSpec.java +31 -0
  18. package/android/src/oldarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaExpressCheckoutViewSpec.java +36 -0
  19. package/android/src/oldarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaOSMViewSpec.java +32 -0
  20. package/android/src/test/java/com/klarna/mobile/sdk/reactnative/KlarnaMobileSDKPackageTest.java +5 -1
  21. package/android/src/test/java/com/klarna/mobile/sdk/reactnative/common/ui/YogaLayoutHelperTest.java +79 -0
  22. package/android/src/test/java/com/klarna/mobile/sdk/reactnative/expresscheckout/KlarnaExpressCheckoutViewManagerTest.java +259 -0
  23. package/android/src/test/java/com/klarna/mobile/sdk/reactnative/osm/KlarnaOSMViewEventHandlerTest.java +136 -0
  24. package/android/src/test/java/com/klarna/mobile/sdk/reactnative/osm/KlarnaOSMViewEventSenderTest.java +184 -0
  25. package/android/src/test/java/com/klarna/mobile/sdk/reactnative/osm/KlarnaOSMViewManagerTest.java +385 -0
  26. package/ios/RNKlarnaMobileSDK.xcodeproj/project.pbxproj +55 -1
  27. package/ios/Sources/KlarnaExpressCheckoutViewManager.h +5 -0
  28. package/ios/Sources/KlarnaExpressCheckoutViewManager.mm +39 -0
  29. package/ios/Sources/KlarnaOSMViewManager.h +5 -0
  30. package/ios/Sources/KlarnaOSMViewManager.mm +59 -0
  31. package/ios/Sources/view/KlarnaExpressCheckoutButtonDelegateProxy.swift +145 -0
  32. package/ios/Sources/view/KlarnaExpressCheckoutViewWrapper.h +41 -0
  33. package/ios/Sources/view/KlarnaOSMViewWrapper.h +48 -0
  34. package/ios/Sources/view/newarch/KlarnaExpressCheckoutViewWrapper.mm +228 -0
  35. package/ios/Sources/view/newarch/KlarnaOSMViewWrapper.mm +294 -0
  36. package/ios/Sources/view/newarch/KlarnaStandaloneWebViewWrapper.mm +20 -13
  37. package/ios/Sources/view/oldarch/KlarnaExpressCheckoutViewWrapper.mm +222 -0
  38. package/ios/Sources/view/oldarch/KlarnaOSMViewWrapper.mm +273 -0
  39. package/ios/Sources/view/oldarch/KlarnaStandaloneWebViewWrapper.mm +11 -13
  40. package/ios/Tests/KlarnaExpressCheckoutViewWrapperTests.m +391 -0
  41. package/ios/Tests/KlarnaOSMViewWrapperTests.m +450 -0
  42. package/ios/Tests/KlarnaStandaloneWebViewWrapperTests.m +105 -0
  43. package/lib/commonjs/KlarnaExpressCheckoutView.js +75 -0
  44. package/lib/commonjs/KlarnaExpressCheckoutView.js.map +1 -0
  45. package/lib/commonjs/KlarnaOSMView.js +94 -0
  46. package/lib/commonjs/KlarnaOSMView.js.map +1 -0
  47. package/lib/commonjs/index.js +99 -0
  48. package/lib/commonjs/index.js.map +1 -1
  49. package/lib/commonjs/specs/KlarnaExpressCheckoutViewNativeComponent.js +11 -0
  50. package/lib/commonjs/specs/KlarnaExpressCheckoutViewNativeComponent.js.map +1 -0
  51. package/lib/commonjs/specs/KlarnaOSMViewNativeComponent.js +16 -0
  52. package/lib/commonjs/specs/KlarnaOSMViewNativeComponent.js.map +1 -0
  53. package/lib/commonjs/types/button/KlarnaButtonShape.js +14 -0
  54. package/lib/commonjs/types/button/KlarnaButtonShape.js.map +1 -0
  55. package/lib/commonjs/types/button/KlarnaButtonStyle.js +13 -0
  56. package/lib/commonjs/types/button/KlarnaButtonStyle.js.map +1 -0
  57. package/lib/commonjs/types/button/KlarnaButtonTheme.js +14 -0
  58. package/lib/commonjs/types/button/KlarnaButtonTheme.js.map +1 -0
  59. package/lib/commonjs/types/common/KlarnaExpressCheckoutSessionOptions.js +9 -0
  60. package/lib/commonjs/types/common/KlarnaExpressCheckoutSessionOptions.js.map +1 -0
  61. package/lib/commonjs/types/common/KlarnaOSMPlacementKey.js +2 -0
  62. package/lib/commonjs/types/common/KlarnaOSMPlacementKey.js.map +1 -0
  63. package/lib/commonjs/types/common/KlarnaTheme.js +14 -0
  64. package/lib/commonjs/types/common/KlarnaTheme.js.map +1 -0
  65. package/lib/module/KlarnaExpressCheckoutView.js +64 -0
  66. package/lib/module/KlarnaExpressCheckoutView.js.map +1 -0
  67. package/lib/module/KlarnaOSMView.js +84 -0
  68. package/lib/module/KlarnaOSMView.js.map +1 -0
  69. package/lib/module/index.js +9 -0
  70. package/lib/module/index.js.map +1 -1
  71. package/lib/module/specs/KlarnaExpressCheckoutViewNativeComponent.js +3 -0
  72. package/lib/module/specs/KlarnaExpressCheckoutViewNativeComponent.js.map +1 -0
  73. package/lib/module/specs/KlarnaOSMViewNativeComponent.js +7 -0
  74. package/lib/module/specs/KlarnaOSMViewNativeComponent.js.map +1 -0
  75. package/lib/module/types/button/KlarnaButtonShape.js +7 -0
  76. package/lib/module/types/button/KlarnaButtonShape.js.map +1 -0
  77. package/lib/module/types/button/KlarnaButtonStyle.js +6 -0
  78. package/lib/module/types/button/KlarnaButtonStyle.js.map +1 -0
  79. package/lib/module/types/button/KlarnaButtonTheme.js +7 -0
  80. package/lib/module/types/button/KlarnaButtonTheme.js.map +1 -0
  81. package/lib/module/types/common/KlarnaExpressCheckoutSessionOptions.js +2 -0
  82. package/lib/module/types/common/KlarnaExpressCheckoutSessionOptions.js.map +1 -0
  83. package/lib/module/types/common/KlarnaOSMPlacementKey.js +2 -0
  84. package/lib/module/types/common/KlarnaOSMPlacementKey.js.map +1 -0
  85. package/lib/module/types/common/KlarnaTheme.js +7 -0
  86. package/lib/module/types/common/KlarnaTheme.js.map +1 -0
  87. package/lib/typescript/KlarnaExpressCheckoutView.d.ts +47 -0
  88. package/lib/typescript/KlarnaExpressCheckoutView.d.ts.map +1 -0
  89. package/lib/typescript/KlarnaOSMView.d.ts +36 -0
  90. package/lib/typescript/KlarnaOSMView.d.ts.map +1 -0
  91. package/lib/typescript/index.d.ts +9 -0
  92. package/lib/typescript/index.d.ts.map +1 -1
  93. package/lib/typescript/specs/KlarnaExpressCheckoutViewNativeComponent.d.ts +45 -0
  94. package/lib/typescript/specs/KlarnaExpressCheckoutViewNativeComponent.d.ts.map +1 -0
  95. package/lib/typescript/specs/KlarnaOSMViewNativeComponent.d.ts +35 -0
  96. package/lib/typescript/specs/KlarnaOSMViewNativeComponent.d.ts.map +1 -0
  97. package/lib/typescript/types/button/KlarnaButtonShape.d.ts +6 -0
  98. package/lib/typescript/types/button/KlarnaButtonShape.d.ts.map +1 -0
  99. package/lib/typescript/types/button/KlarnaButtonStyle.d.ts +5 -0
  100. package/lib/typescript/types/button/KlarnaButtonStyle.d.ts.map +1 -0
  101. package/lib/typescript/types/button/KlarnaButtonTheme.d.ts +6 -0
  102. package/lib/typescript/types/button/KlarnaButtonTheme.d.ts.map +1 -0
  103. package/lib/typescript/types/common/KlarnaExpressCheckoutSessionOptions.d.ts +10 -0
  104. package/lib/typescript/types/common/KlarnaExpressCheckoutSessionOptions.d.ts.map +1 -0
  105. package/lib/typescript/types/common/KlarnaOSMPlacementKey.d.ts +2 -0
  106. package/lib/typescript/types/common/KlarnaOSMPlacementKey.d.ts.map +1 -0
  107. package/lib/typescript/types/common/KlarnaTheme.d.ts +6 -0
  108. package/lib/typescript/types/common/KlarnaTheme.d.ts.map +1 -0
  109. package/package.json +8 -3
  110. package/react-native-klarna-inapp-sdk.podspec +2 -1
  111. package/src/KlarnaExpressCheckoutView.tsx +169 -0
  112. package/src/KlarnaOSMView.tsx +157 -0
  113. package/src/index.tsx +9 -0
  114. package/src/specs/KlarnaExpressCheckoutViewNativeComponent.ts +66 -0
  115. package/src/specs/KlarnaOSMViewNativeComponent.ts +50 -0
  116. package/src/types/button/KlarnaButtonShape.ts +5 -0
  117. package/src/types/button/KlarnaButtonStyle.ts +4 -0
  118. package/src/types/button/KlarnaButtonTheme.ts +5 -0
  119. package/src/types/common/KlarnaExpressCheckoutSessionOptions.ts +13 -0
  120. package/src/types/common/KlarnaOSMPlacementKey.ts +3 -0
  121. 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
@@ -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.9.1'
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(reactContext)
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(ReactApplicationContext reactApplicationContext) {
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 = false;
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(reactAppContext.getCurrentActivity(), null, 0, eventHandler);
108
- ResizeObserverWrapperView<KlarnaCheckoutView> view = new ResizeObserverWrapperView<>(reactAppContext, null, klarnaCheckoutView);
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
 
@@ -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
- postEvent(eventDispatcher, createEvent(viewReference, eventName, params));
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.ReactApplicationContext;
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(ReactApplicationContext context, AttributeSet attrs, T view) {
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.ReactApplicationContext;
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(ReactApplicationContext context, AttributeSet attrs, T view) {
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);
@@ -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
+ }