react-native-klarna-inapp-sdk 2.3.15 → 2.4.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 (62) hide show
  1. package/README.md +1 -0
  2. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/KlarnaMobileSDKPackage.java +2 -4
  3. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/event/KlarnaEventHandlerEventsUtil.java +62 -3
  4. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/util/ArgumentsUtil.java +40 -0
  5. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/signin/KlarnaSignInData.java +15 -0
  6. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/signin/KlarnaSignInEventsMapper.java +40 -0
  7. package/android/src/main/java/com/klarna/mobile/sdk/reactnative/signin/KlarnaSignInModuleImpl.java +124 -0
  8. package/android/src/newarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaSignInModuleSpec.java +65 -0
  9. package/android/src/oldarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaSignInModuleSpec.java +39 -0
  10. package/android/src/test/java/com/klarna/mobile/sdk/reactnative/KlarnaMobileSDKPackageTest.java +5 -4
  11. package/ios/Sources/signIn/KlarnaSignInData.h +25 -0
  12. package/ios/Sources/signIn/KlarnaSignInData.mm +21 -0
  13. package/ios/Sources/signIn/KlarnaSignInEventsMapper.h +18 -0
  14. package/ios/Sources/signIn/KlarnaSignInEventsMapper.m +54 -0
  15. package/ios/Sources/signIn/KlarnaSignInModule.h +26 -0
  16. package/ios/Sources/signIn/KlarnaSignInModuleImpl.h +37 -0
  17. package/ios/Sources/signIn/KlarnaSignInModuleImpl.mm +244 -0
  18. package/ios/Sources/signIn/newarch/KlarnaSignInModule.mm +75 -0
  19. package/ios/Sources/signIn/oldarch/KlarnaSignInModule.mm +72 -0
  20. package/lib/commonjs/KlarnaSignInSDK.js +80 -0
  21. package/lib/commonjs/KlarnaSignInSDK.js.map +1 -0
  22. package/lib/commonjs/index.js +11 -0
  23. package/lib/commonjs/index.js.map +1 -1
  24. package/lib/commonjs/specs/NativeKlarnaSignIn.js +10 -0
  25. package/lib/commonjs/specs/NativeKlarnaSignIn.js.map +1 -0
  26. package/lib/commonjs/types/common/KlarnaEnvironment.js +13 -0
  27. package/lib/commonjs/types/common/KlarnaEnvironment.js.map +1 -0
  28. package/lib/commonjs/types/common/KlarnaRegion.js +14 -0
  29. package/lib/commonjs/types/common/KlarnaRegion.js.map +1 -0
  30. package/lib/module/KlarnaSignInSDK.js +72 -0
  31. package/lib/module/KlarnaSignInSDK.js.map +1 -0
  32. package/lib/module/index.js +1 -0
  33. package/lib/module/index.js.map +1 -1
  34. package/lib/module/specs/NativeKlarnaSignIn.js +3 -0
  35. package/lib/module/specs/NativeKlarnaSignIn.js.map +1 -0
  36. package/lib/module/types/common/KlarnaEnvironment.js +6 -0
  37. package/lib/module/types/common/KlarnaEnvironment.js.map +1 -0
  38. package/lib/module/types/common/KlarnaRegion.js +7 -0
  39. package/lib/module/types/common/KlarnaRegion.js.map +1 -0
  40. package/lib/typescript/KlarnaSignInSDK.d.ts +19 -0
  41. package/lib/typescript/KlarnaSignInSDK.d.ts.map +1 -0
  42. package/lib/typescript/index.d.ts +1 -0
  43. package/lib/typescript/index.d.ts.map +1 -1
  44. package/lib/typescript/specs/NativeKlarnaSignIn.d.ts +10 -0
  45. package/lib/typescript/specs/NativeKlarnaSignIn.d.ts.map +1 -0
  46. package/lib/typescript/types/common/KlarnaEnvironment.d.ts +5 -0
  47. package/lib/typescript/types/common/KlarnaEnvironment.d.ts.map +1 -0
  48. package/lib/typescript/types/common/KlarnaMobileSDKError.d.ts +4 -0
  49. package/lib/typescript/types/common/KlarnaMobileSDKError.d.ts.map +1 -1
  50. package/lib/typescript/types/common/KlarnaProductEvent.d.ts +1 -0
  51. package/lib/typescript/types/common/KlarnaProductEvent.d.ts.map +1 -1
  52. package/lib/typescript/types/common/KlarnaRegion.d.ts +6 -0
  53. package/lib/typescript/types/common/KlarnaRegion.d.ts.map +1 -0
  54. package/package.json +1 -1
  55. package/react-native-klarna-inapp-sdk.podspec +1 -1
  56. package/src/KlarnaSignInSDK.tsx +122 -0
  57. package/src/index.tsx +1 -0
  58. package/src/specs/NativeKlarnaSignIn.ts +25 -0
  59. package/src/types/common/KlarnaEnvironment.ts +4 -0
  60. package/src/types/common/KlarnaMobileSDKError.ts +2 -0
  61. package/src/types/common/KlarnaProductEvent.ts +1 -0
  62. package/src/types/common/KlarnaRegion.ts +5 -0
package/README.md CHANGED
@@ -11,6 +11,7 @@ currently has the following components:
11
11
  - `KlarnaPaymentView` to integrate Klarna Payments
12
12
  - `KlarnaStandaloneWebView` to integrate Klarna Standalone WebView
13
13
  - `KlarnaCheckoutView` to integrate Klarna Checkout
14
+ - `KlarnaSignInSDK` to integrate Klarna Sign In
14
15
 
15
16
  This repository also includes a test application that you can use to see how it works.
16
17
 
@@ -1,7 +1,5 @@
1
1
  package com.klarna.mobile.sdk.reactnative;
2
2
 
3
- import android.app.Application;
4
-
5
3
  import androidx.annotation.NonNull;
6
4
 
7
5
  import com.facebook.react.ReactPackage;
@@ -10,9 +8,9 @@ import com.facebook.react.bridge.ReactApplicationContext;
10
8
  import com.facebook.react.uimanager.ViewManager;
11
9
  import com.klarna.mobile.sdk.reactnative.checkout.KlarnaCheckoutViewManager;
12
10
  import com.klarna.mobile.sdk.reactnative.payments.KlarnaPaymentViewManager;
11
+ import com.klarna.mobile.sdk.reactnative.spec.RNKlarnaSignInModuleSpec;
13
12
  import com.klarna.mobile.sdk.reactnative.standalonewebview.KlarnaStandaloneWebViewManager;
14
13
 
15
- import java.util.Collections;
16
14
  import java.util.List;
17
15
 
18
16
  public class KlarnaMobileSDKPackage implements ReactPackage {
@@ -20,7 +18,7 @@ public class KlarnaMobileSDKPackage implements ReactPackage {
20
18
  @NonNull
21
19
  @Override
22
20
  public List<NativeModule> createNativeModules(@NonNull ReactApplicationContext reactContext) {
23
- return Collections.emptyList();
21
+ return List.of(new RNKlarnaSignInModuleSpec(reactContext));
24
22
  }
25
23
 
26
24
  @NonNull
@@ -5,25 +5,33 @@ import android.view.View;
5
5
  import androidx.annotation.NonNull;
6
6
  import androidx.annotation.Nullable;
7
7
 
8
+ import com.facebook.react.bridge.Promise;
8
9
  import com.facebook.react.bridge.ReadableMap;
9
10
  import com.facebook.react.bridge.WritableMap;
11
+ import com.google.gson.reflect.TypeToken;
10
12
  import com.klarna.mobile.sdk.KlarnaMobileSDKError;
11
13
  import com.klarna.mobile.sdk.api.KlarnaProductEvent;
14
+ import com.klarna.mobile.sdk.api.signin.model.KlarnaSignInToken;
12
15
  import com.klarna.mobile.sdk.reactnative.common.util.ArgumentsUtil;
13
16
  import com.klarna.mobile.sdk.reactnative.common.util.ParserUtil;
17
+ import com.klarna.mobile.sdk.reactnative.signin.KlarnaSignInData;
18
+ import com.klarna.mobile.sdk.reactnative.signin.KlarnaSignInEventsMapper;
14
19
 
20
+ import java.lang.reflect.Type;
15
21
  import java.util.HashMap;
22
+ import java.util.Map;
16
23
 
17
24
  public class KlarnaEventHandlerEventsUtil {
18
25
 
19
26
  public static final String EVENT_NAME_ON_EVENT = "onEvent";
20
27
  public static final String EVENT_NAME_ON_ERROR = "onError";
28
+ public static final String PARAM_NAME_IS_FATAL = "isFatal";
29
+ public static final String PARAM_NAME_MESSAGE = "message";
30
+ public static final String PARAM_NAME_NAME = "name";
31
+ public static final String PARAM_NAME_SESSION_ID = "sessionId";
21
32
 
22
33
  private static final String PARAM_NAME_ACTION = "action";
23
34
  private static final String PARAM_NAME_PARAMS = "params";
24
- private static final String PARAM_NAME_IS_FATAL = "isFatal";
25
- private static final String PARAM_NAME_MESSAGE = "message";
26
- private static final String PARAM_NAME_NAME = "name";
27
35
  private static final String PARAM_NAME_PRODUCT_EVENT = "productEvent";
28
36
 
29
37
  public static <T extends View> void sendKlarnaProductEvent(@NonNull ComponentEventSender<T> componentEventSender, @Nullable View view, @NonNull KlarnaProductEvent klarnaProductEvent) {
@@ -50,4 +58,55 @@ public class KlarnaEventHandlerEventsUtil {
50
58
  }});
51
59
  componentEventSender.postEventForView(view, EVENT_NAME_ON_EVENT, params);
52
60
  }
61
+
62
+ public static void sendKlarnaProductEvent(@NonNull KlarnaSignInData signInData, @NonNull KlarnaProductEvent klarnaProductEvent) {
63
+ if (klarnaProductEvent.getAction().equals("KlarnaSignInUserAuth")) {
64
+ return;
65
+ }
66
+ Map<String, Object> updatedParams = new HashMap<>();
67
+ for(Map.Entry<String, Object> entry : klarnaProductEvent.getParams().entrySet()) {
68
+ String updatedKey = KlarnaSignInEventsMapper.mapSignInParamName(entry.getKey());
69
+ updatedParams.put(updatedKey, entry.getValue());
70
+ }
71
+ String eventName = KlarnaSignInEventsMapper.mapSignInEventName(klarnaProductEvent.getAction());
72
+ ReadableMap eventMap = ArgumentsUtil.createMap(new HashMap<String, Object>() {{
73
+ put(PARAM_NAME_ACTION, eventName);
74
+ put(PARAM_NAME_SESSION_ID, klarnaProductEvent.getSessionId());
75
+ if (!updatedParams.isEmpty()) {
76
+ put(PARAM_NAME_PARAMS, ArgumentsUtil.createMapUsingJSONString(updatedParams));
77
+ }
78
+ }});
79
+
80
+ if (signInData.promise != null) {
81
+ signInData.promise.resolve(eventMap);
82
+ }
83
+ }
84
+
85
+ public static void sendKlarnaMobileSDKError(@NonNull KlarnaSignInData signInData, @NonNull KlarnaMobileSDKError klarnaMobileSDKError) {
86
+ String errorName = KlarnaSignInEventsMapper.mapSignInErrorName(klarnaMobileSDKError.getName());
87
+ WritableMap eventMap = ArgumentsUtil.createMap(new HashMap<String, Object>() {{
88
+ put(PARAM_NAME_NAME, errorName);
89
+ put(PARAM_NAME_MESSAGE, klarnaMobileSDKError.getMessage());
90
+ put(PARAM_NAME_IS_FATAL, klarnaMobileSDKError.isFatal());
91
+ put(PARAM_NAME_SESSION_ID, klarnaMobileSDKError.getSessionId());
92
+ if (!klarnaMobileSDKError.getParams().isEmpty()) {
93
+ put(PARAM_NAME_PARAMS, ArgumentsUtil.createMapUsingJSONString(klarnaMobileSDKError.getParams()));
94
+ }
95
+ }});
96
+ if (signInData.promise != null) {
97
+ signInData.promise.reject(EVENT_NAME_ON_ERROR, eventMap);
98
+ }
99
+ }
100
+
101
+ public static ReadableMap createMapFrom(HashMap<String, Object> map) {
102
+ WritableMap writableMap = ArgumentsUtil.createMap(new HashMap<String, Object>());
103
+ for (Map.Entry<String, Object> entry : map.entrySet()) {
104
+ if (entry.getValue() instanceof String) {
105
+ writableMap.putString(entry.getKey(), (String) entry.getValue());
106
+ } else if (entry.getValue() instanceof Object) {
107
+
108
+ }
109
+ }
110
+ return ArgumentsUtil.createMap(map);
111
+ }
53
112
  }
@@ -6,9 +6,15 @@ import com.facebook.react.bridge.ReadableMap;
6
6
  import com.facebook.react.bridge.WritableArray;
7
7
  import com.facebook.react.bridge.WritableMap;
8
8
 
9
+ import org.json.JSONException;
10
+ import org.json.JSONObject;
11
+
12
+ import java.util.Iterator;
9
13
  import java.util.List;
10
14
  import java.util.Map;
11
15
 
16
+ import okhttp3.internal.Util;
17
+
12
18
  public class ArgumentsUtil {
13
19
 
14
20
  public static WritableMap createMap(Map<String, Object> sourceMap) {
@@ -59,4 +65,38 @@ public class ArgumentsUtil {
59
65
  }
60
66
  return array;
61
67
  }
68
+
69
+ public static WritableMap createMapUsingJSONString(Map<String, Object> sourceMap) {
70
+ String jsonString = ParserUtil.toJson(sourceMap);
71
+ WritableMap map = Arguments.createMap();
72
+ try {
73
+ JSONObject jsonObject = new JSONObject(jsonString);
74
+ map = jsonToWritableMap(jsonObject);
75
+ } catch (JSONException e) {
76
+ System.out.println("JSONException occurred: " + e.getMessage());
77
+ }
78
+ return map;
79
+ }
80
+
81
+ private static WritableMap jsonToWritableMap(JSONObject jsonObject) throws JSONException {
82
+ WritableMap map = Arguments.createMap();
83
+ for (Iterator<String> it = jsonObject.keys(); it.hasNext(); ) {
84
+ String key = it.next();
85
+ Object value = jsonObject.get(key);
86
+ if (value instanceof JSONObject) {
87
+ map.putMap(key, jsonToWritableMap((JSONObject) value));
88
+ } else if (value instanceof Boolean) {
89
+ map.putBoolean(key, (Boolean) value);
90
+ } else if (value instanceof Integer) {
91
+ map.putInt(key, (Integer) value);
92
+ } else if (value instanceof Double) {
93
+ map.putDouble(key, (Double) value);
94
+ } else if (value instanceof String) {
95
+ map.putString(key, (String) value);
96
+ } else {
97
+ map.putNull(key);
98
+ }
99
+ }
100
+ return map;
101
+ }
62
102
  }
@@ -0,0 +1,15 @@
1
+ package com.klarna.mobile.sdk.reactnative.signin;
2
+
3
+ import com.facebook.react.bridge.Promise;
4
+ import com.klarna.mobile.sdk.api.signin.KlarnaSignInSDK;
5
+
6
+ public class KlarnaSignInData {
7
+ String instanceId;
8
+ public Promise promise;
9
+ KlarnaSignInSDK sdkInstance;
10
+
11
+ public KlarnaSignInData(String instanceId, KlarnaSignInSDK sdkInstance) {
12
+ this.instanceId = instanceId;
13
+ this.sdkInstance = sdkInstance;
14
+ }
15
+ }
@@ -0,0 +1,40 @@
1
+ package com.klarna.mobile.sdk.reactnative.signin;
2
+
3
+ import java.util.Collections;
4
+ import java.util.HashMap;
5
+ import java.util.Map;
6
+
7
+ public class KlarnaSignInEventsMapper {
8
+ public static String mapSignInErrorName(String key) {
9
+ Map<String, String> errorsMap = new HashMap<>();
10
+ errorsMap.put("InvalidReturnUrlError", "KlarnaSignInInvalidReturnURL");
11
+ errorsMap.put("KlarnaSignInErrorInvalidCustomTabsReturnUrl", "KlarnaSignInInvalidReturnURL");
12
+ errorsMap.put("KlarnaSignInErrorAlreadyInProgress", "KlarnaSignInAlreadyInProgress");
13
+ errorsMap.put("KlarnaSignInErrorSignInFailed", "KlarnaSignInAuthorizationFailed");
14
+ errorsMap.put("KlarnaSignInErrorInvalidClientID", "KlarnaSignInInvalidClientID");
15
+ errorsMap.put("KlarnaSignInErrorInvalidMarket", "KlarnaSignInInvalidMarket");
16
+ errorsMap.put("klarnaSignInInvalidPresentationContext", "KlarnaSignInInvalidPresentationContext");
17
+ errorsMap.put("KlarnaSignInErrorInvalidScope", "KlarnaSignInInvalidScope");
18
+ errorsMap.put("KlarnaSignInErrorMissingTokenizationCallback", "KlarnaSignInMissingTokenizationId");
19
+ if (errorsMap.get(key) == null) {
20
+ return key;
21
+ }
22
+ return errorsMap.get(key);
23
+ }
24
+
25
+ public static String mapSignInEventName(String key) {
26
+ Map<String, String> eventsMap = new HashMap<>();
27
+ eventsMap.put("KlarnaSignInToken", "KlarnaSignInToken");
28
+ eventsMap.put("KlarnaSignInUserCancelled", "KlarnaSignInUserCancelled");
29
+ if (eventsMap.get(key) == null) {
30
+ return key;
31
+ }
32
+ return eventsMap.get(key);
33
+ }
34
+
35
+ public static String mapSignInParamName(String key) {
36
+ Map<String, String> paramsMap = new HashMap<>();
37
+ paramsMap.put("KlarnaSignInToken", "KlarnaSignInToken");
38
+ return paramsMap.get(key);
39
+ }
40
+ }
@@ -0,0 +1,124 @@
1
+ package com.klarna.mobile.sdk.reactnative.signin;
2
+
3
+ import androidx.annotation.NonNull;
4
+
5
+ import com.facebook.react.bridge.Promise;
6
+ import com.facebook.react.bridge.ReactApplicationContext;
7
+ import com.facebook.react.bridge.ReadableMap;
8
+ import com.klarna.mobile.sdk.KlarnaMobileSDKError;
9
+ import com.klarna.mobile.sdk.api.KlarnaEnvironment;
10
+ import com.klarna.mobile.sdk.api.KlarnaEventHandler;
11
+ import com.klarna.mobile.sdk.api.KlarnaProductEvent;
12
+ import com.klarna.mobile.sdk.api.KlarnaRegion;
13
+ import com.klarna.mobile.sdk.api.component.KlarnaComponent;
14
+ import com.klarna.mobile.sdk.api.signin.KlarnaSignInError;
15
+ import com.klarna.mobile.sdk.api.signin.KlarnaSignInEvent;
16
+ import com.klarna.mobile.sdk.api.signin.KlarnaSignInSDK;
17
+ import com.klarna.mobile.sdk.reactnative.common.event.KlarnaEventHandlerEventsUtil;
18
+ import com.klarna.mobile.sdk.reactnative.common.util.ArgumentsUtil;
19
+
20
+ import java.util.ArrayList;
21
+ import java.util.HashMap;
22
+ import java.util.Map;
23
+
24
+ public class KlarnaSignInModuleImpl implements KlarnaEventHandler {
25
+
26
+ public static final String NAME = "RNKlarnaSignIn";
27
+
28
+ public static final String SIGN_IN_SDK_NOT_INITIALIZED = "SIGN_IN_SDK_NOT_INITIALIZED";
29
+
30
+ private final ReactApplicationContext reactAppContext;
31
+ private final HashMap<String, KlarnaSignInData> signInSDKMap;
32
+
33
+ public KlarnaSignInModuleImpl(ReactApplicationContext reactAppContext) {
34
+ this.reactAppContext = reactAppContext;
35
+ this.signInSDKMap = new HashMap<String, KlarnaSignInData>();
36
+ }
37
+
38
+ /* Module private methods */
39
+
40
+ private KlarnaEnvironment environmentFrom(@NonNull String value) {
41
+ return switch (value) {
42
+ case "playground" -> KlarnaEnvironment.PLAYGROUND;
43
+ case "staging" -> KlarnaEnvironment.STAGING;
44
+ default -> KlarnaEnvironment.PRODUCTION;
45
+ };
46
+
47
+ }
48
+
49
+ private KlarnaRegion regionFrom(@NonNull String value) {
50
+ return switch (value) {
51
+ case "na" -> KlarnaRegion.NA;
52
+ case "oc" -> KlarnaRegion.OC;
53
+ default -> KlarnaRegion.EU;
54
+ };
55
+
56
+ }
57
+
58
+ private KlarnaSignInData getInstanceData(KlarnaComponent component) {
59
+ for (Map.Entry<String, KlarnaSignInData> entry : signInSDKMap.entrySet()) {
60
+ KlarnaSignInData data = entry.getValue();
61
+ if (data.sdkInstance == component) {
62
+ return data;
63
+ }
64
+ }
65
+ return null;
66
+ }
67
+
68
+ /* Module public methods */
69
+ public void init(String instanceId, String environment, String region, String returnUrl, Promise promise) {
70
+ KlarnaEnvironment env = environmentFrom(environment);
71
+ KlarnaRegion reg = regionFrom(region);
72
+ reactAppContext.runOnUiQueueThread(() -> {
73
+ KlarnaSignInSDK signInInstance = new KlarnaSignInSDK(reactAppContext.getCurrentActivity(), returnUrl, this, env, reg);
74
+ KlarnaSignInData signInData = new KlarnaSignInData(instanceId, signInInstance);
75
+ signInSDKMap.put(instanceId, signInData);
76
+ promise.resolve(null);
77
+ });
78
+ }
79
+
80
+ public void signIn(String instanceId, String clientId, String scope, String market, String locale, String tokenizationId, Promise promise) {
81
+ KlarnaSignInData signInData = signInSDKMap.get(instanceId);
82
+ if (signInData != null) {
83
+ signInData.promise = promise;
84
+ signInData.sdkInstance.signIn(clientId, scope, market, locale, tokenizationId);
85
+ } else {
86
+ promise.reject(SIGN_IN_SDK_NOT_INITIALIZED, "Sign in SDK not initialized");
87
+ }
88
+ }
89
+
90
+ public void dispose(String instanceId, Promise promise) {
91
+ KlarnaSignInData signInData = signInSDKMap.get(instanceId);
92
+ if (signInData != null) {
93
+ signInSDKMap.remove(instanceId);
94
+ promise.resolve(null);
95
+ }
96
+ }
97
+
98
+ /* KlarnaEventHandler methods */
99
+
100
+ @Override
101
+ public void onError(@NonNull KlarnaComponent klarnaComponent, @NonNull KlarnaMobileSDKError klarnaMobileSDKError) {
102
+ ArrayList<String> allowedNonFatalErrors = new ArrayList<>();
103
+ allowedNonFatalErrors.add(KlarnaSignInError.SignInFailed);
104
+ allowedNonFatalErrors.add(KlarnaSignInError.AlreadyInProgress);
105
+ if (klarnaMobileSDKError.isFatal() || !allowedNonFatalErrors.contains(klarnaMobileSDKError.getName())) {
106
+ KlarnaSignInData data = getInstanceData(klarnaComponent);
107
+ if (data != null) {
108
+ if (data.promise != null) {
109
+ KlarnaEventHandlerEventsUtil.sendKlarnaMobileSDKError(data, klarnaMobileSDKError);
110
+ }
111
+ }
112
+ }
113
+ }
114
+
115
+ @Override
116
+ public void onEvent(@NonNull KlarnaComponent klarnaComponent, @NonNull KlarnaProductEvent klarnaProductEvent) {
117
+ KlarnaSignInData data = getInstanceData(klarnaComponent);
118
+ if (data != null) {
119
+ if (data.promise != null) {
120
+ KlarnaEventHandlerEventsUtil.sendKlarnaProductEvent(data, klarnaProductEvent);
121
+ }
122
+ }
123
+ }
124
+ }
@@ -0,0 +1,65 @@
1
+ package com.klarna.mobile.sdk.reactnative.spec;
2
+
3
+ import androidx.annotation.Nullable;
4
+
5
+ import com.facebook.react.bridge.NativeModule;
6
+ import com.facebook.react.bridge.Promise;
7
+ import com.facebook.react.bridge.ReactApplicationContext;
8
+ import com.facebook.react.module.model.ReactModuleInfo;
9
+ import com.facebook.react.module.model.ReactModuleInfoProvider;
10
+ import com.klarna.mobile.sdk.reactnative.NativeKlarnaSignInSpec;
11
+ import com.klarna.mobile.sdk.reactnative.signin.KlarnaSignInModuleImpl;
12
+
13
+ import java.util.HashMap;
14
+ import java.util.Map;
15
+
16
+ public class RNKlarnaSignInModuleSpec extends NativeKlarnaSignInSpec {
17
+
18
+ private final KlarnaSignInModuleImpl module;
19
+
20
+ public RNKlarnaSignInModuleSpec(ReactApplicationContext reactContext) {
21
+ super(reactContext);
22
+ this.module = new KlarnaSignInModuleImpl(reactContext);
23
+ }
24
+
25
+ @Nullable
26
+ public NativeModule getModule(String name, ReactApplicationContext reactContext) {
27
+ if (name.equals(RNKlarnaSignInModuleSpec.NAME)) {
28
+ return new RNKlarnaSignInModuleSpec(reactContext);
29
+ } else {
30
+ return null;
31
+ }
32
+ }
33
+
34
+ public ReactModuleInfoProvider getReactModuleInfoProvider() {
35
+ return () -> {
36
+ final Map<String, ReactModuleInfo> moduleInfos = new HashMap<>();
37
+ moduleInfos.put(
38
+ RNKlarnaSignInModuleSpec.NAME,
39
+ new ReactModuleInfo(
40
+ RNKlarnaSignInModuleSpec.NAME,
41
+ RNKlarnaSignInModuleSpec.NAME,
42
+ false, // canOverrideExistingModule
43
+ false, // needsEagerInit
44
+ false, // isCxxModule
45
+ true // isTurboModule
46
+ ));
47
+ return moduleInfos;
48
+ };
49
+ }
50
+
51
+ @Override
52
+ public void init(String instanceId, String environment, String region, String returnUrl, Promise promise) {
53
+ module.init(instanceId, environment, region, returnUrl, promise);
54
+ }
55
+
56
+ @Override
57
+ public void dispose(String instanceId, Promise promise) {
58
+ module.dispose(instanceId, promise);
59
+ }
60
+
61
+ @Override
62
+ public void signIn(String instanceId, String clientId, String scope, String market, String locale, String tokenizationId, Promise promise) {
63
+ module.signIn(instanceId, clientId, scope, market, locale, tokenizationId, promise);
64
+ }
65
+ }
@@ -0,0 +1,39 @@
1
+ package com.klarna.mobile.sdk.reactnative.spec;
2
+
3
+ import androidx.annotation.NonNull;
4
+
5
+ import com.facebook.react.bridge.Promise;
6
+ import com.facebook.react.bridge.ReactApplicationContext;
7
+ import com.facebook.react.bridge.ReactContextBaseJavaModule;
8
+ import com.facebook.react.bridge.ReactMethod;
9
+ import com.klarna.mobile.sdk.reactnative.signin.KlarnaSignInModuleImpl;
10
+
11
+ public class RNKlarnaSignInModuleSpec extends ReactContextBaseJavaModule {
12
+ private KlarnaSignInModuleImpl module;
13
+
14
+ public RNKlarnaSignInModuleSpec(ReactApplicationContext reactContext) {
15
+ super(reactContext);
16
+ this.module = new KlarnaSignInModuleImpl(reactContext);
17
+ }
18
+
19
+ @NonNull
20
+ @Override
21
+ public String getName() {
22
+ return KlarnaSignInModuleImpl.NAME;
23
+ }
24
+
25
+ @ReactMethod(isBlockingSynchronousMethod = false)
26
+ public void init(String instanceId, String environment, String region, String returnUrl, Promise promise) {
27
+ module.init(instanceId, environment, region, returnUrl, promise);
28
+ }
29
+
30
+ @ReactMethod(isBlockingSynchronousMethod = false)
31
+ public void dispose(String instanceId, Promise promise) {
32
+ module.dispose(instanceId, promise);
33
+ }
34
+
35
+ @ReactMethod(isBlockingSynchronousMethod = false)
36
+ public void signIn(String instanceId, String clientId, String scope, String market, String locale, String tokenizationId, Promise promise) {
37
+ module.signIn(instanceId, clientId, scope, market, locale, tokenizationId, promise);
38
+ }
39
+ }
@@ -10,6 +10,7 @@ import com.facebook.react.uimanager.ViewManager;
10
10
  import com.klarna.mobile.sdk.reactnative.KlarnaMobileSDKPackage;
11
11
  import com.klarna.mobile.sdk.reactnative.checkout.KlarnaCheckoutViewManager;
12
12
  import com.klarna.mobile.sdk.reactnative.payments.KlarnaPaymentViewManager;
13
+ import com.klarna.mobile.sdk.reactnative.spec.RNKlarnaSignInModuleSpec;
13
14
  import com.klarna.mobile.sdk.reactnative.standalonewebview.KlarnaStandaloneWebViewManager;
14
15
 
15
16
  import org.junit.Assert;
@@ -34,10 +35,10 @@ public class KlarnaMobileSDKPackageTest {
34
35
 
35
36
  @Test
36
37
  public void testCreateNativeModules() {
37
- KlarnaMobileSDKPackage paymentViewPackage = new KlarnaMobileSDKPackage();
38
- List<NativeModule> nativeModules = paymentViewPackage.createNativeModules(reactContext);
39
- Assert.assertNotNull(nativeModules);
40
- Assert.assertTrue(nativeModules.isEmpty());
38
+ KlarnaMobileSDKPackage mobilePackage = new KlarnaMobileSDKPackage();
39
+ List<NativeModule> nativeModules = mobilePackage.createNativeModules(reactContext);
40
+ Assert.assertEquals(1, nativeModules.size());
41
+ Assert.assertTrue(nativeModules.get(0) instanceof RNKlarnaSignInModuleSpec);
41
42
  }
42
43
 
43
44
  @Test
@@ -0,0 +1,25 @@
1
+ //
2
+ // KlarnaSignInData.h
3
+ // react-native-klarna-inapp-sdk
4
+ //
5
+ // Created by Jorge Palacio on 2025-03-12.
6
+ //
7
+
8
+ #import <Foundation/Foundation.h>
9
+ #import "KlarnaMobileSDK/KlarnaMobileSDK-Swift.h"
10
+ #import <React/RCTBridgeModule.h>
11
+
12
+ NS_ASSUME_NONNULL_BEGIN
13
+
14
+ @interface KlarnaSignInData : NSObject
15
+
16
+ @property (nonatomic, strong) NSString *instanceID;
17
+ @property (nonatomic, strong) KlarnaSignInSDK *sdkInstance API_AVAILABLE(ios(13.0));
18
+ @property (nonatomic, copy) RCTPromiseResolveBlock resolver;
19
+ @property (nonatomic, copy) RCTPromiseRejectBlock rejecter;
20
+
21
+ -(instancetype)initWith:(NSString *)instanceID sdkInstance:(KlarnaSignInSDK *)sdkInstance;
22
+
23
+ @end
24
+
25
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,21 @@
1
+ //
2
+ // KlarnaSignInData.m
3
+ // react-native-klarna-inapp-sdk
4
+ //
5
+ // Created by Jorge Palacio on 2025-03-12.
6
+ //
7
+
8
+ #import "KlarnaSignInData.h"
9
+
10
+ @implementation KlarnaSignInData
11
+
12
+ -(instancetype)initWith:(NSString *)instanceID sdkInstance:(KlarnaSignInSDK *)sdkInstance {
13
+ self = [super init];
14
+ if (self) {
15
+ _instanceID = instanceID;
16
+ _sdkInstance = sdkInstance;
17
+ }
18
+ return self;
19
+ }
20
+
21
+ @end
@@ -0,0 +1,18 @@
1
+ //
2
+ // KlarnaSignInErrorsMapper.h
3
+ // react-native-klarna-inapp-sdk
4
+ //
5
+ // Created by Jorge Palacio on 2025-05-13.
6
+ //
7
+
8
+ #import <Foundation/Foundation.h>
9
+
10
+ NS_ASSUME_NONNULL_BEGIN
11
+
12
+ @interface KlarnaSignInEventsMapper : NSObject
13
+ +(NSString *)mapSignInErrorName:(NSString *)errorName;
14
+ +(NSString *)mapSignInEventName:(NSString *)eventName;
15
+ +(NSString *)mapSignInParamName:(NSString *)paramName;
16
+ @end
17
+
18
+ NS_ASSUME_NONNULL_END
@@ -0,0 +1,54 @@
1
+ //
2
+ // KlarnaSignInErrorsMapper.m
3
+ // react-native-klarna-inapp-sdk
4
+ //
5
+ // Created by Jorge Palacio on 2025-05-13.
6
+ //
7
+
8
+ #import "KlarnaSignInEventsMapper.h"
9
+
10
+ @implementation KlarnaSignInEventsMapper
11
+ +(NSString *)mapSignInErrorName:(NSString *)errorName {
12
+ NSDictionary *signInErrorsMap = @{
13
+ @"klarnaInvalidReturnURLError": @"KlarnaSignInInvalidReturnURL",
14
+ @"klarnaSignInAlreadyInProgress": @"KlarnaSignInAlreadyInProgress",
15
+ @"klarnaSignInAuthorizationFailed": @"KlarnaSignInAuthorizationFailed",
16
+ @"klarnaSignInInvalidClientID": @"KlarnaSignInInvalidClientID",
17
+ @"klarnaSignInInvalidMarket": @"KlarnaSignInInvalidMarket",
18
+ @"klarnaSignInInvalidPresentationContext": @"KlarnaSignInInvalidPresentationContext",
19
+ @"klarnaSignInInvalidScope": @"KlarnaSignInInvalidScope",
20
+ @"klarnaSignInMissingTokenizationDelegate": @"KlarnaSignInMissingTokenizationId",
21
+ };
22
+ NSString *mappedError = signInErrorsMap[errorName];
23
+ if (mappedError) {
24
+ return mappedError;
25
+ } else {
26
+ return errorName;
27
+ }
28
+ }
29
+
30
+ +(NSString *)mapSignInEventName:(NSString *)eventName {
31
+ NSDictionary *signInEventsMap = @{
32
+ @"klarnaToken": @"KlarnaSignInToken",
33
+ @"klarnaSignInUserCancelled": @"KlarnaSignInUserCancelled"
34
+ };
35
+ NSString *mappedEvent = signInEventsMap[eventName];
36
+ if (mappedEvent) {
37
+ return mappedEvent;
38
+ } else {
39
+ return eventName;
40
+ }
41
+ }
42
+
43
+ +(NSString *)mapSignInParamName:(NSString *)paramName {
44
+ NSDictionary *signInParamsMap = @{
45
+ @"klarnaToken": @"KlarnaSignInToken"
46
+ };
47
+ NSString *mappedParam = signInParamsMap[paramName];
48
+ if (mappedParam) {
49
+ return mappedParam;
50
+ } else {
51
+ return paramName;
52
+ }
53
+ }
54
+ @end
@@ -0,0 +1,26 @@
1
+ //
2
+ // KlarnaSignInSDK.h
3
+ // RNKlarnaMobileSDK
4
+ //
5
+ // Created by Jorge Palacio on 2025-02-20.
6
+ // Copyright © 2025 Facebook. All rights reserved.
7
+ //
8
+
9
+ #import <Foundation/Foundation.h>
10
+ #import <React/RCTBridgeModule.h>
11
+ #import <RNKlarnaMobileSDK/RNKlarnaMobileSDK.h>
12
+
13
+ NS_ASSUME_NONNULL_BEGIN
14
+
15
+ #ifdef RCT_NEW_ARCH_ENABLED
16
+ @interface KlarnaSignInModule: NSObject<NativeKlarnaSignInSpec>
17
+
18
+ #else
19
+
20
+ @interface KlarnaSignInModule: NSObject<RCTBridgeModule>
21
+
22
+ #endif
23
+
24
+ @end
25
+
26
+ NS_ASSUME_NONNULL_END