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.
- package/README.md +1 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/KlarnaMobileSDKPackage.java +2 -4
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/event/KlarnaEventHandlerEventsUtil.java +62 -3
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/util/ArgumentsUtil.java +40 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/signin/KlarnaSignInData.java +15 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/signin/KlarnaSignInEventsMapper.java +40 -0
- package/android/src/main/java/com/klarna/mobile/sdk/reactnative/signin/KlarnaSignInModuleImpl.java +124 -0
- package/android/src/newarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaSignInModuleSpec.java +65 -0
- package/android/src/oldarch/java/com/klarna/mobile/sdk/reactnative/spec/RNKlarnaSignInModuleSpec.java +39 -0
- package/android/src/test/java/com/klarna/mobile/sdk/reactnative/KlarnaMobileSDKPackageTest.java +5 -4
- package/ios/Sources/signIn/KlarnaSignInData.h +25 -0
- package/ios/Sources/signIn/KlarnaSignInData.mm +21 -0
- package/ios/Sources/signIn/KlarnaSignInEventsMapper.h +18 -0
- package/ios/Sources/signIn/KlarnaSignInEventsMapper.m +54 -0
- package/ios/Sources/signIn/KlarnaSignInModule.h +26 -0
- package/ios/Sources/signIn/KlarnaSignInModuleImpl.h +37 -0
- package/ios/Sources/signIn/KlarnaSignInModuleImpl.mm +244 -0
- package/ios/Sources/signIn/newarch/KlarnaSignInModule.mm +75 -0
- package/ios/Sources/signIn/oldarch/KlarnaSignInModule.mm +72 -0
- package/lib/commonjs/KlarnaSignInSDK.js +80 -0
- package/lib/commonjs/KlarnaSignInSDK.js.map +1 -0
- package/lib/commonjs/index.js +11 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/specs/NativeKlarnaSignIn.js +10 -0
- package/lib/commonjs/specs/NativeKlarnaSignIn.js.map +1 -0
- package/lib/commonjs/types/common/KlarnaEnvironment.js +13 -0
- package/lib/commonjs/types/common/KlarnaEnvironment.js.map +1 -0
- package/lib/commonjs/types/common/KlarnaRegion.js +14 -0
- package/lib/commonjs/types/common/KlarnaRegion.js.map +1 -0
- package/lib/module/KlarnaSignInSDK.js +72 -0
- package/lib/module/KlarnaSignInSDK.js.map +1 -0
- package/lib/module/index.js +1 -0
- package/lib/module/index.js.map +1 -1
- package/lib/module/specs/NativeKlarnaSignIn.js +3 -0
- package/lib/module/specs/NativeKlarnaSignIn.js.map +1 -0
- package/lib/module/types/common/KlarnaEnvironment.js +6 -0
- package/lib/module/types/common/KlarnaEnvironment.js.map +1 -0
- package/lib/module/types/common/KlarnaRegion.js +7 -0
- package/lib/module/types/common/KlarnaRegion.js.map +1 -0
- package/lib/typescript/KlarnaSignInSDK.d.ts +19 -0
- package/lib/typescript/KlarnaSignInSDK.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +1 -0
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/specs/NativeKlarnaSignIn.d.ts +10 -0
- package/lib/typescript/specs/NativeKlarnaSignIn.d.ts.map +1 -0
- package/lib/typescript/types/common/KlarnaEnvironment.d.ts +5 -0
- package/lib/typescript/types/common/KlarnaEnvironment.d.ts.map +1 -0
- package/lib/typescript/types/common/KlarnaMobileSDKError.d.ts +4 -0
- package/lib/typescript/types/common/KlarnaMobileSDKError.d.ts.map +1 -1
- package/lib/typescript/types/common/KlarnaProductEvent.d.ts +1 -0
- package/lib/typescript/types/common/KlarnaProductEvent.d.ts.map +1 -1
- package/lib/typescript/types/common/KlarnaRegion.d.ts +6 -0
- package/lib/typescript/types/common/KlarnaRegion.d.ts.map +1 -0
- package/package.json +1 -1
- package/react-native-klarna-inapp-sdk.podspec +1 -1
- package/src/KlarnaSignInSDK.tsx +122 -0
- package/src/index.tsx +1 -0
- package/src/specs/NativeKlarnaSignIn.ts +25 -0
- package/src/types/common/KlarnaEnvironment.ts +4 -0
- package/src/types/common/KlarnaMobileSDKError.ts +2 -0
- package/src/types/common/KlarnaProductEvent.ts +1 -0
- 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
|
|
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
|
}
|
package/android/src/main/java/com/klarna/mobile/sdk/reactnative/common/util/ArgumentsUtil.java
CHANGED
|
@@ -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
|
+
}
|
package/android/src/main/java/com/klarna/mobile/sdk/reactnative/signin/KlarnaSignInEventsMapper.java
ADDED
|
@@ -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
|
+
}
|
package/android/src/main/java/com/klarna/mobile/sdk/reactnative/signin/KlarnaSignInModuleImpl.java
ADDED
|
@@ -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
|
+
}
|
package/android/src/test/java/com/klarna/mobile/sdk/reactnative/KlarnaMobileSDKPackageTest.java
CHANGED
|
@@ -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
|
|
38
|
-
List<NativeModule> nativeModules =
|
|
39
|
-
Assert.
|
|
40
|
-
Assert.assertTrue(nativeModules.
|
|
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
|