@snowplow/react-native-tracker 1.4.0 → 2.0.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 (239) 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 +150 -0
  8. package/.github/workflows/deploy.yml +98 -0
  9. package/.github/workflows/e2e-android.yml +121 -0
  10. package/.github/workflows/e2e-ios.yml +90 -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 +166 -0
  18. package/CONTRIBUTING.md +80 -0
  19. package/README.md +23 -110
  20. package/android/build.gradle +93 -37
  21. package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  22. package/android/gradle/wrapper/gradle-wrapper.properties +1 -2
  23. package/android/gradle.properties +5 -2
  24. package/android/gradlew +172 -110
  25. package/android/gradlew.bat +24 -19
  26. package/android/src/main/AndroidManifest.xml +1 -3
  27. package/android/src/main/AndroidManifestNew.xml +2 -0
  28. package/android/src/main/java/com/snowplow/reactnativetracker/ReactNativeTrackerModule.kt +704 -0
  29. package/android/src/main/java/com/snowplow/reactnativetracker/ReactNativeTrackerPackage.kt +17 -0
  30. package/android/src/main/java/com/snowplow/reactnativetracker/util/ConfigUtil.kt +271 -0
  31. package/android/src/main/java/com/snowplow/reactnativetracker/util/EventUtil.kt +213 -0
  32. package/android/src/main/java/com/snowplow/reactnativetracker/util/TrackerVersion.kt +5 -0
  33. package/babel.config.js +3 -0
  34. package/example/.watchmanconfig +1 -0
  35. package/example/Gemfile +6 -0
  36. package/example/android/app/build.gradle +129 -0
  37. package/example/android/app/debug.keystore +0 -0
  38. package/example/android/app/proguard-rules.pro +10 -0
  39. package/example/android/app/src/androidTest/java/com/reactnativetrackerexample/DetoxTest.java +36 -0
  40. package/example/android/app/src/androidTest/java/com/reactnativetrackerexample/DetoxTestAppJUnitRunner.java +21 -0
  41. package/example/android/app/src/debug/AndroidManifest.xml +13 -0
  42. package/example/android/app/src/debug/java/com/reactnativetrackerexample/ReactNativeFlipper.java +75 -0
  43. package/example/android/app/src/main/AndroidManifest.xml +26 -0
  44. package/example/android/app/src/main/java/com/reactnativetrackerexample/MainActivity.java +32 -0
  45. package/example/android/app/src/main/java/com/reactnativetrackerexample/MainApplication.java +62 -0
  46. package/example/android/app/src/main/res/drawable/rn_edit_text_material.xml +36 -0
  47. package/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
  48. package/example/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +0 -0
  49. package/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
  50. package/example/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +0 -0
  51. package/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
  52. package/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +0 -0
  53. package/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
  54. package/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
  55. package/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
  56. package/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
  57. package/example/android/app/src/main/res/values/strings.xml +3 -0
  58. package/example/android/app/src/main/res/values/styles.xml +9 -0
  59. package/example/android/app/src/release/java/com/reactnativetrackerexample/ReactNativeFlipper.java +20 -0
  60. package/example/android/build.gradle +31 -0
  61. package/example/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  62. package/example/android/gradle/wrapper/gradle-wrapper.properties +6 -0
  63. package/example/android/gradle.properties +44 -0
  64. package/example/android/gradlew +244 -0
  65. package/example/android/gradlew.bat +92 -0
  66. package/example/android/settings.gradle +4 -0
  67. package/example/app.json +4 -0
  68. package/example/babel.config.js +17 -0
  69. package/example/detox.config.js +92 -0
  70. package/example/e2e/config.json +10 -0
  71. package/example/e2e/emitEvents.e2e.detox.js +108 -0
  72. package/example/e2e/environment.js +23 -0
  73. package/example/e2e/helpers/microCommands.js +153 -0
  74. package/example/e2e/helpers/microHelpers.js +346 -0
  75. package/example/e2e/helpers/microHelpers.test.js +308 -0
  76. package/example/e2e/helpers/schemas.js +62 -0
  77. package/example/e2e/jest.config.js +16 -0
  78. package/example/e2e/setup.js +4 -0
  79. package/example/e2e/testEvents.micro.test.js +300 -0
  80. package/example/index.js +5 -0
  81. package/example/ios/.xcode.env +11 -0
  82. package/example/ios/Podfile +64 -0
  83. package/example/ios/Podfile.lock +737 -0
  84. package/example/ios/ReactNativeTrackerExample/AppDelegate.h +6 -0
  85. package/example/ios/ReactNativeTrackerExample/AppDelegate.mm +26 -0
  86. package/example/ios/ReactNativeTrackerExample/Images.xcassets/AppIcon.appiconset/Contents.json +53 -0
  87. package/example/ios/ReactNativeTrackerExample/Images.xcassets/Contents.json +6 -0
  88. package/example/ios/ReactNativeTrackerExample/Info.plist +55 -0
  89. package/example/ios/ReactNativeTrackerExample/LaunchScreen.storyboard +47 -0
  90. package/example/ios/ReactNativeTrackerExample/main.m +10 -0
  91. package/example/ios/ReactNativeTrackerExample-Bridging-Header.h +3 -0
  92. package/example/ios/ReactNativeTrackerExample.xcodeproj/project.pbxproj +722 -0
  93. package/{ios/RNSnowplowTracker.xcodeproj/xcshareddata/xcschemes/RNSnowplowTracker.xcscheme → example/ios/ReactNativeTrackerExample.xcodeproj/xcshareddata/xcschemes/ReactNativeTrackerExample.xcscheme} +29 -21
  94. package/example/ios/ReactNativeTrackerExample.xcworkspace/contents.xcworkspacedata +10 -0
  95. package/example/ios/ReactNativeTrackerExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
  96. package/example/ios/ReactNativeTrackerExampleTests/Info.plist +24 -0
  97. package/example/ios/ReactNativeTrackerExampleTests/ReactNativeTrackerExampleTests.m +66 -0
  98. package/example/metro.config.js +45 -0
  99. package/example/package.json +54 -0
  100. package/example/react-native.config.js +10 -0
  101. package/example/src/App.js +557 -0
  102. package/example/tsconfig.json +5 -0
  103. package/example/yarn.lock +7379 -0
  104. package/ios/ReactNativeTracker-Bridging-Header.h +2 -0
  105. package/ios/ReactNativeTracker.mm +165 -0
  106. package/ios/ReactNativeTracker.swift +757 -0
  107. package/ios/{RNSnowplowTracker.xcodeproj → ReactNativeTracker.xcodeproj}/project.pbxproj +55 -79
  108. package/ios/Util/ConfigUtils.swift +206 -0
  109. package/ios/Util/TrackerVersion.swift +3 -0
  110. package/ios/Util/Utilities.swift +37 -0
  111. package/lefthook.yml +11 -0
  112. package/lib/commonjs/api.js +475 -0
  113. package/lib/commonjs/api.js.map +1 -0
  114. package/lib/commonjs/configurations.js +209 -0
  115. package/lib/commonjs/configurations.js.map +1 -0
  116. package/lib/commonjs/constants.js +85 -0
  117. package/lib/commonjs/constants.js.map +1 -0
  118. package/lib/commonjs/events.js +256 -0
  119. package/lib/commonjs/events.js.map +1 -0
  120. package/lib/commonjs/index.js +141 -0
  121. package/lib/commonjs/index.js.map +1 -0
  122. package/lib/commonjs/jsCore.js +393 -0
  123. package/lib/commonjs/jsCore.js.map +1 -0
  124. package/lib/commonjs/native.js +29 -0
  125. package/lib/commonjs/native.js.map +1 -0
  126. package/lib/commonjs/subject.js +248 -0
  127. package/lib/commonjs/subject.js.map +1 -0
  128. package/lib/commonjs/tracker.js +221 -0
  129. package/lib/commonjs/tracker.js.map +1 -0
  130. package/lib/commonjs/types.js +2 -0
  131. package/lib/commonjs/types.js.map +1 -0
  132. package/lib/commonjs/utils.js +85 -0
  133. package/lib/commonjs/utils.js.map +1 -0
  134. package/lib/commonjs/webViewInterface.js +79 -0
  135. package/lib/commonjs/webViewInterface.js.map +1 -0
  136. package/lib/module/api.js +439 -0
  137. package/lib/module/api.js.map +1 -0
  138. package/lib/module/configurations.js +197 -0
  139. package/lib/module/configurations.js.map +1 -0
  140. package/lib/module/constants.js +80 -0
  141. package/lib/module/constants.js.map +1 -0
  142. package/lib/module/events.js +240 -0
  143. package/lib/module/events.js.map +1 -0
  144. package/lib/module/index.js +129 -0
  145. package/lib/module/index.js.map +1 -0
  146. package/lib/module/jsCore.js +390 -0
  147. package/lib/module/jsCore.js.map +1 -0
  148. package/lib/module/native.js +25 -0
  149. package/lib/module/native.js.map +1 -0
  150. package/lib/module/subject.js +235 -0
  151. package/lib/module/subject.js.map +1 -0
  152. package/lib/module/tracker.js +209 -0
  153. package/lib/module/tracker.js.map +1 -0
  154. package/lib/module/types.js +2 -0
  155. package/lib/module/types.js.map +1 -0
  156. package/lib/module/utils.js +79 -0
  157. package/lib/module/utils.js.map +1 -0
  158. package/lib/module/webViewInterface.js +75 -0
  159. package/lib/module/webViewInterface.js.map +1 -0
  160. package/lib/typescript/__tests__/api.test.d.ts +2 -0
  161. package/lib/typescript/__tests__/api.test.d.ts.map +1 -0
  162. package/lib/typescript/__tests__/configurations.test.d.ts +2 -0
  163. package/lib/typescript/__tests__/configurations.test.d.ts.map +1 -0
  164. package/lib/typescript/__tests__/events.test.d.ts +2 -0
  165. package/lib/typescript/__tests__/events.test.d.ts.map +1 -0
  166. package/lib/typescript/__tests__/index.test.d.ts +2 -0
  167. package/lib/typescript/__tests__/index.test.d.ts.map +1 -0
  168. package/lib/typescript/__tests__/jsCore.test.d.ts +2 -0
  169. package/lib/typescript/__tests__/jsCore.test.d.ts.map +1 -0
  170. package/lib/typescript/__tests__/utils.test.d.ts +2 -0
  171. package/lib/typescript/__tests__/utils.test.d.ts.map +1 -0
  172. package/lib/typescript/api.d.ts +226 -0
  173. package/lib/typescript/api.d.ts.map +1 -0
  174. package/lib/typescript/configurations.d.ts +73 -0
  175. package/lib/typescript/configurations.d.ts.map +1 -0
  176. package/lib/typescript/constants.d.ts +59 -0
  177. package/lib/typescript/constants.d.ts.map +1 -0
  178. package/lib/typescript/events.d.ts +101 -0
  179. package/lib/typescript/events.d.ts.map +1 -0
  180. package/lib/typescript/index.d.ts +27 -0
  181. package/lib/typescript/index.d.ts.map +1 -0
  182. package/lib/typescript/jsCore.d.ts +140 -0
  183. package/lib/typescript/jsCore.d.ts.map +1 -0
  184. package/lib/typescript/native.d.ts +4 -0
  185. package/lib/typescript/native.d.ts.map +1 -0
  186. package/lib/typescript/subject.d.ts +91 -0
  187. package/lib/typescript/subject.d.ts.map +1 -0
  188. package/lib/typescript/tracker.d.ts +93 -0
  189. package/lib/typescript/tracker.d.ts.map +1 -0
  190. package/{dist/index.d.ts → lib/typescript/types.d.ts} +188 -75
  191. package/lib/typescript/types.d.ts.map +1 -0
  192. package/lib/typescript/utils.d.ts +35 -0
  193. package/lib/typescript/utils.d.ts.map +1 -0
  194. package/lib/typescript/webViewInterface.d.ts +15 -0
  195. package/lib/typescript/webViewInterface.d.ts.map +1 -0
  196. package/package.json +134 -52
  197. package/scripts/bootstrap.js +29 -0
  198. package/snowplow-react-native-tracker.podspec +42 -0
  199. package/src/__mocks__/react-native.js +7 -0
  200. package/src/__tests__/api.test.ts +34 -0
  201. package/src/__tests__/configurations.test.ts +620 -0
  202. package/src/__tests__/events.test.ts +749 -0
  203. package/src/__tests__/index.test.ts +27 -0
  204. package/src/__tests__/jsCore.test.ts +169 -0
  205. package/src/__tests__/utils.test.ts +23 -0
  206. package/src/api.ts +535 -0
  207. package/src/configurations.ts +337 -0
  208. package/src/constants.ts +102 -0
  209. package/src/events.ts +330 -0
  210. package/src/index.ts +189 -0
  211. package/src/jsCore.ts +553 -0
  212. package/src/native.ts +34 -0
  213. package/src/subject.ts +315 -0
  214. package/src/tracker.ts +330 -0
  215. package/src/types.ts +1087 -0
  216. package/src/utils.ts +78 -0
  217. package/src/webViewInterface.ts +105 -0
  218. package/tsconfig.build.json +5 -0
  219. package/tsconfig.json +28 -0
  220. package/turbo.json +34 -0
  221. package/yarn.lock +9333 -0
  222. package/RNSnowplowTracker.podspec +0 -24
  223. package/android/src/main/java/com/snowplowanalytics/react/tracker/RNSnowplowTrackerModule.java +0 -750
  224. package/android/src/main/java/com/snowplowanalytics/react/tracker/RNSnowplowTrackerPackage.java +0 -29
  225. package/android/src/main/java/com/snowplowanalytics/react/util/ConfigUtil.java +0 -351
  226. package/android/src/main/java/com/snowplowanalytics/react/util/EventUtil.java +0 -339
  227. package/android/src/main/java/com/snowplowanalytics/react/util/TrackerVersion.java +0 -7
  228. package/dist/index.js +0 -2026
  229. package/dist/index.js.map +0 -1
  230. package/ios/RNSnowplowTracker.h +0 -34
  231. package/ios/RNSnowplowTracker.m +0 -911
  232. package/ios/Util/NSDictionary+RNSP_TypeMethods.h +0 -33
  233. package/ios/Util/NSDictionary+RNSP_TypeMethods.m +0 -40
  234. package/ios/Util/RNConfigUtils.h +0 -44
  235. package/ios/Util/RNConfigUtils.m +0 -209
  236. package/ios/Util/RNTrackerVersion.h +0 -27
  237. package/ios/Util/RNTrackerVersion.m +0 -27
  238. package/ios/Util/RNUtilities.h +0 -32
  239. package/ios/Util/RNUtilities.m +0 -68
@@ -0,0 +1,704 @@
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.customContexts.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.customContexts.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.customContexts.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 trackPageViewEvent(
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: PageView = EventUtil.createPageViewEvent(argmap)
239
+ val evCtxts: List<SelfDescribingJson> = EventUtil.createContexts(contexts)
240
+ event.customContexts.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 trackTimingEvent(
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: Timing = EventUtil.createTimingEvent(argmap)
259
+ val evCtxts: List<SelfDescribingJson> = EventUtil.createContexts(contexts)
260
+ event.customContexts.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 trackConsentGrantedEvent(
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: ConsentGranted = EventUtil.createConsentGrantedEvent(argmap)
279
+ val evCtxts: List<SelfDescribingJson> = EventUtil.createContexts(contexts)
280
+ event.customContexts.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 trackConsentWithdrawnEvent(
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: ConsentWithdrawn = EventUtil.createConsentWithdrawnEvent(argmap)
299
+ val evCtxts: List<SelfDescribingJson> = EventUtil.createContexts(contexts)
300
+ event.customContexts.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 trackEcommerceTransactionEvent(
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: EcommerceTransaction = EventUtil.createEcommerceTransactionEvent(argmap)
319
+ val evCtxts: List<SelfDescribingJson> = EventUtil.createContexts(contexts)
320
+ event.customContexts.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 trackDeepLinkReceivedEvent(
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: DeepLinkReceived = EventUtil.createDeepLinkReceivedEvent(argmap)
339
+ val evCtxts: List<SelfDescribingJson> = EventUtil.createContexts(contexts)
340
+ event.customContexts.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 trackMessageNotificationEvent(
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: MessageNotification = EventUtil.createMessageNotificationEvent(argmap)
359
+ val evCtxts: List<SelfDescribingJson> = EventUtil.createContexts(contexts)
360
+ event.customContexts.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 removeGlobalContexts(
370
+ details: ReadableMap,
371
+ promise: Promise
372
+ ) {
373
+ try {
374
+ val namespace = details.getString("tracker")
375
+ val tag = details.getString("removeTag")!!
376
+ val trackerController = getTracker(namespace)
377
+ trackerController.globalContexts.remove(tag)
378
+ promise.resolve(true)
379
+ } catch (t: Throwable) {
380
+ promise.reject("ERROR", t.message)
381
+ }
382
+ }
383
+
384
+ @ReactMethod
385
+ fun addGlobalContexts(
386
+ details: ReadableMap,
387
+ promise: Promise
388
+ ) {
389
+ try {
390
+ val namespace = details.getString("tracker")
391
+ val gcArg = details.getMap("addGlobalContext")!!
392
+ val tag = gcArg.getString("tag")!!
393
+ val globalContexts = gcArg.getArray("globalContexts")!!
394
+ val staticContexts: MutableList<SelfDescribingJson> = ArrayList()
395
+ for (i in 0 until globalContexts.size()) {
396
+ val gContext: SelfDescribingJson =
397
+ EventUtil.createSelfDescribingJson(globalContexts.getMap(i))
398
+ staticContexts.add(gContext)
399
+ }
400
+ val gcStatic = GlobalContext(staticContexts)
401
+ val trackerController = getTracker(namespace)
402
+ trackerController.globalContexts.add(tag, gcStatic)
403
+ promise.resolve(true)
404
+ } catch (t: Throwable) {
405
+ promise.reject("ERROR", t.message)
406
+ }
407
+ }
408
+
409
+ @ReactMethod
410
+ fun setUserId(
411
+ details: ReadableMap,
412
+ promise: Promise
413
+ ) {
414
+ try {
415
+ val namespace = details.getString("tracker")
416
+ val trackerController = getTracker(namespace)
417
+ if (details.isNull("userId")) {
418
+ trackerController.subject.userId = null
419
+ } else {
420
+ trackerController.subject.userId = details.getString("userId")
421
+ }
422
+ promise.resolve(true)
423
+ } catch (t: Throwable) {
424
+ promise.reject("ERROR", t.message)
425
+ }
426
+ }
427
+
428
+ @ReactMethod
429
+ fun setNetworkUserId(
430
+ details: ReadableMap,
431
+ promise: Promise
432
+ ) {
433
+ try {
434
+ val namespace = details.getString("tracker")
435
+ val trackerController = getTracker(namespace)
436
+ if (details.isNull("networkUserId")) {
437
+ trackerController.subject.networkUserId = null
438
+ } else {
439
+ trackerController.subject.networkUserId = details.getString("networkUserId")
440
+ }
441
+ promise.resolve(true)
442
+ } catch (t: Throwable) {
443
+ promise.reject("ERROR", t.message)
444
+ }
445
+ }
446
+
447
+ @ReactMethod
448
+ fun setDomainUserId(
449
+ details: ReadableMap,
450
+ promise: Promise
451
+ ) {
452
+ try {
453
+ val namespace = details.getString("tracker")
454
+ val trackerController = getTracker(namespace)
455
+ if (details.isNull("domainUserId")) {
456
+ trackerController.subject.domainUserId = null
457
+ } else {
458
+ trackerController.subject.domainUserId = details.getString("domainUserId")
459
+ }
460
+ promise.resolve(true)
461
+ } catch (t: Throwable) {
462
+ promise.reject("ERROR", t.message)
463
+ }
464
+ }
465
+
466
+ @ReactMethod
467
+ fun setIpAddress(
468
+ details: ReadableMap,
469
+ promise: Promise
470
+ ) {
471
+ try {
472
+ val namespace = details.getString("tracker")
473
+ val trackerController = getTracker(namespace)
474
+ if (details.isNull("ipAddress")) {
475
+ trackerController.subject.ipAddress = null
476
+ } else {
477
+ trackerController.subject.ipAddress = details.getString("ipAddress")
478
+ }
479
+ promise.resolve(true)
480
+ } catch (t: Throwable) {
481
+ promise.reject("ERROR", t.message)
482
+ }
483
+ }
484
+
485
+ @ReactMethod
486
+ fun setUseragent(
487
+ details: ReadableMap,
488
+ promise: Promise
489
+ ) {
490
+ try {
491
+ val namespace = details.getString("tracker")
492
+ val trackerController = getTracker(namespace)
493
+ if (details.isNull("useragent")) {
494
+ trackerController.subject.useragent = null
495
+ } else {
496
+ trackerController.subject.useragent = details.getString("useragent")
497
+ }
498
+ promise.resolve(true)
499
+ } catch (t: Throwable) {
500
+ promise.reject("ERROR", t.message)
501
+ }
502
+ }
503
+
504
+ @ReactMethod
505
+ fun setTimezone(
506
+ details: ReadableMap,
507
+ promise: Promise
508
+ ) {
509
+ try {
510
+ val namespace = details.getString("tracker")
511
+ val trackerController = getTracker(namespace)
512
+ if (details.isNull("timezone")) {
513
+ trackerController.subject.timezone = null
514
+ } else {
515
+ trackerController.subject.timezone = details.getString("timezone")
516
+ }
517
+ promise.resolve(true)
518
+ } catch (t: Throwable) {
519
+ promise.reject("ERROR", t.message)
520
+ }
521
+ }
522
+
523
+ @ReactMethod
524
+ fun setLanguage(
525
+ details: ReadableMap,
526
+ promise: Promise
527
+ ) {
528
+ try {
529
+ val namespace = details.getString("tracker")
530
+ val trackerController = getTracker(namespace)
531
+ if (details.isNull("language")) {
532
+ trackerController.subject.language = null
533
+ } else {
534
+ trackerController.subject.language = details.getString("language")
535
+ }
536
+ promise.resolve(true)
537
+ } catch (t: Throwable) {
538
+ promise.reject("ERROR", t.message)
539
+ }
540
+ }
541
+
542
+ @ReactMethod
543
+ fun setScreenResolution(
544
+ details: ReadableMap,
545
+ promise: Promise
546
+ ) {
547
+ try {
548
+ val namespace = details.getString("tracker")
549
+ val trackerController = getTracker(namespace)
550
+ if (details.isNull("screenResolution")) {
551
+ trackerController.subject.screenResolution = null
552
+ } else {
553
+ val screenRes = details.getArray("screenResolution")!!
554
+ val width: Int = screenRes.getDouble(0).toInt()
555
+ val height: Int = screenRes.getDouble(1).toInt()
556
+ val screenR = Size(width, height)
557
+ trackerController.subject.screenResolution = screenR
558
+ }
559
+ promise.resolve(true)
560
+ } catch (t: Throwable) {
561
+ promise.reject("ERROR", t.message)
562
+ }
563
+ }
564
+
565
+ @ReactMethod
566
+ fun setScreenViewport(
567
+ details: ReadableMap,
568
+ promise: Promise
569
+ ) {
570
+ try {
571
+ val namespace = details.getString("tracker")
572
+ val trackerController = getTracker(namespace)
573
+ if (details.isNull("screenViewport")) {
574
+ trackerController.subject.screenViewPort = null
575
+ } else {
576
+ val screenView = details.getArray("screenViewport")!!
577
+ val width: Int = screenView.getDouble(0).toInt()
578
+ val height: Int = screenView.getDouble(1).toInt()
579
+ val screenVP = Size(width, height)
580
+ trackerController.subject.screenViewPort = screenVP
581
+ }
582
+ promise.resolve(true)
583
+ } catch (t: Throwable) {
584
+ promise.reject("ERROR", t.message)
585
+ }
586
+ }
587
+
588
+ @ReactMethod
589
+ fun setColorDepth(
590
+ details: ReadableMap,
591
+ promise: Promise
592
+ ) {
593
+ try {
594
+ val namespace = details.getString("tracker")
595
+ val trackerController = getTracker(namespace)
596
+ if (details.isNull("colorDepth")) {
597
+ trackerController.subject.colorDepth = null
598
+ } else {
599
+ trackerController.subject.colorDepth = details.getDouble("colorDepth").toInt()
600
+ }
601
+ promise.resolve(true)
602
+ } catch (t: Throwable) {
603
+ promise.reject("ERROR", t.message)
604
+ }
605
+ }
606
+
607
+ @ReactMethod
608
+ fun getSessionUserId(
609
+ details: ReadableMap,
610
+ promise: Promise
611
+ ) {
612
+ try {
613
+ val namespace = details.getString("tracker")
614
+ val trackerController = getTracker(namespace)
615
+ val suid = trackerController.session!!.userId
616
+ promise.resolve(suid)
617
+ } catch (t: Throwable) {
618
+ promise.reject("ERROR", t.message)
619
+ }
620
+ }
621
+
622
+ @ReactMethod
623
+ fun getSessionId(
624
+ details: ReadableMap,
625
+ promise: Promise
626
+ ) {
627
+ try {
628
+ val namespace = details.getString("tracker")
629
+ val trackerController = getTracker(namespace)
630
+ val sid = trackerController.session!!.sessionId
631
+ promise.resolve(sid)
632
+ } catch (t: Throwable) {
633
+ promise.reject("ERROR", t.message)
634
+ }
635
+ }
636
+
637
+ @ReactMethod
638
+ fun getSessionIndex(
639
+ details: ReadableMap,
640
+ promise: Promise
641
+ ) {
642
+ try {
643
+ val namespace = details.getString("tracker")
644
+ val trackerController = getTracker(namespace)
645
+ val sidx = trackerController.session!!.sessionIndex!!
646
+ promise.resolve(sidx)
647
+ } catch (t: Throwable) {
648
+ promise.reject("ERROR", t.message)
649
+ }
650
+ }
651
+
652
+ @ReactMethod
653
+ fun getIsInBackground(
654
+ details: ReadableMap,
655
+ promise: Promise
656
+ ) {
657
+ try {
658
+ val namespace = details.getString("tracker")
659
+ val trackerController = getTracker(namespace)
660
+ val isInBg = trackerController.session!!.isInBackground
661
+ promise.resolve(isInBg)
662
+ } catch (t: Throwable) {
663
+ promise.reject("ERROR", t.message)
664
+ }
665
+ }
666
+
667
+ @ReactMethod
668
+ fun getBackgroundIndex(
669
+ details: ReadableMap,
670
+ promise: Promise
671
+ ) {
672
+ try {
673
+ val namespace = details.getString("tracker")
674
+ val trackerController = getTracker(namespace)
675
+ val bgIdx = trackerController.session!!.backgroundIndex
676
+ promise.resolve(bgIdx)
677
+ } catch (t: Throwable) {
678
+ promise.reject("ERROR", t.message)
679
+ }
680
+ }
681
+
682
+ @ReactMethod
683
+ fun getForegroundIndex(
684
+ details: ReadableMap,
685
+ promise: Promise
686
+ ) {
687
+ try {
688
+ val namespace = details.getString("tracker")
689
+ val trackerController = getTracker(namespace)
690
+ val fgIdx = trackerController.session!!.foregroundIndex
691
+ promise.resolve(fgIdx)
692
+ } catch (t: Throwable) {
693
+ promise.reject("ERROR", t.message)
694
+ }
695
+ }
696
+
697
+ private fun getTracker(namespace: String?): TrackerController {
698
+ return namespace?.let { Snowplow.getTracker(it) } ?: defaultTracker!!
699
+ }
700
+
701
+ companion object {
702
+ const val NAME = "ReactNativeTracker"
703
+ }
704
+ }