react-native-klarna-inapp-sdk 2.1.13 → 2.2.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 (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 +346 -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 +72 -29
  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
@@ -1,51 +1,100 @@
1
1
  buildscript {
2
- ext.safeExtGet = {prop, fallback ->
3
- rootProject.ext.has(prop) ? rootProject.ext.get(prop) : fallback
2
+ ext.getExtOrFallback = { name, fallback ->
3
+ rootProject.ext.has(name) ? rootProject.ext.get(name) : fallback
4
4
  }
5
+
6
+ ext.getExtOrDefault = { name ->
7
+ getExtOrFallback(name, project.properties["lib_" + name])
8
+ }
9
+
5
10
  repositories {
6
11
  google()
7
12
  mavenCentral()
8
13
  }
9
14
 
10
15
  dependencies {
11
- // Matches recent template from React Native (0.64)
12
- // https://github.com/facebook/react-native/blob/0.64-stable/template/android/build.gradle#L16
13
- classpath("com.android.tools.build:gradle:${safeExtGet('gradlePluginVersion', '4.2.0')}")
16
+ classpath "com.android.tools.build:gradle:${getExtOrDefault('gradlePluginVersion')}"
14
17
  }
15
18
  }
16
19
 
20
+ def isNewArchitectureEnabled() {
21
+ return rootProject.hasProperty("newArchEnabled") && rootProject.getProperty("newArchEnabled") == "true"
22
+ }
23
+
17
24
  apply plugin: 'com.android.library'
18
- apply plugin: 'maven-publish'
25
+ apply plugin: 'kotlin-android'
26
+
27
+ def appProject = rootProject.allprojects.find { it.plugins.hasPlugin('com.android.application') }
28
+
29
+ if (isNewArchitectureEnabled()) {
30
+ apply plugin: "com.facebook.react"
31
+ }
32
+
33
+ def getExtOrDefault(name) {
34
+ return rootProject.ext.has(name) ? rootProject.ext.get(name) : project.properties["lib_" + name]
35
+ }
36
+
37
+ def getExtOrIntegerDefault(name) {
38
+ return rootProject.ext.has(name) ? rootProject.ext.get(name) : (project.properties["lib_" + name]).toInteger()
39
+ }
40
+
41
+ def supportsNamespace() {
42
+ def parsed = com.android.Version.ANDROID_GRADLE_PLUGIN_VERSION.tokenize('.')
43
+ def major = parsed[0].toInteger()
44
+ def minor = parsed[1].toInteger()
45
+
46
+ // Namespace support was added in 7.3.0
47
+ if (major == 7 && minor >= 3) {
48
+ return true
49
+ }
19
50
 
20
- // Matches or updates values in template from React Native (0.64)
21
- // https://github.com/facebook/react-native/blob/0.64-stable/template/android/build.gradle#L5-L9
22
- def DEFAULT_COMPILE_SDK_VERSION = 30
23
- def DEFAULT_BUILD_TOOLS_VERSION = "30.0.2"
24
- def DEFAULT_MIN_SDK_VERSION = 21
25
- def DEFAULT_TARGET_SDK_VERSION = 30
51
+ return major >= 8
52
+ }
26
53
 
27
54
  android {
28
- compileSdkVersion safeExtGet('compileSdkVersion', DEFAULT_COMPILE_SDK_VERSION)
29
- buildToolsVersion safeExtGet('buildToolsVersion', DEFAULT_BUILD_TOOLS_VERSION)
55
+ if (supportsNamespace()) {
56
+ namespace "com.klarna.mobile.sdk.reactnative"
57
+
58
+ sourceSets {
59
+ main {
60
+ manifest.srcFile "src/main/AndroidManifestNew.xml"
61
+ }
62
+ }
63
+ }
64
+ compileSdkVersion getExtOrIntegerDefault("compileSdkVersion")
30
65
 
31
66
  defaultConfig {
32
- minSdkVersion safeExtGet('minSdkVersion', DEFAULT_MIN_SDK_VERSION)
33
- targetSdkVersion safeExtGet('targetSdkVersion', DEFAULT_TARGET_SDK_VERSION)
67
+ minSdkVersion getExtOrIntegerDefault("minSdkVersion")
68
+ targetSdkVersion getExtOrIntegerDefault("targetSdkVersion")
69
+ buildConfigField "boolean", "IS_NEW_ARCHITECTURE_ENABLED", isNewArchitectureEnabled().toString()
34
70
  versionCode 1
35
71
  versionName "1.0"
36
72
  }
73
+ buildTypes {
74
+ release {
75
+ minifyEnabled false
76
+ }
77
+ }
37
78
  lintOptions {
38
79
  abortOnError false
80
+ disable "GradleCompatible"
81
+ }
82
+ compileOptions {
83
+ sourceCompatibility JavaVersion.VERSION_1_8
84
+ targetCompatibility JavaVersion.VERSION_1_8
85
+ }
86
+ sourceSets {
87
+ main {
88
+ if (isNewArchitectureEnabled()) {
89
+ java.srcDirs += ["src/newarch/java"]
90
+ } else {
91
+ java.srcDirs += ["src/oldarch/java"]
92
+ }
93
+ }
39
94
  }
40
95
  }
41
96
 
42
97
  repositories {
43
- maven {
44
- // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
45
- // Matches recent template from React Native (0.59)
46
- // https://github.com/facebook/react-native/blob/0.59-stable/template/android/build.gradle#L30
47
- url "$projectDir/../node_modules/react-native/android"
48
- }
49
98
  mavenCentral()
50
99
  google()
51
100
  maven {
@@ -54,7 +103,11 @@ repositories {
54
103
  }
55
104
 
56
105
  dependencies {
57
- implementation "com.facebook.react:react-native:${safeExtGet('reactnativeVersion', '+')}"
106
+ // For < 0.71, this will be from the local maven repo
107
+ // For > 0.71, this will be replaced by `com.facebook.react:react-android:$version` by react gradle plugin
108
+ //noinspection GradleDynamicVersion
109
+ implementation "com.facebook.react:react-native:${getExtOrFallback('reactnativeVersion', '+')}"
110
+
58
111
  implementation 'com.klarna.mobile:sdk:2.6.8'
59
112
 
60
113
  testImplementation "junit:junit:4.13"
@@ -69,87 +122,12 @@ dependencies {
69
122
  testImplementation "org.powermock:powermock-classloading-xstream:2.0.7"
70
123
  }
71
124
 
72
- def configureReactNativePom(def pom) {
73
- def packageJson = new groovy.json.JsonSlurper().parseText(file('../package.json').text)
74
-
75
- pom.project {
76
- name packageJson.title
77
- artifactId packageJson.name
78
- version = packageJson.version
79
- group = "com.klarna"
80
- description packageJson.description
81
- url packageJson.repository.baseUrl
82
-
83
- licenses {
84
- license {
85
- name packageJson.license
86
- url packageJson.repository.baseUrl + '/blob/master/' + packageJson.licenseFilename
87
- distribution 'repo'
88
- }
89
- }
90
-
91
- developers {
92
- developer {
93
- id packageJson.author.username
94
- name packageJson.author.name
95
- }
96
- }
97
- }
98
- }
99
-
100
- afterEvaluate { project ->
101
-
102
- task androidJavadocs(type: Javadoc) {
103
- source = android.sourceSets.main.java.srcDirs
104
- classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
105
- android.libraryVariants.all { variant ->
106
- if (variant.name == 'release') {
107
- owner.classpath += variant.javaCompileProvider.get().classpath
108
- }
109
- }
110
- }
111
-
112
- task androidJavadocsJar(type: Jar, dependsOn: androidJavadocs) {
113
- archiveClassifier.set('javadoc')
114
- from androidJavadocs.destinationDir
115
- }
116
-
117
- task androidSourcesJar(type: Jar) {
118
- archiveClassifier = 'sources'
119
- from android.sourceSets.main.java.srcDirs
120
- include '**/*.java'
121
- }
122
-
123
- android.libraryVariants.all { variant ->
124
- def name = variant.name.capitalize()
125
- task "jar${name}"(type: Jar, dependsOn: variant.javaCompile) {
126
- from variant.javaCompile.destinationDir
127
- }
128
- }
129
-
130
- artifacts {
131
- archives androidSourcesJar
132
- archives androidJavadocsJar
133
- }
134
-
135
- publishing {
136
- publications {
137
- sdkDefaultRelease(MavenPublication) {
138
- def packageJson = new groovy.json.JsonSlurper().parseText(file('../package.json').text)
139
- groupId "com.klarna"
140
- artifactId packageJson.name
141
- version packageJson.version
142
- description packageJson.description
143
-
144
- artifact(androidSourcesJar)
145
- artifact(androidJavadocsJar)
146
- }
147
- }
148
-
149
- repositories {
150
- maven {
151
- url = uri("file://${projectDir}/../android/maven")
152
- }
153
- }
154
- }
125
+ // removed from the docs but we can keep it
126
+ // https://reactnative.dev/docs/0.71/new-architecture-library-intro
127
+ if (isNewArchitectureEnabled()) {
128
+ react {
129
+ jsRootDir = file("../src/specs")
130
+ libraryName = "RNKlarnaMobileSDK"
131
+ codegenJavaPackageName = "com.klarna.mobile.sdk.reactnative"
132
+ }
155
133
  }
@@ -15,3 +15,10 @@ org.gradle.jvmargs=-Xmx1536m
15
15
  kotlin.code.style=official
16
16
  android.useAndroidX=true
17
17
  android.enableJetifier=true
18
+
19
+ lib_gradlePluginVersion=7.2.1
20
+ lib_kotlinVersion=1.7.0
21
+ lib_minSdkVersion=21
22
+ lib_targetSdkVersion=31
23
+ lib_compileSdkVersion=31
24
+ lib_ndkVersion=21.4.7075529
@@ -1,4 +1,5 @@
1
1
  <manifest xmlns:android="http://schemas.android.com/apk/res/android"
2
- package="com.klarna.inapp.sdk">
2
+ package="com.klarna.mobile.sdk.reactnative">
3
3
 
4
+ <uses-permission android:name="android.permission.INTERNET" />
4
5
  </manifest>
@@ -0,0 +1,4 @@
1
+ <manifest xmlns:android="http://schemas.android.com/apk/res/android">
2
+
3
+ <uses-permission android:name="android.permission.INTERNET" />
4
+ </manifest>
@@ -0,0 +1,33 @@
1
+ package com.klarna.mobile.sdk.reactnative;
2
+
3
+ import android.app.Application;
4
+
5
+ import androidx.annotation.NonNull;
6
+
7
+ import com.facebook.react.ReactPackage;
8
+ import com.facebook.react.bridge.NativeModule;
9
+ import com.facebook.react.bridge.ReactApplicationContext;
10
+ import com.facebook.react.uimanager.ViewManager;
11
+ import com.klarna.mobile.sdk.reactnative.payments.KlarnaPaymentViewManager;
12
+ import com.klarna.mobile.sdk.reactnative.standalonewebview.KlarnaStandaloneWebViewManager;
13
+
14
+ import java.util.Collections;
15
+ import java.util.List;
16
+
17
+ public class KlarnaMobileSDKPackage implements ReactPackage {
18
+
19
+ @NonNull
20
+ @Override
21
+ public List<NativeModule> createNativeModules(@NonNull ReactApplicationContext reactContext) {
22
+ return Collections.emptyList();
23
+ }
24
+
25
+ @NonNull
26
+ @Override
27
+ public List<ViewManager> createViewManagers(@NonNull ReactApplicationContext reactContext) {
28
+ return List.of(
29
+ new KlarnaPaymentViewManager(reactContext, (Application) reactContext.getApplicationContext()),
30
+ new KlarnaStandaloneWebViewManager(reactContext, (Application) reactContext.getApplicationContext())
31
+ );
32
+ }
33
+ }
@@ -0,0 +1,62 @@
1
+ package com.klarna.mobile.sdk.reactnative.common;
2
+
3
+ import com.facebook.react.bridge.Arguments;
4
+ import com.facebook.react.bridge.ReadableArray;
5
+ import com.facebook.react.bridge.ReadableMap;
6
+ import com.facebook.react.bridge.WritableArray;
7
+ import com.facebook.react.bridge.WritableMap;
8
+
9
+ import java.util.List;
10
+ import java.util.Map;
11
+
12
+ public class ArgumentsUtil {
13
+
14
+ public static WritableMap createMap(Map<String, Object> sourceMap) {
15
+ WritableMap map = Arguments.createMap();
16
+ for (Map.Entry<String, Object> entry : sourceMap.entrySet()) {
17
+ String key = entry.getKey();
18
+ Object value = entry.getValue();
19
+ if (value == null) {
20
+ map.putNull(key);
21
+ } else if (value instanceof Boolean) {
22
+ map.putBoolean(key, (Boolean) value);
23
+ } else if (value instanceof String) {
24
+ map.putString(key, (String) value);
25
+ } else if (value instanceof Integer) {
26
+ map.putInt(key, (Integer) value);
27
+ } else if (value instanceof Double) {
28
+ map.putDouble(key, (Double) value);
29
+ } else if (value instanceof ReadableArray) {
30
+ map.putArray(key, (ReadableArray) value);
31
+ } else if (value instanceof ReadableMap) {
32
+ map.putMap(key, (ReadableMap) value);
33
+ }
34
+ }
35
+ return map;
36
+ }
37
+
38
+ public static WritableArray createArray(List<?> sourceList) {
39
+ WritableArray array = Arguments.createArray();
40
+ if (sourceList != null && sourceList.size() > 0) {
41
+ for (int i = 0; i < sourceList.size(); i++) {
42
+ Object value = sourceList.get(i);
43
+ if (value == null) {
44
+ array.pushNull();
45
+ } else if (value instanceof Boolean) {
46
+ array.pushBoolean((Boolean) value);
47
+ } else if (value instanceof String) {
48
+ array.pushString((String) value);
49
+ } else if (value instanceof Integer) {
50
+ array.pushInt((Integer) value);
51
+ } else if (value instanceof Double) {
52
+ array.pushDouble((Double) value);
53
+ } else if (value instanceof ReadableArray) {
54
+ array.pushArray((ReadableArray) value);
55
+ } else if (value instanceof ReadableMap) {
56
+ array.pushMap((ReadableMap) value);
57
+ }
58
+ }
59
+ }
60
+ return array;
61
+ }
62
+ }
@@ -0,0 +1,100 @@
1
+ package com.klarna.mobile.sdk.reactnative.common;
2
+
3
+ import android.os.Build;
4
+ import android.webkit.JavascriptInterface;
5
+ import android.webkit.WebView;
6
+
7
+ import java.lang.ref.WeakReference;
8
+
9
+ public class WebViewResizeObserver {
10
+ /**
11
+ * The interface between the wrapper and listener class
12
+ * to send the updated height values
13
+ */
14
+ public interface WebViewResizeObserverCallback {
15
+ void onResized(int value);
16
+ }
17
+
18
+ private static final String JS_INTERFACE_NAME = "NativeResizeObserver";
19
+ private final WeakReference<WebViewResizeObserverCallback> callback;
20
+
21
+ public WebViewResizeObserver(WebViewResizeObserverCallback callback) {
22
+ this.callback = new WeakReference<>(callback);
23
+ }
24
+
25
+ public void addInterface(WebView webView) {
26
+ webView.addJavascriptInterface(this, JS_INTERFACE_NAME);
27
+ }
28
+
29
+ public void injectListener(WebView webView) {
30
+ injectScript(webView, initScript());
31
+ }
32
+
33
+ /**
34
+ * The javascript interface method that is called when there's a
35
+ * 'resize' event
36
+ *
37
+ * @param value The height value which is sent from the 'resize' listener
38
+ */
39
+ @JavascriptInterface
40
+ public void onResized(int value) {
41
+ sendHeightValue(value);
42
+ }
43
+
44
+ /**
45
+ * Unwraps and null checks the callback object and sends
46
+ * the height value to wrapper through this callback
47
+ *
48
+ * @param value The updated height value to send to wrapper
49
+ */
50
+ private void sendHeightValue(int value) {
51
+ WebViewResizeObserverCallback callbackInstance = callback.get();
52
+ if (callbackInstance != null) {
53
+ callbackInstance.onResized(value);
54
+ }
55
+ }
56
+
57
+ private void injectScript(WebView webView, String script) {
58
+ String tryCatchScript = "try {\n" +
59
+ " " + script + "\n" +
60
+ "} catch (error) {\n" +
61
+ " console.error(\"inject failed\")\n" +
62
+ "}";
63
+ evaluateJSCompat(webView, tryCatchScript);
64
+ }
65
+
66
+ /**
67
+ * Evaluates a script inside a web view in a backward-compatible manner
68
+ *
69
+ * @param webView The web view to evaluate the script
70
+ * @param script The script to be evaluated
71
+ */
72
+ private void evaluateJSCompat(WebView webView, String script) {
73
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
74
+ webView.evaluateJavascript(script, null);
75
+ } else {
76
+ webView.loadUrl("javascript:" + script);
77
+ }
78
+ }
79
+
80
+ private String initScript() {
81
+ return "const container = document.querySelector('#payment-container');\n" +
82
+ "const resizeObserver = new ResizeObserver((entries) => {\n" +
83
+ " for (let entry of entries) {\n" +
84
+ " console.log('New dimensions found: ', entry);\n" +
85
+ " if (entry.contentRect) {\n" +
86
+ " const height = entry.contentRect.height;\n" +
87
+ " const listener = window.NativeResizeObserver;\n" +
88
+ " if (listener != null) {\n" +
89
+ " listener.onResized(height);\n" +
90
+ " }\n" +
91
+ " }\n" +
92
+ " }\n" +
93
+ " console.log('Container size changed');\n" +
94
+ "});\n" +
95
+ "if (container != null) {\n" +
96
+ " resizeObserver.observe(container);\n" +
97
+ "}\n" +
98
+ "console.log('Resize observer initialized');";
99
+ }
100
+ }
@@ -1,4 +1,4 @@
1
- package com.klarna.inapp.sdk;
1
+ package com.klarna.mobile.sdk.reactnative.payments;
2
2
 
3
3
  import androidx.annotation.IdRes;
4
4
  import androidx.annotation.NonNull;
@@ -7,14 +7,10 @@ import androidx.annotation.Nullable;
7
7
  import com.facebook.react.bridge.Arguments;
8
8
  import com.facebook.react.bridge.WritableMap;
9
9
  import com.facebook.react.uimanager.events.Event;
10
- import com.facebook.react.uimanager.events.RCTEventEmitter;
11
-
12
- import java.util.HashMap;
13
- import java.util.Map;
14
10
 
15
11
  /**
16
12
  * A `KlarnaPaymentEvent` builds the event that will be eventually sent via `on<event>`.
17
- *
13
+ * <p>
18
14
  * It consists of a flat JSON object with a single `name` parameter for the event name as well as
19
15
  * other, optional parameters depending on the function that was called.
20
16
  */
@@ -27,14 +23,15 @@ public class KlarnaPaymentEvent extends Event<KlarnaPaymentEvent> {
27
23
  public static final String EVENT_NAME_ON_REAUTHORIZE = "onReauthorized";
28
24
  public static final String EVENT_NAME_ON_FINALIZE = "onFinalized";
29
25
  public static final String EVENT_NAME_ON_ERROR = "onError";
26
+ public static final String EVENT_NAME_ON_RESIZED = "onResized";
30
27
 
31
28
  @NonNull
32
29
  private final String eventName;
33
30
 
34
31
  @Nullable
35
- private final Map<String, Object> additionalParams;
32
+ private final WritableMap additionalParams;
36
33
 
37
- public KlarnaPaymentEvent(@IdRes int viewId, @NonNull String eventName, @Nullable Map<String, Object> additionalParams) {
34
+ public KlarnaPaymentEvent(@IdRes int viewId, @NonNull String eventName, @Nullable WritableMap additionalParams) {
38
35
  super(viewId);
39
36
  this.eventName = eventName;
40
37
  this.additionalParams = additionalParams;
@@ -45,19 +42,12 @@ public class KlarnaPaymentEvent extends Event<KlarnaPaymentEvent> {
45
42
  return eventName;
46
43
  }
47
44
 
48
- /**
49
- * Composes and sends the event JSON object being sent up to JS.
50
- * @param rctEventEmitter
51
- */
45
+ @Nullable
52
46
  @Override
53
- public void dispatch(RCTEventEmitter rctEventEmitter) {
54
- Map<String, Object> map = new HashMap<>();
55
-
47
+ protected WritableMap getEventData() {
56
48
  if (additionalParams != null) {
57
- map.putAll(additionalParams);
49
+ return additionalParams;
58
50
  }
59
-
60
- WritableMap eventData = Arguments.makeNativeMap(map);
61
- rctEventEmitter.receiveEvent(getViewTag(), getEventName(), eventData);
51
+ return Arguments.createMap();
62
52
  }
63
53
  }