@os1-platform/dispatch-mobile 2.1.8 → 2.1.10

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 (131) hide show
  1. package/lib/commonjs/analytics/sentry/SentryAnalyticsSingleton.js +0 -2
  2. package/lib/commonjs/analytics/sentry/SentryAnalyticsSingleton.js.map +1 -1
  3. package/lib/commonjs/analytics/sentry/SentryAnalyticsUtils.js +0 -6
  4. package/lib/commonjs/analytics/sentry/SentryAnalyticsUtils.js.map +1 -1
  5. package/lib/commonjs/analytics/sentry/SentrySdkConstants.js +2 -0
  6. package/lib/commonjs/analytics/sentry/SentrySdkConstants.js.map +1 -1
  7. package/lib/commonjs/components/executiontasks/imageCapture/ImageCapture.js +1 -1
  8. package/lib/commonjs/components/executiontasks/imageCapture/ImageCapture.js.map +1 -1
  9. package/lib/commonjs/index.js.map +1 -1
  10. package/lib/commonjs/manager/sdk/DispatchSDKManager.js +5 -4
  11. package/lib/commonjs/manager/sdk/DispatchSDKManager.js.map +1 -1
  12. package/lib/commonjs/manager/sdk/callbacksHandler.js +28 -1
  13. package/lib/commonjs/manager/sdk/callbacksHandler.js.map +1 -1
  14. package/lib/commonjs/manager/syncmanager/AppSyncManager.js +7 -5
  15. package/lib/commonjs/manager/syncmanager/AppSyncManager.js.map +1 -1
  16. package/lib/commonjs/manager/syncmanager/DBConfig.js +3 -1
  17. package/lib/commonjs/manager/syncmanager/DBConfig.js.map +1 -1
  18. package/lib/commonjs/manager/syncmanager/constants.js +4 -1
  19. package/lib/commonjs/manager/syncmanager/constants.js.map +1 -1
  20. package/lib/commonjs/manager/syncmanager/document/DocumentHttpClient.js +37 -20
  21. package/lib/commonjs/manager/syncmanager/document/DocumentHttpClient.js.map +1 -1
  22. package/lib/commonjs/manager/syncmanager/document/DocumentManager.js +26 -4
  23. package/lib/commonjs/manager/syncmanager/document/DocumentManager.js.map +1 -1
  24. package/lib/commonjs/manager/syncmanager/document/DocumentSyncManager.js +276 -20
  25. package/lib/commonjs/manager/syncmanager/document/DocumentSyncManager.js.map +1 -1
  26. package/lib/commonjs/manager/syncmanager/events/ETEventsManager.js +41 -13
  27. package/lib/commonjs/manager/syncmanager/events/ETEventsManager.js.map +1 -1
  28. package/lib/commonjs/manager/syncmanager/events/EventsSyncManager.js +116 -59
  29. package/lib/commonjs/manager/syncmanager/events/EventsSyncManager.js.map +1 -1
  30. package/lib/commonjs/manager/syncmanager/events/SyncHttpClient.js +17 -0
  31. package/lib/commonjs/manager/syncmanager/events/SyncHttpClient.js.map +1 -1
  32. package/lib/commonjs/models/auth.js.map +1 -1
  33. package/lib/commonjs/models/sdk.js.map +1 -1
  34. package/lib/commonjs/network/NetworkClient.js +12 -2
  35. package/lib/commonjs/network/NetworkClient.js.map +1 -1
  36. package/lib/commonjs/network/NetworkUtils.js +14 -7
  37. package/lib/commonjs/network/NetworkUtils.js.map +1 -1
  38. package/lib/commonjs/network/client.js +1 -1
  39. package/lib/commonjs/network/client.js.map +1 -1
  40. package/lib/commonjs/ui/screens/DeliverScreen.js.map +1 -1
  41. package/lib/commonjs/ui/screens/FormsScreen.js.map +1 -1
  42. package/lib/commonjs/utils/SyncManagerUtils.js +29 -2
  43. package/lib/commonjs/utils/SyncManagerUtils.js.map +1 -1
  44. package/lib/commonjs/utils/storage.js +21 -5
  45. package/lib/commonjs/utils/storage.js.map +1 -1
  46. package/lib/commonjs/utils/utils.js +0 -9
  47. package/lib/commonjs/utils/utils.js.map +1 -1
  48. package/lib/module/analytics/sentry/SentryAnalyticsSingleton.js +0 -2
  49. package/lib/module/analytics/sentry/SentryAnalyticsSingleton.js.map +1 -1
  50. package/lib/module/analytics/sentry/SentryAnalyticsUtils.js +0 -6
  51. package/lib/module/analytics/sentry/SentryAnalyticsUtils.js.map +1 -1
  52. package/lib/module/analytics/sentry/SentrySdkConstants.js +2 -0
  53. package/lib/module/analytics/sentry/SentrySdkConstants.js.map +1 -1
  54. package/lib/module/components/executiontasks/imageCapture/ImageCapture.js +1 -1
  55. package/lib/module/components/executiontasks/imageCapture/ImageCapture.js.map +1 -1
  56. package/lib/module/index.js.map +1 -1
  57. package/lib/module/manager/sdk/DispatchSDKManager.js +5 -4
  58. package/lib/module/manager/sdk/DispatchSDKManager.js.map +1 -1
  59. package/lib/module/manager/sdk/callbacksHandler.js +27 -1
  60. package/lib/module/manager/sdk/callbacksHandler.js.map +1 -1
  61. package/lib/module/manager/syncmanager/AppSyncManager.js +7 -5
  62. package/lib/module/manager/syncmanager/AppSyncManager.js.map +1 -1
  63. package/lib/module/manager/syncmanager/DBConfig.js +3 -1
  64. package/lib/module/manager/syncmanager/DBConfig.js.map +1 -1
  65. package/lib/module/manager/syncmanager/constants.js +3 -0
  66. package/lib/module/manager/syncmanager/constants.js.map +1 -1
  67. package/lib/module/manager/syncmanager/document/DocumentHttpClient.js +38 -21
  68. package/lib/module/manager/syncmanager/document/DocumentHttpClient.js.map +1 -1
  69. package/lib/module/manager/syncmanager/document/DocumentManager.js +26 -4
  70. package/lib/module/manager/syncmanager/document/DocumentManager.js.map +1 -1
  71. package/lib/module/manager/syncmanager/document/DocumentSyncManager.js +276 -20
  72. package/lib/module/manager/syncmanager/document/DocumentSyncManager.js.map +1 -1
  73. package/lib/module/manager/syncmanager/events/ETEventsManager.js +42 -14
  74. package/lib/module/manager/syncmanager/events/ETEventsManager.js.map +1 -1
  75. package/lib/module/manager/syncmanager/events/EventsSyncManager.js +119 -61
  76. package/lib/module/manager/syncmanager/events/EventsSyncManager.js.map +1 -1
  77. package/lib/module/manager/syncmanager/events/SyncHttpClient.js +15 -0
  78. package/lib/module/manager/syncmanager/events/SyncHttpClient.js.map +1 -1
  79. package/lib/module/models/auth.js.map +1 -1
  80. package/lib/module/models/sdk.js.map +1 -1
  81. package/lib/module/network/NetworkClient.js +12 -2
  82. package/lib/module/network/NetworkClient.js.map +1 -1
  83. package/lib/module/network/NetworkUtils.js +14 -7
  84. package/lib/module/network/NetworkUtils.js.map +1 -1
  85. package/lib/module/network/client.js +1 -1
  86. package/lib/module/network/client.js.map +1 -1
  87. package/lib/module/ui/screens/DeliverScreen.js.map +1 -1
  88. package/lib/module/ui/screens/FormsScreen.js.map +1 -1
  89. package/lib/module/utils/SyncManagerUtils.js +30 -3
  90. package/lib/module/utils/SyncManagerUtils.js.map +1 -1
  91. package/lib/module/utils/storage.js +21 -5
  92. package/lib/module/utils/storage.js.map +1 -1
  93. package/lib/module/utils/utils.js +0 -9
  94. package/lib/module/utils/utils.js.map +1 -1
  95. package/lib/typescript/analytics/sentry/SentrySdkConstants.d.ts +2 -0
  96. package/lib/typescript/manager/sdk/callbacksHandler.d.ts +3 -1
  97. package/lib/typescript/manager/syncmanager/DBConfig.d.ts +4 -0
  98. package/lib/typescript/manager/syncmanager/constants.d.ts +3 -0
  99. package/lib/typescript/manager/syncmanager/document/DocumentManager.d.ts +2 -0
  100. package/lib/typescript/manager/syncmanager/document/DocumentSyncManager.d.ts +2 -1
  101. package/lib/typescript/manager/syncmanager/events/ETEventsManager.d.ts +2 -0
  102. package/lib/typescript/manager/syncmanager/events/EventsSyncManager.d.ts +1 -1
  103. package/lib/typescript/models/sdk.d.ts +1 -0
  104. package/lib/typescript/utils/storage.d.ts +3 -3
  105. package/package.json +5 -5
  106. package/src/analytics/sentry/SentryAnalyticsSingleton.ts +7 -9
  107. package/src/analytics/sentry/SentryAnalyticsUtils.ts +24 -36
  108. package/src/analytics/sentry/SentrySdkConstants.ts +2 -0
  109. package/src/components/executiontasks/imageCapture/ImageCapture.tsx +1 -3
  110. package/src/index.tsx +1 -1
  111. package/src/manager/sdk/DispatchSDKManager.ts +8 -3
  112. package/src/manager/sdk/callbacksHandler.ts +39 -2
  113. package/src/manager/syncmanager/AppSyncManager.ts +15 -13
  114. package/src/manager/syncmanager/DBConfig.ts +4 -0
  115. package/src/manager/syncmanager/constants.ts +3 -0
  116. package/src/manager/syncmanager/document/DocumentHttpClient.ts +54 -24
  117. package/src/manager/syncmanager/document/DocumentManager.ts +48 -7
  118. package/src/manager/syncmanager/document/DocumentSyncManager.ts +351 -30
  119. package/src/manager/syncmanager/events/ETEventsManager.ts +50 -16
  120. package/src/manager/syncmanager/events/EventsSyncManager.ts +157 -74
  121. package/src/manager/syncmanager/events/SyncHttpClient.ts +30 -1
  122. package/src/models/auth.ts +1 -0
  123. package/src/models/sdk.ts +1 -0
  124. package/src/network/NetworkClient.ts +18 -2
  125. package/src/network/NetworkUtils.ts +9 -1
  126. package/src/network/client.ts +1 -1
  127. package/src/ui/screens/DeliverScreen.tsx +6 -5
  128. package/src/ui/screens/FormsScreen.tsx +8 -6
  129. package/src/utils/SyncManagerUtils.ts +41 -6
  130. package/src/utils/storage.ts +21 -8
  131. package/src/utils/utils.ts +0 -8
@@ -1,23 +1,17 @@
1
1
  import * as Sentry from '@sentry/react-native';
2
2
  import { Platform } from 'react-native';
3
- import {
4
- Event,
5
- EventHint,
6
- CaptureContext,
7
- User,
8
- Extras,
9
- } from '@sentry/types';
3
+ import { Event, User } from '@sentry/types';
10
4
  import SentryAnalyticsSingleton from './SentryAnalyticsSingleton';
11
5
  import { SentryEvent } from './SentryModels';
12
6
  import { fireFirebaseEvent } from '../firebase/FirebaseLogging';
13
7
  import { SentryEventNameSdkConstants } from './SentrySdkConstants';
14
8
 
15
- export async function fireEventWithScreenName({ severityLevel, eventName, cta="N/A",screenName="N/A",extraParams=null } : SentryEvent){
9
+ export async function fireEventWithScreenName({ severityLevel, eventName, cta = "N/A", screenName = "N/A", extraParams = null }: SentryEvent) {
16
10
 
17
11
  //ignoring the button clicked event for now
18
- if(eventName === SentryEventNameSdkConstants.BUTTON_CLICKED) return;
12
+ if (eventName === SentryEventNameSdkConstants.BUTTON_CLICKED) return;
19
13
 
20
- console.log("sentry::fireEventWithScreenName()"," called")
14
+ console.log("sentry::fireEventWithScreenName()", " called")
21
15
  console.log("sentry::fireEventWithScreenName::severityLevel", severityLevel)
22
16
  console.log("sentry::fireEventWithScreenName::eventName", eventName)
23
17
  console.log("sentry::fireEventWithScreenName::cta", cta)
@@ -25,47 +19,41 @@ export async function fireEventWithScreenName({ severityLevel, eventName, cta="N
25
19
  console.log("sentry::fireEventWithScreenName::extraParams", JSON.stringify(extraParams))
26
20
  //
27
21
  const singletonInstance = SentryAnalyticsSingleton.getInstance();
28
- const tenantId = singletonInstance.getDispatchAndUserData()?.tenantId??"N/A"
29
- const dispatchId = singletonInstance.getDispatchAndUserData()?.dispatchId??"N/A"
30
- const userId = singletonInstance.getDispatchAndUserData()?.userId??"N/A"
31
- const userName = singletonInstance.getDispatchAndUserData()?.userName??"N/A"
32
- const userEmail = singletonInstance.getDispatchAndUserData()?.userEmail??"N/A"
22
+ const tenantId = singletonInstance.getDispatchAndUserData()?.tenantId ?? "N/A"
23
+ const dispatchId = singletonInstance.getDispatchAndUserData()?.dispatchId ?? "N/A"
24
+ const userId = singletonInstance.getDispatchAndUserData()?.userId ?? "N/A"
25
+ const userName = singletonInstance.getDispatchAndUserData()?.userName ?? "N/A"
26
+ const userEmail = singletonInstance.getDispatchAndUserData()?.userEmail ?? "N/A"
33
27
  //
34
- console.log("sentry::fireEventWithScreenName::tenantId", tenantId)
35
- console.log("sentry::fireEventWithScreenName::dispatchId", dispatchId)
36
- console.log("sentry::fireEventWithScreenName::userId", userId)
37
- console.log("sentry::fireEventWithScreenName::userName", userName)
38
- console.log("sentry::fireEventWithScreenName::userEmail", userEmail)
39
- //
40
- var event : Event = {
28
+ var event: Event = {
41
29
  level: severityLevel,
42
30
  message: eventName,
43
- tags:{
44
- tenantId:tenantId??"N/A",
45
- dispatchId:dispatchId??"N/A",
46
- screenName:screenName??"N/A",
47
- cta:cta??"N/A",
48
- ref:SentryAnalyticsSingleton.ref,
31
+ tags: {
32
+ tenantId: tenantId ?? "N/A",
33
+ dispatchId: dispatchId ?? "N/A",
34
+ screenName: screenName ?? "N/A",
35
+ cta: cta ?? "N/A",
36
+ ref: SentryAnalyticsSingleton.ref,
49
37
  },
50
38
  extra: extraParams ?? '',
51
39
  };
52
40
 
53
41
  //fetch user details only if tenantId is present
54
- if(tenantId != null && tenantId?.trim() != ""){
42
+ if (tenantId != null && tenantId?.trim() != "") {
55
43
  let user: User = {};
56
- user.id = userId??"N/A";
57
- user.email = userEmail??"N/A";
58
- user.username = userName??"N/A";
44
+ user.id = userId ?? "N/A";
45
+ user.email = userEmail ?? "N/A";
46
+ user.username = userName ?? "N/A";
59
47
  event.user = user;
60
48
  }
61
49
  //
62
50
  event.platform = Platform.OS
63
- event.environment = await getEnvironment();
51
+ event.environment = await getEnvironment();
64
52
  //
65
- Sentry.captureEvent(event);
53
+ Sentry.captureEvent(event);
66
54
  //fire firebase event
67
-
68
- await fireFirebaseEvent(event.message??"No_Event_Name", event);
55
+
56
+ await fireFirebaseEvent(event.message ?? "No_Event_Name", event);
69
57
  }
70
58
 
71
59
  const getEnvironment = async () => {
@@ -47,6 +47,8 @@ export enum SentryEventNameSdkConstants{
47
47
  API_CALL = "API_CALL",
48
48
  API_RESPONSE = "API_RESPONSE",
49
49
  API_ERROR = "API_ERROR",
50
+ APP_ERROR = "APP_ERROR",
51
+ APP_LOG = "APP_LOG",
50
52
  BUTTON_CLICKED = "BUTTON_CLICKED",
51
53
  SDK_INIT_STARTED = "SDK_INIT_STARTED",
52
54
  SDK_INIT_DONE = "SDK_INIT_DONE",
@@ -361,9 +361,7 @@ style={{
361
361
  <View style={CommonStyles.mainContainer}>
362
362
  {props.message && (
363
363
  <View style={styles.etMessageView}>
364
- <Text style={styles.etMessage}>
365
- Take a photo of the shipments. Please ensure the items are clearly visible.
366
- </Text>
364
+ <Text style={styles.etMessage}>{props.message}</Text>
367
365
  </View>
368
366
  )}
369
367
  <View
package/src/index.tsx CHANGED
@@ -86,4 +86,4 @@ export { MtsSdk };
86
86
  export { Helper };
87
87
  //sentry function export
88
88
  export { SentryAnalyticsSingleton, fireEventWithScreenName, SeverityLevelValue, ScreenNameSdkConstants, SentryEventNameSdkConstants, DispatchAndUserData, SentryEvent};
89
- export { DocumentManager };
89
+ export { DocumentManager };
@@ -15,6 +15,7 @@ import Storage from '../../utils/storage';
15
15
  import { pushBulkEventForSync } from '../../utils/SyncManagerUtils';
16
16
  import callbackHandler from './callbacksHandler';
17
17
  import { DispatchExecutor as dispatchExecutor } from '@os1-platform/platform-coreos-execution-engine-sdk';
18
+ import { MAX_RETRY_COUNT } from '../syncmanager/constants';
18
19
 
19
20
  export class DispatchSDKManager {
20
21
  private static instance: DispatchSDKManager;
@@ -30,6 +31,7 @@ export class DispatchSDKManager {
30
31
  return DispatchSDKManager.instance;
31
32
  }
32
33
 
34
+
33
35
  /**
34
36
  * Call this init method with username,userID & authentication tokens
35
37
  * @param sdkConfig
@@ -68,7 +70,7 @@ export class DispatchSDKManager {
68
70
  GraphQLClient.init(sdkConfig.tenantBaseURL);
69
71
  AppSyncManager.initAppSync(
70
72
  sdkConfig.tenantBaseURL,
71
- sdkConfig.syncRetryCount ?? 3
73
+ sdkConfig.syncRetryCount ?? MAX_RETRY_COUNT
72
74
  );
73
75
  LocationManager.getInstance().startUpdates();
74
76
  if (sdkConfig.eventMapping) {
@@ -80,11 +82,13 @@ export class DispatchSDKManager {
80
82
 
81
83
  if (
82
84
  sdkConfig.callbacks?.fetchPhoneNumbersCallback &&
83
- sdkConfig?.callbacks?.fetchDateTimeCallback
85
+ sdkConfig?.callbacks?.fetchDateTimeCallback &&
86
+ sdkConfig?.callbacks?.tokenRefreshCallback
84
87
  ) {
85
88
  await callbackHandler.init(
86
89
  sdkConfig.callbacks.fetchPhoneNumbersCallback,
87
- sdkConfig.callbacks.fetchDateTimeCallback
90
+ sdkConfig.callbacks.fetchDateTimeCallback,
91
+ sdkConfig.callbacks.tokenRefreshCallback
88
92
  );
89
93
  }
90
94
  await dispatchExecutor.init(
@@ -102,4 +106,5 @@ export class DispatchSDKManager {
102
106
  public removeLocationUpdates() {
103
107
  LocationManager.getInstance().stopLocationUpdates();
104
108
  }
109
+
105
110
  }
@@ -1,18 +1,25 @@
1
+ import { DispatchSDKConfig } from "src/models/sdk";
2
+ import DispatchSdkCache from "./DispatchSdkCache";
3
+ import { BaseError, } from "../../errors/BaseError";
4
+ import ErrorCodes from '../../errors/ErrorCodes';
5
+
1
6
  class CallbacksHandler {
2
7
  private _callbackToFetchPhoneNumbers!: (
3
8
  sdsIds: string[]
4
9
  ) => Promise<{ key: string; value: string[] }>;
5
10
 
6
11
  private _callbackToFetchDateTime!: () => Promise<string>;
12
+ private _callbackRefreshToken!: () => Promise<string>;
7
13
 
8
14
  public init(
9
15
  phoneCallback: (
10
16
  sdsIds: string[]
11
17
  ) => Promise<{ key: string; value: string[] }>,
12
- dateTimeCallBack: () => Promise<string>
18
+ dateTimeCallBack: () => Promise<string>, tokenRefreshCallback: () => Promise<string>
13
19
  ) {
14
20
  this._callbackToFetchPhoneNumbers = phoneCallback;
15
21
  this._callbackToFetchDateTime = dateTimeCallBack;
22
+ this._callbackRefreshToken = tokenRefreshCallback;
16
23
  }
17
24
 
18
25
  public async getPhoneNumbers(
@@ -30,7 +37,37 @@ class CallbacksHandler {
30
37
  return await this._callbackToFetchDateTime();
31
38
  }
32
39
  }
33
- }
34
40
 
41
+ public async refresheAndUpdateToken() {
42
+ if (!this._callbackRefreshToken){
43
+ throw new BaseError(
44
+ ErrorCodes.SyncManagerNotInitialized,
45
+ 'Dispatch SDK Not Initalised'
46
+ );
47
+ } else {
48
+ let token = await this._callbackRefreshToken();
49
+ if(token && token.length != 0){
50
+ let sdkConfig =
51
+ (await DispatchSdkCache.getInstance().getObjectFromCache(
52
+ DispatchSdkCache.KEYS.SDK_CONFIG
53
+ )) as DispatchSDKConfig;
54
+ sdkConfig.accessToken = token;
55
+ var headers = sdkConfig.headers;
56
+ if(headers){
57
+ headers['x-coreos-access'] = token;
58
+ sdkConfig.headers = headers;
59
+ }
60
+ let cache: DispatchSdkCache = DispatchSdkCache.getInstance();
61
+ let keys = DispatchSdkCache.KEYS;
62
+ cache.setObjectInCache(keys.SDK_CONFIG, sdkConfig);
63
+ }else{
64
+ throw new BaseError(
65
+ ErrorCodes.ACCESS_TOKEN_EXPIRED,
66
+ 'Unable to refresh token'
67
+ );
68
+ }
69
+ }
70
+ }
71
+ }
35
72
  const callbackHandler = new CallbacksHandler();
36
73
  export default callbackHandler;
@@ -15,6 +15,7 @@ import {
15
15
  DEFAULT_NOTIFICATION_TITLE,
16
16
  } from '../../constants/constants';
17
17
  import type { DispatchSDKConfig } from '../../models/sdk';
18
+ import { MAX_RETRY_COUNT } from './constants';
18
19
 
19
20
  export default class AppSyncManager {
20
21
  private constructor(tenantBaseURL: string, retryCount: number) {
@@ -58,17 +59,18 @@ export default class AppSyncManager {
58
59
  tenantBaseURL: string,
59
60
  syncRetryCount: number
60
61
  ): AppSyncManager {
61
- if (!AppSyncManager.instance) {
62
- Logger.getInstance().logEvent(
63
- 'initAppSync',
64
- 'CREATING NEW INSTANCE',
65
- LOG_TYPE.SDK_INFO
66
- );
67
- AppSyncManager.instance = new AppSyncManager(
68
- tenantBaseURL,
69
- syncRetryCount
70
- );
71
- }
62
+ // removing this check to allow tenant change in app due to this manager instance did't re-init and event and docs didn't sync
63
+ // if (!AppSyncManager.instance) {
64
+ Logger.getInstance().logEvent(
65
+ 'initAppSync',
66
+ 'CREATING NEW INSTANCE',
67
+ LOG_TYPE.SDK_INFO
68
+ );
69
+ AppSyncManager.instance = new AppSyncManager(
70
+ tenantBaseURL,
71
+ syncRetryCount
72
+ );
73
+ // }
72
74
  return AppSyncManager.instance;
73
75
  }
74
76
  public static getInstance(): AppSyncManager {
@@ -88,7 +90,7 @@ export default class AppSyncManager {
88
90
  (await DispatchSdkCache.getInstance().getObjectFromCache(
89
91
  DispatchSdkCache.KEYS.SDK_CONFIG
90
92
  )) as DispatchSDKConfig;
91
- const retryCount = sdkConfig.syncRetryCount ?? 3;
93
+ const retryCount = sdkConfig.syncRetryCount ?? MAX_RETRY_COUNT;
92
94
  if (sdkConfig.tenantBaseURL != null && retryCount != null) {
93
95
  AppSyncManager.initAppSync(sdkConfig.tenantBaseURL, +retryCount);
94
96
  AppSyncManager.getInstance().startSDKSyncManager();
@@ -148,7 +150,7 @@ export default class AppSyncManager {
148
150
  config?.notificationConfig?.interval ?? DEFAULT_INTERVAL,
149
151
  config?.notificationConfig?.title ?? DEFAULT_NOTIFICATION_TITLE,
150
152
  config?.notificationConfig?.description ??
151
- DEFAULT_NOTIFICATION_DESCRIPTION
153
+ DEFAULT_NOTIFICATION_DESCRIPTION
152
154
  );
153
155
  } else {
154
156
  Logger.getInstance().logEvent(
@@ -23,6 +23,7 @@ export const EVENTS_COLUMNS = {
23
23
  SYNC_ERROR: 'sync_error',
24
24
  DISPATCH_ID: 'dispatch_id',
25
25
  DATA_LENGTH: 'data_length',
26
+ ATTEMPT_COUNT: 'attempt_count',
26
27
  };
27
28
 
28
29
  export const DOCUMENT_TABLE = 'DOCUMENTS_TABLE';
@@ -42,6 +43,7 @@ export const DOCUMENT_COLUMNS = {
42
43
  DISPATCH_ID: 'dispatch_id',
43
44
  JOB_ID: 'job_id',
44
45
  OBJECTIVE_REF: 'objective_ref',
46
+ ATTEMPT_COUNT: 'attempt_count',
45
47
  GEO_TIMESTAMP: 'geo_timestamp',
46
48
  PROCESSED_FILE_PATH: 'processed_file_path',
47
49
  };
@@ -63,6 +65,7 @@ export type DocumentRow = {
63
65
  objective_ref: string;
64
66
  geo_timestamp: string;
65
67
  processed_file_path: string;
68
+ attempt_count: number;
66
69
  };
67
70
  export type EventRow = {
68
71
  id: number;
@@ -73,6 +76,7 @@ export type EventRow = {
73
76
  objective_ref: string;
74
77
  sync_error: string;
75
78
  dispatch_id: string;
79
+ attempt_count: number;
76
80
  };
77
81
 
78
82
  export enum SyncMethod {
@@ -3,3 +3,6 @@ export const LAST_SYNCED_EVENT_ID = 'lastSyncedEventId';
3
3
  export const SHARED_PREFERENCE_DISPATCH_ID = 'sharedPreferenceDispatchId';
4
4
  export const SHARED_PREFERENCE_SCAN_OUTPUT = 'scanETMappedOutput';
5
5
  export const SCAN_MERGED_OBJ_ID_OUTPUT = 'scanMergedObjectiveIDs';
6
+ export const POD_DOC = 'POD_DOC';
7
+ export const PROCESS_MAX_RETRIED_ROWS = false;
8
+ export const MAX_RETRY_COUNT = 3;
@@ -10,7 +10,8 @@ import RNFS from 'react-native-fs';
10
10
  import { stat } from 'react-native-fs';
11
11
  import { ScreenNameSdkConstants, SentryEventNameSdkConstants, SeverityLevelValue } from '../../../analytics/sentry/SentrySdkConstants';
12
12
  import { fireEventWithScreenName } from '../../../analytics/sentry/SentryAnalyticsUtils';
13
- import { flattenObject } from '../../../utils/utils';
13
+ import { flattenObject, isTokenExpired } from '../../../utils/utils';
14
+ import callbackHandler from '../../../manager/sdk/callbacksHandler';
14
15
 
15
16
  const cache = DispatchSdkCache.getInstance();
16
17
  const cacheKeys = DispatchSdkCache.KEYS;
@@ -21,7 +22,6 @@ export default class DocumentHttpClient extends HttpClient {
21
22
  public async uploadDocument(document: DocumentRow): Promise<string | null> {
22
23
  if (document.base64 && document.data != null) {
23
24
  const response = await this.uploadBase64File(document);
24
-
25
25
  let info = '';
26
26
  if (
27
27
  response &&
@@ -34,17 +34,22 @@ export default class DocumentHttpClient extends HttpClient {
34
34
  } else {
35
35
  info = String(response.status);
36
36
  }
37
- let extraParameters = { response: info };
37
+ let extraParameters = {
38
+ response: info,
39
+ fName: document.file_name && document.file_name.length != 0 ? document.file_name.substring(4): '',
40
+ dName: document.fms_folder_id && document.fms_folder_id.length != 0 ? document.fms_folder_id.substring(4): '',
41
+ dispId: document.dispatch_id && document.dispatch_id.length != 0 ? document.dispatch_id.substring(9): ''
42
+ };
38
43
 
39
44
  fireEventWithScreenName({
40
45
  severityLevel: SeverityLevelValue.LOG,
41
46
  eventName: SentryEventNameSdkConstants.API_RESPONSE,
42
- screenName: 'Upload_Base64_File_Response',
47
+ screenName: 'uploadDocument:Upload_Base64_File_Response',
43
48
  extraParams: extraParameters,
44
49
  });
45
50
 
46
51
  Logger.getInstance().logEvent(
47
- 'uploadBase64FileResponse',
52
+ 'uploadDocument:uploadBase64FileResponse',
48
53
  flattenObject(extraParameters),
49
54
  LOG_TYPE.SDK_ERROR
50
55
  );
@@ -56,7 +61,7 @@ export default class DocumentHttpClient extends HttpClient {
56
61
  response.status === 202
57
62
  ) {
58
63
  return response.data.data.id;
59
- } else {
64
+ }else{
60
65
  return null;
61
66
  }
62
67
  } else {
@@ -72,17 +77,22 @@ export default class DocumentHttpClient extends HttpClient {
72
77
  } else {
73
78
  info = String(uploadResponse.status);
74
79
  }
75
- let extraParams = { response: info };
80
+ let extraParameters = {
81
+ response: info,
82
+ fName: document.file_name && document.file_name.length != 0 ? document.file_name.substring(4): '',
83
+ dName: document.fms_folder_id && document.fms_folder_id.length != 0 ? document.fms_folder_id.substring(4): '',
84
+ dispId: document.dispatch_id && document.dispatch_id.length != 0 ? document.dispatch_id.substring(9): ''
85
+ };
76
86
 
77
87
  fireEventWithScreenName({
78
88
  severityLevel: SeverityLevelValue.LOG,
79
89
  eventName: SentryEventNameSdkConstants.API_RESPONSE,
80
- screenName: 'Upload_Binary_File_Response',
81
- extraParams: extraParams,
90
+ screenName: 'uploadDocument:Upload_Binary_File_Response',
91
+ extraParams: extraParameters,
82
92
  });
83
93
  Logger.getInstance().logEvent(
84
- 'uploadBinaryFileResponse',
85
- flattenObject(extraParams),
94
+ 'uploadDocument:uploadBinaryFileResponse',
95
+ flattenObject(extraParameters),
86
96
  LOG_TYPE.SDK_ERROR
87
97
  );
88
98
  if (
@@ -94,7 +104,7 @@ export default class DocumentHttpClient extends HttpClient {
94
104
  FileSystem.deleteAsync(document.processed_file_path).then().catch(); // WE DELETE FILE HERE
95
105
 
96
106
  return JSON.parse(uploadResponse.body)?.data?.id;
97
- } else {
107
+ }else{
98
108
  return null;
99
109
  }
100
110
  }
@@ -124,25 +134,33 @@ export default class DocumentHttpClient extends HttpClient {
124
134
  ],
125
135
  fileName: document.file_name,
126
136
  });
127
- const sdkConfig = (await cache.getObjectFromCache(
137
+ let sdkConfig = (await cache.getObjectFromCache(
128
138
  cacheKeys.SDK_CONFIG
129
139
  )) as DispatchSDKConfig;
130
- let extraParams = {
131
- fileName: document.file_name,
132
- folderName: document.fms_folder_id,
140
+ if(isTokenExpired(sdkConfig.accessToken)){
141
+ await callbackHandler.refresheAndUpdateToken();
142
+ sdkConfig = (await cache.getObjectFromCache(
143
+ cacheKeys.SDK_CONFIG
144
+ )) as DispatchSDKConfig;
145
+ }
146
+ let extraParameters = {
147
+ fName: document.file_name && document.file_name.length != 0 ? document.file_name.substring(4): '',
148
+ dName: document.fms_folder_id && document.fms_folder_id.length != 0 ? document.fms_folder_id.substring(4): '',
149
+ dispId: document.dispatch_id && document.dispatch_id.length != 0 ? document.dispatch_id.substring(9): ''
133
150
  };
134
151
 
135
152
  fireEventWithScreenName({
136
153
  severityLevel: SeverityLevelValue.LOG,
137
154
  eventName: SentryEventNameSdkConstants.API_CALL,
138
155
  screenName: 'Upload_Base64_File_Request',
139
- extraParams: extraParams,
156
+ extraParams: extraParameters,
140
157
  });
141
158
  Logger.getInstance().logEvent(
142
159
  'uploadBase64FileRequest',
143
- flattenObject(extraParams),
160
+ flattenObject(extraParameters),
144
161
  LOG_TYPE.SDK_ERROR
145
162
  );
163
+
146
164
  return this.instance.post(
147
165
  `/api/folders/${document.fms_folder_id}/files`,
148
166
  requestBody,
@@ -162,9 +180,17 @@ export default class DocumentHttpClient extends HttpClient {
162
180
  private async uploadBinaryFile(
163
181
  document: DocumentRow
164
182
  ): Promise<FileSystemUploadResult> {
165
- const sdkConfig = (await cache.getObjectFromCache(
183
+
184
+ let sdkConfig = (await cache.getObjectFromCache(
166
185
  cacheKeys.SDK_CONFIG
167
186
  )) as DispatchSDKConfig;
187
+ if(isTokenExpired(sdkConfig.accessToken)){
188
+ await callbackHandler.refresheAndUpdateToken();
189
+ sdkConfig = (await cache.getObjectFromCache(
190
+ cacheKeys.SDK_CONFIG
191
+ )) as DispatchSDKConfig;
192
+ }
193
+
168
194
  let filePathToUpload = document.file_path;
169
195
  let processedFileExist = await RNFS.exists(document.processed_file_path);
170
196
  if (processedFileExist) {
@@ -172,21 +198,25 @@ export default class DocumentHttpClient extends HttpClient {
172
198
  }
173
199
  const url =
174
200
  sdkConfig.tenantBaseURL + `/api/folders/${document.fms_folder_id}/files`;
175
- let extraParams = {
176
- fileName: document.file_name,
177
- folderName: document.fms_folder_id,
201
+
202
+ let extraParameters = {
203
+ fName: document.file_name && document.file_name.length != 0 ? document.file_name.substring(4): '',
204
+ dName: document.fms_folder_id && document.fms_folder_id.length != 0 ? document.fms_folder_id.substring(4): '',
205
+ dispId: document.dispatch_id && document.dispatch_id.length != 0 ? document.dispatch_id.substring(9): ''
178
206
  };
207
+
179
208
  fireEventWithScreenName({
180
209
  severityLevel: SeverityLevelValue.LOG,
181
210
  eventName: SentryEventNameSdkConstants.API_CALL,
182
211
  screenName: 'Upload_Binary_File_Request',
183
- extraParams: extraParams,
212
+ extraParams: extraParameters,
184
213
  });
185
214
  Logger.getInstance().logEvent(
186
215
  'uploadBinaryFileRequest',
187
- flattenObject(extraParams),
216
+ flattenObject(extraParameters),
188
217
  LOG_TYPE.SDK_ERROR
189
218
  );
219
+
190
220
  return FileSystem.uploadAsync(url, filePathToUpload, {
191
221
  headers: {
192
222
  'accept': 'application/json',
@@ -1,4 +1,5 @@
1
1
  import { DOCUMENT_COLUMNS, DOCUMENT_TABLE, DocumentRow } from '../DBConfig';
2
+ import { MAX_RETRY_COUNT, PROCESS_MAX_RETRIED_ROWS } from '../constants';
2
3
  import * as Database from '../database';
3
4
  import type { SQLResultSet } from 'expo-sqlite';
4
5
 
@@ -31,6 +32,7 @@ export default class DocumentManager {
31
32
  ${DOCUMENT_COLUMNS.FMS_FOLDER_ID} TEXT,\
32
33
  ${DOCUMENT_COLUMNS.PRIORITY} INTEGER NOT NULL DEFAULT 1,\
33
34
  ${DOCUMENT_COLUMNS.SYNC_ERROR} TEXT,\
35
+ ${DOCUMENT_COLUMNS.ATTEMPT_COUNT} INTEGER DEFAULT 0 NOT NULL,\
34
36
  ${DOCUMENT_COLUMNS.GEO_TIMESTAMP} TEXT,\
35
37
  ${DOCUMENT_COLUMNS.PROCESSED_FILE_PATH} TEXT,\
36
38
  ${DOCUMENT_COLUMNS.DESCRIPTION} TEXT);`,
@@ -130,6 +132,19 @@ export default class DocumentManager {
130
132
  );
131
133
  }
132
134
 
135
+ // This function will actualy update the document row with sync and attempt count.
136
+ public async markDocumentSyncedWithAttempt(
137
+ id: number,
138
+ fmsID: string,
139
+ attempt: number,
140
+ sync: number
141
+ ): Promise<void> {
142
+ if (!id) return;
143
+ await Database.executeQuery(
144
+ `UPDATE ${DOCUMENT_TABLE} SET ${DOCUMENT_COLUMNS.SYNCED} = ?,${DOCUMENT_COLUMNS.FMS_ID} = ?,${DOCUMENT_COLUMNS.ATTEMPT_COUNT} = ? WHERE ${DOCUMENT_COLUMNS.ID} = ?;`,
145
+ [sync, fmsID, attempt, id]
146
+ );
147
+ }
133
148
  // This function is updating processed_file_path column for the base64 overlayed data and overlayed image file for POD. Also if it is base 64 then it is also storing temprary file path in file_path as original bae64 image.
134
149
  public async updateProcesedFilePath(
135
150
  id: number,
@@ -157,13 +172,39 @@ export default class DocumentManager {
157
172
  );
158
173
  }
159
174
 
160
- public async getUnsyncedDocument(): Promise<DocumentRow[]> {
161
- let rs = await Database.executeQuery(
162
- `SELECT * from ${DOCUMENT_TABLE}\
163
- WHERE ${DOCUMENT_COLUMNS.SYNCED} = 0 \
164
- ORDER BY ${DOCUMENT_COLUMNS.PRIORITY} ASC LIMIT 1;`,
165
- []
175
+ public async updateDocPriority(
176
+ id: number,
177
+ priority: number
178
+ ): Promise<void> {
179
+ if (!id) throw new TypeError('Document ID cannot be null');
180
+ await Database.executeQuery(
181
+ `UPDATE ${DOCUMENT_TABLE}\
182
+ SET \
183
+ ${DOCUMENT_COLUMNS.PRIORITY} = ?\
184
+ WHERE ${DOCUMENT_COLUMNS.ID} = ?;`,
185
+ [priority, id]
166
186
  );
167
- return rs.rows._array;
187
+ }
188
+
189
+
190
+ public async getUnsyncedDocument(): Promise<DocumentRow[]> {
191
+ // If it is allowed max_retried_rows are allowed to process then it will refetch those data which are even have tried max attempt otherwise it will skip those events.
192
+ if(PROCESS_MAX_RETRIED_ROWS){
193
+ let rs = await Database.executeQuery(
194
+ `SELECT * from ${DOCUMENT_TABLE}\
195
+ WHERE ${DOCUMENT_COLUMNS.SYNCED} = 0 \
196
+ ORDER BY ${DOCUMENT_COLUMNS.PRIORITY} ASC LIMIT 1;`,
197
+ []
198
+ );
199
+ return rs.rows._array;
200
+ }else{
201
+ let rs = await Database.executeQuery(
202
+ `SELECT * from ${DOCUMENT_TABLE}\
203
+ WHERE ${DOCUMENT_COLUMNS.SYNCED} = 0 AND ${DOCUMENT_COLUMNS.ATTEMPT_COUNT} < ${MAX_RETRY_COUNT} \
204
+ ORDER BY ${DOCUMENT_COLUMNS.PRIORITY} ASC LIMIT 1;`,
205
+ []
206
+ );
207
+ return rs.rows._array;
208
+ }
168
209
  }
169
210
  }