@os1-platform/dispatch-mobile 3.0.3 → 3.1.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 (223) hide show
  1. package/android/build.gradle +38 -9
  2. package/android/gradle.properties +17 -2
  3. package/lib/commonjs/components/dispatch/DispatchExecNavigator.js.map +1 -1
  4. package/lib/commonjs/components/executiontasks/forms/widgets/DateTimeWidget.js.map +1 -1
  5. package/lib/commonjs/components/executiontasks/imageCapture/CaptureUtils.js +1 -1
  6. package/lib/commonjs/components/executiontasks/imageCapture/CaptureUtils.js.map +1 -1
  7. package/lib/commonjs/components/executiontasks/validateOTP/ValidateOTPET.js +467 -287
  8. package/lib/commonjs/components/executiontasks/validateOTP/ValidateOTPET.js.map +1 -1
  9. package/lib/commonjs/components/executiontasks/validateOTP/ValidateOTPSchema.js +14 -1
  10. package/lib/commonjs/components/executiontasks/validateOTP/ValidateOTPSchema.js.map +1 -1
  11. package/lib/commonjs/components/executiontasks/validateOTP/ValidateOtpStyles.js +272 -0
  12. package/lib/commonjs/components/executiontasks/validateOTP/ValidateOtpStyles.js.map +1 -0
  13. package/lib/commonjs/components/executiontasks/validateOTP/components/ContactListView.js +99 -0
  14. package/lib/commonjs/components/executiontasks/validateOTP/components/ContactListView.js.map +1 -0
  15. package/lib/commonjs/components/executiontasks/validateOTP/components/OTPView.js +195 -0
  16. package/lib/commonjs/components/executiontasks/validateOTP/components/OTPView.js.map +1 -0
  17. package/lib/commonjs/components/executiontasks/validateOTP/components/VerificationComplete.js +106 -0
  18. package/lib/commonjs/components/executiontasks/validateOTP/components/VerificationComplete.js.map +1 -0
  19. package/lib/commonjs/components/executiontasks/validateOTP/constants.js +12 -5
  20. package/lib/commonjs/components/executiontasks/validateOTP/constants.js.map +1 -1
  21. package/lib/commonjs/components/executiontasks/validateOTP/sub-components/ContactCard.js +68 -0
  22. package/lib/commonjs/components/executiontasks/validateOTP/sub-components/ContactCard.js.map +1 -0
  23. package/lib/commonjs/components/executiontasks/validateOTP/sub-components/OTPInput.js +12 -5
  24. package/lib/commonjs/components/executiontasks/validateOTP/sub-components/OTPInput.js.map +1 -1
  25. package/lib/commonjs/components/executiontasks/validateOTP/sub-components/ResendOTPButton.js +61 -0
  26. package/lib/commonjs/components/executiontasks/validateOTP/sub-components/ResendOTPButton.js.map +1 -0
  27. package/lib/commonjs/components/executiontasks/validateOTP/utils.js +235 -114
  28. package/lib/commonjs/components/executiontasks/validateOTP/utils.js.map +1 -1
  29. package/lib/commonjs/components/utils/Scale.js +22 -0
  30. package/lib/commonjs/components/utils/Scale.js.map +1 -0
  31. package/lib/commonjs/components/widgets/ConfirmCancelModal.js +47 -0
  32. package/lib/commonjs/components/widgets/ConfirmCancelModal.js.map +1 -0
  33. package/lib/commonjs/components/widgets/SnackBarCustom.js +36 -4
  34. package/lib/commonjs/components/widgets/SnackBarCustom.js.map +1 -1
  35. package/lib/commonjs/components/widgets/SplitTextInput.js +48 -18
  36. package/lib/commonjs/components/widgets/SplitTextInput.js.map +1 -1
  37. package/lib/commonjs/constants/apiConstants.js +4 -1
  38. package/lib/commonjs/constants/apiConstants.js.map +1 -1
  39. package/lib/commonjs/constants/constants.js +2 -1
  40. package/lib/commonjs/constants/constants.js.map +1 -1
  41. package/lib/commonjs/icons/icExclamationcircleo_dark.svg +3 -0
  42. package/lib/commonjs/icons/icFailed.gif +0 -0
  43. package/lib/commonjs/icons/icRadioChecked.svg +4 -0
  44. package/lib/commonjs/icons/icRadioUnchecked.svg +4 -0
  45. package/lib/commonjs/icons/icSuccess.gif +0 -0
  46. package/lib/commonjs/icons/index.js +28 -0
  47. package/lib/commonjs/icons/index.js.map +1 -0
  48. package/lib/commonjs/index.js +19 -0
  49. package/lib/commonjs/index.js.map +1 -1
  50. package/lib/commonjs/manager/sdk/DispatchSDKManager.js +5 -4
  51. package/lib/commonjs/manager/sdk/DispatchSDKManager.js.map +1 -1
  52. package/lib/commonjs/manager/sdk/callbacksHandler.js +9 -2
  53. package/lib/commonjs/manager/sdk/callbacksHandler.js.map +1 -1
  54. package/lib/commonjs/manager/syncmanager/AppSyncManager.js +1 -4
  55. package/lib/commonjs/manager/syncmanager/AppSyncManager.js.map +1 -1
  56. package/lib/commonjs/manager/syncmanager/constants.js +3 -1
  57. package/lib/commonjs/manager/syncmanager/constants.js.map +1 -1
  58. package/lib/commonjs/manager/syncmanager/document/DocumentHttpClient.js +3 -2
  59. package/lib/commonjs/manager/syncmanager/document/DocumentHttpClient.js.map +1 -1
  60. package/lib/commonjs/manager/syncmanager/document/DocumentSyncManager.js +70 -80
  61. package/lib/commonjs/manager/syncmanager/document/DocumentSyncManager.js.map +1 -1
  62. package/lib/commonjs/models/sdk.js +1 -0
  63. package/lib/commonjs/models/sdk.js.map +1 -1
  64. package/lib/commonjs/ui/screens/ValidateOTPScreen.js +132 -12
  65. package/lib/commonjs/ui/screens/ValidateOTPScreen.js.map +1 -1
  66. package/lib/commonjs/utils/ApiUtils.js +122 -3
  67. package/lib/commonjs/utils/ApiUtils.js.map +1 -1
  68. package/lib/commonjs/utils/ExecTaskUtils.js +67 -7
  69. package/lib/commonjs/utils/ExecTaskUtils.js.map +1 -1
  70. package/lib/commonjs/utils/context/valdiateOTPContext.js +11 -0
  71. package/lib/commonjs/utils/context/valdiateOTPContext.js.map +1 -0
  72. package/lib/commonjs/utils/helper.js.map +1 -1
  73. package/lib/commonjs/utils/hooks/useTimer.js +68 -30
  74. package/lib/commonjs/utils/hooks/useTimer.js.map +1 -1
  75. package/lib/module/components/dispatch/DispatchExecNavigator.js.map +1 -1
  76. package/lib/module/components/executiontasks/forms/widgets/DateTimeWidget.js.map +1 -1
  77. package/lib/module/components/executiontasks/imageCapture/CaptureUtils.js +1 -1
  78. package/lib/module/components/executiontasks/imageCapture/CaptureUtils.js.map +1 -1
  79. package/lib/module/components/executiontasks/validateOTP/ValidateOTPET.js +480 -290
  80. package/lib/module/components/executiontasks/validateOTP/ValidateOTPET.js.map +1 -1
  81. package/lib/module/components/executiontasks/validateOTP/ValidateOTPSchema.js +14 -0
  82. package/lib/module/components/executiontasks/validateOTP/ValidateOTPSchema.js.map +1 -1
  83. package/lib/module/components/executiontasks/validateOTP/ValidateOtpStyles.js +266 -0
  84. package/lib/module/components/executiontasks/validateOTP/ValidateOtpStyles.js.map +1 -0
  85. package/lib/module/components/executiontasks/validateOTP/components/ContactListView.js +88 -0
  86. package/lib/module/components/executiontasks/validateOTP/components/ContactListView.js.map +1 -0
  87. package/lib/module/components/executiontasks/validateOTP/components/OTPView.js +194 -0
  88. package/lib/module/components/executiontasks/validateOTP/components/OTPView.js.map +1 -0
  89. package/lib/module/components/executiontasks/validateOTP/components/VerificationComplete.js +96 -0
  90. package/lib/module/components/executiontasks/validateOTP/components/VerificationComplete.js.map +1 -0
  91. package/lib/module/components/executiontasks/validateOTP/constants.js +11 -4
  92. package/lib/module/components/executiontasks/validateOTP/constants.js.map +1 -1
  93. package/lib/module/components/executiontasks/validateOTP/sub-components/ContactCard.js +59 -0
  94. package/lib/module/components/executiontasks/validateOTP/sub-components/ContactCard.js.map +1 -0
  95. package/lib/module/components/executiontasks/validateOTP/sub-components/OTPInput.js +11 -5
  96. package/lib/module/components/executiontasks/validateOTP/sub-components/OTPInput.js.map +1 -1
  97. package/lib/module/components/executiontasks/validateOTP/sub-components/ResendOTPButton.js +52 -0
  98. package/lib/module/components/executiontasks/validateOTP/sub-components/ResendOTPButton.js.map +1 -0
  99. package/lib/module/components/executiontasks/validateOTP/utils.js +219 -108
  100. package/lib/module/components/executiontasks/validateOTP/utils.js.map +1 -1
  101. package/lib/module/components/utils/Scale.js +14 -0
  102. package/lib/module/components/utils/Scale.js.map +1 -0
  103. package/lib/module/components/widgets/ConfirmCancelModal.js +40 -0
  104. package/lib/module/components/widgets/ConfirmCancelModal.js.map +1 -0
  105. package/lib/module/components/widgets/SnackBarCustom.js +36 -4
  106. package/lib/module/components/widgets/SnackBarCustom.js.map +1 -1
  107. package/lib/module/components/widgets/SplitTextInput.js +48 -19
  108. package/lib/module/components/widgets/SplitTextInput.js.map +1 -1
  109. package/lib/module/constants/apiConstants.js +4 -1
  110. package/lib/module/constants/apiConstants.js.map +1 -1
  111. package/lib/module/constants/constants.js +1 -0
  112. package/lib/module/constants/constants.js.map +1 -1
  113. package/lib/module/icons/icExclamationcircleo_dark.svg +3 -0
  114. package/lib/module/icons/icFailed.gif +0 -0
  115. package/lib/module/icons/icRadioChecked.svg +4 -0
  116. package/lib/module/icons/icRadioUnchecked.svg +4 -0
  117. package/lib/module/icons/icSuccess.gif +0 -0
  118. package/lib/module/icons/index.js +5 -0
  119. package/lib/module/icons/index.js.map +1 -0
  120. package/lib/module/index.js +2 -0
  121. package/lib/module/index.js.map +1 -1
  122. package/lib/module/manager/sdk/DispatchSDKManager.js +5 -3
  123. package/lib/module/manager/sdk/DispatchSDKManager.js.map +1 -1
  124. package/lib/module/manager/sdk/callbacksHandler.js +12 -3
  125. package/lib/module/manager/sdk/callbacksHandler.js.map +1 -1
  126. package/lib/module/manager/syncmanager/AppSyncManager.js +1 -4
  127. package/lib/module/manager/syncmanager/AppSyncManager.js.map +1 -1
  128. package/lib/module/manager/syncmanager/constants.js +2 -0
  129. package/lib/module/manager/syncmanager/constants.js.map +1 -1
  130. package/lib/module/manager/syncmanager/document/DocumentHttpClient.js +3 -2
  131. package/lib/module/manager/syncmanager/document/DocumentHttpClient.js.map +1 -1
  132. package/lib/module/manager/syncmanager/document/DocumentSyncManager.js +70 -80
  133. package/lib/module/manager/syncmanager/document/DocumentSyncManager.js.map +1 -1
  134. package/lib/module/models/sdk.js +2 -0
  135. package/lib/module/models/sdk.js.map +1 -1
  136. package/lib/module/ui/screens/ValidateOTPScreen.js +139 -11
  137. package/lib/module/ui/screens/ValidateOTPScreen.js.map +1 -1
  138. package/lib/module/utils/ApiUtils.js +118 -2
  139. package/lib/module/utils/ApiUtils.js.map +1 -1
  140. package/lib/module/utils/ExecTaskUtils.js +66 -7
  141. package/lib/module/utils/ExecTaskUtils.js.map +1 -1
  142. package/lib/module/utils/context/valdiateOTPContext.js +4 -0
  143. package/lib/module/utils/context/valdiateOTPContext.js.map +1 -0
  144. package/lib/module/utils/helper.js +1 -0
  145. package/lib/module/utils/helper.js.map +1 -1
  146. package/lib/module/utils/hooks/useTimer.js +67 -30
  147. package/lib/module/utils/hooks/useTimer.js.map +1 -1
  148. package/lib/typescript/components/executiontasks/collectPayment/PaymentStyles.d.ts +3 -3
  149. package/lib/typescript/components/executiontasks/deliver/DeliverETInput.d.ts +0 -1
  150. package/lib/typescript/components/executiontasks/scan/modalConstant.d.ts +0 -1
  151. package/lib/typescript/components/executiontasks/validateOTP/ValidateOTPET.d.ts +3 -3
  152. package/lib/typescript/components/executiontasks/validateOTP/ValidateOTPSchema.d.ts +169 -5
  153. package/lib/typescript/components/executiontasks/validateOTP/ValidateOtpStyles.d.ts +257 -0
  154. package/lib/typescript/components/executiontasks/validateOTP/components/ContactListView.d.ts +3 -0
  155. package/lib/typescript/components/executiontasks/validateOTP/components/OTPView.d.ts +3 -0
  156. package/lib/typescript/components/executiontasks/validateOTP/components/VerificationComplete.d.ts +3 -0
  157. package/lib/typescript/components/executiontasks/validateOTP/constants.d.ts +11 -4
  158. package/lib/typescript/components/executiontasks/validateOTP/sub-components/ContactCard.d.ts +8 -0
  159. package/lib/typescript/components/executiontasks/validateOTP/sub-components/ResendOTPButton.d.ts +12 -0
  160. package/lib/typescript/components/executiontasks/validateOTP/utils.d.ts +31 -7
  161. package/lib/typescript/components/utils/Scale.d.ts +4 -0
  162. package/lib/typescript/components/widgets/ConfirmCancelModal.d.ts +9 -0
  163. package/lib/typescript/components/widgets/SnackBarCustom.d.ts +4 -8
  164. package/lib/typescript/components/widgets/SplitTextInput.d.ts +1 -1
  165. package/lib/typescript/components/widgets/Timer.d.ts +3 -3
  166. package/lib/typescript/constants/apiConstants.d.ts +3 -0
  167. package/lib/typescript/constants/constants.d.ts +1 -0
  168. package/lib/typescript/icons/index.d.ts +4 -0
  169. package/lib/typescript/index.d.ts +2 -0
  170. package/lib/typescript/manager/sdk/callbacksHandler.d.ts +4 -1
  171. package/lib/typescript/manager/syncmanager/constants.d.ts +2 -0
  172. package/lib/typescript/models/execTasks/ETConfig.d.ts +1 -1
  173. package/lib/typescript/models/sdk.d.ts +3 -0
  174. package/lib/typescript/network/GraphQLClient.d.ts +4 -4
  175. package/lib/typescript/styles/executionTasks/CommonStyles.d.ts +2 -2
  176. package/lib/typescript/ui/screens/HttpRequestScreen.d.ts +0 -1
  177. package/lib/typescript/utils/ApiUtils.d.ts +6 -2
  178. package/lib/typescript/utils/ExecTaskUtils.d.ts +1 -0
  179. package/lib/typescript/utils/context/paymentContext.d.ts +0 -1
  180. package/lib/typescript/utils/context/valdiateOTPContext.d.ts +6 -0
  181. package/lib/typescript/utils/hooks/useModal.d.ts +0 -2
  182. package/lib/typescript/utils/hooks/useTimer.d.ts +7 -5
  183. package/package.json +46 -44
  184. package/src/components/dispatch/DispatchExecNavigator.tsx +1 -1
  185. package/src/components/executiontasks/forms/widgets/DateTimeWidget.tsx +2 -2
  186. package/src/components/executiontasks/imageCapture/CaptureUtils.ts +1 -1
  187. package/src/components/executiontasks/validateOTP/ValidateOTPET.tsx +654 -381
  188. package/src/components/executiontasks/validateOTP/ValidateOTPSchema.ts +193 -8
  189. package/src/components/executiontasks/validateOTP/ValidateOtpStyles.ts +298 -0
  190. package/src/components/executiontasks/validateOTP/components/ContactListView.tsx +109 -0
  191. package/src/components/executiontasks/validateOTP/components/OTPView.tsx +216 -0
  192. package/src/components/executiontasks/validateOTP/components/VerificationComplete.tsx +124 -0
  193. package/src/components/executiontasks/validateOTP/constants.ts +11 -4
  194. package/src/components/executiontasks/validateOTP/sub-components/ContactCard.tsx +72 -0
  195. package/src/components/executiontasks/validateOTP/sub-components/OTPInput.tsx +13 -7
  196. package/src/components/executiontasks/validateOTP/sub-components/ResendOTPButton.tsx +86 -0
  197. package/src/components/executiontasks/validateOTP/utils.ts +313 -143
  198. package/src/components/utils/Scale.ts +13 -0
  199. package/src/components/widgets/ConfirmCancelModal.tsx +49 -0
  200. package/src/components/widgets/SnackBarCustom.tsx +37 -13
  201. package/src/components/widgets/SplitTextInput.tsx +58 -21
  202. package/src/constants/apiConstants.ts +3 -0
  203. package/src/constants/constants.ts +2 -2
  204. package/src/icons/icExclamationcircleo_dark.svg +3 -0
  205. package/src/icons/icFailed.gif +0 -0
  206. package/src/icons/icRadioChecked.svg +4 -0
  207. package/src/icons/icRadioUnchecked.svg +4 -0
  208. package/src/icons/icSuccess.gif +0 -0
  209. package/src/icons/index.ts +5 -0
  210. package/src/index.tsx +2 -0
  211. package/src/manager/sdk/DispatchSDKManager.ts +6 -5
  212. package/src/manager/sdk/callbacksHandler.ts +29 -12
  213. package/src/manager/syncmanager/AppSyncManager.ts +4 -7
  214. package/src/manager/syncmanager/constants.ts +2 -0
  215. package/src/manager/syncmanager/document/DocumentHttpClient.ts +29 -29
  216. package/src/manager/syncmanager/document/DocumentSyncManager.ts +75 -84
  217. package/src/models/sdk.ts +6 -0
  218. package/src/ui/screens/ValidateOTPScreen.tsx +194 -32
  219. package/src/utils/ApiUtils.ts +131 -3
  220. package/src/utils/ExecTaskUtils.ts +77 -15
  221. package/src/utils/context/valdiateOTPContext.ts +9 -0
  222. package/src/utils/helper.ts +0 -1
  223. package/src/utils/hooks/useTimer.ts +94 -36
@@ -1,264 +1,467 @@
1
- import { View, Text, StyleSheet, BackHandler, Platform } from 'react-native';
2
- import React, { useState, useLayoutEffect } from 'react';
3
- import { Button, Modal, Portal, Provider } from 'react-native-paper';
4
- import { SvgXml } from 'react-native-svg';
5
- import OTPInput from './sub-components/OTPInput';
6
- import type { ValidateOTPInput } from './ValidateOTPSchema';
7
- import useTimer from '../../../utils/hooks/useTimer';
1
+ /* eslint-disable @typescript-eslint/no-unused-vars */
2
+ /* eslint-disable react-native/no-inline-styles */
3
+ // External Libraries
4
+ import React, {
5
+ useState,
6
+ useLayoutEffect,
7
+ useEffect,
8
+ FC,
9
+ useContext,
10
+ } from 'react';
11
+ import { View, Text, Platform } from 'react-native';
12
+
13
+ // UI Libraries and Icons
8
14
  import {
9
- CommonStyles,
10
- Fonts,
11
- } from '../../../styles/executionTasks/CommonStyles';
12
- import { generateOTP, parseRetryConfig } from './utils';
13
- import { checkForValidation } from './utils';
15
+ ActivityIndicator,
16
+ Button,
17
+ Portal,
18
+ Provider,
19
+ } from 'react-native-paper';
20
+
21
+ // Utility Functions and Hooks
22
+ import { getBaseETResponse } from '../../../utils/ExecTaskUtils';
23
+ import { hasGoBackConnector } from '../../../components/utils';
14
24
  import {
15
- ERROR_GENERATING_OTP,
16
- INVALID_OTP,
17
- INVALID_OTP_LENGTH,
18
- mobileSVG,
19
- } from './constants';
25
+ countType,
26
+ generateOTP,
27
+ getCount,
28
+ parseResendConfig,
29
+ updateResendCount,
30
+ updateRetryCount,
31
+ VALIDATE_OTP_SCREENS,
32
+ verifyOTP,
33
+ } from './utils';
34
+
35
+ // Dispatch Codes and Models
36
+ import { getEventCodeByET } from '../../../manager/dispatchCodes/EventCodeContainer';
20
37
  import {
21
38
  EntityCode,
22
39
  ExecutionTaskID,
23
40
  } from '../../../models/execTasks/ETConfig';
24
- import { getBaseETResponse } from '../../../utils/ExecTaskUtils';
25
- import { getEventCodeByET } from '../../../manager/dispatchCodes/EventCodeContainer';
41
+ import { ValidateOTPContext } from '../../../utils/context/valdiateOTPContext';
42
+
43
+ // Schema and Types
44
+ import {
45
+ ContactTypes,
46
+ InputType,
47
+ OtpDeliveryMethodTypes,
48
+ OtpInputConfigType,
49
+ ResendOTPConfigType,
50
+ SetSnackBarType,
51
+ ValidationType,
52
+ type ValidateOTPInput,
53
+ } from './ValidateOTPSchema';
54
+
55
+ // Constants
56
+ import { GO_BACK_EVENT_CODE } from '../../../constants/constants';
57
+ import {
58
+ ERROR_GENERATING_OTP,
59
+ ERROR_VALIDATE_OTP,
60
+ INVALID_OTP,
61
+ INVALID_OTP_LENGTH,
62
+ INVALID_OTP_ONE_ATTEMPT_LEFT,
63
+ OTP_SENT_SUCCESSFULLY,
64
+ UNABLE_TO_SEND_OTP,
65
+ } from './constants';
66
+
67
+ // Components
26
68
  import SnackBarCustom, {
27
69
  SnackBarType,
28
70
  } from '../../../components/widgets/SnackBarCustom';
29
- import Icon from 'react-native-vector-icons/MaterialIcons';
30
- import { GO_BACK_EVENT_CODE } from '../../../constants/constants';
31
- import { hasGoBackConnector } from '../../../components/utils';
32
71
  import GoBackModal from '../../../components/widgets/GoBackModal';
33
- import { useFocusEffect } from '@react-navigation/native';
34
- import { ScreenNameSdkConstants, SentryEventNameSdkConstants, SeverityLevelValue } from '../../../analytics/sentry/SentrySdkConstants';
35
- import { fireEventWithScreenName } from '../../../analytics/sentry/SentryAnalyticsUtils';
72
+ import ConfirmCancelModal from '../../../components/widgets/ConfirmCancelModal';
73
+ import { OTPView } from './components/OTPView';
74
+ import { ContactListView } from './components/ContactListView';
75
+ import VerificationComplete from './components/VerificationComplete';
76
+ import ProgressDialog from '../../widgets/ProgressDialog';
36
77
 
37
- const ValidateOTPET = (props: ValidateOTPInput) => {
38
- const [showBackModal, setShowBackModal] = useState(false);
39
-
40
- // Handle back-button click
41
- useFocusEffect(
42
- React.useCallback(() => {
43
- const onBackPress = () => {
44
- if (
45
- props.taskMeta?.enableGoBack &&
46
- hasGoBackConnector(props.applicableReasons)
47
- ) {
48
- setShowBackModal(true);
49
- return true;
50
- } else {
51
- props.navigation.goBack();
52
- return true;
53
- }
54
- };
55
- BackHandler.addEventListener('hardwareBackPress', onBackPress);
56
- return () =>
57
- BackHandler.removeEventListener('hardwareBackPress', onBackPress);
58
- }, [])
59
- );
78
+ // Styles
79
+ import styles from './ValidateOtpStyles';
80
+ import {
81
+ CommonStyles,
82
+ Fonts,
83
+ } from '../../../styles/executionTasks/CommonStyles';
60
84
 
61
- useLayoutEffect(() => {
62
- props.navigation.setOptions({
63
- title: props.title,
64
- headerLeft: () => {
65
- return (
66
- <Icon
67
- onPress={() => {
68
- if (
69
- props.taskMeta?.enableGoBack &&
70
- hasGoBackConnector(props.applicableReasons)
71
- )
72
- setShowBackModal(true);
73
- else props.navigation.goBack();
74
- const cta = 'Arrow Back';
75
- fireEventWithScreenName({ severityLevel: SeverityLevelValue.LOG, eventName: SentryEventNameSdkConstants.BUTTON_CLICKED, screenName: ScreenNameSdkConstants.VALIDATE_OTP_ET_SCREEN, cta: cta });
76
-
77
- }}
78
- name="arrow-back"
79
- color={'black'}
80
- size={25}
81
- style={{
82
- paddingRight: 15,
83
- paddingTop: 5,
84
- }}
85
- />
86
- );
87
- },
88
- });
89
- }, [props.navigation, props.title]);
85
+ // Analytics
86
+ import {
87
+ ScreenNameSdkConstants,
88
+ SentryEventNameSdkConstants,
89
+ SeverityLevelValue,
90
+ } from '../../../analytics/sentry/SentrySdkConstants';
91
+ import { fireEventWithScreenName } from '../../../analytics/sentry/SentryAnalyticsUtils';
90
92
 
91
- const retryConfig = parseRetryConfig(props.generationLogic?.retryConfig);
93
+ const ValidateOTPET: FC<ValidateOTPInput> = (props) => {
94
+ const { contacts, navigation } = props;
95
+ // Context
96
+ const validateConfigContext = useContext(ValidateOTPContext);
97
+ const domain = validateConfigContext?.sdkConfig?.validateOtpDomain ?? '';
92
98
 
93
- const initialMinute = Math.floor(retryConfig.delay / 60);
94
- const initialSeconds = parseInt((retryConfig.delay % 60).toFixed(0));
95
- const [timer, resetTimer] = useTimer({
96
- initialMinute,
97
- initialSeconds,
98
- });
99
+ // Configurations
100
+ const resendConfig: ResendOTPConfigType = parseResendConfig(props.resendOTP);
101
+ const otpInputConfig: OtpInputConfigType = {
102
+ inputType: props.inputType || InputType.NUMBER,
103
+ length: props.otpLength || 6,
104
+ validationRegex: `^[0-9]+$`,
105
+ };
99
106
 
100
- const [sendOTP, setSendOTP] = useState(
101
- Boolean(props.generationLogic?.generateOnLoad)
107
+ // State: Contact Management
108
+ const [contactList, setContactList] = useState<ContactTypes[]>(contacts);
109
+ const [selectedContact, setSelectedContact] = useState<ContactTypes>(
110
+ contactList[0] || null
111
+ );
112
+ const [isContactVisited, setIsContactVisited] = useState<boolean>(
113
+ props.doorstepOTP
102
114
  );
103
- const [retryCount, setRetryCount] = useState(0);
104
115
 
116
+ // State: OTP Handling
105
117
  const [userInput, setUserInput] = useState({
106
118
  captureInput: '',
107
119
  });
108
120
  const { captureInput: otpCode } = userInput;
109
-
110
- const setOTPCode = (otpCode: string) => {
111
- setUserInput({ ...userInput, captureInput: otpCode });
121
+ const setOTPCode = (code: string) => {
122
+ setUserInput({ ...userInput, captureInput: code });
112
123
  };
124
+ const [retryCount, setRetryCount] = useState<number>(0);
125
+ const [resendCount, setResendCount] = useState<number>(0);
126
+ const [disableProceedBtn, setDisableProceedBtn] = useState(false);
113
127
 
114
- const [hasError, setHasError] = useState(false);
115
- const [errorMessage, setErrorMessage] = useState('');
128
+ // State: UI and Navigation
129
+ const [showBackModal, setShowBackModal] = useState<boolean>(false);
130
+ const [showCancelModal, setShowCancelModal] = useState<boolean>(false);
131
+ const [loading, setLoading] = useState<boolean>(false);
132
+ const [hasError, setHasError] = useState<boolean>(false);
133
+ const [errorMessage, setErrorMessage] = useState<string>('');
134
+ const [success, setSuccess] = useState<boolean>(false);
135
+ const [shouldNavigateBack, setShouldNavigateBack] = useState<boolean>(false);
136
+ const [currentScreen, setCurrentScreen] = useState<string>(
137
+ props.doorstepOTP
138
+ ? VALIDATE_OTP_SCREENS.CONTACT_LIST
139
+ : VALIDATE_OTP_SCREENS.OTP_VIEW
140
+ );
116
141
 
117
- const [snackBar, setSnackBar] = useState({
142
+ // State: SnackBar
143
+ const [snackBar, setSnackBar] = useState<SetSnackBarType>({
118
144
  show: false,
119
- type: SnackBarType.SUCCESS,
145
+ type: SnackBarType.OTP_SUCCESS,
120
146
  message: '',
121
147
  });
122
148
 
123
- const renderButtons = () => {
124
- return (
125
- <View style={styles.bottomView}>
126
- <View>
127
- <Button
128
- style={[CommonStyles.nextButton, { width: 165, marginStart: 10 }]}
129
- labelStyle={CommonStyles.nextButtonLabel}
130
- mode={'contained'}
131
- uppercase={false}
132
- onPress={async () => {
133
- // send OTP Generation using props
134
- if (
135
- sendOTP &&
136
- props.generationLogic &&
137
- props.generationLogic?.generateOnLoad
138
- ) {
139
- const response = await generateOTP(props.generationLogic.api);
140
- resetTimer();
141
- if (response) setSendOTP(false);
142
- else
143
- setSnackBar({
144
- show: true,
145
- message: ERROR_GENERATING_OTP,
146
- type: SnackBarType.FAILURE,
147
- });
148
- }
149
- // check for Validation
150
- else if (!sendOTP) {
151
- if (otpCode.length < props.captureInput.length) {
152
- setSnackBar({
153
- show: true,
154
- message: INVALID_OTP_LENGTH.replace(
155
- '<length>',
156
- `${props.captureInput.length}`
157
- ),
158
- type: SnackBarType.FAILURE,
159
- });
160
- } else {
161
- const isValid = await checkForValidation(
162
- otpCode,
163
- props.validation,
164
- { userInput }
165
- );
166
-
167
- if (!isValid) {
168
- setErrorMessage(INVALID_OTP);
169
- setHasError(true);
170
- } else {
171
- props.onSubmitET({
172
- ...(await getBaseETResponse(
173
- EntityCode.VALIDATE_OTP_ET,
174
- true,
175
- getEventCodeByET(
176
- ExecutionTaskID.VALIDATE_OTP_ET,
177
- true,
178
- props.applicableReasons?.success
179
- ),
180
- '',
181
- props.mergedObjectiveId,
182
- ExecutionTaskID.VALIDATE_OTP_ET
183
- )),
184
- });
185
- }
186
- }
187
- }
188
- const cta = 'Proceed';
189
- fireEventWithScreenName({ severityLevel: SeverityLevelValue.LOG, eventName: SentryEventNameSdkConstants.BUTTON_CLICKED, screenName: ScreenNameSdkConstants.VALIDATE_OTP_ET_SCREEN, cta: cta });
190
-
191
- }}
192
- >
193
- Proceed
194
- </Button>
195
- </View>
196
- <View>
197
- <Button
198
- style={[CommonStyles.cancelButton, { width: 165, marginEnd: 10 }]}
199
- labelStyle={CommonStyles.cancelButtonLabel}
200
- mode={'outlined'}
201
- uppercase={false}
202
- onPress={async () => {
203
- // Cancel the ET
204
- props.onSubmitET({
205
- ...(await getBaseETResponse(
206
- EntityCode.VALIDATE_OTP_ET,
207
- false,
208
- getEventCodeByET(
209
- ExecutionTaskID.VALIDATE_OTP_ET,
210
- false,
211
- props.applicableReasons?.failure
212
- ),
213
- '',
214
- props.mergedObjectiveId,
215
- ExecutionTaskID.VALIDATE_OTP_ET
216
- )),
217
- });
218
- const cta = 'Skip';
219
- fireEventWithScreenName({ severityLevel: SeverityLevelValue.LOG, eventName: SentryEventNameSdkConstants.BUTTON_CLICKED, screenName: ScreenNameSdkConstants.VALIDATE_OTP_ET_SCREEN, cta: cta });
220
-
221
- }}
222
- >
223
- Skip
224
- </Button>
225
- </View>
226
- </View>
227
- );
228
- };
149
+ useEffect(() => {
150
+ const fetchCounts = async () => {
151
+ // eslint-disable-next-line no-shadow
152
+ const retryCount = await getCount(countType.RETRY);
153
+ // eslint-disable-next-line no-shadow
154
+ const resendCount = await getCount(countType.RESEND);
155
+ setRetryCount(retryCount);
156
+ setResendCount(resendCount);
157
+ };
229
158
 
230
- const renderRetryButton = () => {
231
- const generationLogic = props.generationLogic;
232
- const enableRetry = props.generationLogic?.enableRetry;
159
+ fetchCounts();
160
+ }, []);
233
161
 
234
- if (generationLogic && enableRetry) {
235
- return (
236
- <View style={styles.retryButton}>
237
- <Button
238
- disabled={Boolean(timer) || retryCount === retryConfig.maxAttempt}
239
- uppercase={false}
240
- onPress={async () => {
241
- setOTPCode('');
242
- setRetryCount((retryCount) => retryCount + 1);
243
- await generateOTP(generationLogic.api);
244
- resetTimer();
245
- const cta = retryConfig.buttonTitle;
246
- fireEventWithScreenName({ severityLevel: SeverityLevelValue.LOG, eventName: SentryEventNameSdkConstants.BUTTON_CLICKED, screenName: ScreenNameSdkConstants.VALIDATE_OTP_ET_SCREEN, cta: cta });
247
-
248
- }}
249
- >{`${retryConfig.buttonTitle} ${timer ? `in ${timer}` : ''}`}</Button>
250
- </View>
162
+ // TO hide header for modal screen
163
+ useLayoutEffect(() => {
164
+ navigation.setOptions({
165
+ // headerShown: loading ? false : true,
166
+ headerStyle: {
167
+ display: loading ? 'none' : 'flex', // Hide the header by setting its display to 'none'
168
+ },
169
+ });
170
+ // eslint-disable-next-line react-hooks/exhaustive-deps
171
+ }, [loading]);
172
+
173
+ useEffect(() => {
174
+ if (currentScreen === VALIDATE_OTP_SCREENS.OTP_VIEW) {
175
+ setDisableProceedBtn(
176
+ otpCode?.length !== otpInputConfig.length ||
177
+ !selectedContact ||
178
+ hasError
251
179
  );
252
- } else return null;
180
+ } else {
181
+ setDisableProceedBtn(!selectedContact);
182
+ }
183
+ }, [
184
+ currentScreen,
185
+ hasError,
186
+ otpCode?.length,
187
+ otpInputConfig.length,
188
+ selectedContact,
189
+ ]);
190
+
191
+ useEffect(() => {
192
+ if (!contacts) return;
193
+
194
+ // Filter contacts based on the delivery method, or use all contacts if BOTH
195
+ const filteredContacts = contacts
196
+ .filter((contact) =>
197
+ props.otpDeliveryMethod === OtpDeliveryMethodTypes.BOTH
198
+ ? true
199
+ : contact.mode?.toLowerCase() ===
200
+ props.otpDeliveryMethod?.toLowerCase()
201
+ )
202
+ .map((contact, index) => ({
203
+ ...contact,
204
+ isSelected: index === 0, // Select the first contact by default
205
+ }));
206
+
207
+ // Update the state with the filtered contacts
208
+ setContactList(filteredContacts);
209
+ if (props.doorstepOTP) {
210
+ setSelectedContact(filteredContacts[0]);
211
+ }
212
+ }, [contacts, props.doorstepOTP, props.otpDeliveryMethod]);
213
+
214
+ // Monitor shouldNavigateBack to trigger navigation if set
215
+ useEffect(() => {
216
+ if (shouldNavigateBack) {
217
+ navigation.goBack();
218
+ setOTPCode('');
219
+ }
220
+ // eslint-disable-next-line react-hooks/exhaustive-deps
221
+ }, [navigation, shouldNavigateBack]);
222
+
223
+ const handleBackNavigation = () => {
224
+ if (
225
+ props.taskMeta?.enableGoBack &&
226
+ hasGoBackConnector(props.applicableReasons)
227
+ ) {
228
+ setShowBackModal(true);
229
+ } else {
230
+ setShouldNavigateBack(true);
231
+ }
232
+ return true;
253
233
  };
254
234
 
255
- const renderErrorMessage = () => {
256
- return errorMessage ? (
257
- <Text style={styles.errorMessage}>{errorMessage}</Text>
258
- ) : null;
235
+ const onProceedCancel = async () => {
236
+ // Cancel the ET
237
+ props.onSubmitET({
238
+ ...(await getBaseETResponse(
239
+ EntityCode.VALIDATE_OTP_ET,
240
+ false,
241
+ getEventCodeByET(
242
+ ExecutionTaskID.VALIDATE_OTP_ET,
243
+ false,
244
+ props.applicableReasons?.failure
245
+ ),
246
+ '',
247
+ props.mergedObjectiveId,
248
+ ExecutionTaskID.VALIDATE_OTP_ET
249
+ )),
250
+ retryCount: retryCount,
251
+ });
252
+ const cta = 'Cancel';
253
+ fireEventWithScreenName({
254
+ severityLevel: SeverityLevelValue.LOG,
255
+ eventName: SentryEventNameSdkConstants.BUTTON_CLICKED,
256
+ screenName: ScreenNameSdkConstants.VALIDATE_OTP_ET_SCREEN,
257
+ cta: cta,
258
+ });
259
259
  };
260
260
 
261
- const renderModal = () => {
261
+ const handleContactListProceed = async () => {
262
+ try {
263
+ setSnackBar({
264
+ show: false,
265
+ message: '',
266
+ type: SnackBarType.OTP_SUCCESS,
267
+ });
268
+ setLoading(true);
269
+
270
+ const payload = {
271
+ jobId: props.orderData[0]?.jobId,
272
+ refId: props.refId,
273
+ objectiveId: props.workflowId,
274
+ contactInfo: {
275
+ id: selectedContact.id,
276
+ mode: selectedContact.mode,
277
+ type: selectedContact.type,
278
+ index: selectedContact.index,
279
+ },
280
+ meta: {
281
+ orderIds: props.orderData?.map(
282
+ (order) => order?.displayInfo?.orderId
283
+ ),
284
+ },
285
+ };
286
+
287
+ const response = await generateOTP(payload, { ...props, domain });
288
+
289
+ if (!response?.status) {
290
+ if (!response.status && response?.code === '101080001017') {
291
+ setCurrentScreen(VALIDATE_OTP_SCREENS.OTP_VIEW);
292
+ setLoading(false);
293
+ setSnackBar({
294
+ show: true,
295
+ message: response?.data?.result?.message || UNABLE_TO_SEND_OTP,
296
+ type: SnackBarType.OTP_FAILED,
297
+ });
298
+ } else {
299
+ setLoading(false);
300
+ setSnackBar({
301
+ show: true,
302
+ message: response?.data?.result?.message || ERROR_GENERATING_OTP,
303
+ type: SnackBarType.OTP_FAILED,
304
+ });
305
+ }
306
+
307
+ return;
308
+ }
309
+
310
+ const resendCountValue =
311
+ Number(
312
+ response?.data?.result?.resendCount ||
313
+ response?.additionalInfo?.resendOTP
314
+ ) || 0;
315
+
316
+ setResendCount(resendCountValue);
317
+ await updateResendCount(resendCountValue);
318
+ setCurrentScreen(VALIDATE_OTP_SCREENS.OTP_VIEW);
319
+ setLoading(false);
320
+ setSnackBar({
321
+ show: true,
322
+ message: OTP_SENT_SUCCESSFULLY,
323
+ type: SnackBarType.OTP_SUCCESS,
324
+ });
325
+ } catch (error) {
326
+ setLoading(false);
327
+ console.error('Error in handleContactListProceed:', error);
328
+ setSnackBar({
329
+ show: true,
330
+ message: ERROR_GENERATING_OTP,
331
+ type: SnackBarType.OTP_FAILED,
332
+ });
333
+ }
334
+ };
335
+
336
+ const handleOTPViewProceed = async () => {
337
+ if (otpCode.length < props.otpLength) {
338
+ // Show error if OTP length is invalid
339
+ setSnackBar({
340
+ show: true,
341
+ message: INVALID_OTP_LENGTH.replace('<length>', `${props.otpLength}`),
342
+ type: SnackBarType.OTP_FAILED,
343
+ });
344
+ return;
345
+ }
346
+
347
+ const payload = {
348
+ refId: props.refId,
349
+ otp: otpCode,
350
+ };
351
+
352
+ const isOnlineValidation = props?.otpValidation
353
+ ? props?.otpValidation?.toString()?.toLowerCase() ===
354
+ ValidationType.ONLINE?.toString()?.toLowerCase()
355
+ : true;
356
+
357
+ const response = isOnlineValidation
358
+ ? await verifyOTP(payload, { ...props, domain })
359
+ : otpCode === props.offlineOtpValue;
360
+
361
+ const retryCountValue =
362
+ Number(
363
+ response?.result?.retryCount || response?.additionalInfo?.retryCount
364
+ ) || retryCount + 1;
365
+
366
+ if (response === false || response?.status === false || !response) {
367
+ setOTPCode('');
368
+ setRetryCount(retryCountValue);
369
+ await updateRetryCount(retryCountValue);
370
+
371
+ if (props.maxRetries - retryCountValue === 1) {
372
+ setSnackBar({
373
+ show: true,
374
+ message: INVALID_OTP_ONE_ATTEMPT_LEFT,
375
+ type: SnackBarType.OTP_FAILED,
376
+ });
377
+ } else if (retryCountValue >= props.maxRetries) {
378
+ setSuccess(false);
379
+ setSnackBar({
380
+ show: false,
381
+ message: '',
382
+ type: SnackBarType.OTP_SUCCESS,
383
+ });
384
+ setLoading(true);
385
+ setTimeout(() => {
386
+ setCurrentScreen(VALIDATE_OTP_SCREENS.VERIFICATION_COMPLETE);
387
+ setLoading(false);
388
+ }, 1000);
389
+ } else {
390
+ setSnackBar({
391
+ show: true,
392
+ message: INVALID_OTP.replace(
393
+ '<length>',
394
+ `${props.maxRetries - retryCountValue}`
395
+ ),
396
+ type: SnackBarType.OTP_FAILED,
397
+ });
398
+ }
399
+ } else {
400
+ setSuccess(true);
401
+ setSnackBar({
402
+ show: false,
403
+ message: '',
404
+ type: SnackBarType.OTP_SUCCESS,
405
+ });
406
+ setLoading(true);
407
+ setTimeout(() => {
408
+ setCurrentScreen(VALIDATE_OTP_SCREENS.VERIFICATION_COMPLETE);
409
+ setLoading(false);
410
+ }, 1000);
411
+ }
412
+ };
413
+
414
+ const onProceed = async () => {
415
+ try {
416
+ if (currentScreen === VALIDATE_OTP_SCREENS.CONTACT_LIST) {
417
+ handleContactListProceed();
418
+ } else {
419
+ handleOTPViewProceed();
420
+ }
421
+ const cta = 'Proceed';
422
+ fireEventWithScreenName({
423
+ severityLevel: SeverityLevelValue.LOG,
424
+ eventName: SentryEventNameSdkConstants.BUTTON_CLICKED,
425
+ screenName: ScreenNameSdkConstants.VALIDATE_OTP_ET_SCREEN,
426
+ cta: cta,
427
+ });
428
+ } catch (error) {
429
+ setLoading(false);
430
+ if (currentScreen === VALIDATE_OTP_SCREENS.CONTACT_LIST) {
431
+ setSnackBar({
432
+ show: true,
433
+ message: ERROR_GENERATING_OTP,
434
+ type: SnackBarType.OTP_FAILED,
435
+ });
436
+ }
437
+ if (currentScreen === VALIDATE_OTP_SCREENS.OTP_VIEW) {
438
+ setSnackBar({
439
+ show: true,
440
+ message: ERROR_VALIDATE_OTP,
441
+ type: SnackBarType.OTP_FAILED,
442
+ });
443
+ }
444
+ }
445
+
446
+ return;
447
+ };
448
+
449
+ const onCancelET = () => {
450
+ setShowCancelModal(true);
451
+ };
452
+
453
+ const handleSelectContact = (contactDetails: ContactTypes) => {
454
+ setSelectedContact(contactDetails);
455
+ setContactList((prevContactList) =>
456
+ prevContactList.map((contact: ContactTypes) => ({
457
+ ...contact,
458
+ isSelected: contact?.value === contactDetails.value,
459
+ }))
460
+ );
461
+ };
462
+
463
+ // *Rendering components*
464
+ const renderGoBackModal = () => {
262
465
  return (
263
466
  <GoBackModal
264
467
  showModal={showBackModal}
@@ -273,6 +476,7 @@ const ValidateOTPET = (props: ValidateOTPInput) => {
273
476
  props.mergedObjectiveId,
274
477
  ExecutionTaskID.VALIDATE_OTP_ET
275
478
  )),
479
+ retryCount: retryCount,
276
480
  });
277
481
  setShowBackModal(false);
278
482
  }}
@@ -281,170 +485,239 @@ const ValidateOTPET = (props: ValidateOTPInput) => {
281
485
  );
282
486
  };
283
487
 
284
- if (sendOTP) {
488
+ const renderCancelModal = () => {
285
489
  return (
286
- <Provider>
287
- <View style={CommonStyles.mainContainer}>
288
- {renderModal()}
289
- <View
290
- style={{
291
- flex: 1,
292
- justifyContent: 'center',
293
- alignItems: 'center',
294
- marginHorizontal: 18,
295
- }}
296
- >
297
- <View style={{ marginBottom: 16 }}>
298
- {Platform.OS === 'android' && <SvgXml xml={mobileSVG} /> }
299
- </View>
300
- <View style={{ marginTop: 16 }}>
301
- <Text style={styles.titleText}>
302
- Do you want to proceed to OTP verification? This will send a
303
- verification code to your consignee.
304
- </Text>
305
- </View>
306
- </View>
307
- {renderButtons()}
308
- <SnackBarCustom
309
- type={snackBar.type}
310
- message={`${snackBar.message}`}
311
- visible={snackBar.show}
312
- onDismiss={() => {
313
- setSnackBar({
314
- show: false,
315
- message: '',
316
- type: SnackBarType.SUCCESS,
317
- });
318
- }}
319
- />
490
+ <ConfirmCancelModal
491
+ showModal={showCancelModal}
492
+ setShowModal={setShowCancelModal}
493
+ onSuccess={() => {
494
+ onProceedCancel();
495
+ setShowCancelModal(false);
496
+ }}
497
+ onFailure={() => setShowCancelModal(false)}
498
+ />
499
+ );
500
+ };
501
+
502
+ const renderButtons = () => {
503
+ if (loading || currentScreen === VALIDATE_OTP_SCREENS.VERIFICATION_COMPLETE)
504
+ return null;
505
+ return (
506
+ <View style={styles.bottomView}>
507
+ <Button
508
+ style={[
509
+ styles.mainBtnStyles,
510
+ CommonStyles.nextButton,
511
+ { borderRadius: 6 },
512
+ disableProceedBtn && { backgroundColor: '#E0E3EB' },
513
+ ]}
514
+ labelStyle={[
515
+ CommonStyles.nextButtonLabel,
516
+ styles.activeBtnText,
517
+ disableProceedBtn && disableProceedBtn && { color: '#A3AAC2' },
518
+ ]}
519
+ mode={'contained'}
520
+ uppercase={false}
521
+ disabled={disableProceedBtn}
522
+ onPress={onProceed}
523
+ >
524
+ Proceed
525
+ </Button>
526
+ {props.restrictCancel === true || props.allowCancel === false
527
+ ? null
528
+ : props.isSelfLoop == false && (
529
+ <Button
530
+ style={[
531
+ styles.mainBtnStyles,
532
+ CommonStyles.cancelButton,
533
+ { borderRadius: 4 },
534
+ ]}
535
+ labelStyle={[
536
+ CommonStyles.cancelButtonLabel,
537
+ styles.cancelBtnText,
538
+ ]}
539
+ mode={'outlined'}
540
+ uppercase={false}
541
+ onPress={onCancelET}
542
+ >
543
+ Cancel
544
+ </Button>
545
+ )}
546
+ </View>
547
+ );
548
+ };
549
+
550
+ const renderLoadingCard = () => {
551
+ return (
552
+ <View
553
+ style={{
554
+ flex: 1,
555
+ justifyContent: 'center',
556
+ }}
557
+ >
558
+ <View style={styles.loadingCard}>
559
+ <ActivityIndicator size="small" color="rgba(107, 142, 255, 1)" />
560
+ <Text style={styles.loadingText}>Loading</Text>
320
561
  </View>
321
- </Provider>
562
+ </View>
322
563
  );
323
- }
324
- if (!sendOTP) {
564
+ };
565
+
566
+ const renderSnackBar = () => {
567
+ if (!snackBar.show) return null; // Show snackbar only when `snackBar.show` is true
325
568
  return (
326
- <Provider>
327
- <View style={CommonStyles.mainContainer}>
328
- {renderModal()}
329
- <View style={styles.otpContainer}>
330
- <View style={styles.otpTitle}>
331
- <Text>
332
- Enter the {props.captureInput?.length} digit OTP sent to the
333
- consignee to confirm order completion
334
- </Text>
335
- </View>
336
- <OTPInput
337
- input={props.captureInput}
569
+ <View style={{ marginHorizontal: 6 }}>
570
+ <SnackBarCustom
571
+ duration={2000}
572
+ type={snackBar.type}
573
+ customBottom={80}
574
+ message={`${snackBar.message}`}
575
+ visible={snackBar.show}
576
+ onDismiss={() => {
577
+ setSnackBar({
578
+ show: false,
579
+ message: '',
580
+ type: SnackBarType.OTP_SUCCESS,
581
+ });
582
+ }}
583
+ />
584
+ </View>
585
+ );
586
+ };
587
+
588
+ const renderContent = () => {
589
+ // if (loading) {
590
+ // return renderLoadingCard;
591
+ // }
592
+
593
+ if (currentScreen === VALIDATE_OTP_SCREENS.VERIFICATION_COMPLETE) {
594
+ return (
595
+ <VerificationComplete
596
+ {...props}
597
+ setLoading={setLoading}
598
+ success={success}
599
+ retryCount={retryCount}
600
+ />
601
+ );
602
+ }
603
+
604
+ if (currentScreen === VALIDATE_OTP_SCREENS.CONTACT_LIST) {
605
+ return (
606
+ <ContactListView
607
+ {...props}
608
+ setIsContactVisited={setIsContactVisited}
609
+ handleSelectContact={handleSelectContact}
610
+ handleBackNavigation={handleBackNavigation}
611
+ contactList={contactList}
612
+ domain={domain}
613
+ />
614
+ );
615
+ }
616
+
617
+ if (currentScreen === VALIDATE_OTP_SCREENS.OTP_VIEW) {
618
+ return (
619
+ <OTPView
620
+ {...props}
621
+ isContactVisited={isContactVisited}
622
+ otpCode={otpCode}
623
+ otpInputConfig={otpInputConfig}
624
+ selectedContact={selectedContact}
625
+ setCurrentScreen={setCurrentScreen}
626
+ setErrorMessage={setErrorMessage}
627
+ setSnackBar={setSnackBar}
628
+ errorMessage={errorMessage}
629
+ setHasError={setHasError}
630
+ setOTPCode={setOTPCode}
631
+ setLoading={setLoading}
632
+ handleBackNavigation={handleBackNavigation}
633
+ hasError={hasError}
634
+ doorstepOTP={props.doorstepOTP}
635
+ setResendCount={setResendCount}
636
+ resendCount={resendCount}
637
+ resendConfig={resendConfig}
638
+ domain={domain}
639
+ />
640
+ );
641
+ }
642
+
643
+ return null;
644
+ };
645
+
646
+ return (
647
+ <Provider>
648
+ <Portal>
649
+ {loading ? (
650
+ <ProgressDialog
651
+ customModalContentStyle={{ paddingVertical: 32 }}
652
+ visible={loading}
653
+ label="Loading"
654
+ labelStyle={{
655
+ fontWeight: '400',
656
+ marginTop: 16,
657
+ fontFamily:
658
+ Platform.OS === 'android'
659
+ ? Fonts.IBMPlexSans_400Regular
660
+ : 'IBMPlexSans-Regular',
661
+ color: '#525B7A',
662
+ letterSpacing: 0.25,
663
+ }}
664
+ />
665
+ ) : currentScreen === VALIDATE_OTP_SCREENS.VERIFICATION_COMPLETE ? (
666
+ <View style={[CommonStyles.mainContainer]}>
667
+ <VerificationComplete
668
+ {...props}
669
+ setLoading={setLoading}
670
+ success={success}
671
+ retryCount={retryCount}
672
+ />
673
+ </View>
674
+ ) : currentScreen === VALIDATE_OTP_SCREENS.CONTACT_LIST ? (
675
+ <View style={[CommonStyles.mainContainer]}>
676
+ {renderGoBackModal()}
677
+ {renderCancelModal()}
678
+ <ContactListView
679
+ {...props}
680
+ setIsContactVisited={setIsContactVisited}
681
+ handleSelectContact={handleSelectContact}
682
+ handleBackNavigation={handleBackNavigation}
683
+ contactList={contactList}
684
+ domain={domain}
685
+ />
686
+ {renderButtons()}
687
+ {renderSnackBar()}
688
+ </View>
689
+ ) : currentScreen === VALIDATE_OTP_SCREENS.OTP_VIEW ? (
690
+ <View style={[CommonStyles.mainContainer]}>
691
+ {renderGoBackModal()}
692
+ {renderCancelModal()}
693
+ <OTPView
694
+ {...props}
695
+ isContactVisited={isContactVisited}
338
696
  otpCode={otpCode}
697
+ otpInputConfig={otpInputConfig}
698
+ selectedContact={selectedContact}
699
+ setCurrentScreen={setCurrentScreen}
700
+ setErrorMessage={setErrorMessage}
701
+ setSnackBar={setSnackBar}
702
+ errorMessage={errorMessage}
703
+ setHasError={setHasError}
339
704
  setOTPCode={setOTPCode}
705
+ setLoading={setLoading}
706
+ handleBackNavigation={handleBackNavigation}
340
707
  hasError={hasError}
341
- setHasError={setHasError}
342
- setErrorMessage={setErrorMessage}
708
+ doorstepOTP={props.doorstepOTP}
709
+ setResendCount={setResendCount}
710
+ resendCount={resendCount}
711
+ resendConfig={resendConfig}
712
+ domain={domain}
343
713
  />
344
- {renderErrorMessage()}
345
- {renderRetryButton()}
714
+ {renderButtons()}
715
+ {renderSnackBar()}
346
716
  </View>
347
- {renderButtons()}
348
- <SnackBarCustom
349
- type={snackBar.type}
350
- message={`${snackBar.message}`}
351
- visible={snackBar.show}
352
- onDismiss={() => {
353
- setSnackBar({
354
- show: false,
355
- message: '',
356
- type: SnackBarType.SUCCESS,
357
- });
358
- }}
359
- />
360
- </View>
361
- </Provider>
362
- );
363
- }
364
- return null;
717
+ ) : null}
718
+ </Portal>
719
+ </Provider>
720
+ );
365
721
  };
366
722
 
367
723
  export default ValidateOTPET;
368
-
369
- const styles = StyleSheet.create({
370
- bottomView: {
371
- flexDirection: 'row-reverse',
372
- justifyContent: 'space-evenly',
373
- padding: 16,
374
- backgroundColor: 'white',
375
- },
376
- titleText: {
377
- justifyContent: 'center',
378
- fontFamily:
379
- Platform.OS === 'android'
380
- ? Fonts.IBMPlexSans_400Regular
381
- : 'IBMPlexSans-Regular',
382
- fontStyle: 'normal',
383
- fontSize: 16,
384
- lineHeight: 20,
385
- letterSpacing: 0.25,
386
- textAlign: 'center',
387
- color: '#3D445C',
388
- marginBottom: 10,
389
- },
390
- otpTitle: {
391
- marginTop: 10,
392
- marginBottom: 20,
393
- fontFamily:
394
- Platform.OS === 'android'
395
- ? Fonts.IBMPlexSans_400Regular
396
- : 'IBMPlexSans-Regular',
397
- fontStyle: 'normal',
398
- fontSize: 16,
399
- lineHeight: 20,
400
- letterSpacing: 0.25,
401
- color: '#3D445C',
402
- alignItems: 'center',
403
- },
404
- otpContainer: {
405
- marginTop: 20,
406
- marginBottom: 40,
407
- marginHorizontal: 10,
408
- flex: 1,
409
- },
410
- retryButton: {
411
- alignItems: 'flex-start',
412
- marginVertical: 10,
413
- },
414
- errorMessage: {
415
- marginTop: 16,
416
- marginHorizontal: 10,
417
- color: '#DC2626',
418
- fontFamily:
419
- Platform.OS === 'android'
420
- ? Fonts.IBMPlexSans_400Regular
421
- : 'IBMPlexSans-Regular',
422
- fontSize: 12,
423
- lineHeight: 16,
424
- },
425
- subText: {
426
- justifyContent: 'center',
427
- fontFamily:
428
- Platform.OS === 'android'
429
- ? Fonts.IBMPlexSans_400Regular
430
- : 'IBMPlexSans-Regular',
431
- fontStyle: 'normal',
432
- fontSize: 14,
433
- letterSpacing: 0.25,
434
- lineHeight: 20,
435
- textAlign: 'center',
436
- color: '#000000',
437
- marginBottom: 10,
438
- },
439
- modalContent: {
440
- marginStart: 60,
441
- marginEnd: 60,
442
- flex: 1,
443
- marginBottom: 60,
444
- },
445
- modalView: {
446
- backgroundColor: 'white',
447
- padding: 15,
448
- borderRadius: 9,
449
- },
450
- });