react-native-klarna-inapp-sdk 2.1.13 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/README.md +100 -270
  2. package/android/build.gradle +84 -106
  3. package/android/gradle.properties +7 -0
  4. package/android/src/main/AndroidManifest.xml +2 -1
  5. package/android/src/main/AndroidManifestNew.xml +4 -0
  6. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/KlarnaMobileSDKPackage.java +33 -0
  7. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/ArgumentsUtil.java +62 -0
  8. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/WebViewResizeObserver.java +100 -0
  9. package/android/src/main/java/com/klarna/{inapp/sdk → mobile/sdk/reactnative/payments}/KlarnaPaymentEvent.java +9 -19
  10. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/payments/KlarnaPaymentViewManager.java +343 -0
  11. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/payments/PaymentViewWrapper.java +78 -0
  12. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/standalonewebview/KlarnaStandaloneWebViewEvent.java +67 -0
  13. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/standalonewebview/KlarnaStandaloneWebViewEventSender.java +139 -0
  14. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/standalonewebview/KlarnaStandaloneWebViewManager.java +205 -0
  15. package/android/src/newarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaPaymentViewSpec.java +32 -0
  16. package/android/src/newarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaStandaloneWebViewSpec.java +33 -0
  17. package/android/src/oldarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaPaymentViewSpec.java +25 -0
  18. package/android/src/oldarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaStandaloneWebViewSpec.java +19 -0
  19. package/android/src/test/java/com/klarna/{inapp/sdk/KlarnaPaymentViewPackageTest.java → mobile/sdk/reactnative/KlarnaMobileSDKPackageTest.java} +9 -4
  20. package/android/src/test/java/com/klarna/{inapp/sdk → mobile/sdk/reactnative/payments}/KlarnaPaymentEventTest.java +17 -20
  21. package/android/src/test/java/com/klarna/{inapp/sdk → mobile/sdk/reactnative/payments}/KlarnaPaymentViewManagerTest.java +62 -36
  22. package/ios/{KlarnaInAppSDK.xcodeproj → RNKlarnaMobileSDK.xcodeproj}/project.pbxproj +147 -87
  23. package/ios/{KlarnaInAppSDK.xcodeproj/xcshareddata/xcschemes/KlarnaInAppSDK.xcscheme → RNKlarnaMobileSDK.xcodeproj/xcshareddata/xcschemes/RNKlarnaMobileSDK.xcscheme} +9 -9
  24. package/ios/{KlarnaInAppSDK.xcodeproj/xcshareddata/xcschemes/KlarnaInAppSDKTests.xcscheme → RNKlarnaMobileSDK.xcodeproj/xcshareddata/xcschemes/RNKlarnaMobileSDKTests.xcscheme} +3 -3
  25. package/ios/Sources/KlarnaPaymentViewManager.h +5 -0
  26. package/ios/Sources/{KlarnaPaymentView.m → KlarnaPaymentViewManager.mm} +10 -15
  27. package/ios/Sources/KlarnaStandaloneWebViewManager.h +5 -0
  28. package/ios/Sources/KlarnaStandaloneWebViewManager.mm +77 -0
  29. package/ios/Sources/view/newarch/KlarnaStandaloneWebViewWrapper.h +29 -0
  30. package/ios/Sources/view/newarch/KlarnaStandaloneWebViewWrapper.mm +265 -0
  31. package/ios/Sources/view/newarch/PaymentViewWrapper.h +33 -0
  32. package/ios/Sources/view/newarch/PaymentViewWrapper.mm +240 -0
  33. package/ios/Sources/view/oldarch/KlarnaStandaloneWebViewWrapper.h +42 -0
  34. package/ios/Sources/view/oldarch/KlarnaStandaloneWebViewWrapper.mm +195 -0
  35. package/ios/Sources/view/{PaymentViewWrapper.h → oldarch/PaymentViewWrapper.h} +9 -7
  36. package/ios/Sources/view/{PaymentViewWrapper.m → oldarch/PaymentViewWrapper.mm} +40 -27
  37. package/ios/Tests/PaymentViewWrapperTests.m +8 -10
  38. package/lib/commonjs/KlarnaPaymentView.js +192 -0
  39. package/lib/commonjs/KlarnaPaymentView.js.map +1 -0
  40. package/lib/commonjs/KlarnaStandaloneWebView.js +81 -0
  41. package/lib/commonjs/KlarnaStandaloneWebView.js.map +1 -0
  42. package/lib/commonjs/index.js +28 -0
  43. package/lib/commonjs/index.js.map +1 -0
  44. package/lib/commonjs/specs/KlarnaPaymentViewNativeComponent.js +16 -0
  45. package/lib/commonjs/specs/KlarnaPaymentViewNativeComponent.js.map +1 -0
  46. package/lib/commonjs/specs/KlarnaStandaloneWebViewNativeComponent.js +16 -0
  47. package/lib/commonjs/specs/KlarnaStandaloneWebViewNativeComponent.js.map +1 -0
  48. package/lib/module/KlarnaPaymentView.js +182 -0
  49. package/lib/module/KlarnaPaymentView.js.map +1 -0
  50. package/lib/module/KlarnaStandaloneWebView.js +71 -0
  51. package/lib/module/KlarnaStandaloneWebView.js.map +1 -0
  52. package/lib/module/index.js +3 -0
  53. package/lib/module/index.js.map +1 -0
  54. package/lib/module/specs/KlarnaPaymentViewNativeComponent.js +7 -0
  55. package/lib/module/specs/KlarnaPaymentViewNativeComponent.js.map +1 -0
  56. package/lib/module/specs/KlarnaStandaloneWebViewNativeComponent.js +7 -0
  57. package/lib/module/specs/KlarnaStandaloneWebViewNativeComponent.js.map +1 -0
  58. package/lib/typescript/KlarnaPaymentView.d.ts +51 -0
  59. package/lib/typescript/KlarnaPaymentView.d.ts.map +1 -0
  60. package/lib/typescript/KlarnaStandaloneWebView.d.ts +46 -0
  61. package/lib/typescript/KlarnaStandaloneWebView.d.ts.map +1 -0
  62. package/lib/typescript/index.d.ts +3 -0
  63. package/lib/typescript/index.d.ts.map +1 -0
  64. package/lib/typescript/specs/KlarnaPaymentViewNativeComponent.d.ts +49 -0
  65. package/lib/typescript/specs/KlarnaPaymentViewNativeComponent.d.ts.map +1 -0
  66. package/lib/typescript/specs/KlarnaStandaloneWebViewNativeComponent.d.ts +65 -0
  67. package/lib/typescript/specs/KlarnaStandaloneWebViewNativeComponent.d.ts.map +1 -0
  68. package/package.json +86 -14
  69. package/react-native-klarna-inapp-sdk.podspec +32 -13
  70. package/src/KlarnaPaymentView.tsx +323 -0
  71. package/src/KlarnaStandaloneWebView.tsx +217 -0
  72. package/src/index.tsx +2 -0
  73. package/src/specs/KlarnaPaymentViewNativeComponent.ts +99 -0
  74. package/src/specs/KlarnaStandaloneWebViewNativeComponent.ts +96 -0
  75. package/.gitattributes +0 -3
  76. package/.watchmanconfig +0 -1
  77. package/.yarnrc +0 -5
  78. package/CHANGELOG.md +0 -116
  79. package/android/README.md +0 -14
  80. package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  81. package/android/gradle/wrapper/gradle-wrapper.properties +0 -6
  82. package/android/gradlew +0 -172
  83. package/android/gradlew.bat +0 -84
  84. package/android/src/main/java/com/klarna/inapp/sdk/HeightListener.java +0 -159
  85. package/android/src/main/java/com/klarna/inapp/sdk/KlarnaPaymentViewManager.java +0 -282
  86. package/android/src/main/java/com/klarna/inapp/sdk/KlarnaPaymentViewPackage.java +0 -25
  87. package/android/src/main/java/com/klarna/inapp/sdk/Mappable.java +0 -10
  88. package/android/src/main/java/com/klarna/inapp/sdk/MappableKlarnaPaymentsSDKError.java +0 -31
  89. package/android/src/main/java/com/klarna/inapp/sdk/PaymentViewWrapper.java +0 -131
  90. package/android/src/test/java/com/klarna/inapp/sdk/MappableKlarnaPaymentsSDKErrorTest.java +0 -45
  91. package/babel.config.js +0 -3
  92. package/integration-tests/build.gradle +0 -59
  93. package/integration-tests/gradle/wrapper/gradle-wrapper.jar +0 -0
  94. package/integration-tests/gradle/wrapper/gradle-wrapper.properties +0 -6
  95. package/integration-tests/gradlew +0 -172
  96. package/integration-tests/gradlew.bat +0 -84
  97. package/integration-tests/settings.gradle +0 -2
  98. package/integration-tests/src/test/resources/junit-platform.properties +0 -4
  99. package/ios/KlarnaInAppSDK.xcworkspace/contents.xcworkspacedata +0 -10
  100. package/ios/KlarnaInAppSDK.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  101. package/ios/Podfile +0 -73
  102. package/ios/Sources/KlarnaPaymentView.h +0 -5
  103. package/scripts/bootstrap.js +0 -29
  104. package/src/index.js +0 -72
@@ -0,0 +1,205 @@
1
+ package com.klarna.mobile.sdk.reactnative.standalonewebview;
2
+
3
+ import android.app.Application;
4
+ import android.graphics.Bitmap;
5
+ import android.os.Build;
6
+ import android.webkit.RenderProcessGoneDetail;
7
+ import android.webkit.WebResourceError;
8
+ import android.webkit.WebResourceRequest;
9
+
10
+ import androidx.annotation.NonNull;
11
+ import androidx.annotation.Nullable;
12
+
13
+ import com.facebook.react.bridge.ReactApplicationContext;
14
+ import com.facebook.react.bridge.ReactContext;
15
+ import com.facebook.react.bridge.ReadableArray;
16
+ import com.facebook.react.common.MapBuilder;
17
+ import com.facebook.react.uimanager.ThemedReactContext;
18
+ import com.facebook.react.uimanager.UIManagerHelper;
19
+ import com.facebook.react.uimanager.annotations.ReactProp;
20
+ import com.facebook.react.uimanager.events.EventDispatcher;
21
+ import com.klarna.mobile.sdk.KlarnaMobileSDKError;
22
+ import com.klarna.mobile.sdk.api.KlarnaEventHandler;
23
+ import com.klarna.mobile.sdk.api.KlarnaProductEvent;
24
+ import com.klarna.mobile.sdk.api.component.KlarnaComponent;
25
+ import com.klarna.mobile.sdk.api.standalonewebview.KlarnaStandaloneWebView;
26
+ import com.klarna.mobile.sdk.api.standalonewebview.KlarnaStandaloneWebViewClient;
27
+ import com.klarna.mobile.sdk.reactnative.spec.RNKlarnaStandaloneWebViewSpec;
28
+
29
+ import java.lang.ref.WeakReference;
30
+ import java.util.HashMap;
31
+ import java.util.Map;
32
+ import java.util.Objects;
33
+
34
+ public class KlarnaStandaloneWebViewManager extends RNKlarnaStandaloneWebViewSpec<KlarnaStandaloneWebView> {
35
+
36
+ // Commands that can be triggered from React Native side
37
+ public static final String COMMAND_LOAD = "load";
38
+ public static final String COMMAND_GO_FORWARD = "goForward";
39
+ public static final String COMMAND_GO_BACK = "goBack";
40
+ public static final String COMMAND_RELOAD = "reload";
41
+
42
+ private static final String REACT_CLASS = "RNKlarnaStandaloneWebView";
43
+
44
+ // Store a list of views to event dispatchers so we send up events via the right views.
45
+ private final Map<WeakReference<KlarnaStandaloneWebView>, EventDispatcher> viewToDispatcher;
46
+ private final KlarnaStandaloneWebViewEventSender klarnaStandaloneWebViewEventSender;
47
+ private final KlarnaEventHandler klarnaEventHandler = new KlarnaEventHandler() {
48
+ @Override
49
+ public void onEvent(@NonNull KlarnaComponent klarnaComponent, @NonNull KlarnaProductEvent klarnaProductEvent) {
50
+ if (klarnaComponent instanceof KlarnaStandaloneWebView) {
51
+ klarnaStandaloneWebViewEventSender.sendKlarnaMessageEvent((KlarnaStandaloneWebView) klarnaComponent, klarnaProductEvent);
52
+ }
53
+ }
54
+
55
+ @Override
56
+ public void onError(@NonNull KlarnaComponent klarnaComponent, @NonNull KlarnaMobileSDKError klarnaMobileSDKError) {
57
+ // Not used as of now
58
+ }
59
+ };
60
+ private final KlarnaStandaloneWebViewClient klarnaStandaloneWebViewClient = new KlarnaStandaloneWebViewClient() {
61
+ @Override
62
+ public void onPageStarted(@Nullable KlarnaStandaloneWebView view, @Nullable String url, @Nullable Bitmap favicon) {
63
+ klarnaStandaloneWebViewEventSender.sendNavigationEvent(view, KlarnaStandaloneWebViewEvent.Event.ON_LOAD_START, url);
64
+ }
65
+
66
+ @Override
67
+ public void onPageFinished(@Nullable KlarnaStandaloneWebView view, @Nullable String url) {
68
+ klarnaStandaloneWebViewEventSender.sendNavigationEvent(view, KlarnaStandaloneWebViewEvent.Event.ON_LOAD_END, url);
69
+ }
70
+
71
+ @Override
72
+ public void onReceivedError(@Nullable KlarnaStandaloneWebView view, @Nullable WebResourceRequest request, @Nullable WebResourceError error) {
73
+ if (error != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
74
+ klarnaStandaloneWebViewEventSender.sendErrorEvent(view, error.getErrorCode(), error.getDescription().toString());
75
+ }
76
+ }
77
+
78
+ @Override
79
+ public void onReceivedError(@Nullable KlarnaStandaloneWebView view, int errorCode, @Nullable String description, @Nullable String failingUrl) {
80
+ klarnaStandaloneWebViewEventSender.sendErrorEvent(view, errorCode, description);
81
+ }
82
+
83
+ @Override
84
+ public void onProgressChanged(@Nullable KlarnaStandaloneWebView view, int newProgress) {
85
+ klarnaStandaloneWebViewEventSender.sendLoadProgressEvent(view, newProgress);
86
+ }
87
+
88
+ @Override
89
+ public void onRenderProcessGone(@Nullable KlarnaStandaloneWebView view, @Nullable RenderProcessGoneDetail detail) {
90
+ boolean didCrash = false;
91
+ if (detail != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
92
+ didCrash = detail.didCrash();
93
+ }
94
+ klarnaStandaloneWebViewEventSender.sendRenderProcessGoneEvent(view, didCrash);
95
+ }
96
+ };
97
+
98
+ public KlarnaStandaloneWebViewManager(ReactApplicationContext reactContext, Application applicationContext) {
99
+ super();
100
+ viewToDispatcher = new HashMap<>();
101
+ klarnaStandaloneWebViewEventSender = new KlarnaStandaloneWebViewEventSender(viewToDispatcher);
102
+ }
103
+
104
+ @ReactProp(name = "returnUrl")
105
+ @Override
106
+ public void setReturnUrl(KlarnaStandaloneWebView view, @Nullable String returnUrl) {
107
+ if (!Objects.equals(returnUrl, view.getReturnURL())) {
108
+ view.setReturnURL(returnUrl);
109
+ }
110
+ }
111
+
112
+ @NonNull
113
+ @Override
114
+ public String getName() {
115
+ return REACT_CLASS;
116
+ }
117
+
118
+ /**
119
+ * Handles commands received from RN to a specific view.
120
+ *
121
+ * @param root view receiving the command
122
+ * @param commandId identifier of the command
123
+ * @param args array of command arguments
124
+ */
125
+ @Override
126
+ public void receiveCommand(@NonNull KlarnaStandaloneWebView root, String commandId, @Nullable ReadableArray args) {
127
+ switch (commandId) {
128
+ case COMMAND_LOAD:
129
+ if (args != null && args.size() > 0) {
130
+ String url = args.getString(0);
131
+ load(root, url);
132
+ }
133
+ break;
134
+ case COMMAND_GO_FORWARD:
135
+ goForward(root);
136
+ break;
137
+ case COMMAND_GO_BACK:
138
+ goBack(root);
139
+ break;
140
+ case COMMAND_RELOAD:
141
+ reload(root);
142
+ break;
143
+ }
144
+ }
145
+
146
+ @Override
147
+ public void load(KlarnaStandaloneWebView view, String url) {
148
+ view.loadUrl(url);
149
+ }
150
+
151
+ @Override
152
+ public void goForward(KlarnaStandaloneWebView view) {
153
+ view.goForward();
154
+ }
155
+
156
+ @Override
157
+ public void goBack(KlarnaStandaloneWebView view) {
158
+ view.goBack();
159
+ }
160
+
161
+ @Override
162
+ public void reload(KlarnaStandaloneWebView view) {
163
+ view.reload();
164
+ }
165
+
166
+ /**
167
+ * Exposes direct event types that will be accessible as prop "callbacks" from RN.
168
+ * <p>
169
+ * Structure must follow:
170
+ * { "<eventName>": {"registrationName": "<eventName>"} }
171
+ */
172
+ @Nullable
173
+ @Override
174
+ public Map<String, Object> getExportedCustomDirectEventTypeConstants() {
175
+ MapBuilder.Builder<String, Object> builder = MapBuilder.builder();
176
+ builder.put(KlarnaStandaloneWebViewEvent.Event.ON_LOAD_START.name, MapBuilder.of("registrationName", KlarnaStandaloneWebViewEvent.Event.ON_LOAD_START.name));
177
+ builder.put(KlarnaStandaloneWebViewEvent.Event.ON_LOAD_END.name, MapBuilder.of("registrationName", KlarnaStandaloneWebViewEvent.Event.ON_LOAD_END.name));
178
+ builder.put(KlarnaStandaloneWebViewEvent.Event.ON_ERROR.name, MapBuilder.of("registrationName", KlarnaStandaloneWebViewEvent.Event.ON_ERROR.name));
179
+ builder.put(KlarnaStandaloneWebViewEvent.Event.ON_LOAD_PROGRESS.name, MapBuilder.of("registrationName", KlarnaStandaloneWebViewEvent.Event.ON_LOAD_PROGRESS.name));
180
+ builder.put(KlarnaStandaloneWebViewEvent.Event.ON_KLARNA_MESSAGE.name, MapBuilder.of("registrationName", KlarnaStandaloneWebViewEvent.Event.ON_KLARNA_MESSAGE.name));
181
+ builder.put(KlarnaStandaloneWebViewEvent.Event.ON_RENDER_PROCESS_GONE.name, MapBuilder.of("registrationName", KlarnaStandaloneWebViewEvent.Event.ON_RENDER_PROCESS_GONE.name));
182
+ return builder.build();
183
+ }
184
+
185
+ @NonNull
186
+ @Override
187
+ protected KlarnaStandaloneWebView createViewInstance(@NonNull ThemedReactContext themedReactContext) {
188
+ KlarnaStandaloneWebView klarnaStandaloneWebView = new KlarnaStandaloneWebView(
189
+ /* context */ themedReactContext,
190
+ /* attrs */ null,
191
+ /* defStyleAttr */ 0,
192
+ /* webViewClient */ klarnaStandaloneWebViewClient,
193
+ /* eventHandler */ klarnaEventHandler,
194
+ /* environment */ null,
195
+ /* region */ null,
196
+ /* theme */ null,
197
+ /* resourceEndpoint */ null,
198
+ /* returnURL */ null);
199
+ // Each view has its own event dispatcher.
200
+ EventDispatcher dispatcher = UIManagerHelper.getEventDispatcherForReactTag((ReactContext) klarnaStandaloneWebView.getContext(), klarnaStandaloneWebView.getId());
201
+ viewToDispatcher.put(new WeakReference<>(klarnaStandaloneWebView), dispatcher);
202
+ return klarnaStandaloneWebView;
203
+ }
204
+
205
+ }
@@ -0,0 +1,32 @@
1
+ package com.klarna.mobile.sdk.reactnative.spec;
2
+
3
+ import android.view.View;
4
+
5
+ import androidx.annotation.NonNull;
6
+ import androidx.annotation.Nullable;
7
+
8
+ import com.facebook.react.bridge.ReadableArray;
9
+ import com.facebook.react.uimanager.SimpleViewManager;
10
+ import com.facebook.react.uimanager.ViewManagerDelegate;
11
+ import com.facebook.react.viewmanagers.RNKlarnaPaymentViewManagerDelegate;
12
+ import com.facebook.react.viewmanagers.RNKlarnaPaymentViewManagerInterface;
13
+
14
+ public abstract class RNKlarnaPaymentViewSpec<T extends View> extends SimpleViewManager<T> implements RNKlarnaPaymentViewManagerInterface<T> {
15
+ private final ViewManagerDelegate<T> mDelegate;
16
+
17
+ public RNKlarnaPaymentViewSpec() {
18
+ mDelegate = new RNKlarnaPaymentViewManagerDelegate<>(this);
19
+ }
20
+
21
+ @Nullable
22
+ @Override
23
+ protected ViewManagerDelegate<T> getDelegate() {
24
+ return mDelegate;
25
+ }
26
+
27
+ @Override
28
+ public void receiveCommand(@NonNull T root, String commandId, @Nullable ReadableArray args) {
29
+ mDelegate.receiveCommand(root, commandId, args);
30
+ }
31
+
32
+ }
@@ -0,0 +1,33 @@
1
+ package com.klarna.mobile.sdk.reactnative.spec;
2
+
3
+ import android.view.View;
4
+
5
+ import androidx.annotation.NonNull;
6
+ import androidx.annotation.Nullable;
7
+
8
+ import com.facebook.react.bridge.ReadableArray;
9
+ import com.facebook.react.uimanager.SimpleViewManager;
10
+ import com.facebook.react.uimanager.ViewManagerDelegate;
11
+ import com.facebook.react.viewmanagers.RNKlarnaStandaloneWebViewManagerDelegate;
12
+ import com.facebook.react.viewmanagers.RNKlarnaStandaloneWebViewManagerInterface;
13
+
14
+ public abstract class RNKlarnaStandaloneWebViewSpec<T extends View> extends SimpleViewManager<T> implements RNKlarnaStandaloneWebViewManagerInterface<T> {
15
+
16
+ private final ViewManagerDelegate<T> viewManagerDelegate;
17
+
18
+ public RNKlarnaStandaloneWebViewSpec() {
19
+ viewManagerDelegate = new RNKlarnaStandaloneWebViewManagerDelegate<>(this);
20
+ }
21
+
22
+ @Nullable
23
+ @Override
24
+ protected ViewManagerDelegate<T> getDelegate() {
25
+ return viewManagerDelegate;
26
+ }
27
+
28
+ @Override
29
+ public void receiveCommand(@NonNull T root, String commandId, @Nullable ReadableArray args) {
30
+ viewManagerDelegate.receiveCommand(root, commandId, args);
31
+ }
32
+
33
+ }
@@ -0,0 +1,25 @@
1
+ package com.klarna.mobile.sdk.reactnative.spec;
2
+
3
+ import android.view.View;
4
+
5
+ import androidx.annotation.Nullable;
6
+
7
+ import com.facebook.react.uimanager.SimpleViewManager;
8
+
9
+ public abstract class RNKlarnaPaymentViewSpec<T extends View> extends SimpleViewManager<T> {
10
+ public abstract void setCategory(T view, @Nullable String value);
11
+
12
+ public abstract void setReturnUrl(T view, @Nullable String value);
13
+
14
+ public abstract void initialize(T view, String clientToken, String returnUrl);
15
+
16
+ public abstract void load(T view, String sessionData);
17
+
18
+ public abstract void loadPaymentReview(T view);
19
+
20
+ public abstract void authorize(T view, boolean autoFinalize, String sessionData);
21
+
22
+ public abstract void reauthorize(T view, String sessionData);
23
+
24
+ public abstract void finalize(T view, String sessionData);
25
+ }
@@ -0,0 +1,19 @@
1
+ package com.klarna.mobile.sdk.reactnative.spec;
2
+
3
+ import android.view.View;
4
+
5
+ import androidx.annotation.Nullable;
6
+
7
+ import com.facebook.react.uimanager.SimpleViewManager;
8
+
9
+ public abstract class RNKlarnaStandaloneWebViewSpec<T extends View> extends SimpleViewManager<T> {
10
+ public abstract void setReturnUrl(T view, @Nullable String returnUrl);
11
+
12
+ public abstract void load(T view, String url);
13
+
14
+ public abstract void goForward(T view);
15
+
16
+ public abstract void goBack(T view);
17
+
18
+ public abstract void reload(T view);
19
+ }
@@ -1,4 +1,4 @@
1
- package com.klarna.inapp.sdk;
1
+ package com.klarna.mobile.sdk.reactnative;
2
2
 
3
3
  import android.app.Application;
4
4
 
@@ -7,6 +7,9 @@ import androidx.test.core.app.ApplicationProvider;
7
7
  import com.facebook.react.bridge.NativeModule;
8
8
  import com.facebook.react.bridge.ReactApplicationContext;
9
9
  import com.facebook.react.uimanager.ViewManager;
10
+ import com.klarna.mobile.sdk.reactnative.KlarnaMobileSDKPackage;
11
+ import com.klarna.mobile.sdk.reactnative.payments.KlarnaPaymentViewManager;
12
+ import com.klarna.mobile.sdk.reactnative.standalonewebview.KlarnaStandaloneWebViewManager;
10
13
 
11
14
  import org.junit.Assert;
12
15
  import org.junit.Before;
@@ -17,7 +20,7 @@ import org.robolectric.RobolectricTestRunner;
17
20
  import java.util.List;
18
21
 
19
22
  @RunWith(RobolectricTestRunner.class)
20
- public class KlarnaPaymentViewPackageTest {
23
+ public class KlarnaMobileSDKPackageTest {
21
24
 
22
25
  private Application application;
23
26
  private ReactApplicationContext reactContext;
@@ -30,7 +33,7 @@ public class KlarnaPaymentViewPackageTest {
30
33
 
31
34
  @Test
32
35
  public void testCreateNativeModules() {
33
- KlarnaPaymentViewPackage paymentViewPackage = new KlarnaPaymentViewPackage();
36
+ KlarnaMobileSDKPackage paymentViewPackage = new KlarnaMobileSDKPackage();
34
37
  List<NativeModule> nativeModules = paymentViewPackage.createNativeModules(reactContext);
35
38
  Assert.assertNotNull(nativeModules);
36
39
  Assert.assertTrue(nativeModules.isEmpty());
@@ -38,10 +41,12 @@ public class KlarnaPaymentViewPackageTest {
38
41
 
39
42
  @Test
40
43
  public void testCreateViewManagers() {
41
- KlarnaPaymentViewPackage paymentViewPackage = new KlarnaPaymentViewPackage();
44
+ KlarnaMobileSDKPackage paymentViewPackage = new KlarnaMobileSDKPackage();
42
45
  List<ViewManager> nativeModules = paymentViewPackage.createViewManagers(reactContext);
43
46
  Assert.assertNotNull(nativeModules);
44
47
  Assert.assertFalse(nativeModules.isEmpty());
48
+ Assert.assertEquals(2, nativeModules.size());
45
49
  Assert.assertTrue(nativeModules.get(0) instanceof KlarnaPaymentViewManager);
50
+ Assert.assertTrue(nativeModules.get(1) instanceof KlarnaStandaloneWebViewManager);
46
51
  }
47
52
  }
@@ -1,4 +1,4 @@
1
- package com.klarna.inapp.sdk;
1
+ package com.klarna.mobile.sdk.reactnative.payments;
2
2
 
3
3
  import android.os.SystemClock;
4
4
 
@@ -30,17 +30,13 @@ import org.powermock.core.classloader.annotations.PrepareForTest;
30
30
  import org.powermock.modules.junit4.rule.PowerMockRule;
31
31
  import org.robolectric.RobolectricTestRunner;
32
32
 
33
- import java.util.Collections;
34
- import java.util.HashMap;
35
- import java.util.Map;
36
-
37
- import static com.klarna.inapp.sdk.KlarnaPaymentEvent.EVENT_NAME_ON_AUTHORIZE;
38
- import static com.klarna.inapp.sdk.KlarnaPaymentEvent.EVENT_NAME_ON_ERROR;
39
- import static com.klarna.inapp.sdk.KlarnaPaymentEvent.EVENT_NAME_ON_FINALIZE;
40
- import static com.klarna.inapp.sdk.KlarnaPaymentEvent.EVENT_NAME_ON_INITIALIZE;
41
- import static com.klarna.inapp.sdk.KlarnaPaymentEvent.EVENT_NAME_ON_LOAD;
42
- import static com.klarna.inapp.sdk.KlarnaPaymentEvent.EVENT_NAME_ON_LOAD_PAYMENT_REVIEW;
43
- import static com.klarna.inapp.sdk.KlarnaPaymentEvent.EVENT_NAME_ON_REAUTHORIZE;
33
+ import static com.klarna.mobile.sdk.reactnative.payments.KlarnaPaymentEvent.EVENT_NAME_ON_AUTHORIZE;
34
+ import static com.klarna.mobile.sdk.reactnative.payments.KlarnaPaymentEvent.EVENT_NAME_ON_ERROR;
35
+ import static com.klarna.mobile.sdk.reactnative.payments.KlarnaPaymentEvent.EVENT_NAME_ON_FINALIZE;
36
+ import static com.klarna.mobile.sdk.reactnative.payments.KlarnaPaymentEvent.EVENT_NAME_ON_INITIALIZE;
37
+ import static com.klarna.mobile.sdk.reactnative.payments.KlarnaPaymentEvent.EVENT_NAME_ON_LOAD;
38
+ import static com.klarna.mobile.sdk.reactnative.payments.KlarnaPaymentEvent.EVENT_NAME_ON_LOAD_PAYMENT_REVIEW;
39
+ import static com.klarna.mobile.sdk.reactnative.payments.KlarnaPaymentEvent.EVENT_NAME_ON_REAUTHORIZE;
44
40
  import static org.mockito.Mockito.mock;
45
41
  import static org.powermock.api.mockito.PowerMockito.when;
46
42
 
@@ -118,12 +114,13 @@ public class KlarnaPaymentEventTest {
118
114
  EventDispatcherListener listener = mock(EventDispatcherListener.class);
119
115
  eventDispatcherMock.addListener(listener);
120
116
 
117
+ WritableMap map = Arguments.createMap();
118
+ map.putString("testKey", "testValue");
119
+
121
120
  KlarnaPaymentEvent event = new KlarnaPaymentEvent(
122
121
  23,
123
122
  "testEventName",
124
- new HashMap<String, Object>() {{
125
- put("testKey", "testValue");
126
- }}
123
+ map
127
124
  );
128
125
 
129
126
  eventDispatcherMock.dispatchEvent(event);
@@ -133,18 +130,18 @@ public class KlarnaPaymentEventTest {
133
130
 
134
131
  @Test
135
132
  public void testDispatch() {
136
- Map<String, Object> additionalParams = Collections.singletonMap("testKey", (Object) "testValue");
133
+ WritableMap map = Arguments.createMap();
134
+ map.putString("testKey", "testValue");
135
+
137
136
  KlarnaPaymentEvent event = new KlarnaPaymentEvent(
138
137
  23,
139
138
  "testEventName",
140
- additionalParams
139
+ map
141
140
  );
142
141
 
143
- WritableMap eventData = Arguments.makeNativeMap(additionalParams);
144
-
145
142
  RCTEventEmitter emitter = mock(RCTEventEmitter.class);
146
143
  event.dispatch(emitter);
147
144
  Mockito.verify(emitter, Mockito.times(1))
148
- .receiveEvent(event.getViewTag(), "testEventName", eventData);
145
+ .receiveEvent(event.getViewTag(), "testEventName", map);
149
146
  }
150
147
  }
@@ -1,12 +1,24 @@
1
- package com.klarna.inapp.sdk;
1
+ package com.klarna.mobile.sdk.reactnative.payments;
2
+
3
+ import static com.klarna.mobile.sdk.reactnative.payments.KlarnaPaymentViewManager.COMMAND_AUTHORIZE;
4
+ import static com.klarna.mobile.sdk.reactnative.payments.KlarnaPaymentViewManager.COMMAND_FINALIZE;
5
+ import static com.klarna.mobile.sdk.reactnative.payments.KlarnaPaymentViewManager.COMMAND_INITIALIZE;
6
+ import static com.klarna.mobile.sdk.reactnative.payments.KlarnaPaymentViewManager.COMMAND_LOAD;
7
+ import static com.klarna.mobile.sdk.reactnative.payments.KlarnaPaymentViewManager.COMMAND_LOAD_PAYMENT_REVIEW;
8
+ import static com.klarna.mobile.sdk.reactnative.payments.KlarnaPaymentViewManager.COMMAND_REAUTHORIZE;
2
9
 
3
10
  import android.app.Application;
4
11
 
5
12
  import androidx.test.core.app.ApplicationProvider;
6
13
 
14
+ import com.facebook.react.bridge.Arguments;
7
15
  import com.facebook.react.bridge.JavaOnlyArray;
16
+ import com.facebook.react.bridge.JavaOnlyMap;
8
17
  import com.facebook.react.bridge.ReactApplicationContext;
18
+ import com.facebook.react.bridge.ReadableArray;
19
+ import com.facebook.react.bridge.ReadableMap;
9
20
  import com.klarna.mobile.sdk.api.payments.KlarnaPaymentView;
21
+ import com.klarna.mobile.sdk.api.payments.KlarnaPaymentsSDKError;
10
22
 
11
23
  import org.junit.After;
12
24
  import org.junit.Assert;
@@ -15,21 +27,15 @@ import org.junit.Rule;
15
27
  import org.junit.Test;
16
28
  import org.junit.runner.RunWith;
17
29
  import org.mockito.Mockito;
30
+ import org.powermock.api.mockito.PowerMockito;
18
31
  import org.powermock.core.classloader.annotations.PowerMockIgnore;
19
32
  import org.powermock.core.classloader.annotations.PrepareForTest;
20
33
  import org.powermock.modules.junit4.rule.PowerMockRule;
21
34
  import org.robolectric.RobolectricTestRunner;
22
35
 
23
- import java.util.Map;
24
-
25
- import static com.klarna.inapp.sdk.KlarnaPaymentViewManager.COMMAND_AUTHORIZE;
26
- import static com.klarna.inapp.sdk.KlarnaPaymentViewManager.COMMAND_FINALIZE;
27
- import static com.klarna.inapp.sdk.KlarnaPaymentViewManager.COMMAND_INITIALIZE;
28
- import static com.klarna.inapp.sdk.KlarnaPaymentViewManager.COMMAND_LOAD;
29
- import static com.klarna.inapp.sdk.KlarnaPaymentViewManager.COMMAND_LOAD_PAYMENT_REVIEW;
30
- import static com.klarna.inapp.sdk.KlarnaPaymentViewManager.COMMAND_REAUTHORIZE;
36
+ import java.util.Collections;
31
37
 
32
- @PrepareForTest()
38
+ @PrepareForTest({Arguments.class})
33
39
  @RunWith(RobolectricTestRunner.class)
34
40
  @PowerMockIgnore({"org.mockito.*", "org.robolectric.*", "androidx.*", "android.*", "com.android.*"})
35
41
  public class KlarnaPaymentViewManagerTest {
@@ -37,21 +43,24 @@ public class KlarnaPaymentViewManagerTest {
37
43
  @Rule
38
44
  public PowerMockRule rule = new PowerMockRule();
39
45
 
40
- private Application application;
41
- private ReactApplicationContext reactContext;
42
-
43
46
  private KlarnaPaymentViewManager manager;
44
47
  private PaymentViewWrapper wrapper;
45
48
 
46
49
  @Before
47
50
  public void setup() {
48
- application = ApplicationProvider.getApplicationContext();
49
- reactContext = new ReactApplicationContext(application);
51
+ Application application = ApplicationProvider.getApplicationContext();
52
+ ReactApplicationContext reactContext = new ReactApplicationContext(application);
50
53
 
51
- manager = new KlarnaPaymentViewManager(reactContext, application);
54
+ manager = new KlarnaPaymentViewManager(reactContext);
52
55
 
53
56
  wrapper = Mockito.mock(PaymentViewWrapper.class);
54
57
  wrapper.paymentView = Mockito.mock(KlarnaPaymentView.class);
58
+
59
+ PowerMockito.mockStatic(Arguments.class);
60
+ PowerMockito.when(Arguments.createArray())
61
+ .thenAnswer(invocation -> new JavaOnlyArray());
62
+ PowerMockito.when(Arguments.createMap())
63
+ .thenAnswer(invocation -> new JavaOnlyMap());
55
64
  }
56
65
 
57
66
  @After
@@ -61,22 +70,20 @@ public class KlarnaPaymentViewManagerTest {
61
70
 
62
71
  @Test
63
72
  public void testReactClassName() {
64
- Assert.assertEquals("KlarnaPaymentView", manager.getName());
65
- Assert.assertEquals("KlarnaPaymentView", KlarnaPaymentViewManager.REACT_CLASS);
73
+ Assert.assertEquals("RNKlarnaPaymentView", manager.getName());
74
+ Assert.assertEquals("RNKlarnaPaymentView", KlarnaPaymentViewManager.REACT_CLASS);
66
75
  }
67
76
 
68
77
  @Test
69
- public void testCommandsMap() {
70
- Map<String, Integer> commandsMap = manager.getCommandsMap();
71
-
72
- Assert.assertNotNull(commandsMap);
73
- Assert.assertEquals(6, commandsMap.size());
74
- Assert.assertEquals(Integer.valueOf(COMMAND_INITIALIZE), commandsMap.get("initialize"));
75
- Assert.assertEquals(Integer.valueOf(COMMAND_LOAD), commandsMap.get("load"));
76
- Assert.assertEquals(Integer.valueOf(COMMAND_LOAD_PAYMENT_REVIEW), commandsMap.get("loadPaymentReview"));
77
- Assert.assertEquals(Integer.valueOf(COMMAND_AUTHORIZE), commandsMap.get("authorize"));
78
- Assert.assertEquals(Integer.valueOf(COMMAND_REAUTHORIZE), commandsMap.get("reauthorize"));
79
- Assert.assertEquals(Integer.valueOf(COMMAND_FINALIZE), commandsMap.get("finalize"));
78
+ public void testSetCategory() {
79
+ manager.setCategory(wrapper, "testCategory");
80
+ Mockito.verify(wrapper.paymentView).setCategory("testCategory");
81
+ }
82
+
83
+ @Test
84
+ public void testSetReturnUrl() {
85
+ manager.setReturnUrl(wrapper, "testReturnUrl://");
86
+ Mockito.verify(wrapper.paymentView).setReturnURL("testReturnUrl://");
80
87
  }
81
88
 
82
89
  @Test
@@ -92,11 +99,10 @@ public class KlarnaPaymentViewManagerTest {
92
99
  Mockito.verify(wrapper.paymentView, Mockito.times(1)).initialize("testToken", "testReturnUrl");
93
100
  }
94
101
 
95
- @Test(expected = IndexOutOfBoundsException.class)
96
102
  public void testReceiveCommandInitializeThrows() {
97
103
  final JavaOnlyArray args = new JavaOnlyArray();
98
- args.pushString("testToken");
99
104
  manager.receiveCommand(wrapper, COMMAND_INITIALIZE, args);
105
+ Mockito.verify(wrapper.paymentView, Mockito.times(0)).initialize(Mockito.anyString(), Mockito.anyString());
100
106
  }
101
107
 
102
108
  @Test
@@ -119,7 +125,7 @@ public class KlarnaPaymentViewManagerTest {
119
125
  @Test
120
126
  public void testReceiveCommandAuthorize() {
121
127
  manager.receiveCommand(wrapper, COMMAND_AUTHORIZE, null);
122
- Mockito.verify(wrapper.paymentView, Mockito.times(0)).authorize(Mockito.anyBoolean(), (String) Mockito.isNull());
128
+ Mockito.verify(wrapper.paymentView, Mockito.times(1)).authorize(Mockito.anyBoolean(), (String) Mockito.isNull());
123
129
 
124
130
  final JavaOnlyArray args = new JavaOnlyArray();
125
131
  args.pushBoolean(true);
@@ -128,11 +134,11 @@ public class KlarnaPaymentViewManagerTest {
128
134
  Mockito.verify(wrapper.paymentView, Mockito.times(1)).authorize(true, "testSessionData");
129
135
  }
130
136
 
131
- @Test(expected = IndexOutOfBoundsException.class)
132
137
  public void testReceiveCommandAuthorizeThrows() {
133
138
  final JavaOnlyArray args = new JavaOnlyArray();
134
139
  args.pushBoolean(true);
135
140
  manager.receiveCommand(wrapper, COMMAND_AUTHORIZE, args);
141
+ Mockito.verify(wrapper.paymentView, Mockito.times(1)).authorize(true, null);
136
142
  }
137
143
 
138
144
  @Test
@@ -158,8 +164,28 @@ public class KlarnaPaymentViewManagerTest {
158
164
  }
159
165
 
160
166
  @Test
161
- public void testSetCategory() {
162
- manager.setCategory(wrapper, "testCategory");
163
- Mockito.verify(wrapper.paymentView).setCategory("testCategory");
167
+ public void testErrorMapFieldsAndValues() {
168
+ KlarnaPaymentsSDKError error = new KlarnaPaymentsSDKError(
169
+ "testName",
170
+ "testMessage",
171
+ false,
172
+ "testAction",
173
+ Collections.singletonList("testInvalidField"),
174
+ "testSessionId"
175
+ );
176
+
177
+ ReadableMap map = manager.buildErrorMap(error);
178
+
179
+ Assert.assertEquals("testName", map.getString("name"));
180
+ Assert.assertEquals("testMessage", map.getString("message"));
181
+ Assert.assertFalse(map.getBoolean("isFatal"));
182
+ Assert.assertEquals("testAction", map.getString("action"));
183
+
184
+ ReadableArray invalidFields = map.getArray("invalidFields");
185
+ Assert.assertNotNull(invalidFields);
186
+ Assert.assertEquals(1, invalidFields.size());
187
+ Assert.assertEquals("testInvalidField", invalidFields.getString(0));
188
+
189
+ Assert.assertEquals("testSessionId", map.getString("sessionId"));
164
190
  }
165
191
  }