hypertrack-sdk-react-native 7.19.1 → 8.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 (40) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/CONTRIBUTING.md +154 -0
  3. package/README.md +25 -16
  4. package/android/build.gradle +140 -41
  5. package/android/gradle/wrapper/gradle-wrapper.jar +0 -0
  6. package/android/gradle/wrapper/gradle-wrapper.properties +5 -0
  7. package/android/gradle.properties +6 -0
  8. package/android/gradlew +185 -0
  9. package/android/gradlew.bat +89 -0
  10. package/android/src/main/AndroidManifest.xml +2 -3
  11. package/android/src/main/java/com/reactnativehypertracksdk/HyperTrackModule.kt +284 -0
  12. package/android/src/main/java/com/reactnativehypertracksdk/HyperTrackSdkPackage.kt +17 -0
  13. package/hypertrack-sdk-react-native.podspec +34 -15
  14. package/ios/{RNHyperTrack/RNHyperTrack.h → HyperTrack.h} +1 -2
  15. package/ios/HyperTrack.m +384 -0
  16. package/ios/{RNHyperTrack.xcodeproj → HyperTrackSdk.xcodeproj}/project.pbxproj +70 -99
  17. package/lib/commonjs/HyperTrack/HyperTrack.js +244 -0
  18. package/lib/commonjs/HyperTrack/HyperTrack.js.map +1 -0
  19. package/lib/commonjs/index.js +52 -0
  20. package/lib/commonjs/index.js.map +1 -0
  21. package/lib/module/HyperTrack/HyperTrack.js +230 -0
  22. package/lib/module/HyperTrack/HyperTrack.js.map +1 -0
  23. package/lib/module/index.js +5 -0
  24. package/lib/module/index.js.map +1 -0
  25. package/lib/typescript/HyperTrack/HyperTrack.d.ts +161 -0
  26. package/lib/typescript/index.d.ts +4 -0
  27. package/package.json +145 -47
  28. package/src/HyperTrack/HyperTrack.ts +273 -0
  29. package/src/index.tsx +11 -0
  30. package/android/src/main/java/com/hypertrack/reactnative/androidsdk/HTSDKModule.java +0 -301
  31. package/android/src/main/java/com/hypertrack/reactnative/androidsdk/HTSDKPackage.java +0 -29
  32. package/ios/RNHyperTrack/RNHyperTrack.m +0 -312
  33. package/ios/RNHyperTrack.xcodeproj/project.xcworkspace/contents.xcworkspacedata +0 -7
  34. package/ios/RNHyperTrack.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +0 -8
  35. package/ios/RNHyperTrack.xcodeproj/project.xcworkspace/xcuserdata/tulushev.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  36. package/ios/RNHyperTrack.xcodeproj/xcuserdata/tulushev.xcuserdatad/xcschemes/xcschememanagement.plist +0 -14
  37. package/js/CriticalErrors.js +0 -97
  38. package/js/EventEmitter.js +0 -11
  39. package/js/HyperTrack.js +0 -130
  40. package/js/index.js +0 -13
@@ -0,0 +1,384 @@
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