hypertrack-sdk-react-native 8.2.2 → 9.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 (116) hide show
  1. package/CHANGELOG.md +23 -1
  2. package/CONTRIBUTING.md +32 -110
  3. package/{LICENSE → LICENSE.md} +2 -0
  4. package/README.md +20 -40
  5. package/android/build.gradle +112 -113
  6. package/android/gradle.properties +1 -1
  7. package/android/src/main/java/com/reactnativehypertracksdk/HyperTrackReactNativePlugin.kt +209 -0
  8. package/android/src/main/java/com/reactnativehypertracksdk/HyperTrackSdkPackage.kt +2 -4
  9. package/android/src/main/java/com/reactnativehypertracksdk/ReactNativeSerialization.kt +88 -0
  10. package/android/src/main/java/com/reactnativehypertracksdk/common/Geotag.kt +9 -0
  11. package/android/src/main/java/com/reactnativehypertracksdk/common/HyperTrackError.kt +27 -0
  12. package/android/src/main/java/com/reactnativehypertracksdk/common/HyperTrackSdkWrapper.kt +243 -0
  13. package/android/src/main/java/com/reactnativehypertracksdk/common/LocationError.kt +9 -0
  14. package/android/src/main/java/com/reactnativehypertracksdk/common/Result.kt +48 -0
  15. package/android/src/main/java/com/reactnativehypertracksdk/common/SdkInitParams.kt +46 -0
  16. package/android/src/main/java/com/reactnativehypertracksdk/common/SdkMethod.kt +20 -0
  17. package/android/src/main/java/com/reactnativehypertracksdk/common/Serialization.kt +196 -0
  18. package/hypertrack-sdk-react-native.podspec +1 -1
  19. package/ios/HyperTrackReactNativePlugin.m +54 -0
  20. package/ios/HyperTrackReactNativePlugin.swift +253 -0
  21. package/ios/HyperTrackSdk-Bridging-Header.h +2 -0
  22. package/ios/HyperTrackSdk.xcodeproj/project.pbxproj +8 -11
  23. package/ios/common/DictionaryDecoder.swift +28 -0
  24. package/ios/common/HyperTrackError.swift +20 -0
  25. package/ios/common/HyperTrackSDKWrapper.swift +118 -0
  26. package/ios/common/SDKInitParams.swift +11 -0
  27. package/ios/common/SDKMethod.swift +14 -0
  28. package/ios/common/Serialization.swift +270 -0
  29. package/lib/commonjs/HyperTrack/HyperTrack.js +141 -142
  30. package/lib/commonjs/HyperTrack/HyperTrack.js.map +1 -1
  31. package/lib/commonjs/HyperTrack/data_types/HyperTrackError.js +31 -0
  32. package/lib/commonjs/HyperTrack/data_types/HyperTrackError.js.map +1 -0
  33. package/lib/commonjs/HyperTrack/data_types/Location.js +2 -0
  34. package/lib/commonjs/HyperTrack/data_types/Location.js.map +1 -0
  35. package/lib/commonjs/HyperTrack/data_types/LocationError.js +6 -0
  36. package/lib/commonjs/HyperTrack/data_types/LocationError.js.map +1 -0
  37. package/lib/commonjs/HyperTrack/data_types/SdkInitParams.js +2 -0
  38. package/lib/commonjs/HyperTrack/data_types/SdkInitParams.js.map +1 -0
  39. package/lib/commonjs/HyperTrack/data_types/internal/DeviceId.js +2 -0
  40. package/lib/commonjs/HyperTrack/data_types/internal/DeviceId.js.map +1 -0
  41. package/lib/commonjs/HyperTrack/data_types/internal/DeviceName.js +2 -0
  42. package/lib/commonjs/HyperTrack/data_types/internal/DeviceName.js.map +1 -0
  43. package/lib/commonjs/HyperTrack/data_types/internal/Geotag.js +2 -0
  44. package/lib/commonjs/HyperTrack/data_types/internal/Geotag.js.map +1 -0
  45. package/lib/commonjs/HyperTrack/data_types/internal/HyperTrackErrorInternal.js +2 -0
  46. package/lib/commonjs/HyperTrack/data_types/internal/HyperTrackErrorInternal.js.map +1 -0
  47. package/lib/commonjs/HyperTrack/data_types/internal/IsAvailable.js +2 -0
  48. package/lib/commonjs/HyperTrack/data_types/internal/IsAvailable.js.map +1 -0
  49. package/lib/commonjs/HyperTrack/data_types/internal/IsTracking.js +2 -0
  50. package/lib/commonjs/HyperTrack/data_types/internal/IsTracking.js.map +1 -0
  51. package/lib/commonjs/HyperTrack/data_types/internal/LocationErrorInternal.js +6 -0
  52. package/lib/commonjs/HyperTrack/data_types/internal/LocationErrorInternal.js.map +1 -0
  53. package/lib/commonjs/HyperTrack/data_types/internal/LocationResponse.js +6 -0
  54. package/lib/commonjs/HyperTrack/data_types/internal/LocationResponse.js.map +1 -0
  55. package/lib/commonjs/index.js +28 -17
  56. package/lib/commonjs/index.js.map +1 -1
  57. package/lib/module/HyperTrack/HyperTrack.js +140 -134
  58. package/lib/module/HyperTrack/HyperTrack.js.map +1 -1
  59. package/lib/module/HyperTrack/data_types/HyperTrackError.js +24 -0
  60. package/lib/module/HyperTrack/data_types/HyperTrackError.js.map +1 -0
  61. package/lib/module/HyperTrack/data_types/Location.js +2 -0
  62. package/lib/module/HyperTrack/data_types/Location.js.map +1 -0
  63. package/lib/module/HyperTrack/data_types/LocationError.js +2 -0
  64. package/lib/module/HyperTrack/data_types/LocationError.js.map +1 -0
  65. package/lib/module/HyperTrack/data_types/SdkInitParams.js +2 -0
  66. package/lib/module/HyperTrack/data_types/SdkInitParams.js.map +1 -0
  67. package/lib/module/HyperTrack/data_types/internal/DeviceId.js +2 -0
  68. package/lib/module/HyperTrack/data_types/internal/DeviceId.js.map +1 -0
  69. package/lib/module/HyperTrack/data_types/internal/DeviceName.js +2 -0
  70. package/lib/module/HyperTrack/data_types/internal/DeviceName.js.map +1 -0
  71. package/lib/module/HyperTrack/data_types/internal/Geotag.js +2 -0
  72. package/lib/module/HyperTrack/data_types/internal/Geotag.js.map +1 -0
  73. package/lib/module/HyperTrack/data_types/internal/HyperTrackErrorInternal.js +2 -0
  74. package/lib/module/HyperTrack/data_types/internal/HyperTrackErrorInternal.js.map +1 -0
  75. package/lib/module/HyperTrack/data_types/internal/IsAvailable.js +2 -0
  76. package/lib/module/HyperTrack/data_types/internal/IsAvailable.js.map +1 -0
  77. package/lib/module/HyperTrack/data_types/internal/IsTracking.js +2 -0
  78. package/lib/module/HyperTrack/data_types/internal/IsTracking.js.map +1 -0
  79. package/lib/module/HyperTrack/data_types/internal/LocationErrorInternal.js +2 -0
  80. package/lib/module/HyperTrack/data_types/internal/LocationErrorInternal.js.map +1 -0
  81. package/lib/module/HyperTrack/data_types/internal/LocationResponse.js +2 -0
  82. package/lib/module/HyperTrack/data_types/internal/LocationResponse.js.map +1 -0
  83. package/lib/module/index.js +4 -1
  84. package/lib/module/index.js.map +1 -1
  85. package/lib/typescript/HyperTrack/HyperTrack.d.ts +66 -100
  86. package/lib/typescript/HyperTrack/data_types/HyperTrackError.d.ts +20 -0
  87. package/lib/typescript/HyperTrack/data_types/Location.d.ts +7 -0
  88. package/lib/typescript/HyperTrack/data_types/LocationError.d.ts +8 -0
  89. package/lib/typescript/HyperTrack/data_types/SdkInitParams.d.ts +5 -0
  90. package/lib/typescript/HyperTrack/data_types/internal/DeviceId.d.ts +4 -0
  91. package/lib/typescript/HyperTrack/data_types/internal/DeviceName.d.ts +4 -0
  92. package/lib/typescript/HyperTrack/data_types/internal/Geotag.d.ts +3 -0
  93. package/lib/typescript/HyperTrack/data_types/internal/HyperTrackErrorInternal.d.ts +4 -0
  94. package/lib/typescript/HyperTrack/data_types/internal/IsAvailable.d.ts +4 -0
  95. package/lib/typescript/HyperTrack/data_types/internal/IsTracking.d.ts +4 -0
  96. package/lib/typescript/HyperTrack/data_types/internal/LocationErrorInternal.d.ts +12 -0
  97. package/lib/typescript/HyperTrack/data_types/internal/LocationResponse.d.ts +11 -0
  98. package/lib/typescript/index.d.ts +4 -1
  99. package/package.json +156 -156
  100. package/src/HyperTrack/HyperTrack.ts +163 -163
  101. package/src/HyperTrack/data_types/HyperTrackError.ts +22 -0
  102. package/src/HyperTrack/data_types/Location.ts +7 -0
  103. package/src/HyperTrack/data_types/LocationError.ts +11 -0
  104. package/src/HyperTrack/data_types/SdkInitParams.ts +5 -0
  105. package/src/HyperTrack/data_types/internal/DeviceId.ts +4 -0
  106. package/src/HyperTrack/data_types/internal/DeviceName.ts +4 -0
  107. package/src/HyperTrack/data_types/internal/Geotag.ts +3 -0
  108. package/src/HyperTrack/data_types/internal/HyperTrackErrorInternal.ts +4 -0
  109. package/src/HyperTrack/data_types/internal/IsAvailable.ts +4 -0
  110. package/src/HyperTrack/data_types/internal/IsTracking.ts +4 -0
  111. package/src/HyperTrack/data_types/internal/LocationErrorInternal.ts +14 -0
  112. package/src/HyperTrack/data_types/internal/LocationResponse.ts +14 -0
  113. package/src/index.tsx +4 -7
  114. package/android/src/main/java/com/reactnativehypertracksdk/HyperTrackModule.kt +0 -284
  115. package/ios/HyperTrack.h +0 -7
  116. package/ios/HyperTrack.m +0 -384
@@ -1,284 +0,0 @@
1
- package com.hypertrack.reactnative.androidsdk
2
-
3
- import android.location.Location
4
- import android.util.Log
5
- import com.facebook.react.bridge.*
6
- import com.facebook.react.module.annotations.ReactModule
7
- import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter
8
- import com.hypertrack.sdk.*
9
- import com.hypertrack.sdk.TrackingStateObserver.OnTrackingStateChangeListener
10
- import java.util.*
11
-
12
- @ReactModule(name = HTSDKModule.NAME)
13
- class HTSDKModule(reactContext: ReactApplicationContext?) :
14
- ReactContextBaseJavaModule(reactContext) {
15
- var trackingStateChangeListener: OnTrackingStateChangeListener? = null
16
- var sdkInstance: HyperTrack? = null
17
- override fun getName(): String {
18
- return NAME
19
- }
20
-
21
- @ReactMethod
22
- fun addListener(type: String?) {
23
- // Keep: Required for RN built in Event Emitter Calls.
24
- }
25
-
26
- @ReactMethod
27
- fun removeListeners(type: Int?) {
28
- // Keep: Required for RN built in Event Emitter Calls.
29
- }
30
-
31
- @ReactMethod
32
- fun initialize(
33
- publishableKey: String?,
34
- startsTracking: Boolean,
35
- automaticallyRequestPermissions: Boolean?,
36
- promise: Promise
37
- ) {
38
- try {
39
- sdkInstance = HyperTrack.getInstance(
40
- publishableKey!!
41
- ).backgroundTrackingRequirement(false)
42
- subscribeToTracking()
43
- if (startsTracking) {
44
- sdkInstance!!.start()
45
- }
46
- promise.resolve(true)
47
- } catch (exception: Exception) {
48
- Log.e(TAG, "Hypertrack SDK initialization failed.", exception)
49
- val error = String.format(Locale.ENGLISH, "%d", RN_ERROR_INVALID_PUBLISHABLE_KEY)
50
- promise.reject(error, Exception("Hypertrack SDK initialization failed."))
51
- }
52
- }
53
-
54
- fun subscribeToTracking() {
55
- if (trackingStateChangeListener != null) {
56
- sdkInstance!!.removeTrackingListener(trackingStateChangeListener)
57
- trackingStateChangeListener = null
58
- }
59
- trackingStateChangeListener = object : OnTrackingStateChangeListener {
60
- override fun onError(trackingError: TrackingError) {
61
-
62
- val params = Arguments.createMap()
63
- params.putInt("code", convertToRNErrorsCode(trackingError.code))
64
- params.putString("message", trackingError.message)
65
- reactApplicationContext
66
- .getJSModule(RCTDeviceEventEmitter::class.java)
67
- .emit("onTrackingErrorHyperTrack", params)
68
- }
69
-
70
- override fun onTrackingStart() {
71
- reactApplicationContext
72
- .getJSModule(RCTDeviceEventEmitter::class.java)
73
- .emit("onTrackingStateChanged", sdkInstance!!.isTracking)
74
- }
75
-
76
- override fun onTrackingStop() {
77
- reactApplicationContext
78
- .getJSModule(RCTDeviceEventEmitter::class.java)
79
- .emit("onTrackingStateChanged", sdkInstance!!.isTracking)
80
- }
81
- }
82
- sdkInstance!!.addTrackingListener(trackingStateChangeListener)
83
- }
84
-
85
- @ReactMethod
86
- fun getDeviceID(promise: Promise) {
87
- promise.resolve(sdkInstance!!.deviceID)
88
- }
89
-
90
- @ReactMethod
91
- fun isTracking(promise: Promise) {
92
- promise.resolve(sdkInstance!!.isTracking)
93
- }
94
-
95
- @ReactMethod
96
- fun startTracking() {
97
- sdkInstance!!.start()
98
- }
99
-
100
- @ReactMethod
101
- fun stopTracking() {
102
- sdkInstance!!.stop()
103
- }
104
-
105
- @ReactMethod
106
- fun syncDeviceSettings() {
107
- sdkInstance!!.syncDeviceSettings()
108
- }
109
-
110
- @ReactMethod
111
- fun addGeotag(rMap: ReadableMap, promise: Promise) {
112
- try {
113
- sdkInstance!!.addGeotag(rMap.toHashMap())
114
- promise.resolve(locationResultToMap(sdkInstance!!.latestLocation))
115
- } catch (e: Exception) {
116
- val error = String.format(Locale.ENGLISH, "%d", RN_ERROR_GENERAL)
117
- promise.reject(error, e)
118
- }
119
- }
120
-
121
- @ReactMethod
122
- fun isAvailable(promise: Promise) {
123
- promise.resolve(sdkInstance!!.availability.equals(Availability.AVAILABLE))
124
- }
125
-
126
-
127
- @ReactMethod
128
- fun setAvailability(availability: Boolean, promise: Promise) {
129
- if (availability) {
130
- sdkInstance!!.availability = Availability.AVAILABLE
131
- } else {
132
- sdkInstance!!.availability = Availability.UNAVAILABLE
133
- }
134
- promise.resolve(sdkInstance!!.availability.equals(Availability.AVAILABLE))
135
- }
136
-
137
- // @ReactMethod
138
- // fun addGeotag(rMap: ReadableMap, expectedLocation: ReadableMap, promise: Promise) {
139
- // try {
140
- // val expected = expectedLocationFromMap(expectedLocation)
141
- // val result = sdkInstance!!.addGeotag(rMap.toHashMap(), expected)
142
- // if (result is GeotagResult.Success) {
143
- // val deviceLocation = result.deviceLocation
144
- // val map = Arguments.createMap()
145
- // map.putDouble("latitude", deviceLocation.latitude)
146
- // map.putDouble("longitude", deviceLocation.longitude)
147
- // promise.resolve(map)
148
- // } else {
149
- // val error = String.format(Locale.ENGLISH, "%d", RN_ERROR_GENERAL)
150
- // promise.reject(error)
151
- // }
152
- // } catch (e: Exception) {
153
- // val error = String.format(Locale.ENGLISH, "%d", RN_ERROR_GENERAL)
154
- // promise.reject(error, e)
155
- // }
156
- // }
157
-
158
- private fun expectedLocationFromMap(expectedLocation: ReadableMap): Location? {
159
- return if (!expectedLocation.hasKey(LATITUDE) || !expectedLocation.hasKey(LONGITUDE)) null else try {
160
- val latitude = expectedLocation.getDouble(LATITUDE)
161
- val longitude = expectedLocation.getDouble(LONGITUDE)
162
- if (longitude > 180.0 || longitude < -180.0) return null
163
- if (latitude > 90.0 || latitude < -90.0) return null
164
- val expected = Location("any")
165
- expected.latitude = latitude
166
- expected.longitude = longitude
167
- expected
168
- } catch (ignored: Throwable) {
169
- null
170
- }
171
- }
172
-
173
- private fun fail(error: Int, promise: Promise) {
174
- val map = Arguments.createMap()
175
- map.putInt("code", error)
176
- promise.resolve(map)
177
- }
178
-
179
- @ReactMethod
180
- fun setDeviceName(name: String?, promise: Promise) {
181
- try {
182
- sdkInstance!!.setDeviceName(name)
183
- promise.resolve(true)
184
- } catch (e: Exception) {
185
- val error = String.format(Locale.ENGLISH, "%d", RN_ERROR_GENERAL)
186
- promise.reject(error, e)
187
- }
188
- }
189
-
190
- @ReactMethod
191
- fun setMetadata(rMap: ReadableMap, promise: Promise) {
192
- try {
193
- sdkInstance!!.setDeviceMetadata(rMap.toHashMap())
194
- promise.resolve(true)
195
- } catch (e: Exception) {
196
- val error = String.format(Locale.ENGLISH, "%d", RN_ERROR_GENERAL)
197
- promise.reject(error, e)
198
- }
199
- }
200
-
201
- @ReactMethod
202
- fun enableDebugLogging(enable: Boolean) {
203
- if (enable) {
204
- HyperTrack.enableDebugLogging()
205
- }
206
- }
207
-
208
- @ReactMethod
209
- fun enableMockLocation(enable: Boolean) {
210
- if (enable) {
211
- sdkInstance!!.allowMockLocations()
212
- }
213
- }
214
-
215
- @ReactMethod
216
- fun getLocation(promise: Promise) {
217
- promise.resolve(locationResultToMap(sdkInstance!!.latestLocation))
218
- }
219
-
220
- @ReactMethod
221
- fun getCurrentLocation(promise: Promise) {
222
- sdkInstance!!.getCurrentLocation { result -> promise.resolve(locationResultToMap(result)) }
223
- }
224
-
225
- private fun locationResultToMap(result: Result<Location, OutageReason>): WritableMap {
226
- val resultMap = Arguments.createMap()
227
- if (result.isSuccess) {
228
- val location = result.value
229
- val locationMap = Arguments.createMap()
230
- locationMap.putDouble(LATITUDE, location.latitude)
231
- locationMap.putDouble(LONGITUDE, location.longitude)
232
- resultMap.putMap(KEY_LOCATION, locationMap)
233
- } else {
234
- val outage = result.error
235
- val errorMap = Arguments.createMap()
236
- errorMap.putString(KEY_OUTAGE_CODE, getOutageName(outage))
237
- resultMap.putMap(KEY_ERROR, errorMap)
238
- }
239
- return resultMap
240
- }
241
-
242
- private fun getOutageName(outageReason: OutageReason): String {
243
- return when (outageReason) {
244
- OutageReason.MISSING_LOCATION_PERMISSION -> OUTAGE_CODE_LOCATION_PERMISSIONS_DENIED
245
- OutageReason.MISSING_ACTIVITY_PERMISSION -> OUTAGE_CODE_MOTION_ACTIVITY_PERMISSIONS_DENIED
246
- OutageReason.LOCATION_SERVICE_DISABLED -> OUTAGE_CODE_LOCATION_SERVICES_DISABLED
247
- OutageReason.NOT_TRACKING -> OUTAGE_CODE_NOT_RUNNING
248
- OutageReason.START_HAS_NOT_FINISHED -> OUTAGE_CODE_STARTING
249
- OutageReason.NO_GPS_SIGNAL, OutageReason.RESTART_REQUIRED -> OUTAGE_CODE_GPS_SIGNAL_LOST
250
- else -> OUTAGE_CODE_GPS_SIGNAL_LOST
251
- }
252
- }
253
-
254
- private fun convertToRNErrorsCode(androidSdkCode: Int): Int {
255
- return when (androidSdkCode) {
256
- TrackingError.INVALID_PUBLISHABLE_KEY_ERROR -> RN_ERROR_INVALID_PUBLISHABLE_KEY
257
- TrackingError.AUTHORIZATION_ERROR -> RN_ERROR_AUTHORIZATION_FAILED
258
- TrackingError.PERMISSION_DENIED_ERROR -> RN_ERROR_PERMISSION_DENIED
259
- else -> RN_ERROR_GENERAL
260
- }
261
- }
262
-
263
- companion object {
264
- private const val TAG = "HTSDKModule"
265
- private const val KEY_LOCATION = "location"
266
- private const val KEY_ERROR = "error"
267
- private const val KEY_OUTAGE_CODE = "code"
268
- const val NAME = "HyperTrack"
269
- const val LATITUDE = "latitude"
270
- const val LONGITUDE = "longitude"
271
- const val ACCURACY = "accuracy"
272
- private const val OUTAGE_CODE_LOCATION_PERMISSIONS_DENIED = "location_permissions_denied"
273
- private const val OUTAGE_CODE_LOCATION_SERVICES_DISABLED = "location_services_disabled"
274
- private const val OUTAGE_CODE_MOTION_ACTIVITY_PERMISSIONS_DENIED =
275
- "motion_activity_permissions_denied"
276
- private const val OUTAGE_CODE_NOT_RUNNING = "not_running"
277
- private const val OUTAGE_CODE_GPS_SIGNAL_LOST = "gps_signal_lost"
278
- private const val OUTAGE_CODE_STARTING = "starting"
279
- private const val RN_ERROR_GENERAL = 0
280
- private const val RN_ERROR_INVALID_PUBLISHABLE_KEY = 1
281
- private const val RN_ERROR_AUTHORIZATION_FAILED = 2
282
- private const val RN_ERROR_PERMISSION_DENIED = 3
283
- }
284
- }
package/ios/HyperTrack.h DELETED
@@ -1,7 +0,0 @@
1
- #import <React/RCTEventEmitter.h>
2
- #import <React/RCTBridgeModule.h>
3
- @import HyperTrack;
4
-
5
- @interface HyperTrack : RCTEventEmitter <RCTBridgeModule>
6
-
7
- @end
package/ios/HyperTrack.m DELETED
@@ -1,384 +0,0 @@
1
- #import "HyperTrack.h"
2
- #import <React/RCTLog.h>
3
- #import <React/RCTEventDispatcher.h>
4
-
5
- @interface HyperTrack ()
6
-
7
- @property(nonatomic) HTSDK *hyperTrack;
8
-
9
- @end
10
-
11
-
12
- @implementation HyperTrack
13
- {
14
- bool hasListeners;
15
- }
16
- /**
17
- * RN Critical error type.
18
- */
19
- typedef NS_ENUM(NSUInteger, RNCriticalErrorType) {
20
- permissionDenied = 3,
21
- authorizationError = 2,
22
- invalidPublishableKey = 1,
23
- generalError = 0
24
- };
25
-
26
- RCT_EXPORT_MODULE();
27
-
28
- - (dispatch_queue_t)methodQueue {
29
- return dispatch_get_main_queue();
30
- }
31
-
32
- - (NSArray<NSString *> *)supportedEvents {
33
- return @[@"onTrackingErrorHyperTrack",
34
- @"onTrackingStateChanged",
35
- ];
36
- }
37
-
38
- - (void)startObserving {
39
- hasListeners = YES;
40
- }
41
-
42
- - (void)stopObserving {
43
- hasListeners = NO;
44
- }
45
-
46
- #pragma mark - HyperTrack SDK
47
-
48
- RCT_EXPORT_METHOD(initialize:(NSString *)publishableKey startsTracking:(BOOL)startsTracking automaticallyRequestPermissions:(BOOL)automaticallyRequestPermissions :(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
49
- RCTLogInfo(@"Initializing HyperTrack with publishableKey: %@", publishableKey);
50
- __weak __typeof(self) weakSelf = self;
51
- dispatch_async(dispatch_get_main_queue(), ^{
52
- [weakSelf addObservers];
53
- HTResult *result = [HTSDK makeSDKWithPublishableKey:publishableKey
54
- automaticallyRequestPermissions:automaticallyRequestPermissions];
55
- if (result.hyperTrack != nil) {
56
- RCTLogInfo(@"Successfully set publishableKey and created SDK instance");
57
- self.hyperTrack = result.hyperTrack;
58
- if (startsTracking) {
59
- [self.hyperTrack start];
60
- }
61
- resolve(nil);
62
- } else {
63
- switch ([result.error code]) {
64
-
65
- case HTFatalErrorDevelopmentPublishableKeyIsEmpty:
66
- {
67
- NSError *error = [NSError errorWithDomain: result.error.domain
68
- code: invalidPublishableKey
69
- userInfo: result.error.userInfo];
70
- reject([NSString stringWithFormat:@"%d", (int)error.code], error.localizedDescription, error);
71
- }
72
- break;
73
-
74
- case HTFatalErrorDevelopmentMissingLocationUpdatesBackgroundModeCapability:
75
- {
76
- NSError *error = [NSError errorWithDomain: result.error.domain
77
- code: generalError
78
- userInfo: result.error.userInfo];
79
- reject([NSString stringWithFormat:@"%d", (int)error.code], error.localizedDescription, error);
80
- }
81
- break;
82
-
83
- case HTFatalErrorDevelopmentRunningOnSimulatorUnsupported:
84
- {
85
- NSError *error = [NSError errorWithDomain: result.error.domain
86
- code: generalError
87
- userInfo: result.error.userInfo];
88
- reject([NSString stringWithFormat:@"%d", (int)error.code], error.localizedDescription, error);
89
- }
90
- break;
91
-
92
- case HTFatalErrorProductionLocationServicesUnavalible:
93
- {
94
- NSError *error = [NSError errorWithDomain: result.error.domain
95
- code: permissionDenied
96
- userInfo: result.error.userInfo];
97
- reject([NSString stringWithFormat:@"%d", (int)error.code], error.localizedDescription, error);
98
- }
99
- break;
100
-
101
- case HTFatalErrorProductionMotionActivityServicesUnavalible:
102
- {
103
- NSError *error = [NSError errorWithDomain: result.error.domain
104
- code: permissionDenied
105
- userInfo: result.error.userInfo];
106
- reject([NSString stringWithFormat:@"%d", (int)error.code], error.localizedDescription, error);
107
- }
108
- break;
109
-
110
- case HTFatalErrorProductionMotionActivityPermissionsDenied:
111
- {
112
- NSError *error = [NSError errorWithDomain: result.error.domain
113
- code: permissionDenied
114
- userInfo: result.error.userInfo];
115
- reject([NSString stringWithFormat:@"%d", (int)error.code], error.localizedDescription, error);
116
- }
117
- break;
118
-
119
- default:
120
- {
121
- NSError *error = [NSError errorWithDomain: result.error.domain
122
- code: generalError
123
- userInfo: result.error.userInfo];
124
- reject([NSString stringWithFormat:@"%d", (int)error.code], error.localizedDescription, error);
125
- }
126
- break;
127
- }
128
- }
129
- });
130
- }
131
-
132
- RCT_EXPORT_METHOD(isAvailable:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
133
- if ( [self.hyperTrack availability] == HTAvailabilityAvailable) {
134
- resolve(@YES);
135
- } else {
136
- resolve(@NO);
137
- }
138
- }
139
-
140
- RCT_EXPORT_METHOD(setAvailability:(BOOL)availability:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
141
- [self.hyperTrack setAvailability: availability ? HTAvailabilityAvailable : HTAvailabilityUnavailable];
142
- if ( [self.hyperTrack availability] == HTAvailabilityAvailable) {
143
- resolve(@YES);
144
- } else {
145
- resolve(@NO);
146
- }
147
- }
148
-
149
- RCT_EXPORT_METHOD(startTracking) {
150
- [self.hyperTrack start];
151
- }
152
-
153
- RCT_EXPORT_METHOD(stopTracking) {
154
- [self.hyperTrack stop];
155
- }
156
-
157
- RCT_EXPORT_METHOD(syncDeviceSettings) {
158
- [self.hyperTrack syncDeviceSettings];
159
- }
160
-
161
- RCT_EXPORT_METHOD(subscribeOnEvents) {
162
-
163
- }
164
-
165
- RCT_EXPORT_METHOD(enableDebugLogging:(BOOL)isEnabled) {
166
- [HTSDK setIsLoggingEnabled:isEnabled];
167
- }
168
-
169
- RCT_EXPORT_METHOD(enableMockLocation:(BOOL)isAllowed) {
170
- [self.hyperTrack setMockLocationsAllowed:isAllowed];
171
- }
172
-
173
- RCT_EXPORT_METHOD(isTracking:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
174
- resolve([NSNumber numberWithBool:[self.hyperTrack isTracking]]);
175
- }
176
-
177
- RCT_EXPORT_METHOD(getLocation:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
178
- HTLocationResult *locationResult = self.hyperTrack.location;
179
-
180
- switch (locationResult.error) {
181
- case HTLocationErrorNoError:
182
- resolve(@{ @"location": @{ @"latitude": [NSNumber numberWithDouble:locationResult.location.latitude], @"longitude": [NSNumber numberWithDouble:locationResult.location.longitude] } });
183
- break;
184
- case HTLocationErrorLocationPermissionsNotDetermined:
185
- resolve(@{ @"error": @{ @"code": @"location_permissions_not_determined" } });
186
- break;
187
- case HTLocationErrorLocationPermissionsCantBeAskedInBackground:
188
- resolve(@{ @"error": @{ @"code": @"location_permissions_cant_be_asked_in_background" } });
189
- break;
190
- case HTLocationErrorLocationPermissionsInsufficientForBackground:
191
- resolve(@{ @"error": @{ @"code": @"location_permissions_insufficient_for_background" } });
192
- break;
193
- case HTLocationErrorLocationPermissionsRestricted:
194
- resolve(@{ @"error": @{ @"code": @"location_permissions_restricted" } });
195
- break;
196
- case HTLocationErrorLocationPermissionsReducedAccuracy:
197
- resolve(@{ @"error": @{ @"code": @"location_permissions_reduced_accuracy" } });
198
- break;
199
- case HTLocationErrorLocationPermissionsDenied:
200
- resolve(@{ @"error": @{ @"code": @"location_permissions_denied" } });
201
- break;
202
- case HTLocationErrorLocationServicesDisabled:
203
- resolve(@{ @"error": @{ @"code": @"location_services_disabled" } });
204
- break;
205
- case HTLocationErrorMotionActivityPermissionsNotDetermined:
206
- resolve(@{ @"error": @{ @"code": @"motion_activity_permissions_not_determined" } });
207
- break;
208
- case HTLocationErrorMotionActivityPermissionsCantBeAskedInBackground:
209
- resolve(@{ @"error": @{ @"code": @"motion_activity_permissions_cant_be_asked_in_background" } });
210
- break;
211
- case HTLocationErrorMotionActivityPermissionsDenied:
212
- resolve(@{ @"error": @{ @"code": @"motion_activity_permissions_denied" } });
213
- break;
214
- case HTLocationErrorMotionActivityServicesDisabled:
215
- resolve(@{ @"error": @{ @"code": @"motion_activity_services_disabled" } });
216
- break;
217
- case HTLocationErrorNotRunning:
218
- resolve(@{ @"error": @{ @"code": @"not_running" } });
219
- break;
220
- case HTLocationErrorGpsSignalLost:
221
- resolve(@{ @"error": @{ @"code": @"gps_signal_lost" } });
222
- break;
223
- case HTLocationErrorStarting:
224
- resolve(@{ @"error": @{ @"code": @"starting" } });
225
- break;
226
- case HTLocationErrorLocationMocked:
227
- resolve(@{ @"error": @{ @"code": @"location_mocked" } });
228
- break;
229
- }
230
- }
231
-
232
- RCT_EXPORT_METHOD(getDeviceID:(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
233
- resolve(self.hyperTrack.deviceID);
234
- }
235
-
236
- RCT_EXPORT_METHOD(setDeviceName:(NSString *)deviceName :(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
237
- self.hyperTrack.deviceName = deviceName;
238
- resolve(nil);
239
- }
240
-
241
- RCT_EXPORT_METHOD(setMetadata:(NSDictionary<NSString*, id>*)metadata :(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
242
- HTMetadata *hyperTrackMetadata = [[HTMetadata alloc] initWithDictionary:metadata];
243
- if (metadata != nil) {
244
- [self.hyperTrack setDeviceMetadata:hyperTrackMetadata];
245
- resolve(nil);
246
- } else {
247
- NSError *error = [NSError errorWithDomain:@"HyperTrackMetadataError" code:-1 userInfo:@{ @"description": @"Metadata is not a valid JSON" }];
248
- reject([NSString stringWithFormat:@"%d", (int)error.code], error.localizedDescription, error);
249
- }
250
- }
251
-
252
- RCT_EXPORT_METHOD(addGeotag:(NSDictionary<NSString*, id>*)metadata :(RCTPromiseResolveBlock)resolve rejecter:(RCTPromiseRejectBlock)reject) {
253
- HTMetadata *hyperTrackMetadata = [[HTMetadata alloc] initWithDictionary:metadata];
254
- if (metadata != nil) {
255
- [self.hyperTrack addGeotag:hyperTrackMetadata];
256
- HTLocationResult *locationResult = self.hyperTrack.location;
257
- switch (locationResult.error) {
258
- case HTLocationErrorNoError:
259
- resolve(@{ @"location": @{ @"latitude": [NSNumber numberWithDouble:locationResult.location.latitude], @"longitude": [NSNumber numberWithDouble:locationResult.location.longitude] } });
260
- break;
261
- case HTLocationErrorLocationPermissionsNotDetermined:
262
- resolve(@{ @"error": @{ @"code": @"location_permissions_not_determined" } });
263
- break;
264
- case HTLocationErrorLocationPermissionsCantBeAskedInBackground:
265
- resolve(@{ @"error": @{ @"code": @"location_permissions_cant_be_asked_in_background" } });
266
- break;
267
- case HTLocationErrorLocationPermissionsInsufficientForBackground:
268
- resolve(@{ @"error": @{ @"code": @"location_permissions_insufficient_for_background" } });
269
- break;
270
- case HTLocationErrorLocationPermissionsRestricted:
271
- resolve(@{ @"error": @{ @"code": @"location_permissions_restricted" } });
272
- break;
273
- case HTLocationErrorLocationPermissionsReducedAccuracy:
274
- resolve(@{ @"error": @{ @"code": @"location_permissions_reduced_accuracy" } });
275
- break;
276
- case HTLocationErrorLocationPermissionsDenied:
277
- resolve(@{ @"error": @{ @"code": @"location_permissions_denied" } });
278
- break;
279
- case HTLocationErrorLocationServicesDisabled:
280
- resolve(@{ @"error": @{ @"code": @"location_services_disabled" } });
281
- break;
282
- case HTLocationErrorMotionActivityPermissionsNotDetermined:
283
- resolve(@{ @"error": @{ @"code": @"motion_activity_permissions_not_determined" } });
284
- break;
285
- case HTLocationErrorMotionActivityPermissionsCantBeAskedInBackground:
286
- resolve(@{ @"error": @{ @"code": @"motion_activity_permissions_cant_be_asked_in_background" } });
287
- break;
288
- case HTLocationErrorMotionActivityPermissionsDenied:
289
- resolve(@{ @"error": @{ @"code": @"motion_activity_permissions_denied" } });
290
- break;
291
- case HTLocationErrorMotionActivityServicesDisabled:
292
- resolve(@{ @"error": @{ @"code": @"motion_activity_services_disabled" } });
293
- break;
294
- case HTLocationErrorNotRunning:
295
- resolve(@{ @"error": @{ @"code": @"not_running" } });
296
- break;
297
- case HTLocationErrorGpsSignalLost:
298
- resolve(@{ @"error": @{ @"code": @"gps_signal_lost" } });
299
- break;
300
- case HTLocationErrorStarting:
301
- resolve(@{ @"error": @{ @"code": @"starting" } });
302
- break;
303
- case HTLocationErrorLocationMocked:
304
- resolve(@{ @"error": @{ @"code": @"location_mocked" } });
305
- break;
306
- }
307
- } else {
308
- NSError *error = [NSError errorWithDomain:@"HyperTrackMetadataError" code:-1 userInfo:@{ @"description": @"Geotag is not a valid JSON" }];
309
- reject([NSString stringWithFormat:@"%d", (int)error.code], error.localizedDescription, error);
310
- }
311
- }
312
-
313
-
314
- #pragma mark - NSNotificationCenter
315
-
316
- - (void)addObservers {
317
- [[NSNotificationCenter defaultCenter] removeObserver:self];
318
- [[NSNotificationCenter defaultCenter] addObserver:self
319
- selector:@selector(sendTrackingStateToRNWith:)
320
- name:HTSDK.startedTrackingNotification
321
- object:nil];
322
- [[NSNotificationCenter defaultCenter] addObserver:self
323
- selector:@selector(sendTrackingStateToRNWith:)
324
- name:HTSDK.stoppedTrackingNotification
325
- object:nil];
326
- [[NSNotificationCenter defaultCenter] addObserver:self
327
- selector:@selector(sendCriticalErrorForNotification:)
328
- name:HTSDK.didEncounterRestorableErrorNotification
329
- object:nil];
330
- [[NSNotificationCenter defaultCenter] addObserver:self
331
- selector:@selector(sendCriticalErrorForNotification:)
332
- name:HTSDK.didEncounterUnrestorableErrorNotification
333
- object:nil];
334
- }
335
-
336
- - (void)sendTrackingStateToRNWith:(NSNotification*)notification {
337
- NSString *eventName = @"";
338
- if ([notification.name isEqualToString: @"HyperTrackStartedTracking"]) {
339
- eventName = @"onTrackingStateChanged";
340
- } else if ([notification.name isEqualToString: @"HyperTrackStoppedTracking"]) {
341
- eventName = @"onTrackingStateChanged";
342
- } else {
343
- return;
344
- }
345
- if (hasListeners) {
346
- [self sendEventWithName: eventName body: @([self.hyperTrack isTracking])];
347
- }
348
- }
349
-
350
- - (void)sendCriticalErrorForNotification:(NSNotification *)notification {
351
- [self sendError:[notification hyperTrackTrackingError]];
352
- }
353
-
354
- - (void)sendError:(NSError *)error {
355
- if (error != nil && hasListeners) {
356
- [self sendEventWithName: @"onTrackingErrorHyperTrack"
357
- body: @{ @"code": [self convertErrorCodeToRN:[error code]], @"message": error.localizedDescription }];
358
- }
359
- }
360
-
361
- - (NSNumber *)convertErrorCodeToRN:(NSInteger)errorCode {
362
- switch (errorCode) {
363
- case HTRestorableErrorLocationPermissionsDenied:
364
- case HTRestorableErrorLocationServicesDisabled:
365
- case HTRestorableErrorMotionActivityServicesDisabled:
366
- case HTUnrestorableErrorMotionActivityPermissionsDenied:
367
- case HTFatalErrorProductionMotionActivityPermissionsDenied:
368
- return [NSNumber numberWithInteger:permissionDenied];
369
- break;
370
- case HTRestorableErrorTrialEnded:
371
- case HTRestorableErrorPaymentDefault:
372
- return [NSNumber numberWithInteger:authorizationError];
373
- break;
374
- case HTUnrestorableErrorInvalidPublishableKey:
375
- case HTFatalErrorDevelopmentPublishableKeyIsEmpty:
376
- return [NSNumber numberWithInteger:invalidPublishableKey];
377
- break;
378
- default:
379
- return [NSNumber numberWithInteger:generalError];
380
- break;
381
- }
382
- }
383
-
384
- @end