hypertrack-sdk-react-native 13.2.3 → 13.3.1

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 (53) hide show
  1. package/android/.gradle/7.2/dependencies-accessors/dependencies-accessors.lock +0 -0
  2. package/android/.gradle/7.2/dependencies-accessors/gc.properties +0 -0
  3. package/android/.gradle/7.2/fileChanges/last-build.bin +0 -0
  4. package/android/.gradle/7.2/fileHashes/fileHashes.lock +0 -0
  5. package/android/.gradle/7.2/gc.properties +0 -0
  6. package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
  7. package/android/.gradle/buildOutputCleanup/cache.properties +2 -0
  8. package/android/.gradle/checksums/checksums.lock +0 -0
  9. package/android/.gradle/vcs-1/gc.properties +0 -0
  10. package/android/.idea/gradle.xml +15 -0
  11. package/android/.idea/misc.xml +9 -0
  12. package/android/.idea/vcs.xml +6 -0
  13. package/android/gradle.properties +1 -1
  14. package/android/local.properties +8 -0
  15. package/android/src/main/java/com/reactnativehypertracksdk/HyperTrackReactNativePlugin.kt +16 -8
  16. package/android/src/main/java/com/reactnativehypertracksdk/ReactNativeSerialization.kt +2 -2
  17. package/android/src/main/java/com/reactnativehypertracksdk/common/GeotagData.kt +4 -1
  18. package/android/src/main/java/com/reactnativehypertracksdk/common/HyperTrackSdkWrapper.kt +41 -21
  19. package/android/src/main/java/com/reactnativehypertracksdk/common/Serialization.kt +156 -112
  20. package/android/src/main/java/com/reactnativehypertracksdk/common/WrapperResult.kt +3 -4
  21. package/hypertrack-sdk-react-native.podspec +1 -1
  22. package/ios/common/GeotagData.swift +10 -1
  23. package/ios/common/HyperTrackSDKWrapper.swift +33 -4
  24. package/ios/common/Serialization.swift +71 -2
  25. package/lib/commonjs/HyperTrack/HyperTrack.js +67 -6
  26. package/lib/commonjs/HyperTrack/HyperTrack.js.map +1 -1
  27. package/lib/commonjs/HyperTrack/data_types/OrderStatus.js +2 -0
  28. package/lib/commonjs/HyperTrack/data_types/OrderStatus.js.map +1 -0
  29. package/lib/commonjs/HyperTrack/data_types/internal/GeotagData.js.map +1 -1
  30. package/lib/commonjs/HyperTrack/data_types/internal/OrderHandle.js +2 -0
  31. package/lib/commonjs/HyperTrack/data_types/internal/OrderHandle.js.map +1 -0
  32. package/lib/commonjs/index.js +7 -0
  33. package/lib/commonjs/index.js.map +1 -1
  34. package/lib/module/HyperTrack/HyperTrack.js +67 -6
  35. package/lib/module/HyperTrack/HyperTrack.js.map +1 -1
  36. package/lib/module/HyperTrack/data_types/OrderStatus.js +2 -0
  37. package/lib/module/HyperTrack/data_types/OrderStatus.js.map +1 -0
  38. package/lib/module/HyperTrack/data_types/internal/GeotagData.js.map +1 -1
  39. package/lib/module/HyperTrack/data_types/internal/OrderHandle.js +2 -0
  40. package/lib/module/HyperTrack/data_types/internal/OrderHandle.js.map +1 -0
  41. package/lib/module/index.js +1 -0
  42. package/lib/module/index.js.map +1 -1
  43. package/lib/typescript/HyperTrack/HyperTrack.d.ts +24 -0
  44. package/lib/typescript/HyperTrack/data_types/OrderStatus.d.ts +8 -0
  45. package/lib/typescript/HyperTrack/data_types/internal/GeotagData.d.ts +4 -0
  46. package/lib/typescript/HyperTrack/data_types/internal/OrderHandle.d.ts +4 -0
  47. package/lib/typescript/index.d.ts +1 -0
  48. package/package.json +1 -1
  49. package/src/HyperTrack/HyperTrack.ts +102 -6
  50. package/src/HyperTrack/data_types/OrderStatus.ts +11 -0
  51. package/src/HyperTrack/data_types/internal/GeotagData.ts +4 -0
  52. package/src/HyperTrack/data_types/internal/OrderHandle.ts +4 -0
  53. package/src/index.tsx +1 -0
@@ -9,7 +9,6 @@ import com.hypertrack.sdk.android.Result
9
9
  * to Map<String, T> or List<T> where T is any JSON-compatible type
10
10
  */
11
11
  internal object Serialization {
12
-
13
12
  fun deserializeDynamicPublishableKey(args: Serialized): WrapperResult<String> {
14
13
  return parse(args) {
15
14
  it.assertValue<String>(key = KEY_TYPE, value = TYPE_DYNAMIC_PUBLISHABLE_KEY)
@@ -19,6 +18,39 @@ internal object Serialization {
19
18
  }
20
19
  }
21
20
 
21
+ fun deserializeGeotagData(map: Map<String, Any?>): WrapperResult<GeotagData> {
22
+ return parse(map) {
23
+ val data =
24
+ it
25
+ .get<Map<String, Any?>>(KEY_GEOTAG_DATA)
26
+ .getOrThrow()
27
+ val expectedLocationData =
28
+ it
29
+ .getOptional<Map<String, Any?>>(KEY_GEOTAG_EXPECTED_LOCATION)
30
+ .getOrThrow()
31
+ val expectedLocation =
32
+ expectedLocationData?.let {
33
+ deserializeLocation(it).getOrThrow()
34
+ }
35
+ val orderHandleData =
36
+ it
37
+ .getOptional<Map<String, Any?>>(KEY_GEOTAG_ORDER_HANDLE)
38
+ .getOrThrow()
39
+ val orderHandle = orderHandleData?.let { deserializeOrderHandle(it).getOrThrow() }
40
+ val orderStatusData =
41
+ it
42
+ .getOptional<Map<String, Any?>>(KEY_GEOTAG_ORDER_STATUS)
43
+ .getOrThrow()
44
+ val orderStatus = orderStatusData?.let { deserializeOrderStatus(it).getOrThrow() }
45
+ GeotagData(
46
+ data = data,
47
+ expectedLocation = expectedLocation,
48
+ orderHandle = orderHandle,
49
+ orderStatus = orderStatus,
50
+ )
51
+ }
52
+ }
53
+
22
54
  fun deserializeIsAvailable(isAvailable: Map<String, Any?>): WrapperResult<Boolean> {
23
55
  return parse(isAvailable) {
24
56
  it.assertValue<String>(key = KEY_TYPE, value = TYPE_IS_AVAILABLE)
@@ -55,49 +87,37 @@ internal object Serialization {
55
87
  }
56
88
  }
57
89
 
58
- fun deserializeGeotagData(map: Map<String, Any?>): WrapperResult<GeotagData> {
59
- return parse(map) {
60
- val data = it
61
- .get<Map<String, Any?>>(KEY_GEOTAG_DATA)
62
- .getOrThrow()
63
- val locationData = it
64
- .getOptional<Map<String, Any?>>(KEY_GEOTAG_EXPECTED_LOCATION)
65
- .getOrThrow()
66
- val location = locationData?.let { deserializeLocation(it).getOrThrow() }
67
- GeotagData(data, location)
68
- }
69
- }
70
-
71
90
  fun serializeDeviceId(deviceId: String): Map<String, Any?> {
72
91
  return mapOf(
73
92
  KEY_TYPE to TYPE_DEVICE_ID,
74
- KEY_VALUE to deviceId
93
+ KEY_VALUE to deviceId,
75
94
  )
76
95
  }
77
96
 
78
97
  fun serializeDynamicPublishableKey(publishableKey: String): Serialized {
79
98
  return mapOf(
80
99
  KEY_TYPE to TYPE_DYNAMIC_PUBLISHABLE_KEY,
81
- KEY_VALUE to publishableKey
100
+ KEY_VALUE to publishableKey,
82
101
  )
83
102
  }
84
103
 
85
104
  fun serializeError(error: HyperTrack.Error): Map<String, String> {
86
105
  return mapOf(
87
106
  KEY_TYPE to TYPE_ERROR,
88
- KEY_VALUE to when (error) {
89
- HyperTrack.Error.BlockedFromRunning -> "blockedFromRunning"
90
- HyperTrack.Error.InvalidPublishableKey -> "invalidPublishableKey"
91
- HyperTrack.Error.Location.Mocked -> "location.mocked"
92
- HyperTrack.Error.Location.ServicesDisabled -> "location.servicesDisabled"
93
- HyperTrack.Error.Location.ServicesUnavailable -> "location.servicesUnavailable"
94
- HyperTrack.Error.Location.SignalLost -> "location.signalLost"
95
- HyperTrack.Error.NoExemptionFromBackgroundStartRestrictions -> "noExemptionFromBackgroundStartRestrictions"
96
- HyperTrack.Error.Permissions.Location.Denied -> "permissions.location.denied"
97
- HyperTrack.Error.Permissions.Location.InsufficientForBackground -> "permissions.location.insufficientForBackground"
98
- HyperTrack.Error.Permissions.Location.ReducedAccuracy -> "permissions.location.reducedAccuracy"
99
- HyperTrack.Error.Permissions.Notifications.Denied -> "permissions.notifications.denied"
100
- }
107
+ KEY_VALUE to
108
+ when (error) {
109
+ HyperTrack.Error.BlockedFromRunning -> "blockedFromRunning"
110
+ HyperTrack.Error.InvalidPublishableKey -> "invalidPublishableKey"
111
+ HyperTrack.Error.Location.Mocked -> "location.mocked"
112
+ HyperTrack.Error.Location.ServicesDisabled -> "location.servicesDisabled"
113
+ HyperTrack.Error.Location.ServicesUnavailable -> "location.servicesUnavailable"
114
+ HyperTrack.Error.Location.SignalLost -> "location.signalLost"
115
+ HyperTrack.Error.NoExemptionFromBackgroundStartRestrictions -> "noExemptionFromBackgroundStartRestrictions"
116
+ HyperTrack.Error.Permissions.Location.Denied -> "permissions.location.denied"
117
+ HyperTrack.Error.Permissions.Location.InsufficientForBackground -> "permissions.location.insufficientForBackground"
118
+ HyperTrack.Error.Permissions.Location.ReducedAccuracy -> "permissions.location.reducedAccuracy"
119
+ HyperTrack.Error.Permissions.Notifications.Denied -> "permissions.notifications.denied"
120
+ },
101
121
  )
102
122
  }
103
123
 
@@ -110,34 +130,18 @@ internal object Serialization {
110
130
  fun serializeIsAvailable(isAvailable: Boolean): Map<String, Any?> {
111
131
  return mapOf(
112
132
  KEY_TYPE to TYPE_IS_AVAILABLE,
113
- KEY_VALUE to isAvailable
133
+ KEY_VALUE to isAvailable,
114
134
  )
115
135
  }
116
136
 
117
137
  fun serializeIsTracking(isTracking: Boolean): Map<String, Any?> {
118
138
  return mapOf(
119
139
  KEY_TYPE to TYPE_IS_TRACKING,
120
- KEY_VALUE to isTracking
140
+ KEY_VALUE to isTracking,
121
141
  )
122
142
  }
123
143
 
124
- fun serializeMetadata(metadata: Map<String, Any?>): Map<String, Any?> {
125
- return mapOf(
126
- KEY_TYPE to TYPE_METADATA,
127
- KEY_VALUE to metadata
128
- )
129
- }
130
-
131
- fun serializeName(name: String): Map<String, Any?> {
132
- return mapOf(
133
- KEY_TYPE to TYPE_NAME,
134
- KEY_VALUE to name
135
- )
136
- }
137
-
138
- fun serializeLocateResult(
139
- locationResult: Result<HyperTrack.Location, Set<HyperTrack.Error>>
140
- ): Map<String, Any?> {
144
+ fun serializeLocateResult(locationResult: Result<HyperTrack.Location, Set<HyperTrack.Error>>): Map<String, Any?> {
141
145
  return when (locationResult) {
142
146
  is Result.Failure -> {
143
147
  serializeFailure(serializeErrors(locationResult.failure))
@@ -149,9 +153,7 @@ internal object Serialization {
149
153
  }
150
154
  }
151
155
 
152
- fun serializeLocationResult(
153
- locationResult: Result<HyperTrack.Location, HyperTrack.LocationError>
154
- ): Map<String, Any?> {
156
+ fun serializeLocationResult(locationResult: Result<HyperTrack.Location, HyperTrack.LocationError>): Map<String, Any?> {
155
157
  return when (locationResult) {
156
158
  is Result.Failure -> {
157
159
  serializeLocationErrorFailure(locationResult.failure)
@@ -171,41 +173,55 @@ internal object Serialization {
171
173
  return serializeSuccess(serializeLocation(location))
172
174
  }
173
175
 
174
- fun serializeLocationWithDeviationSuccess(
175
- locationWithDeviation: HyperTrack.LocationWithDeviation,
176
- ): Map<String, Any?> {
176
+ fun serializeLocationWithDeviationSuccess(locationWithDeviation: HyperTrack.LocationWithDeviation): Map<String, Any?> {
177
177
  return serializeSuccess(
178
178
  serializeLocationWithDeviation(
179
- locationWithDeviation
180
- )
179
+ locationWithDeviation,
180
+ ),
181
181
  )
182
182
  }
183
183
 
184
- private fun serializeLocationWithDeviation(
185
- locationWithDeviation: HyperTrack.LocationWithDeviation,
186
- ): Map<String, Any?> {
184
+ fun serializeLocation(location: HyperTrack.Location): Map<String, Any?> {
187
185
  return mapOf(
188
- KEY_TYPE to TYPE_LOCATION_WITH_DEVIATION,
189
- KEY_VALUE to mapOf(
190
- KEY_LOCATION to serializeLocation(locationWithDeviation.location),
191
- KEY_DEVIATION to locationWithDeviation.deviation
192
- )
186
+ KEY_TYPE to TYPE_LOCATION,
187
+ KEY_VALUE to
188
+ mapOf(
189
+ KEY_LATITUDE to location.latitude,
190
+ KEY_LONGITUDE to location.longitude,
191
+ ),
192
+ )
193
+ }
194
+
195
+ fun serializeMetadata(metadata: Map<String, Any?>): Map<String, Any?> {
196
+ return mapOf(
197
+ KEY_TYPE to TYPE_METADATA,
198
+ KEY_VALUE to metadata,
199
+ )
200
+ }
201
+
202
+ fun serializeName(name: String): Map<String, Any?> {
203
+ return mapOf(
204
+ KEY_TYPE to TYPE_NAME,
205
+ KEY_VALUE to name,
193
206
  )
194
207
  }
195
208
 
196
209
  private fun deserializeLocation(map: Map<String, Any?>): WrapperResult<Location> {
197
210
  return parse(map) {
198
211
  it.assertValue<String>(key = KEY_TYPE, value = TYPE_LOCATION)
199
- val value = it
200
- .get<Map<String, Any?>>(KEY_VALUE)
201
- .getOrThrow()
202
- parse(value) { parser ->
203
- val latitude = parser
204
- .get<Double>(KEY_LATITUDE)
205
- .getOrThrow()
206
- val longitude = parser
207
- .get<Double>(KEY_LONGITUDE)
212
+ val value =
213
+ it
214
+ .get<Map<String, Any?>>(KEY_VALUE)
208
215
  .getOrThrow()
216
+ parse(value) { parser ->
217
+ val latitude =
218
+ parser
219
+ .get<Double>(KEY_LATITUDE)
220
+ .getOrThrow()
221
+ val longitude =
222
+ parser
223
+ .get<Double>(KEY_LONGITUDE)
224
+ .getOrThrow()
209
225
  Location("api").also {
210
226
  it.latitude = latitude
211
227
  it.longitude = longitude
@@ -214,38 +230,62 @@ internal object Serialization {
214
230
  }
215
231
  }
216
232
 
233
+ private fun deserializeOrderHandle(map: Map<String, Any?>): WrapperResult<String> {
234
+ return parse(map) {
235
+ it.assertValue<String>(key = KEY_TYPE, value = TYPE_ORDER_HANDLE)
236
+ it
237
+ .get<String>(KEY_VALUE)
238
+ .getOrThrow()
239
+ }
240
+ }
241
+
242
+ private fun deserializeOrderStatus(map: Map<String, Any?>): WrapperResult<HyperTrack.OrderStatus> {
243
+ return parse(map) {
244
+ when (it.get<String>(KEY_TYPE).getOrThrow()) {
245
+ TYPE_GEOTAG_ORDER_STATUS_CLOCK_IN -> HyperTrack.OrderStatus.ClockIn
246
+ TYPE_GEOTAG_ORDER_STATUS_CLOCK_OUT -> HyperTrack.OrderStatus.ClockOut
247
+ TYPE_GEOTAG_ORDER_STATUS_CUSTOM ->
248
+ HyperTrack.OrderStatus.Custom(
249
+ it.get<String>(KEY_VALUE).getOrThrow(),
250
+ )
251
+
252
+ else -> throw Error("Unknown order status: $map")
253
+ }
254
+ }
255
+ }
256
+
257
+ private fun serializeLocationWithDeviation(locationWithDeviation: HyperTrack.LocationWithDeviation): Map<String, Any?> {
258
+ return mapOf(
259
+ KEY_TYPE to TYPE_LOCATION_WITH_DEVIATION,
260
+ KEY_VALUE to
261
+ mapOf(
262
+ KEY_LOCATION to serializeLocation(locationWithDeviation.location),
263
+ KEY_DEVIATION to locationWithDeviation.deviation,
264
+ ),
265
+ )
266
+ }
267
+
217
268
  private fun serializeFailure(failure: List<Map<String, Any?>>): Map<String, Any?> {
218
269
  return mapOf(
219
270
  KEY_TYPE to TYPE_RESULT_FAILURE,
220
- KEY_VALUE to failure
271
+ KEY_VALUE to failure,
221
272
  )
222
273
  }
223
274
 
224
275
  private fun serializeFailure(failure: Map<String, Any?>): Map<String, Any?> {
225
276
  return mapOf(
226
277
  KEY_TYPE to TYPE_RESULT_FAILURE,
227
- KEY_VALUE to failure
278
+ KEY_VALUE to failure,
228
279
  )
229
280
  }
230
281
 
231
282
  private fun serializeSuccess(success: Map<String, Any?>): Map<String, Any?> {
232
283
  return mapOf(
233
284
  KEY_TYPE to TYPE_RESULT_SUCCESS,
234
- KEY_VALUE to success
285
+ KEY_VALUE to success,
235
286
  )
236
287
  }
237
288
 
238
- fun serializeLocation(location: HyperTrack.Location): Map<String, Any?> {
239
- return mapOf(
240
- KEY_TYPE to TYPE_LOCATION,
241
- KEY_VALUE to mapOf(
242
- KEY_LATITUDE to location.latitude,
243
- KEY_LONGITUDE to location.longitude
244
- )
245
- )
246
- }
247
-
248
-
249
289
  private fun serializeLocationError(locationError: HyperTrack.LocationError): Map<String, Any?> {
250
290
  return when (locationError) {
251
291
  HyperTrack.LocationError.NotRunning -> {
@@ -259,8 +299,9 @@ internal object Serialization {
259
299
  is HyperTrack.LocationError.Errors -> {
260
300
  mapOf(
261
301
  KEY_TYPE to TYPE_LOCATION_ERROR_ERRORS,
262
- KEY_VALUE to locationError.errors
263
- .map { serializeError(it) }
302
+ KEY_VALUE to
303
+ locationError.errors
304
+ .map { serializeError(it) },
264
305
  )
265
306
  }
266
307
  }
@@ -268,7 +309,7 @@ internal object Serialization {
268
309
 
269
310
  fun <T> parse(
270
311
  source: Map<String, Any?>,
271
- parseFunction: (Parser) -> T
312
+ parseFunction: (Parser) -> T,
272
313
  ): WrapperResult<T> {
273
314
  val parser = Parser(source)
274
315
  return try {
@@ -283,20 +324,18 @@ internal object Serialization {
283
324
  ParsingExceptions(source, parser.exceptions + e)
284
325
  } else {
285
326
  e
286
- }
327
+ },
287
328
  )
288
329
  }
289
330
  }
290
331
 
291
332
  internal class Parser(
292
- private val source: Map<String, Any?>
333
+ private val source: Map<String, Any?>,
293
334
  ) {
294
335
  private val _exceptions = mutableListOf<Exception>()
295
336
  val exceptions: List<Exception> = _exceptions
296
337
 
297
- inline fun <reified T> get(
298
- key: String
299
- ): WrapperResult<T> {
338
+ inline fun <reified T> get(key: String): WrapperResult<T> {
300
339
  return try {
301
340
  Success(source[key]!! as T)
302
341
  } catch (e: Exception) {
@@ -304,14 +343,12 @@ internal object Serialization {
304
343
  ParsingException(key, e)
305
344
  .also {
306
345
  _exceptions.add(it)
307
- }
346
+ },
308
347
  )
309
348
  }
310
349
  }
311
350
 
312
- inline fun <reified T> getOptional(
313
- key: String
314
- ): WrapperResult<T?> {
351
+ inline fun <reified T> getOptional(key: String): WrapperResult<T?> {
315
352
  return try {
316
353
  Success(source[key] as T?)
317
354
  } catch (e: Exception) {
@@ -319,14 +356,14 @@ internal object Serialization {
319
356
  ParsingException(key, e)
320
357
  .also {
321
358
  _exceptions.add(it)
322
- }
359
+ },
323
360
  )
324
361
  }
325
362
  }
326
363
 
327
364
  inline fun <reified T> assertValue(
328
365
  key: String,
329
- value: Any
366
+ value: Any,
330
367
  ) {
331
368
  if (source[key] != value) {
332
369
  _exceptions.add(Exception("Assertion failed: $key != $value"))
@@ -336,17 +373,17 @@ internal object Serialization {
336
373
 
337
374
  internal data class ParsingExceptions(
338
375
  val source: Any,
339
- val exceptions: List<Exception>
376
+ val exceptions: List<Exception>,
340
377
  ) : Throwable(
341
- exceptions.joinToString("\n")
342
- .let {
343
- "Invalid input:\n\n${source}\n\n$it"
344
- }
345
- )
378
+ exceptions.joinToString("\n")
379
+ .let {
380
+ "Invalid input:\n\n${source}\n\n$it"
381
+ },
382
+ )
346
383
 
347
384
  internal class ParsingException(
348
385
  key: String,
349
- exception: Exception
386
+ exception: Exception,
350
387
  ) : Exception("Invalid value for '$key': $exception", exception)
351
388
 
352
389
  private const val KEY_TYPE = "type"
@@ -369,11 +406,18 @@ internal object Serialization {
369
406
  private const val TYPE_LOCATION_ERROR_NOT_RUNNING = "notRunning"
370
407
  private const val TYPE_LOCATION_ERROR_STARTING = "starting"
371
408
 
409
+ private const val TYPE_ORDER_HANDLE = "orderHandle"
410
+ private const val TYPE_GEOTAG_ORDER_STATUS_CLOCK_IN = "orderStatusClockIn"
411
+ private const val TYPE_GEOTAG_ORDER_STATUS_CLOCK_OUT = "orderStatusClockOut"
412
+ private const val TYPE_GEOTAG_ORDER_STATUS_CUSTOM = "orderStatusCustom"
413
+
372
414
  private const val KEY_LATITUDE = "latitude"
373
415
  private const val KEY_LONGITUDE = "longitude"
374
416
 
375
- const val KEY_DEVIATION = "deviation"
376
- const val KEY_GEOTAG_DATA = "data"
377
- const val KEY_GEOTAG_EXPECTED_LOCATION = "expectedLocation"
378
- const val KEY_LOCATION = "location"
417
+ private const val KEY_DEVIATION = "deviation"
418
+ private const val KEY_GEOTAG_DATA = "data"
419
+ private const val KEY_GEOTAG_EXPECTED_LOCATION = "expectedLocation"
420
+ private const val KEY_GEOTAG_ORDER_HANDLE = "orderHandle"
421
+ private const val KEY_GEOTAG_ORDER_STATUS = "orderStatus"
422
+ private const val KEY_LOCATION = "location"
379
423
  }
@@ -1,9 +1,7 @@
1
1
  package com.reactnativehypertracksdk.common
2
2
 
3
3
  internal sealed class WrapperResult<SuccessType> {
4
- fun <MappedSuccess> flatMapSuccess(
5
- onSuccess: (SuccessType) -> WrapperResult<MappedSuccess>
6
- ): WrapperResult<MappedSuccess> {
4
+ fun <MappedSuccess> flatMapSuccess(onSuccess: (SuccessType) -> WrapperResult<MappedSuccess>): WrapperResult<MappedSuccess> {
7
5
  return when (this) {
8
6
  is Success -> {
9
7
  onSuccess.invoke(this.success)
@@ -32,7 +30,7 @@ internal sealed class WrapperResult<SuccessType> {
32
30
  is Success -> this.success
33
31
  is Failure -> throw Exception(
34
32
  "Result unwrapping failed: ${this.failure}",
35
- this.failure
33
+ this.failure,
36
34
  )
37
35
  }
38
36
  }
@@ -49,4 +47,5 @@ internal sealed class WrapperResult<SuccessType> {
49
47
  }
50
48
 
51
49
  internal data class Success<SuccessType>(val success: SuccessType) : WrapperResult<SuccessType>()
50
+
52
51
  internal data class Failure<SuccessType>(val failure: Throwable) : WrapperResult<SuccessType>()
@@ -18,7 +18,7 @@ Pod::Spec.new do |s|
18
18
  s.source_files = "ios/**/*.{h,m,mm,swift}"
19
19
 
20
20
  s.dependency "React-Core"
21
- s.dependency 'HyperTrack', '5.4.1'
21
+ s.dependency 'HyperTrack', '5.5.2'
22
22
 
23
23
  # Don't install the dependencies when we run `pod install` in the old architecture.
24
24
  if ENV['RCT_NEW_ARCH_ENABLED'] == '1' then
@@ -3,9 +3,18 @@ import HyperTrack
3
3
  struct GeotagData {
4
4
  let data: [String: Any]
5
5
  let expectedLocation: HyperTrack.Location?
6
+ let orderHandle: String?
7
+ let orderStatus: HyperTrack.OrderStatus?
6
8
 
7
- init(data: [String: Any], expectedLocation: HyperTrack.Location?) {
9
+ init(
10
+ data: [String: Any],
11
+ expectedLocation: HyperTrack.Location?,
12
+ orderHandle: String?,
13
+ orderStatus: HyperTrack.OrderStatus?
14
+ ) {
8
15
  self.data = data
9
16
  self.expectedLocation = expectedLocation
17
+ self.orderHandle = orderHandle
18
+ self.orderStatus = orderStatus
10
19
  }
11
20
  }
@@ -14,12 +14,41 @@ enum FailureResult: Error {
14
14
  func addGeotag(_ args: [String: Any]) -> Result<SuccessResult, FailureResult> {
15
15
  return deserializeGeotagData(args).flatMap { geotagData in
16
16
  if let metadata: HyperTrack.JSON.Object = toJSON(geotagData.data) {
17
+ let expectedLocation = geotagData.expectedLocation
18
+ let orderHandle = geotagData.orderHandle
19
+ let orderStatus = geotagData.orderStatus
20
+
17
21
  if let expectedLocation = geotagData.expectedLocation {
18
- let result = HyperTrack.addGeotag(metadata, expectedLocation: expectedLocation)
19
- return .success(.dict(serializeLocationWithDeviationResult(result)))
22
+ if orderHandle != nil || orderStatus != nil {
23
+ if orderHandle == nil || orderStatus == nil {
24
+ return .failure(.error("orderHandle and orderStatus must be provided"))
25
+ }
26
+ let result = HyperTrack.addGeotag(
27
+ orderHandle: orderHandle!,
28
+ orderStatus: orderStatus!,
29
+ metadata: metadata,
30
+ expectedLocation: expectedLocation
31
+ )
32
+ return .success(.dict(serializeLocationWithDeviationResult(result)))
33
+ } else {
34
+ let result = HyperTrack.addGeotag(metadata, expectedLocation: expectedLocation)
35
+ return .success(.dict(serializeLocationWithDeviationResult(result)))
36
+ }
20
37
  } else {
21
- let result = HyperTrack.addGeotag(metadata)
22
- return .success(.dict(serializeLocationResult(result)))
38
+ if orderHandle != nil || orderStatus != nil {
39
+ if orderHandle == nil || orderStatus == nil {
40
+ return .failure(.error("orderHandle and orderStatus must be provided"))
41
+ }
42
+ let result = HyperTrack.addGeotag(
43
+ orderHandle: orderHandle!,
44
+ orderStatus: orderStatus!,
45
+ metadata: metadata
46
+ )
47
+ return .success(.dict(serializeLocationResult(result)))
48
+ } else {
49
+ let result = HyperTrack.addGeotag(metadata)
50
+ return .success(.dict(serializeLocationResult(result)))
51
+ }
23
52
  }
24
53
  } else {
25
54
  return .failure(.error("Failed to deserialize geotag metadata"))
@@ -32,16 +32,56 @@ func deserializeGeotagData(
32
32
  guard let data = args[keyGeotagData] as? [String: Any] else {
33
33
  return .failure(.fatalError(getParseError(args, key: keyGeotagData)))
34
34
  }
35
+ let orderHandleData = args["orderHandle"] as? [String: Any]
36
+ let orderHandleResult: Result<String, FailureResult>? = if let orderHandleData = orderHandleData {
37
+ deserializeOrderHandle(orderHandleData)
38
+ } else {
39
+ nil
40
+ }
41
+ if case let .failure(failure) = orderHandleResult {
42
+ return .failure(failure)
43
+ }
44
+ let orderHandle: String? = if case let .success(orderHandle) = orderHandleResult {
45
+ orderHandle
46
+ } else {
47
+ nil
48
+ }
49
+
50
+ let orderStatusData = args["orderStatus"] as? [String: Any]
51
+ let orderStatusResult: Result<HyperTrack.OrderStatus, FailureResult>? = if let orderStatusData = orderStatusData {
52
+ deserializeOrderStatus(orderStatusData)
53
+ } else {
54
+ nil
55
+ }
56
+ if case let .failure(failure) = orderStatusResult {
57
+ return .failure(failure)
58
+ }
59
+ let orderStatus: HyperTrack.OrderStatus? = if case let .success(orderStatus) = orderStatusResult {
60
+ orderStatus
61
+ } else {
62
+ nil
63
+ }
64
+
35
65
  if let expectedLocationData = args[keyExpectedLocation] as? [String: Any] {
36
66
  let expectedLocation = deserializeLocation(expectedLocationData)
37
67
  switch expectedLocation {
38
68
  case let .failure(failure):
39
69
  return .failure(failure)
40
70
  case let .success(expectedLocation):
41
- return .success(.init(data: data, expectedLocation: expectedLocation))
71
+ return .success(.init(
72
+ data: data,
73
+ expectedLocation: expectedLocation,
74
+ orderHandle: orderHandle,
75
+ orderStatus: orderStatus
76
+ ))
42
77
  }
43
78
  } else {
44
- return .success(.init(data: data, expectedLocation: nil))
79
+ return .success(.init(
80
+ data: data,
81
+ expectedLocation: nil,
82
+ orderHandle: orderHandle,
83
+ orderStatus: orderStatus
84
+ ))
45
85
  }
46
86
  }
47
87
 
@@ -101,6 +141,35 @@ func deserializeName(_ data: [String: Any]) -> Result<String, FailureResult> {
101
141
  return .success(value)
102
142
  }
103
143
 
144
+ func deserializeOrderHandle(_ data: [String: Any]) -> Result<String, FailureResult> {
145
+ if data[keyType] as? String != "orderHandle" {
146
+ return .failure(.fatalError(getParseError(data, key: keyType)))
147
+ }
148
+ guard let value = data[keyValue] as? String else {
149
+ return .failure(.fatalError(getParseError(data, key: keyValue)))
150
+ }
151
+ return .success(value)
152
+ }
153
+
154
+ func deserializeOrderStatus(_ data: [String: Any]) -> Result<HyperTrack.OrderStatus, FailureResult> {
155
+ guard let type = data[keyType] as? String else {
156
+ return .failure(.fatalError(getParseError(data, key: keyType)))
157
+ }
158
+ switch type {
159
+ case "orderStatusClockIn":
160
+ return .success(.clockIn)
161
+ case "orderStatusClockOut":
162
+ return .success(.clockOut)
163
+ case "orderStatusCustom":
164
+ guard let value = data[keyValue] as? String else {
165
+ return .failure(.fatalError(getParseError(data, key: keyValue)))
166
+ }
167
+ return .success(.custom(value))
168
+ default:
169
+ return .failure(.fatalError(getParseError(data, key: keyType)))
170
+ }
171
+ }
172
+
104
173
  func serializeDeviceID(_ deviceID: String) -> [String: Any] {
105
174
  return [
106
175
  keyType: "deviceID",