@snowplow/react-native-tracker 1.4.0 → 2.1.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 (240) hide show
  1. package/.editorconfig +15 -0
  2. package/.eslintignore +6 -0
  3. package/.gitattributes +3 -0
  4. package/.github/ISSUE_TEMPLATE/bug_report.md +29 -0
  5. package/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
  6. package/.github/actions/setup/action.yml +28 -0
  7. package/.github/workflows/build.yml +155 -0
  8. package/.github/workflows/deploy.yml +97 -0
  9. package/.github/workflows/e2e-android.yml +121 -0
  10. package/.github/workflows/e2e-ios.yml +95 -0
  11. package/.github/workflows/snyk.yml +21 -0
  12. package/.gitignore +70 -0
  13. package/.npmignore +60 -0
  14. package/.nvmrc +1 -0
  15. package/.watchmanconfig +1 -0
  16. package/.yarnrc +3 -0
  17. package/CHANGELOG +176 -0
  18. package/CONTRIBUTING.md +80 -0
  19. package/LICENSE +1 -1
  20. package/README.md +24 -111
  21. package/android/build.gradle +93 -37
  22. package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  23. package/android/gradle/wrapper/gradle-wrapper.properties +1 -2
  24. package/android/gradle.properties +5 -2
  25. package/android/gradlew +172 -110
  26. package/android/gradlew.bat +24 -19
  27. package/android/src/main/AndroidManifest.xml +1 -3
  28. package/android/src/main/AndroidManifestNew.xml +2 -0
  29. package/android/src/main/java/com/snowplow/reactnativetracker/ReactNativeTrackerModule.kt +744 -0
  30. package/android/src/main/java/com/snowplow/reactnativetracker/ReactNativeTrackerPackage.kt +17 -0
  31. package/android/src/main/java/com/snowplow/reactnativetracker/util/ConfigUtil.kt +274 -0
  32. package/android/src/main/java/com/snowplow/reactnativetracker/util/EventUtil.kt +233 -0
  33. package/android/src/main/java/com/snowplow/reactnativetracker/util/TrackerVersion.kt +5 -0
  34. package/babel.config.js +3 -0
  35. package/example/.watchmanconfig +1 -0
  36. package/example/Gemfile +6 -0
  37. package/example/android/app/build.gradle +129 -0
  38. package/example/android/app/debug.keystore +0 -0
  39. package/example/android/app/proguard-rules.pro +10 -0
  40. package/example/android/app/src/androidTest/java/com/reactnativetrackerexample/DetoxTest.java +36 -0
  41. package/example/android/app/src/androidTest/java/com/reactnativetrackerexample/DetoxTestAppJUnitRunner.java +21 -0
  42. package/example/android/app/src/debug/AndroidManifest.xml +13 -0
  43. package/example/android/app/src/debug/java/com/reactnativetrackerexample/ReactNativeFlipper.java +75 -0
  44. package/example/android/app/src/main/AndroidManifest.xml +26 -0
  45. package/example/android/app/src/main/java/com/reactnativetrackerexample/MainActivity.java +32 -0
  46. package/example/android/app/src/main/java/com/reactnativetrackerexample/MainApplication.java +62 -0
  47. package/example/android/app/src/main/res/drawable/rn_edit_text_material.xml +36 -0
  48. package/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  49. package/example/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +0 -0
  50. package/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  51. package/example/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +0 -0
  52. package/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  53. package/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +0 -0
  54. package/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  55. package/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
  56. package/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  57. package/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
  58. package/example/android/app/src/main/res/values/strings.xml +3 -0
  59. package/example/android/app/src/main/res/values/styles.xml +9 -0
  60. package/example/android/app/src/release/java/com/reactnativetrackerexample/ReactNativeFlipper.java +20 -0
  61. package/example/android/build.gradle +31 -0
  62. package/example/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  63. package/example/android/gradle/wrapper/gradle-wrapper.properties +6 -0
  64. package/example/android/gradle.properties +44 -0
  65. package/example/android/gradlew +244 -0
  66. package/example/android/gradlew.bat +92 -0
  67. package/example/android/settings.gradle +4 -0
  68. package/example/app.json +4 -0
  69. package/example/babel.config.js +17 -0
  70. package/example/detox.config.js +92 -0
  71. package/example/e2e/config.json +10 -0
  72. package/example/e2e/emitEvents.e2e.detox.js +95 -0
  73. package/example/e2e/environment.js +23 -0
  74. package/example/e2e/helpers/microCommands.js +140 -0
  75. package/example/e2e/helpers/microHelpers.js +333 -0
  76. package/example/e2e/helpers/microHelpers.test.js +295 -0
  77. package/example/e2e/helpers/schemas.js +49 -0
  78. package/example/e2e/jest.config.js +16 -0
  79. package/example/e2e/setup.js +4 -0
  80. package/example/e2e/testEvents.micro.test.js +287 -0
  81. package/example/index.js +5 -0
  82. package/example/ios/.xcode.env +11 -0
  83. package/example/ios/Podfile +62 -0
  84. package/example/ios/Podfile.lock +730 -0
  85. package/example/ios/ReactNativeTrackerExample/AppDelegate.h +6 -0
  86. package/example/ios/ReactNativeTrackerExample/AppDelegate.mm +26 -0
  87. package/example/ios/ReactNativeTrackerExample/Images.xcassets/AppIcon.appiconset/Contents.json +53 -0
  88. package/example/ios/ReactNativeTrackerExample/Images.xcassets/Contents.json +6 -0
  89. package/example/ios/ReactNativeTrackerExample/Info.plist +55 -0
  90. package/example/ios/ReactNativeTrackerExample/LaunchScreen.storyboard +47 -0
  91. package/example/ios/ReactNativeTrackerExample/main.m +10 -0
  92. package/example/ios/ReactNativeTrackerExample-Bridging-Header.h +3 -0
  93. package/example/ios/ReactNativeTrackerExample.xcodeproj/project.pbxproj +722 -0
  94. package/{ios/RNSnowplowTracker.xcodeproj/xcshareddata/xcschemes/RNSnowplowTracker.xcscheme → example/ios/ReactNativeTrackerExample.xcodeproj/xcshareddata/xcschemes/ReactNativeTrackerExample.xcscheme} +29 -21
  95. package/example/ios/ReactNativeTrackerExample.xcworkspace/contents.xcworkspacedata +10 -0
  96. package/example/ios/ReactNativeTrackerExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  97. package/example/ios/ReactNativeTrackerExampleTests/Info.plist +24 -0
  98. package/example/ios/ReactNativeTrackerExampleTests/ReactNativeTrackerExampleTests.m +66 -0
  99. package/example/metro.config.js +45 -0
  100. package/example/package.json +54 -0
  101. package/example/react-native.config.js +10 -0
  102. package/example/src/App.js +566 -0
  103. package/example/tsconfig.json +5 -0
  104. package/example/yarn.lock +7379 -0
  105. package/ios/ReactNativeTracker-Bridging-Header.h +2 -0
  106. package/ios/ReactNativeTracker.mm +175 -0
  107. package/ios/ReactNativeTracker.swift +822 -0
  108. package/ios/{RNSnowplowTracker.xcodeproj → ReactNativeTracker.xcodeproj}/project.pbxproj +55 -79
  109. package/ios/Util/ConfigUtils.swift +209 -0
  110. package/ios/Util/TrackerVersion.swift +3 -0
  111. package/ios/Util/Utilities.swift +37 -0
  112. package/lefthook.yml +11 -0
  113. package/lib/commonjs/api.js +490 -0
  114. package/lib/commonjs/api.js.map +1 -0
  115. package/lib/commonjs/configurations.js +196 -0
  116. package/lib/commonjs/configurations.js.map +1 -0
  117. package/lib/commonjs/constants.js +77 -0
  118. package/lib/commonjs/constants.js.map +1 -0
  119. package/lib/commonjs/events.js +277 -0
  120. package/lib/commonjs/events.js.map +1 -0
  121. package/lib/commonjs/index.js +132 -0
  122. package/lib/commonjs/index.js.map +1 -0
  123. package/lib/commonjs/jsCore.js +427 -0
  124. package/lib/commonjs/jsCore.js.map +1 -0
  125. package/lib/commonjs/native.js +16 -0
  126. package/lib/commonjs/native.js.map +1 -0
  127. package/lib/commonjs/subject.js +235 -0
  128. package/lib/commonjs/subject.js.map +1 -0
  129. package/lib/commonjs/tracker.js +248 -0
  130. package/lib/commonjs/tracker.js.map +1 -0
  131. package/lib/commonjs/types.js +2 -0
  132. package/lib/commonjs/types.js.map +1 -0
  133. package/lib/commonjs/utils.js +72 -0
  134. package/lib/commonjs/utils.js.map +1 -0
  135. package/lib/commonjs/webViewInterface.js +66 -0
  136. package/lib/commonjs/webViewInterface.js.map +1 -0
  137. package/lib/module/api.js +452 -0
  138. package/lib/module/api.js.map +1 -0
  139. package/lib/module/configurations.js +184 -0
  140. package/lib/module/configurations.js.map +1 -0
  141. package/lib/module/constants.js +72 -0
  142. package/lib/module/constants.js.map +1 -0
  143. package/lib/module/events.js +259 -0
  144. package/lib/module/events.js.map +1 -0
  145. package/lib/module/index.js +120 -0
  146. package/lib/module/index.js.map +1 -0
  147. package/lib/module/jsCore.js +424 -0
  148. package/lib/module/jsCore.js.map +1 -0
  149. package/lib/module/native.js +12 -0
  150. package/lib/module/native.js.map +1 -0
  151. package/lib/module/subject.js +222 -0
  152. package/lib/module/subject.js.map +1 -0
  153. package/lib/module/tracker.js +234 -0
  154. package/lib/module/tracker.js.map +1 -0
  155. package/lib/module/types.js +2 -0
  156. package/lib/module/types.js.map +1 -0
  157. package/lib/module/utils.js +66 -0
  158. package/lib/module/utils.js.map +1 -0
  159. package/lib/module/webViewInterface.js +62 -0
  160. package/lib/module/webViewInterface.js.map +1 -0
  161. package/lib/typescript/__tests__/api.test.d.ts +2 -0
  162. package/lib/typescript/__tests__/api.test.d.ts.map +1 -0
  163. package/lib/typescript/__tests__/configurations.test.d.ts +2 -0
  164. package/lib/typescript/__tests__/configurations.test.d.ts.map +1 -0
  165. package/lib/typescript/__tests__/events.test.d.ts +2 -0
  166. package/lib/typescript/__tests__/events.test.d.ts.map +1 -0
  167. package/lib/typescript/__tests__/index.test.d.ts +2 -0
  168. package/lib/typescript/__tests__/index.test.d.ts.map +1 -0
  169. package/lib/typescript/__tests__/jsCore.test.d.ts +2 -0
  170. package/lib/typescript/__tests__/jsCore.test.d.ts.map +1 -0
  171. package/lib/typescript/__tests__/utils.test.d.ts +2 -0
  172. package/lib/typescript/__tests__/utils.test.d.ts.map +1 -0
  173. package/lib/typescript/api.d.ts +240 -0
  174. package/lib/typescript/api.d.ts.map +1 -0
  175. package/lib/typescript/configurations.d.ts +73 -0
  176. package/lib/typescript/configurations.d.ts.map +1 -0
  177. package/lib/typescript/constants.d.ts +64 -0
  178. package/lib/typescript/constants.d.ts.map +1 -0
  179. package/lib/typescript/events.d.ts +115 -0
  180. package/lib/typescript/events.d.ts.map +1 -0
  181. package/lib/typescript/index.d.ts +27 -0
  182. package/lib/typescript/index.d.ts.map +1 -0
  183. package/lib/typescript/jsCore.d.ts +152 -0
  184. package/lib/typescript/jsCore.d.ts.map +1 -0
  185. package/lib/typescript/native.d.ts +4 -0
  186. package/lib/typescript/native.d.ts.map +1 -0
  187. package/lib/typescript/subject.d.ts +91 -0
  188. package/lib/typescript/subject.d.ts.map +1 -0
  189. package/lib/typescript/tracker.d.ts +111 -0
  190. package/lib/typescript/tracker.d.ts.map +1 -0
  191. package/{dist/index.d.ts → lib/typescript/types.d.ts} +264 -73
  192. package/lib/typescript/types.d.ts.map +1 -0
  193. package/lib/typescript/utils.d.ts +35 -0
  194. package/lib/typescript/utils.d.ts.map +1 -0
  195. package/lib/typescript/webViewInterface.d.ts +15 -0
  196. package/lib/typescript/webViewInterface.d.ts.map +1 -0
  197. package/package.json +135 -53
  198. package/scripts/bootstrap.js +29 -0
  199. package/snowplow-react-native-tracker.podspec +42 -0
  200. package/src/__mocks__/react-native.js +7 -0
  201. package/src/__tests__/api.test.ts +21 -0
  202. package/src/__tests__/configurations.test.ts +608 -0
  203. package/src/__tests__/events.test.ts +736 -0
  204. package/src/__tests__/index.test.ts +14 -0
  205. package/src/__tests__/jsCore.test.ts +199 -0
  206. package/src/__tests__/utils.test.ts +10 -0
  207. package/src/api.ts +556 -0
  208. package/src/configurations.ts +325 -0
  209. package/src/constants.ts +97 -0
  210. package/src/events.ts +355 -0
  211. package/src/index.ts +184 -0
  212. package/src/jsCore.ts +603 -0
  213. package/src/native.ts +21 -0
  214. package/src/subject.ts +302 -0
  215. package/src/tracker.ts +377 -0
  216. package/src/types.ts +1162 -0
  217. package/src/utils.ts +65 -0
  218. package/src/webViewInterface.ts +92 -0
  219. package/tsconfig.build.json +5 -0
  220. package/tsconfig.json +28 -0
  221. package/turbo.json +34 -0
  222. package/yarn.lock +9333 -0
  223. package/RNSnowplowTracker.podspec +0 -24
  224. package/android/src/main/java/com/snowplowanalytics/react/tracker/RNSnowplowTrackerModule.java +0 -750
  225. package/android/src/main/java/com/snowplowanalytics/react/tracker/RNSnowplowTrackerPackage.java +0 -29
  226. package/android/src/main/java/com/snowplowanalytics/react/util/ConfigUtil.java +0 -351
  227. package/android/src/main/java/com/snowplowanalytics/react/util/EventUtil.java +0 -339
  228. package/android/src/main/java/com/snowplowanalytics/react/util/TrackerVersion.java +0 -7
  229. package/dist/index.js +0 -2026
  230. package/dist/index.js.map +0 -1
  231. package/ios/RNSnowplowTracker.h +0 -34
  232. package/ios/RNSnowplowTracker.m +0 -911
  233. package/ios/Util/NSDictionary+RNSP_TypeMethods.h +0 -33
  234. package/ios/Util/NSDictionary+RNSP_TypeMethods.m +0 -40
  235. package/ios/Util/RNConfigUtils.h +0 -44
  236. package/ios/Util/RNConfigUtils.m +0 -209
  237. package/ios/Util/RNTrackerVersion.h +0 -27
  238. package/ios/Util/RNTrackerVersion.m +0 -27
  239. package/ios/Util/RNUtilities.h +0 -32
  240. package/ios/Util/RNUtilities.m +0 -68
@@ -0,0 +1,744 @@
1
+ package com.snowplow.reactnativetracker
2
+
3
+ import com.facebook.react.bridge.*
4
+ import com.snowplow.reactnativetracker.util.ConfigUtil
5
+ import com.snowplow.reactnativetracker.util.EventUtil
6
+ import com.snowplowanalytics.snowplow.Snowplow
7
+ import com.snowplowanalytics.snowplow.Snowplow.defaultTracker
8
+ import com.snowplowanalytics.snowplow.Snowplow.removeAllTrackers
9
+ import com.snowplowanalytics.snowplow.Snowplow.removeTracker
10
+ import com.snowplowanalytics.snowplow.configuration.*
11
+ import com.snowplowanalytics.snowplow.controller.TrackerController
12
+ import com.snowplowanalytics.snowplow.event.*
13
+ import com.snowplowanalytics.snowplow.globalcontexts.GlobalContext
14
+ import com.snowplowanalytics.snowplow.network.CollectorCookieJar
15
+ import com.snowplowanalytics.snowplow.network.HttpMethod
16
+ import com.snowplowanalytics.snowplow.payload.SelfDescribingJson
17
+ import com.snowplowanalytics.snowplow.util.Size
18
+ import com.snowplowanalytics.snowplow.configuration.Configuration
19
+ import com.snowplowanalytics.snowplow.configuration.EmitterConfiguration
20
+ import com.snowplowanalytics.snowplow.configuration.GdprConfiguration
21
+ import com.snowplowanalytics.snowplow.configuration.NetworkConfiguration
22
+ import com.snowplowanalytics.snowplow.configuration.SessionConfiguration
23
+ import com.snowplowanalytics.snowplow.configuration.TrackerConfiguration
24
+ import com.snowplowanalytics.snowplow.configuration.SubjectConfiguration
25
+ import com.snowplowanalytics.snowplow.configuration.GlobalContextsConfiguration
26
+ import com.snowplowanalytics.snowplow.event.DeepLinkReceived
27
+ import com.snowplowanalytics.snowplow.event.MessageNotification
28
+ import com.snowplowanalytics.snowplow.event.SelfDescribing
29
+ import com.snowplowanalytics.snowplow.event.ScreenView
30
+ import com.snowplowanalytics.snowplow.event.Structured
31
+ import com.snowplowanalytics.snowplow.event.PageView
32
+ import com.snowplowanalytics.snowplow.event.Timing
33
+ import com.snowplowanalytics.snowplow.event.ConsentGranted
34
+ import com.snowplowanalytics.snowplow.event.ConsentWithdrawn
35
+ import com.snowplowanalytics.snowplow.event.EcommerceTransaction
36
+ import java.util.concurrent.TimeUnit
37
+
38
+ import okhttp3.OkHttpClient
39
+ import okhttp3.Request
40
+
41
+ class ReactNativeTrackerModule(val reactContext: ReactApplicationContext) :
42
+ ReactContextBaseJavaModule(reactContext) {
43
+
44
+ override fun getName(): String {
45
+ return NAME
46
+ }
47
+
48
+ @ReactMethod
49
+ fun createTracker(
50
+ argmap: ReadableMap,
51
+ promise: Promise
52
+ ) {
53
+ try {
54
+ val trackerNs = argmap.getString("namespace")!!
55
+ val networkConfig = argmap.getMap("networkConfig")!!
56
+
57
+ // NetworkConfiguration
58
+ val endpoint = networkConfig.getString("endpoint")!!
59
+ val networkConfiguration = networkConfig.getString("method")?.let { method ->
60
+ NetworkConfiguration(
61
+ endpoint,
62
+ if ("get".equals(method, ignoreCase = true)) HttpMethod.GET else HttpMethod.POST
63
+ )
64
+ } ?: NetworkConfiguration(endpoint)
65
+ networkConfig.getString("customPostPath")?.let { customPostPath ->
66
+ networkConfiguration.customPostPath = customPostPath
67
+ }
68
+ if (networkConfig.hasKey("requestHeaders") && !networkConfig.isNull("requestHeaders")) {
69
+ networkConfig.getMap("requestHeaders")?.let { requestHeaders ->
70
+ val client: OkHttpClient = OkHttpClient.Builder()
71
+ .connectTimeout(15, TimeUnit.SECONDS)
72
+ .readTimeout(15, TimeUnit.SECONDS)
73
+ .cookieJar(CollectorCookieJar(reactContext))
74
+ .addInterceptor { chain ->
75
+ val requestBuilder: Request.Builder = chain.request().newBuilder()
76
+ val it: ReadableMapKeySetIterator = requestHeaders.keySetIterator()
77
+ while (it.hasNextKey()) {
78
+ val key = it.nextKey()
79
+ val value = requestHeaders.getString(key)
80
+ if (value != null) {
81
+ requestBuilder.header(key, value)
82
+ }
83
+ }
84
+ chain.proceed(requestBuilder.build())
85
+ }.build()
86
+ networkConfiguration.okHttpClient(client)
87
+ }
88
+ }
89
+
90
+ // Configurations
91
+ val controllers: MutableList<Configuration> = ArrayList()
92
+
93
+ // TrackerConfiguration
94
+ val trackerConfiguration = ConfigUtil.mkTrackerConfiguration(argmap.getMap("trackerConfig"), this.reactContext)
95
+ controllers.add(trackerConfiguration)
96
+
97
+ // SessionConfiguration
98
+ argmap.getMap("sessionConfig")?.let { sessionConfig ->
99
+ val sessionConfiguration: SessionConfiguration =
100
+ ConfigUtil.mkSessionConfiguration(sessionConfig)
101
+ controllers.add(sessionConfiguration)
102
+ }
103
+
104
+ // EmitterConfiguration
105
+ argmap.getMap("emitterConfig")?.let { emitterConfig ->
106
+ val emitterConfiguration: EmitterConfiguration =
107
+ ConfigUtil.mkEmitterConfiguration(emitterConfig)
108
+ controllers.add(emitterConfiguration)
109
+ }
110
+
111
+ // SubjectConfiguration
112
+ argmap.getMap("subjectConfig")?.let { subjectConfig ->
113
+ val subjectConfiguration: SubjectConfiguration =
114
+ ConfigUtil.mkSubjectConfiguration(subjectConfig)
115
+ controllers.add(subjectConfiguration)
116
+ }
117
+
118
+ // GdprConfiguration
119
+ argmap.getMap("gdprConfig")?.let { gdprConfig ->
120
+ val gdprConfiguration: GdprConfiguration = ConfigUtil.mkGdprConfiguration(gdprConfig)
121
+ controllers.add(gdprConfiguration)
122
+ }
123
+
124
+ // GCConfiguration
125
+ argmap.getArray("gcConfig")?.let { gcConfig ->
126
+ val gcConfiguration: GlobalContextsConfiguration = ConfigUtil.mkGCConfiguration(gcConfig)
127
+ controllers.add(gcConfiguration)
128
+ }
129
+
130
+ // create the tracker
131
+ Snowplow.createTracker(
132
+ this.reactContext,
133
+ trackerNs,
134
+ networkConfiguration,
135
+ *controllers.toTypedArray()
136
+ )
137
+ promise.resolve(true)
138
+ } catch (t: Throwable) {
139
+ promise.reject("ERROR", t.message)
140
+ }
141
+ }
142
+
143
+ @ReactMethod
144
+ fun removeTracker(
145
+ details: ReadableMap,
146
+ promise: Promise
147
+ ) {
148
+ try {
149
+ val namespace = details.getString("tracker")
150
+ val trackerController = getTracker(namespace)
151
+ promise.resolve(removeTracker(trackerController))
152
+ } catch (t: Throwable) {
153
+ promise.reject("ERROR", t.message)
154
+ }
155
+ }
156
+
157
+ @ReactMethod
158
+ fun removeAllTrackers(promise: Promise) {
159
+ try {
160
+ removeAllTrackers()
161
+ promise.resolve(true)
162
+ } catch (t: Throwable) {
163
+ promise.reject("ERROR", t.message)
164
+ }
165
+ }
166
+
167
+ @ReactMethod
168
+ fun trackSelfDescribingEvent(
169
+ details: ReadableMap,
170
+ promise: Promise
171
+ ) {
172
+ try {
173
+ val namespace = details.getString("tracker")
174
+ val argmap = details.getMap("eventData")!!
175
+ val contexts = details.getArray("contexts")!!
176
+ val trackerController = getTracker(namespace)
177
+ val sdj: SelfDescribingJson = EventUtil.createSelfDescribingJson(argmap)
178
+ val event = SelfDescribing(sdj)
179
+ val evCtxts: List<SelfDescribingJson> = EventUtil.createContexts(contexts)
180
+ event.entities.addAll(evCtxts)
181
+ trackerController.track(event)
182
+ promise.resolve(true)
183
+ } catch (t: Throwable) {
184
+ promise.reject("ERROR", t.message)
185
+ }
186
+ }
187
+
188
+ @ReactMethod
189
+ fun trackStructuredEvent(
190
+ details: ReadableMap,
191
+ promise: Promise
192
+ ) {
193
+ try {
194
+ val namespace = details.getString("tracker")
195
+ val argmap = details.getMap("eventData")!!
196
+ val contexts: ReadableArray = details.getArray("contexts")!!
197
+ val trackerController = getTracker(namespace)
198
+ val event: Structured = EventUtil.createStructuredEvent(argmap)
199
+ val evCtxts: List<SelfDescribingJson> = EventUtil.createContexts(contexts)
200
+ event.entities.addAll(evCtxts)
201
+ trackerController.track(event)
202
+ promise.resolve(true)
203
+ } catch (t: Throwable) {
204
+ promise.reject("ERROR", t.message)
205
+ }
206
+ }
207
+
208
+ @ReactMethod
209
+ fun trackScreenViewEvent(
210
+ details: ReadableMap,
211
+ promise: Promise
212
+ ) {
213
+ try {
214
+ val namespace = details.getString("tracker")
215
+ val argmap = details.getMap("eventData")!!
216
+ val contexts = details.getArray("contexts")!!
217
+ val trackerController = getTracker(namespace)
218
+ val event: ScreenView = EventUtil.createScreenViewEvent(argmap)
219
+ val evCtxts: List<SelfDescribingJson> = EventUtil.createContexts(contexts)
220
+ event.entities.addAll(evCtxts)
221
+ trackerController.track(event)
222
+ promise.resolve(true)
223
+ } catch (t: Throwable) {
224
+ promise.reject("ERROR", t.message)
225
+ }
226
+ }
227
+
228
+ @ReactMethod
229
+ fun trackScrollChangedEvent(
230
+ details: ReadableMap,
231
+ promise: Promise
232
+ ) {
233
+ try {
234
+ val namespace = details.getString("tracker")
235
+ val argmap = details.getMap("eventData")!!
236
+ val contexts = details.getArray("contexts")!!
237
+ val trackerController = getTracker(namespace)
238
+ val event: ScrollChanged = EventUtil.createScrollChangedEvent(argmap)
239
+ val evCtxts: List<SelfDescribingJson> = EventUtil.createContexts(contexts)
240
+ event.entities.addAll(evCtxts)
241
+ trackerController.track(event)
242
+ promise.resolve(true)
243
+ } catch (t: Throwable) {
244
+ promise.reject("ERROR", t.message)
245
+ }
246
+ }
247
+
248
+ @ReactMethod
249
+ fun trackListItemViewEvent(
250
+ details: ReadableMap,
251
+ promise: Promise
252
+ ) {
253
+ try {
254
+ val namespace = details.getString("tracker")
255
+ val argmap = details.getMap("eventData")!!
256
+ val contexts = details.getArray("contexts")!!
257
+ val trackerController = getTracker(namespace)
258
+ val event: ListItemView = EventUtil.createListItemViewEvent(argmap)
259
+ val evCtxts: List<SelfDescribingJson> = EventUtil.createContexts(contexts)
260
+ event.entities.addAll(evCtxts)
261
+ trackerController.track(event)
262
+ promise.resolve(true)
263
+ } catch (t: Throwable) {
264
+ promise.reject("ERROR", t.message)
265
+ }
266
+ }
267
+
268
+ @ReactMethod
269
+ fun trackPageViewEvent(
270
+ details: ReadableMap,
271
+ promise: Promise
272
+ ) {
273
+ try {
274
+ val namespace = details.getString("tracker")
275
+ val argmap = details.getMap("eventData")!!
276
+ val contexts = details.getArray("contexts")!!
277
+ val trackerController = getTracker(namespace)
278
+ val event: PageView = EventUtil.createPageViewEvent(argmap)
279
+ val evCtxts: List<SelfDescribingJson> = EventUtil.createContexts(contexts)
280
+ event.entities.addAll(evCtxts)
281
+ trackerController.track(event)
282
+ promise.resolve(true)
283
+ } catch (t: Throwable) {
284
+ promise.reject("ERROR", t.message)
285
+ }
286
+ }
287
+
288
+ @ReactMethod
289
+ fun trackTimingEvent(
290
+ details: ReadableMap,
291
+ promise: Promise
292
+ ) {
293
+ try {
294
+ val namespace = details.getString("tracker")
295
+ val argmap = details.getMap("eventData")!!
296
+ val contexts = details.getArray("contexts")!!
297
+ val trackerController = getTracker(namespace)
298
+ val event: Timing = EventUtil.createTimingEvent(argmap)
299
+ val evCtxts: List<SelfDescribingJson> = EventUtil.createContexts(contexts)
300
+ event.entities.addAll(evCtxts)
301
+ trackerController.track(event)
302
+ promise.resolve(true)
303
+ } catch (t: Throwable) {
304
+ promise.reject("ERROR", t.message)
305
+ }
306
+ }
307
+
308
+ @ReactMethod
309
+ fun trackConsentGrantedEvent(
310
+ details: ReadableMap,
311
+ promise: Promise
312
+ ) {
313
+ try {
314
+ val namespace = details.getString("tracker")
315
+ val argmap = details.getMap("eventData")!!
316
+ val contexts = details.getArray("contexts")!!
317
+ val trackerController = getTracker(namespace)
318
+ val event: ConsentGranted = EventUtil.createConsentGrantedEvent(argmap)
319
+ val evCtxts: List<SelfDescribingJson> = EventUtil.createContexts(contexts)
320
+ event.entities.addAll(evCtxts)
321
+ trackerController.track(event)
322
+ promise.resolve(true)
323
+ } catch (t: Throwable) {
324
+ promise.reject("ERROR", t.message)
325
+ }
326
+ }
327
+
328
+ @ReactMethod
329
+ fun trackConsentWithdrawnEvent(
330
+ details: ReadableMap,
331
+ promise: Promise
332
+ ) {
333
+ try {
334
+ val namespace = details.getString("tracker")
335
+ val argmap = details.getMap("eventData")!!
336
+ val contexts = details.getArray("contexts")!!
337
+ val trackerController = getTracker(namespace)
338
+ val event: ConsentWithdrawn = EventUtil.createConsentWithdrawnEvent(argmap)
339
+ val evCtxts: List<SelfDescribingJson> = EventUtil.createContexts(contexts)
340
+ event.entities.addAll(evCtxts)
341
+ trackerController.track(event)
342
+ promise.resolve(true)
343
+ } catch (t: Throwable) {
344
+ promise.reject("ERROR", t.message)
345
+ }
346
+ }
347
+
348
+ @ReactMethod
349
+ fun trackEcommerceTransactionEvent(
350
+ details: ReadableMap,
351
+ promise: Promise
352
+ ) {
353
+ try {
354
+ val namespace = details.getString("tracker")
355
+ val argmap = details.getMap("eventData")!!
356
+ val contexts = details.getArray("contexts")!!
357
+ val trackerController = getTracker(namespace)
358
+ val event: EcommerceTransaction = EventUtil.createEcommerceTransactionEvent(argmap)
359
+ val evCtxts: List<SelfDescribingJson> = EventUtil.createContexts(contexts)
360
+ event.entities.addAll(evCtxts)
361
+ trackerController.track(event)
362
+ promise.resolve(true)
363
+ } catch (t: Throwable) {
364
+ promise.reject("ERROR", t.message)
365
+ }
366
+ }
367
+
368
+ @ReactMethod
369
+ fun trackDeepLinkReceivedEvent(
370
+ details: ReadableMap,
371
+ promise: Promise
372
+ ) {
373
+ try {
374
+ val namespace = details.getString("tracker")
375
+ val argmap = details.getMap("eventData")!!
376
+ val contexts = details.getArray("contexts")!!
377
+ val trackerController = getTracker(namespace)
378
+ val event: DeepLinkReceived = EventUtil.createDeepLinkReceivedEvent(argmap)
379
+ val evCtxts: List<SelfDescribingJson> = EventUtil.createContexts(contexts)
380
+ event.entities.addAll(evCtxts)
381
+ trackerController.track(event)
382
+ promise.resolve(true)
383
+ } catch (t: Throwable) {
384
+ promise.reject("ERROR", t.message)
385
+ }
386
+ }
387
+
388
+ @ReactMethod
389
+ fun trackMessageNotificationEvent(
390
+ details: ReadableMap,
391
+ promise: Promise
392
+ ) {
393
+ try {
394
+ val namespace = details.getString("tracker")
395
+ val argmap = details.getMap("eventData")!!
396
+ val contexts = details.getArray("contexts")!!
397
+ val trackerController = getTracker(namespace)
398
+ val event: MessageNotification = EventUtil.createMessageNotificationEvent(argmap)
399
+ val evCtxts: List<SelfDescribingJson> = EventUtil.createContexts(contexts)
400
+ event.entities.addAll(evCtxts)
401
+ trackerController.track(event)
402
+ promise.resolve(true)
403
+ } catch (t: Throwable) {
404
+ promise.reject("ERROR", t.message)
405
+ }
406
+ }
407
+
408
+ @ReactMethod
409
+ fun removeGlobalContexts(
410
+ details: ReadableMap,
411
+ promise: Promise
412
+ ) {
413
+ try {
414
+ val namespace = details.getString("tracker")
415
+ val tag = details.getString("removeTag")!!
416
+ val trackerController = getTracker(namespace)
417
+ trackerController.globalContexts.remove(tag)
418
+ promise.resolve(true)
419
+ } catch (t: Throwable) {
420
+ promise.reject("ERROR", t.message)
421
+ }
422
+ }
423
+
424
+ @ReactMethod
425
+ fun addGlobalContexts(
426
+ details: ReadableMap,
427
+ promise: Promise
428
+ ) {
429
+ try {
430
+ val namespace = details.getString("tracker")
431
+ val gcArg = details.getMap("addGlobalContext")!!
432
+ val tag = gcArg.getString("tag")!!
433
+ val globalContexts = gcArg.getArray("globalContexts")!!
434
+ val staticContexts: MutableList<SelfDescribingJson> = ArrayList()
435
+ for (i in 0 until globalContexts.size()) {
436
+ val gContext: SelfDescribingJson =
437
+ EventUtil.createSelfDescribingJson(globalContexts.getMap(i))
438
+ staticContexts.add(gContext)
439
+ }
440
+ val gcStatic = GlobalContext(staticContexts)
441
+ val trackerController = getTracker(namespace)
442
+ trackerController.globalContexts.add(tag, gcStatic)
443
+ promise.resolve(true)
444
+ } catch (t: Throwable) {
445
+ promise.reject("ERROR", t.message)
446
+ }
447
+ }
448
+
449
+ @ReactMethod
450
+ fun setUserId(
451
+ details: ReadableMap,
452
+ promise: Promise
453
+ ) {
454
+ try {
455
+ val namespace = details.getString("tracker")
456
+ val trackerController = getTracker(namespace)
457
+ if (details.isNull("userId")) {
458
+ trackerController.subject.userId = null
459
+ } else {
460
+ trackerController.subject.userId = details.getString("userId")
461
+ }
462
+ promise.resolve(true)
463
+ } catch (t: Throwable) {
464
+ promise.reject("ERROR", t.message)
465
+ }
466
+ }
467
+
468
+ @ReactMethod
469
+ fun setNetworkUserId(
470
+ details: ReadableMap,
471
+ promise: Promise
472
+ ) {
473
+ try {
474
+ val namespace = details.getString("tracker")
475
+ val trackerController = getTracker(namespace)
476
+ if (details.isNull("networkUserId")) {
477
+ trackerController.subject.networkUserId = null
478
+ } else {
479
+ trackerController.subject.networkUserId = details.getString("networkUserId")
480
+ }
481
+ promise.resolve(true)
482
+ } catch (t: Throwable) {
483
+ promise.reject("ERROR", t.message)
484
+ }
485
+ }
486
+
487
+ @ReactMethod
488
+ fun setDomainUserId(
489
+ details: ReadableMap,
490
+ promise: Promise
491
+ ) {
492
+ try {
493
+ val namespace = details.getString("tracker")
494
+ val trackerController = getTracker(namespace)
495
+ if (details.isNull("domainUserId")) {
496
+ trackerController.subject.domainUserId = null
497
+ } else {
498
+ trackerController.subject.domainUserId = details.getString("domainUserId")
499
+ }
500
+ promise.resolve(true)
501
+ } catch (t: Throwable) {
502
+ promise.reject("ERROR", t.message)
503
+ }
504
+ }
505
+
506
+ @ReactMethod
507
+ fun setIpAddress(
508
+ details: ReadableMap,
509
+ promise: Promise
510
+ ) {
511
+ try {
512
+ val namespace = details.getString("tracker")
513
+ val trackerController = getTracker(namespace)
514
+ if (details.isNull("ipAddress")) {
515
+ trackerController.subject.ipAddress = null
516
+ } else {
517
+ trackerController.subject.ipAddress = details.getString("ipAddress")
518
+ }
519
+ promise.resolve(true)
520
+ } catch (t: Throwable) {
521
+ promise.reject("ERROR", t.message)
522
+ }
523
+ }
524
+
525
+ @ReactMethod
526
+ fun setUseragent(
527
+ details: ReadableMap,
528
+ promise: Promise
529
+ ) {
530
+ try {
531
+ val namespace = details.getString("tracker")
532
+ val trackerController = getTracker(namespace)
533
+ if (details.isNull("useragent")) {
534
+ trackerController.subject.useragent = null
535
+ } else {
536
+ trackerController.subject.useragent = details.getString("useragent")
537
+ }
538
+ promise.resolve(true)
539
+ } catch (t: Throwable) {
540
+ promise.reject("ERROR", t.message)
541
+ }
542
+ }
543
+
544
+ @ReactMethod
545
+ fun setTimezone(
546
+ details: ReadableMap,
547
+ promise: Promise
548
+ ) {
549
+ try {
550
+ val namespace = details.getString("tracker")
551
+ val trackerController = getTracker(namespace)
552
+ if (details.isNull("timezone")) {
553
+ trackerController.subject.timezone = null
554
+ } else {
555
+ trackerController.subject.timezone = details.getString("timezone")
556
+ }
557
+ promise.resolve(true)
558
+ } catch (t: Throwable) {
559
+ promise.reject("ERROR", t.message)
560
+ }
561
+ }
562
+
563
+ @ReactMethod
564
+ fun setLanguage(
565
+ details: ReadableMap,
566
+ promise: Promise
567
+ ) {
568
+ try {
569
+ val namespace = details.getString("tracker")
570
+ val trackerController = getTracker(namespace)
571
+ if (details.isNull("language")) {
572
+ trackerController.subject.language = null
573
+ } else {
574
+ trackerController.subject.language = details.getString("language")
575
+ }
576
+ promise.resolve(true)
577
+ } catch (t: Throwable) {
578
+ promise.reject("ERROR", t.message)
579
+ }
580
+ }
581
+
582
+ @ReactMethod
583
+ fun setScreenResolution(
584
+ details: ReadableMap,
585
+ promise: Promise
586
+ ) {
587
+ try {
588
+ val namespace = details.getString("tracker")
589
+ val trackerController = getTracker(namespace)
590
+ if (details.isNull("screenResolution")) {
591
+ trackerController.subject.screenResolution = null
592
+ } else {
593
+ val screenRes = details.getArray("screenResolution")!!
594
+ val width: Int = screenRes.getDouble(0).toInt()
595
+ val height: Int = screenRes.getDouble(1).toInt()
596
+ val screenR = Size(width, height)
597
+ trackerController.subject.screenResolution = screenR
598
+ }
599
+ promise.resolve(true)
600
+ } catch (t: Throwable) {
601
+ promise.reject("ERROR", t.message)
602
+ }
603
+ }
604
+
605
+ @ReactMethod
606
+ fun setScreenViewport(
607
+ details: ReadableMap,
608
+ promise: Promise
609
+ ) {
610
+ try {
611
+ val namespace = details.getString("tracker")
612
+ val trackerController = getTracker(namespace)
613
+ if (details.isNull("screenViewport")) {
614
+ trackerController.subject.screenViewPort = null
615
+ } else {
616
+ val screenView = details.getArray("screenViewport")!!
617
+ val width: Int = screenView.getDouble(0).toInt()
618
+ val height: Int = screenView.getDouble(1).toInt()
619
+ val screenVP = Size(width, height)
620
+ trackerController.subject.screenViewPort = screenVP
621
+ }
622
+ promise.resolve(true)
623
+ } catch (t: Throwable) {
624
+ promise.reject("ERROR", t.message)
625
+ }
626
+ }
627
+
628
+ @ReactMethod
629
+ fun setColorDepth(
630
+ details: ReadableMap,
631
+ promise: Promise
632
+ ) {
633
+ try {
634
+ val namespace = details.getString("tracker")
635
+ val trackerController = getTracker(namespace)
636
+ if (details.isNull("colorDepth")) {
637
+ trackerController.subject.colorDepth = null
638
+ } else {
639
+ trackerController.subject.colorDepth = details.getDouble("colorDepth").toInt()
640
+ }
641
+ promise.resolve(true)
642
+ } catch (t: Throwable) {
643
+ promise.reject("ERROR", t.message)
644
+ }
645
+ }
646
+
647
+ @ReactMethod
648
+ fun getSessionUserId(
649
+ details: ReadableMap,
650
+ promise: Promise
651
+ ) {
652
+ try {
653
+ val namespace = details.getString("tracker")
654
+ val trackerController = getTracker(namespace)
655
+ val suid = trackerController.session!!.userId
656
+ promise.resolve(suid)
657
+ } catch (t: Throwable) {
658
+ promise.reject("ERROR", t.message)
659
+ }
660
+ }
661
+
662
+ @ReactMethod
663
+ fun getSessionId(
664
+ details: ReadableMap,
665
+ promise: Promise
666
+ ) {
667
+ try {
668
+ val namespace = details.getString("tracker")
669
+ val trackerController = getTracker(namespace)
670
+ val sid = trackerController.session!!.sessionId
671
+ promise.resolve(sid)
672
+ } catch (t: Throwable) {
673
+ promise.reject("ERROR", t.message)
674
+ }
675
+ }
676
+
677
+ @ReactMethod
678
+ fun getSessionIndex(
679
+ details: ReadableMap,
680
+ promise: Promise
681
+ ) {
682
+ try {
683
+ val namespace = details.getString("tracker")
684
+ val trackerController = getTracker(namespace)
685
+ val sidx = trackerController.session!!.sessionIndex!!
686
+ promise.resolve(sidx)
687
+ } catch (t: Throwable) {
688
+ promise.reject("ERROR", t.message)
689
+ }
690
+ }
691
+
692
+ @ReactMethod
693
+ fun getIsInBackground(
694
+ details: ReadableMap,
695
+ promise: Promise
696
+ ) {
697
+ try {
698
+ val namespace = details.getString("tracker")
699
+ val trackerController = getTracker(namespace)
700
+ val isInBg = trackerController.session!!.isInBackground
701
+ promise.resolve(isInBg)
702
+ } catch (t: Throwable) {
703
+ promise.reject("ERROR", t.message)
704
+ }
705
+ }
706
+
707
+ @ReactMethod
708
+ fun getBackgroundIndex(
709
+ details: ReadableMap,
710
+ promise: Promise
711
+ ) {
712
+ try {
713
+ val namespace = details.getString("tracker")
714
+ val trackerController = getTracker(namespace)
715
+ val bgIdx = trackerController.session!!.backgroundIndex
716
+ promise.resolve(bgIdx)
717
+ } catch (t: Throwable) {
718
+ promise.reject("ERROR", t.message)
719
+ }
720
+ }
721
+
722
+ @ReactMethod
723
+ fun getForegroundIndex(
724
+ details: ReadableMap,
725
+ promise: Promise
726
+ ) {
727
+ try {
728
+ val namespace = details.getString("tracker")
729
+ val trackerController = getTracker(namespace)
730
+ val fgIdx = trackerController.session!!.foregroundIndex
731
+ promise.resolve(fgIdx)
732
+ } catch (t: Throwable) {
733
+ promise.reject("ERROR", t.message)
734
+ }
735
+ }
736
+
737
+ private fun getTracker(namespace: String?): TrackerController {
738
+ return namespace?.let { Snowplow.getTracker(it) } ?: defaultTracker!!
739
+ }
740
+
741
+ companion object {
742
+ const val NAME = "ReactNativeTracker"
743
+ }
744
+ }