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.
- package/android/.gradle/7.2/dependencies-accessors/dependencies-accessors.lock +0 -0
- package/android/.gradle/7.2/dependencies-accessors/gc.properties +0 -0
- package/android/.gradle/7.2/fileChanges/last-build.bin +0 -0
- package/android/.gradle/7.2/fileHashes/fileHashes.lock +0 -0
- package/android/.gradle/7.2/gc.properties +0 -0
- package/android/.gradle/buildOutputCleanup/buildOutputCleanup.lock +0 -0
- package/android/.gradle/buildOutputCleanup/cache.properties +2 -0
- package/android/.gradle/checksums/checksums.lock +0 -0
- package/android/.gradle/vcs-1/gc.properties +0 -0
- package/android/.idea/gradle.xml +15 -0
- package/android/.idea/misc.xml +9 -0
- package/android/.idea/vcs.xml +6 -0
- package/android/gradle.properties +1 -1
- package/android/local.properties +8 -0
- package/android/src/main/java/com/reactnativehypertracksdk/HyperTrackReactNativePlugin.kt +16 -8
- package/android/src/main/java/com/reactnativehypertracksdk/ReactNativeSerialization.kt +2 -2
- package/android/src/main/java/com/reactnativehypertracksdk/common/GeotagData.kt +4 -1
- package/android/src/main/java/com/reactnativehypertracksdk/common/HyperTrackSdkWrapper.kt +41 -21
- package/android/src/main/java/com/reactnativehypertracksdk/common/Serialization.kt +156 -112
- package/android/src/main/java/com/reactnativehypertracksdk/common/WrapperResult.kt +3 -4
- package/hypertrack-sdk-react-native.podspec +1 -1
- package/ios/common/GeotagData.swift +10 -1
- package/ios/common/HyperTrackSDKWrapper.swift +33 -4
- package/ios/common/Serialization.swift +71 -2
- package/lib/commonjs/HyperTrack/HyperTrack.js +67 -6
- package/lib/commonjs/HyperTrack/HyperTrack.js.map +1 -1
- package/lib/commonjs/HyperTrack/data_types/OrderStatus.js +2 -0
- package/lib/commonjs/HyperTrack/data_types/OrderStatus.js.map +1 -0
- package/lib/commonjs/HyperTrack/data_types/internal/GeotagData.js.map +1 -1
- package/lib/commonjs/HyperTrack/data_types/internal/OrderHandle.js +2 -0
- package/lib/commonjs/HyperTrack/data_types/internal/OrderHandle.js.map +1 -0
- package/lib/commonjs/index.js +7 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/module/HyperTrack/HyperTrack.js +67 -6
- package/lib/module/HyperTrack/HyperTrack.js.map +1 -1
- package/lib/module/HyperTrack/data_types/OrderStatus.js +2 -0
- package/lib/module/HyperTrack/data_types/OrderStatus.js.map +1 -0
- package/lib/module/HyperTrack/data_types/internal/GeotagData.js.map +1 -1
- package/lib/module/HyperTrack/data_types/internal/OrderHandle.js +2 -0
- package/lib/module/HyperTrack/data_types/internal/OrderHandle.js.map +1 -0
- package/lib/module/index.js +1 -0
- package/lib/module/index.js.map +1 -1
- package/lib/typescript/HyperTrack/HyperTrack.d.ts +24 -0
- package/lib/typescript/HyperTrack/data_types/OrderStatus.d.ts +8 -0
- package/lib/typescript/HyperTrack/data_types/internal/GeotagData.d.ts +4 -0
- package/lib/typescript/HyperTrack/data_types/internal/OrderHandle.d.ts +4 -0
- package/lib/typescript/index.d.ts +1 -0
- package/package.json +1 -1
- package/src/HyperTrack/HyperTrack.ts +102 -6
- package/src/HyperTrack/data_types/OrderStatus.ts +11 -0
- package/src/HyperTrack/data_types/internal/GeotagData.ts +4 -0
- package/src/HyperTrack/data_types/internal/OrderHandle.ts +4 -0
- 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
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
189
|
-
KEY_VALUE to
|
|
190
|
-
|
|
191
|
-
|
|
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 =
|
|
200
|
-
|
|
201
|
-
|
|
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
|
|
263
|
-
.
|
|
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
|
-
|
|
342
|
-
|
|
343
|
-
|
|
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
|
|
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.
|
|
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(
|
|
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
|
-
|
|
19
|
-
|
|
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
|
-
|
|
22
|
-
|
|
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(
|
|
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(
|
|
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",
|