@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.
- package/.editorconfig +15 -0
- package/.eslintignore +6 -0
- package/.gitattributes +3 -0
- package/.github/ISSUE_TEMPLATE/bug_report.md +29 -0
- package/.github/ISSUE_TEMPLATE/feature_request.md +20 -0
- package/.github/actions/setup/action.yml +28 -0
- package/.github/workflows/build.yml +155 -0
- package/.github/workflows/deploy.yml +97 -0
- package/.github/workflows/e2e-android.yml +121 -0
- package/.github/workflows/e2e-ios.yml +95 -0
- package/.github/workflows/snyk.yml +21 -0
- package/.gitignore +70 -0
- package/.npmignore +60 -0
- package/.nvmrc +1 -0
- package/.watchmanconfig +1 -0
- package/.yarnrc +3 -0
- package/CHANGELOG +176 -0
- package/CONTRIBUTING.md +80 -0
- package/LICENSE +1 -1
- package/README.md +24 -111
- package/android/build.gradle +93 -37
- package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/android/gradle/wrapper/gradle-wrapper.properties +1 -2
- package/android/gradle.properties +5 -2
- package/android/gradlew +172 -110
- package/android/gradlew.bat +24 -19
- package/android/src/main/AndroidManifest.xml +1 -3
- package/android/src/main/AndroidManifestNew.xml +2 -0
- package/android/src/main/java/com/snowplow/reactnativetracker/ReactNativeTrackerModule.kt +744 -0
- package/android/src/main/java/com/snowplow/reactnativetracker/ReactNativeTrackerPackage.kt +17 -0
- package/android/src/main/java/com/snowplow/reactnativetracker/util/ConfigUtil.kt +274 -0
- package/android/src/main/java/com/snowplow/reactnativetracker/util/EventUtil.kt +233 -0
- package/android/src/main/java/com/snowplow/reactnativetracker/util/TrackerVersion.kt +5 -0
- package/babel.config.js +3 -0
- package/example/.watchmanconfig +1 -0
- package/example/Gemfile +6 -0
- package/example/android/app/build.gradle +129 -0
- package/example/android/app/debug.keystore +0 -0
- package/example/android/app/proguard-rules.pro +10 -0
- package/example/android/app/src/androidTest/java/com/reactnativetrackerexample/DetoxTest.java +36 -0
- package/example/android/app/src/androidTest/java/com/reactnativetrackerexample/DetoxTestAppJUnitRunner.java +21 -0
- package/example/android/app/src/debug/AndroidManifest.xml +13 -0
- package/example/android/app/src/debug/java/com/reactnativetrackerexample/ReactNativeFlipper.java +75 -0
- package/example/android/app/src/main/AndroidManifest.xml +26 -0
- package/example/android/app/src/main/java/com/reactnativetrackerexample/MainActivity.java +32 -0
- package/example/android/app/src/main/java/com/reactnativetrackerexample/MainApplication.java +62 -0
- package/example/android/app/src/main/res/drawable/rn_edit_text_material.xml +36 -0
- package/example/android/app/src/main/res/mipmap-hdpi/ic_launcher.png +0 -0
- package/example/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png +0 -0
- package/example/android/app/src/main/res/mipmap-mdpi/ic_launcher.png +0 -0
- package/example/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png +0 -0
- package/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png +0 -0
- package/example/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png +0 -0
- package/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png +0 -0
- package/example/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png +0 -0
- package/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png +0 -0
- package/example/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png +0 -0
- package/example/android/app/src/main/res/values/strings.xml +3 -0
- package/example/android/app/src/main/res/values/styles.xml +9 -0
- package/example/android/app/src/release/java/com/reactnativetrackerexample/ReactNativeFlipper.java +20 -0
- package/example/android/build.gradle +31 -0
- package/example/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/example/android/gradle/wrapper/gradle-wrapper.properties +6 -0
- package/example/android/gradle.properties +44 -0
- package/example/android/gradlew +244 -0
- package/example/android/gradlew.bat +92 -0
- package/example/android/settings.gradle +4 -0
- package/example/app.json +4 -0
- package/example/babel.config.js +17 -0
- package/example/detox.config.js +92 -0
- package/example/e2e/config.json +10 -0
- package/example/e2e/emitEvents.e2e.detox.js +95 -0
- package/example/e2e/environment.js +23 -0
- package/example/e2e/helpers/microCommands.js +140 -0
- package/example/e2e/helpers/microHelpers.js +333 -0
- package/example/e2e/helpers/microHelpers.test.js +295 -0
- package/example/e2e/helpers/schemas.js +49 -0
- package/example/e2e/jest.config.js +16 -0
- package/example/e2e/setup.js +4 -0
- package/example/e2e/testEvents.micro.test.js +287 -0
- package/example/index.js +5 -0
- package/example/ios/.xcode.env +11 -0
- package/example/ios/Podfile +62 -0
- package/example/ios/Podfile.lock +730 -0
- package/example/ios/ReactNativeTrackerExample/AppDelegate.h +6 -0
- package/example/ios/ReactNativeTrackerExample/AppDelegate.mm +26 -0
- package/example/ios/ReactNativeTrackerExample/Images.xcassets/AppIcon.appiconset/Contents.json +53 -0
- package/example/ios/ReactNativeTrackerExample/Images.xcassets/Contents.json +6 -0
- package/example/ios/ReactNativeTrackerExample/Info.plist +55 -0
- package/example/ios/ReactNativeTrackerExample/LaunchScreen.storyboard +47 -0
- package/example/ios/ReactNativeTrackerExample/main.m +10 -0
- package/example/ios/ReactNativeTrackerExample-Bridging-Header.h +3 -0
- package/example/ios/ReactNativeTrackerExample.xcodeproj/project.pbxproj +722 -0
- package/{ios/RNSnowplowTracker.xcodeproj/xcshareddata/xcschemes/RNSnowplowTracker.xcscheme → example/ios/ReactNativeTrackerExample.xcodeproj/xcshareddata/xcschemes/ReactNativeTrackerExample.xcscheme} +29 -21
- package/example/ios/ReactNativeTrackerExample.xcworkspace/contents.xcworkspacedata +10 -0
- package/example/ios/ReactNativeTrackerExample.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -0
- package/example/ios/ReactNativeTrackerExampleTests/Info.plist +24 -0
- package/example/ios/ReactNativeTrackerExampleTests/ReactNativeTrackerExampleTests.m +66 -0
- package/example/metro.config.js +45 -0
- package/example/package.json +54 -0
- package/example/react-native.config.js +10 -0
- package/example/src/App.js +566 -0
- package/example/tsconfig.json +5 -0
- package/example/yarn.lock +7379 -0
- package/ios/ReactNativeTracker-Bridging-Header.h +2 -0
- package/ios/ReactNativeTracker.mm +175 -0
- package/ios/ReactNativeTracker.swift +822 -0
- package/ios/{RNSnowplowTracker.xcodeproj → ReactNativeTracker.xcodeproj}/project.pbxproj +55 -79
- package/ios/Util/ConfigUtils.swift +209 -0
- package/ios/Util/TrackerVersion.swift +3 -0
- package/ios/Util/Utilities.swift +37 -0
- package/lefthook.yml +11 -0
- package/lib/commonjs/api.js +490 -0
- package/lib/commonjs/api.js.map +1 -0
- package/lib/commonjs/configurations.js +196 -0
- package/lib/commonjs/configurations.js.map +1 -0
- package/lib/commonjs/constants.js +77 -0
- package/lib/commonjs/constants.js.map +1 -0
- package/lib/commonjs/events.js +277 -0
- package/lib/commonjs/events.js.map +1 -0
- package/lib/commonjs/index.js +132 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/jsCore.js +427 -0
- package/lib/commonjs/jsCore.js.map +1 -0
- package/lib/commonjs/native.js +16 -0
- package/lib/commonjs/native.js.map +1 -0
- package/lib/commonjs/subject.js +235 -0
- package/lib/commonjs/subject.js.map +1 -0
- package/lib/commonjs/tracker.js +248 -0
- package/lib/commonjs/tracker.js.map +1 -0
- package/lib/commonjs/types.js +2 -0
- package/lib/commonjs/types.js.map +1 -0
- package/lib/commonjs/utils.js +72 -0
- package/lib/commonjs/utils.js.map +1 -0
- package/lib/commonjs/webViewInterface.js +66 -0
- package/lib/commonjs/webViewInterface.js.map +1 -0
- package/lib/module/api.js +452 -0
- package/lib/module/api.js.map +1 -0
- package/lib/module/configurations.js +184 -0
- package/lib/module/configurations.js.map +1 -0
- package/lib/module/constants.js +72 -0
- package/lib/module/constants.js.map +1 -0
- package/lib/module/events.js +259 -0
- package/lib/module/events.js.map +1 -0
- package/lib/module/index.js +120 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/jsCore.js +424 -0
- package/lib/module/jsCore.js.map +1 -0
- package/lib/module/native.js +12 -0
- package/lib/module/native.js.map +1 -0
- package/lib/module/subject.js +222 -0
- package/lib/module/subject.js.map +1 -0
- package/lib/module/tracker.js +234 -0
- package/lib/module/tracker.js.map +1 -0
- package/lib/module/types.js +2 -0
- package/lib/module/types.js.map +1 -0
- package/lib/module/utils.js +66 -0
- package/lib/module/utils.js.map +1 -0
- package/lib/module/webViewInterface.js +62 -0
- package/lib/module/webViewInterface.js.map +1 -0
- package/lib/typescript/__tests__/api.test.d.ts +2 -0
- package/lib/typescript/__tests__/api.test.d.ts.map +1 -0
- package/lib/typescript/__tests__/configurations.test.d.ts +2 -0
- package/lib/typescript/__tests__/configurations.test.d.ts.map +1 -0
- package/lib/typescript/__tests__/events.test.d.ts +2 -0
- package/lib/typescript/__tests__/events.test.d.ts.map +1 -0
- package/lib/typescript/__tests__/index.test.d.ts +2 -0
- package/lib/typescript/__tests__/index.test.d.ts.map +1 -0
- package/lib/typescript/__tests__/jsCore.test.d.ts +2 -0
- package/lib/typescript/__tests__/jsCore.test.d.ts.map +1 -0
- package/lib/typescript/__tests__/utils.test.d.ts +2 -0
- package/lib/typescript/__tests__/utils.test.d.ts.map +1 -0
- package/lib/typescript/api.d.ts +240 -0
- package/lib/typescript/api.d.ts.map +1 -0
- package/lib/typescript/configurations.d.ts +73 -0
- package/lib/typescript/configurations.d.ts.map +1 -0
- package/lib/typescript/constants.d.ts +64 -0
- package/lib/typescript/constants.d.ts.map +1 -0
- package/lib/typescript/events.d.ts +115 -0
- package/lib/typescript/events.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +27 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/jsCore.d.ts +152 -0
- package/lib/typescript/jsCore.d.ts.map +1 -0
- package/lib/typescript/native.d.ts +4 -0
- package/lib/typescript/native.d.ts.map +1 -0
- package/lib/typescript/subject.d.ts +91 -0
- package/lib/typescript/subject.d.ts.map +1 -0
- package/lib/typescript/tracker.d.ts +111 -0
- package/lib/typescript/tracker.d.ts.map +1 -0
- package/{dist/index.d.ts → lib/typescript/types.d.ts} +264 -73
- package/lib/typescript/types.d.ts.map +1 -0
- package/lib/typescript/utils.d.ts +35 -0
- package/lib/typescript/utils.d.ts.map +1 -0
- package/lib/typescript/webViewInterface.d.ts +15 -0
- package/lib/typescript/webViewInterface.d.ts.map +1 -0
- package/package.json +135 -53
- package/scripts/bootstrap.js +29 -0
- package/snowplow-react-native-tracker.podspec +42 -0
- package/src/__mocks__/react-native.js +7 -0
- package/src/__tests__/api.test.ts +21 -0
- package/src/__tests__/configurations.test.ts +608 -0
- package/src/__tests__/events.test.ts +736 -0
- package/src/__tests__/index.test.ts +14 -0
- package/src/__tests__/jsCore.test.ts +199 -0
- package/src/__tests__/utils.test.ts +10 -0
- package/src/api.ts +556 -0
- package/src/configurations.ts +325 -0
- package/src/constants.ts +97 -0
- package/src/events.ts +355 -0
- package/src/index.ts +184 -0
- package/src/jsCore.ts +603 -0
- package/src/native.ts +21 -0
- package/src/subject.ts +302 -0
- package/src/tracker.ts +377 -0
- package/src/types.ts +1162 -0
- package/src/utils.ts +65 -0
- package/src/webViewInterface.ts +92 -0
- package/tsconfig.build.json +5 -0
- package/tsconfig.json +28 -0
- package/turbo.json +34 -0
- package/yarn.lock +9333 -0
- package/RNSnowplowTracker.podspec +0 -24
- package/android/src/main/java/com/snowplowanalytics/react/tracker/RNSnowplowTrackerModule.java +0 -750
- package/android/src/main/java/com/snowplowanalytics/react/tracker/RNSnowplowTrackerPackage.java +0 -29
- package/android/src/main/java/com/snowplowanalytics/react/util/ConfigUtil.java +0 -351
- package/android/src/main/java/com/snowplowanalytics/react/util/EventUtil.java +0 -339
- package/android/src/main/java/com/snowplowanalytics/react/util/TrackerVersion.java +0 -7
- package/dist/index.js +0 -2026
- package/dist/index.js.map +0 -1
- package/ios/RNSnowplowTracker.h +0 -34
- package/ios/RNSnowplowTracker.m +0 -911
- package/ios/Util/NSDictionary+RNSP_TypeMethods.h +0 -33
- package/ios/Util/NSDictionary+RNSP_TypeMethods.m +0 -40
- package/ios/Util/RNConfigUtils.h +0 -44
- package/ios/Util/RNConfigUtils.m +0 -209
- package/ios/Util/RNTrackerVersion.h +0 -27
- package/ios/Util/RNTrackerVersion.m +0 -27
- package/ios/Util/RNUtilities.h +0 -32
- package/ios/Util/RNUtilities.m +0 -68
|
@@ -0,0 +1,822 @@
|
|
|
1
|
+
import SnowplowTracker
|
|
2
|
+
|
|
3
|
+
@objc(ReactNativeTracker)
|
|
4
|
+
class ReactNativeTracker: NSObject {
|
|
5
|
+
|
|
6
|
+
@objc(createTracker:resolver:rejecter:)
|
|
7
|
+
func createTracker(argmap:NSDictionary, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
|
|
8
|
+
|
|
9
|
+
let trackerNs = argmap.object(forKey: "namespace") as! String
|
|
10
|
+
let networkConfig = argmap.object(forKey: "networkConfig") as! NSDictionary
|
|
11
|
+
|
|
12
|
+
// NetworkConfiguration
|
|
13
|
+
let method = networkConfig.object(forKey: "method") as? String
|
|
14
|
+
let httpMethod: HttpMethodOptions = method == "get" ? .get : .post
|
|
15
|
+
let endpoint = networkConfig.object(forKey: "endpoint") as! String
|
|
16
|
+
let networkConfiguration = NetworkConfiguration(endpoint: endpoint, method: httpMethod)
|
|
17
|
+
if let customPostPath = networkConfig.object(forKey: "customPostPath") as? String {
|
|
18
|
+
networkConfiguration.customPostPath = customPostPath
|
|
19
|
+
}
|
|
20
|
+
if let requestHeaders = networkConfig.object(forKey: "requestHeaders") as? Dictionary<String, String> {
|
|
21
|
+
networkConfiguration.requestHeaders = requestHeaders
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Configurations
|
|
25
|
+
var controllers: [ConfigurationProtocol] = []
|
|
26
|
+
|
|
27
|
+
// TrackerConfiguration
|
|
28
|
+
let trackerConfiguration = ConfigUtils.mkTrackerConfig(argmap.object(forKey: "trackerConfig") as? NSDictionary ?? NSDictionary())
|
|
29
|
+
controllers.append(trackerConfiguration)
|
|
30
|
+
|
|
31
|
+
// SessionConfiguration
|
|
32
|
+
if let sessionArg = argmap.object(forKey: "sessionConfig") as? NSDictionary,
|
|
33
|
+
let sessionConfiguration = ConfigUtils.mkSessionConfig(sessionArg) {
|
|
34
|
+
controllers.append(sessionConfiguration)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// EmitterConfiguration
|
|
38
|
+
if let emitterArg = argmap.object(forKey: "emitterConfig") as? NSDictionary,
|
|
39
|
+
let emitterConfiguration = ConfigUtils.mkEmitterConfig(emitterArg) {
|
|
40
|
+
controllers.append(emitterConfiguration)
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// SubjectConfiguration
|
|
44
|
+
if let subjectArg = argmap.object(forKey: "subjectConfig") as? NSDictionary,
|
|
45
|
+
let subjectConfiguration = ConfigUtils.mkSubjectConfig(subjectArg) {
|
|
46
|
+
controllers.append(subjectConfiguration)
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// GdprConfiguration
|
|
50
|
+
if let gdprArg = argmap.object(forKey: "gdprConfig") as? NSDictionary,
|
|
51
|
+
let gdprConfiguration = ConfigUtils.mkGdprConfig(gdprArg) {
|
|
52
|
+
controllers.append(gdprConfiguration)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// GConfiguration
|
|
56
|
+
if let gcArg = argmap.object(forKey: "gcConfig") as? NSArray,
|
|
57
|
+
let gcConfiguration = ConfigUtils.mkGCConfig(gcArg) {
|
|
58
|
+
controllers.append(gcConfiguration)
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
_ = Snowplow.createTracker(namespace: trackerNs, network: networkConfiguration, configurations: controllers)
|
|
62
|
+
resolve(true)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
@objc(removeTracker:resolver:rejecter:)
|
|
66
|
+
func removeTracker(details:NSDictionary, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
|
|
67
|
+
let namespace = details.object(forKey: "tracker") as? String
|
|
68
|
+
let trackerController = trackerByNamespace(namespace)
|
|
69
|
+
let removed = Snowplow.remove(tracker: trackerController)
|
|
70
|
+
resolve(removed);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
@objc(removeAllTrackers:rejecter:)
|
|
74
|
+
func removeAllTrackers(resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
|
|
75
|
+
Snowplow.removeAllTrackers()
|
|
76
|
+
resolve(true)
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
@objc(trackSelfDescribingEvent:resolver:rejecter:)
|
|
80
|
+
func trackSelfDescribingEvent(details:NSDictionary, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
|
|
81
|
+
|
|
82
|
+
let namespace = details.object(forKey: "tracker") as? String
|
|
83
|
+
if let trackerController = trackerByNamespace(namespace),
|
|
84
|
+
let argmap = details.object(forKey: "eventData") as? NSDictionary,
|
|
85
|
+
let schema = argmap.object(forKey: "schema") as? String,
|
|
86
|
+
let data = argmap.object(forKey: "data") as? Dictionary<String, Any> {
|
|
87
|
+
|
|
88
|
+
let eventData = SelfDescribingJson(
|
|
89
|
+
schema: schema,
|
|
90
|
+
andDictionary: data
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
let event = SelfDescribing(eventData: eventData)
|
|
94
|
+
if let contexts = details.object(forKey: "contexts") as? NSArray {
|
|
95
|
+
event.entities = Utilities.mkSDJArray(contexts)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
_ = trackerController.track(event)
|
|
99
|
+
resolve(true);
|
|
100
|
+
} else {
|
|
101
|
+
let error = NSError(domain: "SnowplowTracker", code: 200)
|
|
102
|
+
reject("ERROR", "tracker with given namespace not found", error);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
@objc(trackStructuredEvent:resolver:rejecter:)
|
|
107
|
+
func trackStructuredEvent(details:NSDictionary, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
|
|
108
|
+
|
|
109
|
+
let namespace = details.object(forKey: "tracker") as? String
|
|
110
|
+
if let trackerController = trackerByNamespace(namespace),
|
|
111
|
+
let argmap = details.object(forKey: "eventData") as? NSDictionary,
|
|
112
|
+
let category = argmap.object(forKey: "category") as? String,
|
|
113
|
+
let action = argmap.object(forKey: "action") as? String {
|
|
114
|
+
let event = Structured(category: category, action: action)
|
|
115
|
+
|
|
116
|
+
if let label = argmap.object(forKey: "label") as? String {
|
|
117
|
+
event.label = label
|
|
118
|
+
}
|
|
119
|
+
if let property = argmap.object(forKey: "property") as? String {
|
|
120
|
+
event.property = property
|
|
121
|
+
}
|
|
122
|
+
if let value = argmap.object(forKey: "value") as? NSNumber {
|
|
123
|
+
event.value = value
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
if let contexts = details.object(forKey: "contexts") as? NSArray {
|
|
127
|
+
event.entities = Utilities.mkSDJArray(contexts)
|
|
128
|
+
}
|
|
129
|
+
_ = trackerController.track(event)
|
|
130
|
+
resolve(true)
|
|
131
|
+
} else {
|
|
132
|
+
let error = NSError(domain: "SnowplowTracker", code: 200)
|
|
133
|
+
reject("ERROR", "tracker with given namespace not found", error)
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
@objc(trackScreenViewEvent:resolver:rejecter:)
|
|
138
|
+
func trackScreenViewEvent(details:NSDictionary, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
|
|
139
|
+
|
|
140
|
+
let namespace = details.object(forKey: "tracker") as? String
|
|
141
|
+
if let trackerController = trackerByNamespace(namespace),
|
|
142
|
+
let argmap = details.object(forKey: "eventData") as? NSDictionary,
|
|
143
|
+
let screenName = argmap.object(forKey: "name") as? String {
|
|
144
|
+
|
|
145
|
+
var screenUuid: UUID?
|
|
146
|
+
if let screenId = argmap.object(forKey: "id") as? String {
|
|
147
|
+
screenUuid = UUID(uuidString: screenId)
|
|
148
|
+
if screenUuid == nil {
|
|
149
|
+
let error = NSError(domain: "SnowplowTracker", code: 200)
|
|
150
|
+
reject("ERROR", "screenId has to be a valid UUID string", error)
|
|
151
|
+
return
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
let event = ScreenView(name: screenName, screenId: screenUuid)
|
|
156
|
+
|
|
157
|
+
if let type = argmap.object(forKey: "type") as? String {
|
|
158
|
+
event.type = type
|
|
159
|
+
}
|
|
160
|
+
if let previousName = argmap.object(forKey: "previousName") as? String {
|
|
161
|
+
event.previousName = previousName;
|
|
162
|
+
}
|
|
163
|
+
if let previousId = argmap.object(forKey: "previousId") as? String {
|
|
164
|
+
event.previousId = previousId
|
|
165
|
+
}
|
|
166
|
+
if let previousType = argmap.object(forKey: "previousType") as? String {
|
|
167
|
+
event.previousType = previousType
|
|
168
|
+
}
|
|
169
|
+
if let transitionType = argmap.object(forKey: "transitionType") as? String {
|
|
170
|
+
event.transitionType = transitionType
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
if let contexts = details.object(forKey: "contexts") as? NSArray {
|
|
174
|
+
event.entities = Utilities.mkSDJArray(contexts)
|
|
175
|
+
}
|
|
176
|
+
_ = trackerController.track(event)
|
|
177
|
+
resolve(true)
|
|
178
|
+
} else {
|
|
179
|
+
let error = NSError(domain: "SnowplowTracker", code: 200)
|
|
180
|
+
reject("ERROR", "tracker with given namespace not found", error)
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
@objc(trackScrollChangedEvent:resolver:rejecter:)
|
|
185
|
+
func trackScrollChangedEvent(details:NSDictionary, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
|
|
186
|
+
|
|
187
|
+
let namespace = details.object(forKey: "tracker") as? String
|
|
188
|
+
if let trackerController = trackerByNamespace(namespace),
|
|
189
|
+
let argmap = details.object(forKey: "eventData") as? NSDictionary {
|
|
190
|
+
|
|
191
|
+
let event = ScrollChanged()
|
|
192
|
+
|
|
193
|
+
if let contentHeight = argmap.object(forKey: "contentHeight") as? NSNumber {
|
|
194
|
+
event.contentHeight = contentHeight.intValue
|
|
195
|
+
}
|
|
196
|
+
if let contentWidth = argmap.object(forKey: "contentWidth") as? NSNumber {
|
|
197
|
+
event.contentWidth = contentWidth.intValue
|
|
198
|
+
}
|
|
199
|
+
if let viewWidth = argmap.object(forKey: "viewWidth") as? NSNumber {
|
|
200
|
+
event.viewWidth = viewWidth.intValue
|
|
201
|
+
}
|
|
202
|
+
if let viewHeight = argmap.object(forKey: "viewHeight") as? NSNumber {
|
|
203
|
+
event.viewHeight = viewHeight.intValue
|
|
204
|
+
}
|
|
205
|
+
if let xOffset = argmap.object(forKey: "xOffset") as? NSNumber {
|
|
206
|
+
event.xOffset = xOffset.intValue
|
|
207
|
+
}
|
|
208
|
+
if let yOffset = argmap.object(forKey: "yOffset") as? NSNumber {
|
|
209
|
+
event.yOffset = yOffset.intValue
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
if let contexts = details.object(forKey: "contexts") as? NSArray {
|
|
213
|
+
event.entities = Utilities.mkSDJArray(contexts)
|
|
214
|
+
}
|
|
215
|
+
_ = trackerController.track(event)
|
|
216
|
+
resolve(true)
|
|
217
|
+
} else {
|
|
218
|
+
let error = NSError(domain: "SnowplowTracker", code: 200)
|
|
219
|
+
reject("ERROR", "tracker with given namespace not found", error)
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
@objc(trackListItemViewEvent:resolver:rejecter:)
|
|
224
|
+
func trackListItemViewEvent(details:NSDictionary, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
|
|
225
|
+
|
|
226
|
+
let namespace = details.object(forKey: "tracker") as? String
|
|
227
|
+
if let trackerController = trackerByNamespace(namespace),
|
|
228
|
+
let argmap = details.object(forKey: "eventData") as? NSDictionary {
|
|
229
|
+
|
|
230
|
+
if let index = argmap.object(forKey: "index") as? NSNumber {
|
|
231
|
+
let event = ListItemView(index: index.intValue)
|
|
232
|
+
|
|
233
|
+
if let itemsCount = argmap.object(forKey: "itemsCount") as? NSNumber {
|
|
234
|
+
event.itemsCount = itemsCount.intValue
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
if let contexts = details.object(forKey: "contexts") as? NSArray {
|
|
238
|
+
event.entities = Utilities.mkSDJArray(contexts)
|
|
239
|
+
}
|
|
240
|
+
_ = trackerController.track(event)
|
|
241
|
+
resolve(true)
|
|
242
|
+
} else {
|
|
243
|
+
let error = NSError(domain: "SnowplowTracker", code: 200)
|
|
244
|
+
reject("ERROR", "index has to be a valid integer", error)
|
|
245
|
+
return
|
|
246
|
+
}
|
|
247
|
+
} else {
|
|
248
|
+
let error = NSError(domain: "SnowplowTracker", code: 200)
|
|
249
|
+
reject("ERROR", "tracker with given namespace not found", error)
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
@objc(trackPageViewEvent:resolver:rejecter:)
|
|
254
|
+
func trackPageViewEvent(details:NSDictionary, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
|
|
255
|
+
let namespace = details.object(forKey: "tracker") as? String
|
|
256
|
+
if let trackerController = trackerByNamespace(namespace),
|
|
257
|
+
let argmap = details.object(forKey: "eventData") as? NSDictionary,
|
|
258
|
+
let pageUrl = argmap.object(forKey: "pageUrl") as? String {
|
|
259
|
+
let event = PageView(pageUrl: pageUrl)
|
|
260
|
+
|
|
261
|
+
if let pageTitle = argmap.object(forKey: "pageTitle") as? String {
|
|
262
|
+
event.pageTitle = pageTitle
|
|
263
|
+
}
|
|
264
|
+
if let referrer = argmap.object(forKey: "referrer") as? String {
|
|
265
|
+
event.referrer = referrer
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
if let contexts = details.object(forKey: "contexts") as? NSArray {
|
|
269
|
+
event.entities = Utilities.mkSDJArray(contexts)
|
|
270
|
+
}
|
|
271
|
+
_ = trackerController.track(event)
|
|
272
|
+
resolve(true)
|
|
273
|
+
} else {
|
|
274
|
+
let error = NSError(domain: "SnowplowTracker", code: 200)
|
|
275
|
+
reject("ERROR", "tracker with given namespace not found", error)
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
@objc(trackTimingEvent:resolver:rejecter:)
|
|
280
|
+
func trackTimingEvent(details:NSDictionary, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
|
|
281
|
+
let namespace = details.object(forKey: "tracker") as? String
|
|
282
|
+
if let trackerController = trackerByNamespace(namespace),
|
|
283
|
+
let argmap = details.object(forKey: "eventData") as? NSDictionary,
|
|
284
|
+
let category = argmap.object(forKey: "category") as? String,
|
|
285
|
+
let variable = argmap.object(forKey: "variable") as? String,
|
|
286
|
+
let timing = argmap.object(forKey: "timing") as? NSNumber {
|
|
287
|
+
let event = Timing(category: category, variable: variable, timing: timing.intValue)
|
|
288
|
+
|
|
289
|
+
if let label = argmap.object(forKey: "label") as? String {
|
|
290
|
+
event.label = label
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
if let contexts = details.object(forKey: "contexts") as? NSArray {
|
|
294
|
+
event.entities = Utilities.mkSDJArray(contexts)
|
|
295
|
+
}
|
|
296
|
+
_ = trackerController.track(event)
|
|
297
|
+
resolve(true)
|
|
298
|
+
} else {
|
|
299
|
+
let error = NSError(domain: "SnowplowTracker", code: 200)
|
|
300
|
+
reject("ERROR", "tracker with given namespace not found", error)
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
@objc(trackConsentGrantedEvent:resolver:rejecter:)
|
|
305
|
+
func trackConsentGrantedEvent(details:NSDictionary, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
|
|
306
|
+
|
|
307
|
+
let namespace = details.object(forKey: "tracker") as? String
|
|
308
|
+
if let trackerController = trackerByNamespace(namespace),
|
|
309
|
+
let argmap = details.object(forKey: "eventData") as? NSDictionary,
|
|
310
|
+
let expiry = argmap.object(forKey: "expiry") as? String,
|
|
311
|
+
let documentId = argmap.object(forKey: "documentId") as? String,
|
|
312
|
+
let version = argmap.object(forKey: "version") as? String {
|
|
313
|
+
|
|
314
|
+
let event = ConsentGranted(expiry: expiry, documentId: documentId, version: version)
|
|
315
|
+
|
|
316
|
+
if let name = argmap.object(forKey: "name") as? String {
|
|
317
|
+
event.name = name;
|
|
318
|
+
}
|
|
319
|
+
if let documentDescription = argmap.object(forKey: "documentDescription") as? String {
|
|
320
|
+
event.documentDescription = documentDescription;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
if let contexts = details.object(forKey: "contexts") as? NSArray {
|
|
324
|
+
event.entities = Utilities.mkSDJArray(contexts)
|
|
325
|
+
}
|
|
326
|
+
_ = trackerController.track(event)
|
|
327
|
+
resolve(true)
|
|
328
|
+
} else {
|
|
329
|
+
let error = NSError(domain: "SnowplowTracker", code: 200)
|
|
330
|
+
reject("ERROR", "tracker with given namespace not found", error)
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
@objc(trackConsentWithdrawnEvent:resolver:rejecter:)
|
|
335
|
+
func trackConsentWithdrawnEvent(details:NSDictionary, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
|
|
336
|
+
|
|
337
|
+
let namespace = details.object(forKey: "tracker") as? String
|
|
338
|
+
if let trackerController = trackerByNamespace(namespace),
|
|
339
|
+
let argmap = details.object(forKey: "eventData") as? NSDictionary {
|
|
340
|
+
|
|
341
|
+
let event = ConsentWithdrawn()
|
|
342
|
+
|
|
343
|
+
if let all = argmap.object(forKey: "all") as? NSNumber {
|
|
344
|
+
event.all = all.boolValue
|
|
345
|
+
}
|
|
346
|
+
if let documentId = argmap.object(forKey: "documentId") as? String {
|
|
347
|
+
event.documentId = documentId
|
|
348
|
+
}
|
|
349
|
+
if let version = argmap.object(forKey: "version") as? String {
|
|
350
|
+
event.version = version
|
|
351
|
+
}
|
|
352
|
+
if let name = argmap.object(forKey: "name") as? String {
|
|
353
|
+
event.name = name
|
|
354
|
+
}
|
|
355
|
+
if let documentDescription = argmap.object(forKey: "documentDescription") as? String {
|
|
356
|
+
event.documentDescription = documentDescription
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
if let contexts = details.object(forKey: "contexts") as? NSArray {
|
|
360
|
+
event.entities = Utilities.mkSDJArray(contexts)
|
|
361
|
+
}
|
|
362
|
+
_ = trackerController.track(event)
|
|
363
|
+
resolve(true)
|
|
364
|
+
} else {
|
|
365
|
+
let error = NSError(domain: "SnowplowTracker", code: 200)
|
|
366
|
+
reject("ERROR", "tracker with given namespace not found", error)
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
@objc(trackEcommerceTransactionEvent:resolver:rejecter:)
|
|
371
|
+
func trackEcommerceTransactionEvent(details:NSDictionary, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
|
|
372
|
+
let namespace = details.object(forKey: "tracker") as? String
|
|
373
|
+
if let trackerController = trackerByNamespace(namespace),
|
|
374
|
+
let argmap = details.object(forKey: "eventData") as? NSDictionary,
|
|
375
|
+
let orderId = argmap.object(forKey: "orderId") as? String,
|
|
376
|
+
let totalValue = argmap.object(forKey: "totalValue") as? NSNumber {
|
|
377
|
+
var transItems: [EcommerceItem] = []
|
|
378
|
+
if let items = argmap.object(forKey: "items") as? NSArray {
|
|
379
|
+
for item in items {
|
|
380
|
+
if let item = item as? NSDictionary,
|
|
381
|
+
let sku = item.object(forKey: "sku") as? String,
|
|
382
|
+
let price = item.object(forKey: "price") as? NSNumber,
|
|
383
|
+
let quantity = item.object(forKey: "quantity") as? NSNumber {
|
|
384
|
+
let ecomItem = EcommerceItem(sku: sku, price: price.doubleValue, quantity: quantity.intValue)
|
|
385
|
+
if let name = argmap.object(forKey: "name") as? String {
|
|
386
|
+
ecomItem.name = name
|
|
387
|
+
}
|
|
388
|
+
if let category = argmap.object(forKey: "category") as? String {
|
|
389
|
+
ecomItem.category = category
|
|
390
|
+
}
|
|
391
|
+
if let currency = argmap.object(forKey: "currency") as? String {
|
|
392
|
+
ecomItem.currency = currency;
|
|
393
|
+
}
|
|
394
|
+
|
|
395
|
+
transItems.append(ecomItem)
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
let event = Ecommerce(orderId: orderId, totalValue: totalValue.doubleValue, items: transItems)
|
|
401
|
+
|
|
402
|
+
if let contexts = details.object(forKey: "contexts") as? NSArray {
|
|
403
|
+
event.entities = Utilities.mkSDJArray(contexts)
|
|
404
|
+
}
|
|
405
|
+
_ = trackerController.track(event)
|
|
406
|
+
resolve(true)
|
|
407
|
+
} else {
|
|
408
|
+
let error = NSError(domain: "SnowplowTracker", code: 200)
|
|
409
|
+
reject("ERROR", "tracker with given namespace not found", error)
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
@objc(trackDeepLinkReceivedEvent:resolver:rejecter:)
|
|
414
|
+
func trackDeepLinkReceivedEvent(details:NSDictionary, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
|
|
415
|
+
|
|
416
|
+
let namespace = details.object(forKey: "tracker") as? String
|
|
417
|
+
if let trackerController = trackerByNamespace(namespace),
|
|
418
|
+
let argmap = details.object(forKey: "eventData") as? NSDictionary,
|
|
419
|
+
let url = argmap.object(forKey: "url") as? String {
|
|
420
|
+
let event = DeepLinkReceived(url: url)
|
|
421
|
+
|
|
422
|
+
if let referrer = argmap.object(forKey: "referrer") as? String {
|
|
423
|
+
event.referrer = referrer
|
|
424
|
+
}
|
|
425
|
+
|
|
426
|
+
if let contexts = details.object(forKey: "contexts") as? NSArray {
|
|
427
|
+
event.entities = Utilities.mkSDJArray(contexts)
|
|
428
|
+
}
|
|
429
|
+
_ = trackerController.track(event)
|
|
430
|
+
resolve(true)
|
|
431
|
+
} else {
|
|
432
|
+
let error = NSError(domain: "SnowplowTracker", code: 200)
|
|
433
|
+
reject("ERROR", "tracker with given namespace not found", error)
|
|
434
|
+
}
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
@objc(trackMessageNotificationEvent:resolver:rejecter:)
|
|
438
|
+
func trackMessageNotificationEvent(details:NSDictionary, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
|
|
439
|
+
|
|
440
|
+
let namespace = details.object(forKey: "tracker") as? String
|
|
441
|
+
if let trackerController = trackerByNamespace(namespace),
|
|
442
|
+
let argmap = details.object(forKey: "eventData") as? NSDictionary,
|
|
443
|
+
let title = argmap.object(forKey: "title") as? String,
|
|
444
|
+
let body = argmap.object(forKey: "body") as? String {
|
|
445
|
+
let triggerStr = argmap.object(forKey: "trigger") as? String
|
|
446
|
+
var trigger: MessageNotificationTrigger = .other
|
|
447
|
+
|
|
448
|
+
if triggerStr == "push" {
|
|
449
|
+
trigger = .push
|
|
450
|
+
} else if triggerStr == "location" {
|
|
451
|
+
trigger = .location
|
|
452
|
+
} else if triggerStr == "calendar" {
|
|
453
|
+
trigger = .calendar
|
|
454
|
+
} else if triggerStr == "timeInterval" {
|
|
455
|
+
trigger = .timeInterval
|
|
456
|
+
}
|
|
457
|
+
let event = MessageNotification(title: title, body: body, trigger: trigger)
|
|
458
|
+
|
|
459
|
+
if let action = argmap.object(forKey: "action") as? String {
|
|
460
|
+
event.action = action
|
|
461
|
+
}
|
|
462
|
+
if let attachmentsMap = argmap.object(forKey: "attachments") as? NSArray {
|
|
463
|
+
var attachments: [MessageNotificationAttachment] = []
|
|
464
|
+
for attachmentMap in attachmentsMap {
|
|
465
|
+
if let attachmentMap = attachmentMap as? NSDictionary,
|
|
466
|
+
let identifier = attachmentMap.object(forKey: "identifier") as? String,
|
|
467
|
+
let type = attachmentMap.object(forKey: "type") as? String,
|
|
468
|
+
let url = attachmentMap.object(forKey: "url") as? String {
|
|
469
|
+
let attachment = MessageNotificationAttachment(identifier: identifier, type: type, url: url)
|
|
470
|
+
attachments.append(attachment)
|
|
471
|
+
}
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
event.attachments = attachments
|
|
475
|
+
}
|
|
476
|
+
if let bodyLocArgs = argmap.object(forKey: "bodyLocArgs") as? NSArray {
|
|
477
|
+
event.bodyLocArgs = bodyLocArgs.map { $0 as? String}.compactMap { $0 }
|
|
478
|
+
}
|
|
479
|
+
if let bodyLocKey = argmap.object(forKey: "bodyLocKey") as? String {
|
|
480
|
+
event.bodyLocKey = bodyLocKey
|
|
481
|
+
}
|
|
482
|
+
if let category = argmap.object(forKey: "category") as? String {
|
|
483
|
+
event.category = category
|
|
484
|
+
}
|
|
485
|
+
if let contentAvailable = argmap.object(forKey: "contentAvailable") as? NSNumber {
|
|
486
|
+
event.contentAvailable = contentAvailable.boolValue
|
|
487
|
+
}
|
|
488
|
+
if let group = argmap.object(forKey: "group") as? String {
|
|
489
|
+
event.group = group
|
|
490
|
+
}
|
|
491
|
+
if let icon = argmap.object(forKey: "icon") as? String {
|
|
492
|
+
event.icon = icon
|
|
493
|
+
}
|
|
494
|
+
if let notificationCount = argmap.object(forKey: "notificationCount") as? NSNumber {
|
|
495
|
+
event.notificationCount = notificationCount.intValue
|
|
496
|
+
}
|
|
497
|
+
if let notificationTimestamp = argmap.object(forKey: "notificationTimestamp") as? String {
|
|
498
|
+
event.notificationTimestamp = notificationTimestamp
|
|
499
|
+
}
|
|
500
|
+
if let sound = argmap.object(forKey: "sound") as? String {
|
|
501
|
+
event.sound = sound
|
|
502
|
+
}
|
|
503
|
+
if let subtitle = argmap.object(forKey: "subtitle") as? String {
|
|
504
|
+
event.subtitle = subtitle
|
|
505
|
+
}
|
|
506
|
+
if let tag = argmap.object(forKey: "tag") as? String {
|
|
507
|
+
event.tag = tag
|
|
508
|
+
}
|
|
509
|
+
if let threadIdentifier = argmap.object(forKey: "threadIdentifier") as? String {
|
|
510
|
+
event.threadIdentifier = threadIdentifier
|
|
511
|
+
}
|
|
512
|
+
if let titleLocArgs = argmap.object(forKey: "titleLocArgs") as? NSArray {
|
|
513
|
+
event.titleLocArgs = titleLocArgs.map { $0 as? String}.compactMap { $0 }
|
|
514
|
+
}
|
|
515
|
+
if let titleLocKey = argmap.object(forKey: "titleLocKey") as? String {
|
|
516
|
+
event.titleLocKey = titleLocKey
|
|
517
|
+
}
|
|
518
|
+
|
|
519
|
+
if let contexts = details.object(forKey: "contexts") as? NSArray {
|
|
520
|
+
event.entities = Utilities.mkSDJArray(contexts)
|
|
521
|
+
}
|
|
522
|
+
_ = trackerController.track(event)
|
|
523
|
+
resolve(true)
|
|
524
|
+
} else {
|
|
525
|
+
let error = NSError(domain: "SnowplowTracker", code: 200)
|
|
526
|
+
reject("ERROR", "tracker with given namespace not found", error)
|
|
527
|
+
}
|
|
528
|
+
}
|
|
529
|
+
|
|
530
|
+
@objc(removeGlobalContexts:resolver:rejecter:)
|
|
531
|
+
func removeGlobalContexts(details:NSDictionary, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
|
|
532
|
+
let namespace = details.object(forKey: "tracker") as? String
|
|
533
|
+
if let trackerController = trackerByNamespace(namespace),
|
|
534
|
+
let tag = details.object(forKey: "removeTag") as? String {
|
|
535
|
+
_ = trackerController.globalContexts?.remove(tag: tag)
|
|
536
|
+
resolve(true)
|
|
537
|
+
} else {
|
|
538
|
+
let error = NSError(domain: "SnowplowTracker", code: 200)
|
|
539
|
+
reject("ERROR", "tracker with given namespace not found", error)
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
@objc(addGlobalContexts:resolver:rejecter:)
|
|
544
|
+
func addGlobalContexts(details:NSDictionary, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
|
|
545
|
+
let namespace = details.object(forKey: "tracker") as? String
|
|
546
|
+
if let trackerController = trackerByNamespace(namespace),
|
|
547
|
+
let gcArg = details.object(forKey: "addGlobalContext") as? NSDictionary,
|
|
548
|
+
let tag = gcArg.object(forKey: "tag") as? String,
|
|
549
|
+
let globalContexts = gcArg.object(forKey: "globalContexts") as? NSArray {
|
|
550
|
+
let staticContexts = Utilities.mkSDJArray(globalContexts)
|
|
551
|
+
let gcStatic = GlobalContext(staticContexts: staticContexts)
|
|
552
|
+
|
|
553
|
+
_ = trackerController.globalContexts?.add(tag: tag, contextGenerator: gcStatic)
|
|
554
|
+
|
|
555
|
+
resolve(true)
|
|
556
|
+
} else {
|
|
557
|
+
let error = NSError(domain: "SnowplowTracker", code: 200)
|
|
558
|
+
reject("ERROR", "tracker with given namespace not found", error)
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
@objc(setUserId:resolver:rejecter:)
|
|
563
|
+
func setUserId(details:NSDictionary, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
|
|
564
|
+
let namespace = details.object(forKey: "tracker") as? String
|
|
565
|
+
if let trackerController = trackerByNamespace(namespace) {
|
|
566
|
+
let newUid = details.object(forKey: "userId") as? String
|
|
567
|
+
trackerController.subject?.userId = newUid
|
|
568
|
+
|
|
569
|
+
resolve(true)
|
|
570
|
+
} else {
|
|
571
|
+
let error = NSError(domain: "SnowplowTracker", code: 200)
|
|
572
|
+
reject("ERROR", "tracker with given namespace not found", error)
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
@objc(setNetworkUserId:resolver:rejecter:)
|
|
577
|
+
func setNetworkUserId(details:NSDictionary, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
|
|
578
|
+
let namespace = details.object(forKey: "tracker") as? String
|
|
579
|
+
if let trackerController = trackerByNamespace(namespace) {
|
|
580
|
+
|
|
581
|
+
let newNuid = details.object(forKey: "networkUserId") as? String
|
|
582
|
+
trackerController.subject?.networkUserId = newNuid
|
|
583
|
+
|
|
584
|
+
resolve(true)
|
|
585
|
+
} else {
|
|
586
|
+
let error = NSError(domain: "SnowplowTracker", code: 200)
|
|
587
|
+
reject("ERROR", "tracker with given namespace not found", error)
|
|
588
|
+
}
|
|
589
|
+
}
|
|
590
|
+
|
|
591
|
+
@objc(setDomainUserId:resolver:rejecter:)
|
|
592
|
+
func setDomainUserId(details:NSDictionary, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
|
|
593
|
+
let namespace = details.object(forKey: "tracker") as? String
|
|
594
|
+
if let trackerController = trackerByNamespace(namespace) {
|
|
595
|
+
|
|
596
|
+
let newDuid = details.object(forKey: "domainUserId") as? String
|
|
597
|
+
trackerController.subject?.domainUserId = newDuid
|
|
598
|
+
|
|
599
|
+
resolve(true)
|
|
600
|
+
} else {
|
|
601
|
+
let error = NSError(domain: "SnowplowTracker", code: 200)
|
|
602
|
+
reject("ERROR", "tracker with given namespace not found", error)
|
|
603
|
+
}
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
@objc(setIpAddress:resolver:rejecter:)
|
|
607
|
+
func setIpAddress(details:NSDictionary, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
|
|
608
|
+
let namespace = details.object(forKey: "tracker") as? String
|
|
609
|
+
if let trackerController = trackerByNamespace(namespace) {
|
|
610
|
+
|
|
611
|
+
let newIp = details.object(forKey: "ipAddress") as? String
|
|
612
|
+
trackerController.subject?.ipAddress = newIp
|
|
613
|
+
|
|
614
|
+
resolve(true)
|
|
615
|
+
} else {
|
|
616
|
+
let error = NSError(domain: "SnowplowTracker", code: 200)
|
|
617
|
+
reject("ERROR", "tracker with given namespace not found", error)
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
@objc(setUseragent:resolver:rejecter:)
|
|
622
|
+
func setUseragent(details:NSDictionary, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
|
|
623
|
+
let namespace = details.object(forKey: "tracker") as? String
|
|
624
|
+
if let trackerController = trackerByNamespace(namespace) {
|
|
625
|
+
|
|
626
|
+
let newUagent = details.object(forKey: "useragent") as? String
|
|
627
|
+
trackerController.subject?.useragent = newUagent
|
|
628
|
+
|
|
629
|
+
resolve(true)
|
|
630
|
+
} else {
|
|
631
|
+
let error = NSError(domain: "SnowplowTracker", code: 200)
|
|
632
|
+
reject("ERROR", "tracker with given namespace not found", error)
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
|
|
636
|
+
@objc(setTimezone:resolver:rejecter:)
|
|
637
|
+
func setTimezone(details:NSDictionary, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
|
|
638
|
+
let namespace = details.object(forKey: "tracker") as? String
|
|
639
|
+
if let trackerController = trackerByNamespace(namespace) {
|
|
640
|
+
|
|
641
|
+
let newTz = details.object(forKey: "timezone") as? String
|
|
642
|
+
trackerController.subject?.timezone = newTz
|
|
643
|
+
|
|
644
|
+
resolve(true)
|
|
645
|
+
} else {
|
|
646
|
+
let error = NSError(domain: "SnowplowTracker", code: 200)
|
|
647
|
+
reject("ERROR", "tracker with given namespace not found", error)
|
|
648
|
+
}
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
@objc(setLanguage:resolver:rejecter:)
|
|
652
|
+
func setLanguage(details:NSDictionary, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
|
|
653
|
+
let namespace = details.object(forKey: "tracker") as? String
|
|
654
|
+
if let trackerController = trackerByNamespace(namespace) {
|
|
655
|
+
|
|
656
|
+
let newLang = details.object(forKey: "language") as? String
|
|
657
|
+
trackerController.subject?.language = newLang
|
|
658
|
+
|
|
659
|
+
resolve(true)
|
|
660
|
+
} else {
|
|
661
|
+
let error = NSError(domain: "SnowplowTracker", code: 200)
|
|
662
|
+
reject("ERROR", "tracker with given namespace not found", error)
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
|
|
666
|
+
@objc(setScreenResolution:resolver:rejecter:)
|
|
667
|
+
func setScreenResolution(details:NSDictionary, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
|
|
668
|
+
let namespace = details.object(forKey: "tracker") as? String
|
|
669
|
+
if let trackerController = trackerByNamespace(namespace) {
|
|
670
|
+
|
|
671
|
+
if let newRes = details.object(forKey: "screenResolution") as? NSArray,
|
|
672
|
+
let resWidth = newRes.object(at: 0) as? NSNumber,
|
|
673
|
+
let resHeight = newRes.object(at: 1) as? NSNumber {
|
|
674
|
+
let resSize = SPSize(width: resWidth.intValue, height: resHeight.intValue)
|
|
675
|
+
trackerController.subject?.screenResolution = resSize
|
|
676
|
+
}
|
|
677
|
+
else {
|
|
678
|
+
trackerController.subject?.screenResolution = nil
|
|
679
|
+
}
|
|
680
|
+
|
|
681
|
+
resolve(true)
|
|
682
|
+
} else {
|
|
683
|
+
let error = NSError(domain: "SnowplowTracker", code: 200)
|
|
684
|
+
reject("ERROR", "tracker with given namespace not found", error)
|
|
685
|
+
}
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
@objc(setScreenViewport:resolver:rejecter:)
|
|
689
|
+
func setScreenViewport(details:NSDictionary, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
|
|
690
|
+
let namespace = details.object(forKey: "tracker") as? String
|
|
691
|
+
if let trackerController = trackerByNamespace(namespace) {
|
|
692
|
+
|
|
693
|
+
if let newView = details.object(forKey: "screenViewport") as? NSArray,
|
|
694
|
+
let vpWidth = newView.object(at: 0) as? NSNumber,
|
|
695
|
+
let vpHeight = newView.object(at: 1) as? NSNumber {
|
|
696
|
+
let vpSize = SPSize(width: vpWidth.intValue, height: vpHeight.intValue)
|
|
697
|
+
trackerController.subject?.screenViewPort = vpSize
|
|
698
|
+
}
|
|
699
|
+
else {
|
|
700
|
+
trackerController.subject?.screenViewPort = nil
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
resolve(true)
|
|
704
|
+
} else {
|
|
705
|
+
let error = NSError(domain: "SnowplowTracker", code: 200)
|
|
706
|
+
reject("ERROR", "tracker with given namespace not found", error)
|
|
707
|
+
}
|
|
708
|
+
}
|
|
709
|
+
|
|
710
|
+
@objc(setColorDepth:resolver:rejecter:)
|
|
711
|
+
func setColorDepth(details:NSDictionary, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
|
|
712
|
+
let namespace = details.object(forKey: "tracker") as? String
|
|
713
|
+
if let trackerController = trackerByNamespace(namespace) {
|
|
714
|
+
|
|
715
|
+
let newColorD = details.object(forKey: "colorDepth") as? NSNumber
|
|
716
|
+
trackerController.subject?.colorDepth = newColorD
|
|
717
|
+
|
|
718
|
+
resolve(true)
|
|
719
|
+
} else {
|
|
720
|
+
let error = NSError(domain: "SnowplowTracker", code: 200)
|
|
721
|
+
reject("ERROR", "tracker with given namespace not found", error)
|
|
722
|
+
}
|
|
723
|
+
}
|
|
724
|
+
|
|
725
|
+
@objc(getSessionUserId:resolver:rejecter:)
|
|
726
|
+
func getSessionUserId(details:NSDictionary, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
|
|
727
|
+
let namespace = details.object(forKey: "tracker") as? String
|
|
728
|
+
if let trackerController = trackerByNamespace(namespace) {
|
|
729
|
+
|
|
730
|
+
resolve(trackerController.session?.userId)
|
|
731
|
+
|
|
732
|
+
} else {
|
|
733
|
+
let error = NSError(domain: "SnowplowTracker", code: 200)
|
|
734
|
+
reject("ERROR", "tracker with given namespace not found", error)
|
|
735
|
+
}
|
|
736
|
+
}
|
|
737
|
+
|
|
738
|
+
@objc(getSessionId:resolver:rejecter:)
|
|
739
|
+
func getSessionId(details:NSDictionary, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
|
|
740
|
+
let namespace = details.object(forKey: "tracker") as? String
|
|
741
|
+
if let trackerController = trackerByNamespace(namespace) {
|
|
742
|
+
|
|
743
|
+
resolve(trackerController.session?.sessionId)
|
|
744
|
+
|
|
745
|
+
} else {
|
|
746
|
+
let error = NSError(domain: "SnowplowTracker", code: 200)
|
|
747
|
+
reject("ERROR", "tracker with given namespace not found", error)
|
|
748
|
+
}
|
|
749
|
+
}
|
|
750
|
+
|
|
751
|
+
@objc(getSessionIndex:resolver:rejecter:)
|
|
752
|
+
func getSessionIndex(details:NSDictionary, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
|
|
753
|
+
let namespace = details.object(forKey: "tracker") as? String
|
|
754
|
+
if let trackerController = trackerByNamespace(namespace) {
|
|
755
|
+
|
|
756
|
+
if let sessionIndex = trackerController.session?.sessionIndex {
|
|
757
|
+
resolve(NSNumber(integerLiteral: sessionIndex))
|
|
758
|
+
} else {
|
|
759
|
+
resolve(nil)
|
|
760
|
+
}
|
|
761
|
+
} else {
|
|
762
|
+
let error = NSError(domain: "SnowplowTracker", code: 200)
|
|
763
|
+
reject("ERROR", "tracker with given namespace not found", error)
|
|
764
|
+
}
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
@objc(getIsInBackground:resolver:rejecter:)
|
|
768
|
+
func getIsInBackground(details:NSDictionary, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
|
|
769
|
+
let namespace = details.object(forKey: "tracker") as? String
|
|
770
|
+
if let trackerController = trackerByNamespace(namespace) {
|
|
771
|
+
|
|
772
|
+
if let isInBg = trackerController.session?.isInBackground {
|
|
773
|
+
resolve(NSNumber(booleanLiteral: isInBg))
|
|
774
|
+
} else {
|
|
775
|
+
resolve(nil)
|
|
776
|
+
}
|
|
777
|
+
} else {
|
|
778
|
+
let error = NSError(domain: "SnowplowTracker", code: 200)
|
|
779
|
+
reject("ERROR", "tracker with given namespace not found", error)
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
|
|
783
|
+
@objc(getBackgroundIndex:resolver:rejecter:)
|
|
784
|
+
func getBackgroundIndex(details:NSDictionary, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
|
|
785
|
+
let namespace = details.object(forKey: "tracker") as? String
|
|
786
|
+
if let trackerController = trackerByNamespace(namespace) {
|
|
787
|
+
|
|
788
|
+
if let bgIdx = trackerController.session?.backgroundIndex {
|
|
789
|
+
resolve(NSNumber(integerLiteral: bgIdx))
|
|
790
|
+
} else {
|
|
791
|
+
resolve(nil)
|
|
792
|
+
}
|
|
793
|
+
} else {
|
|
794
|
+
let error = NSError(domain: "SnowplowTracker", code: 200)
|
|
795
|
+
reject("ERROR", "tracker with given namespace not found", error)
|
|
796
|
+
}
|
|
797
|
+
}
|
|
798
|
+
|
|
799
|
+
@objc(getForegroundIndex:resolver:rejecter:)
|
|
800
|
+
func getForegroundIndex(details:NSDictionary, resolve:RCTPromiseResolveBlock,reject:RCTPromiseRejectBlock) -> Void {
|
|
801
|
+
let namespace = details.object(forKey: "tracker") as? String
|
|
802
|
+
if let trackerController = trackerByNamespace(namespace) {
|
|
803
|
+
|
|
804
|
+
if let fgIdx = trackerController.session?.foregroundIndex {
|
|
805
|
+
resolve(NSNumber(integerLiteral: fgIdx))
|
|
806
|
+
} else {
|
|
807
|
+
resolve(nil)
|
|
808
|
+
}
|
|
809
|
+
} else {
|
|
810
|
+
let error = NSError(domain: "SnowplowTracker", code: 200)
|
|
811
|
+
reject("ERROR", "tracker with given namespace not found", error)
|
|
812
|
+
}
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
func trackerByNamespace(_ namespace: String?) -> TrackerController? {
|
|
816
|
+
if let namespace = namespace {
|
|
817
|
+
return Snowplow.tracker(namespace: namespace)
|
|
818
|
+
} else {
|
|
819
|
+
return Snowplow.defaultTracker()
|
|
820
|
+
}
|
|
821
|
+
}
|
|
822
|
+
}
|