@finspringinnovations/fdsdk 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (315) hide show
  1. package/README.md +184 -0
  2. package/lib/api/applicationApi.d.ts +1 -0
  3. package/lib/api/applicationApi.js +11 -0
  4. package/lib/api/bankApi.d.ts +352 -0
  5. package/lib/api/bankApi.js +54 -0
  6. package/lib/api/baseApi.d.ts +8 -0
  7. package/lib/api/baseApi.js +456 -0
  8. package/lib/api/customerApi.d.ts +855 -0
  9. package/lib/api/customerApi.js +213 -0
  10. package/lib/api/fdApi.d.ts +979 -0
  11. package/lib/api/fdApi.js +112 -0
  12. package/lib/api/fdCalculatorApi.d.ts +179 -0
  13. package/lib/api/fdCalculatorApi.js +36 -0
  14. package/lib/api/index.d.ts +14 -0
  15. package/lib/api/index.js +45 -0
  16. package/lib/api/interestRateApi.d.ts +585 -0
  17. package/lib/api/interestRateApi.js +101 -0
  18. package/lib/api/kycApi.d.ts +486 -0
  19. package/lib/api/kycApi.js +71 -0
  20. package/lib/api/masterDataApi.d.ts +158 -0
  21. package/lib/api/masterDataApi.js +32 -0
  22. package/lib/api/nomineeApi.d.ts +325 -0
  23. package/lib/api/nomineeApi.js +46 -0
  24. package/lib/api/onboardingApi.d.ts +192 -0
  25. package/lib/api/onboardingApi.js +41 -0
  26. package/lib/api/panApi.d.ts +0 -0
  27. package/lib/api/panApi.js +23 -0
  28. package/lib/api/paymentApi.d.ts +325 -0
  29. package/lib/api/paymentApi.js +46 -0
  30. package/lib/api/workflowApi.d.ts +654 -0
  31. package/lib/api/workflowApi.js +90 -0
  32. package/lib/assets/images/images.d.ts +4 -0
  33. package/lib/assets/images/images.js +10 -0
  34. package/lib/components/AadhaarInput.d.ts +13 -0
  35. package/lib/components/AadhaarInput.js +47 -0
  36. package/lib/components/ActionButton.d.ts +12 -0
  37. package/lib/components/ActionButton.js +87 -0
  38. package/lib/components/ActiveFDCard.d.ts +16 -0
  39. package/lib/components/ActiveFDCard.js +95 -0
  40. package/lib/components/AmountInput.d.ts +20 -0
  41. package/lib/components/AmountInput.js +144 -0
  42. package/lib/components/CheckboxOption.d.ts +11 -0
  43. package/lib/components/CheckboxOption.js +41 -0
  44. package/lib/components/CompanyHeader.d.ts +7 -0
  45. package/lib/components/CompanyHeader.js +57 -0
  46. package/lib/components/DropdownSelector.d.ts +9 -0
  47. package/lib/components/DropdownSelector.js +49 -0
  48. package/lib/components/EmptyState.d.ts +17 -0
  49. package/lib/components/EmptyState.js +44 -0
  50. package/lib/components/ErrorDisplay.d.ts +17 -0
  51. package/lib/components/ErrorDisplay.js +69 -0
  52. package/lib/components/FAQItem.d.ts +9 -0
  53. package/lib/components/FAQItem.js +52 -0
  54. package/lib/components/FDCard.d.ts +21 -0
  55. package/lib/components/FDCard.js +96 -0
  56. package/lib/components/FormDropdown.d.ts +18 -0
  57. package/lib/components/FormDropdown.js +155 -0
  58. package/lib/components/FormSection.d.ts +14 -0
  59. package/lib/components/FormSection.js +38 -0
  60. package/lib/components/Header.d.ts +14 -0
  61. package/lib/components/Header.js +52 -0
  62. package/lib/components/IFSCSearchResultCard.d.ts +13 -0
  63. package/lib/components/IFSCSearchResultCard.js +70 -0
  64. package/lib/components/InfoBox.d.ts +8 -0
  65. package/lib/components/InfoBox.js +39 -0
  66. package/lib/components/InterestRateCard.d.ts +8 -0
  67. package/lib/components/InterestRateCard.js +46 -0
  68. package/lib/components/LoadingIndicator.d.ts +12 -0
  69. package/lib/components/LoadingIndicator.js +30 -0
  70. package/lib/components/OTPInput.d.ts +17 -0
  71. package/lib/components/OTPInput.js +144 -0
  72. package/lib/components/PaymentDetailsCard.d.ts +20 -0
  73. package/lib/components/PaymentDetailsCard.js +68 -0
  74. package/lib/components/PendingFDBottomSheet.d.ts +18 -0
  75. package/lib/components/PendingFDBottomSheet.js +122 -0
  76. package/lib/components/SafeAreaWrapper.d.ts +13 -0
  77. package/lib/components/SafeAreaWrapper.js +41 -0
  78. package/lib/components/ScreenHeader.d.ts +11 -0
  79. package/lib/components/ScreenHeader.js +46 -0
  80. package/lib/components/StatusDisplay.d.ts +15 -0
  81. package/lib/components/StatusDisplay.js +88 -0
  82. package/lib/components/TextFieldWithLabel.d.ts +46 -0
  83. package/lib/components/TextFieldWithLabel.js +326 -0
  84. package/lib/components/TrustBox.d.ts +8 -0
  85. package/lib/components/TrustBox.js +45 -0
  86. package/lib/components/ValidationErrorAlert.d.ts +23 -0
  87. package/lib/components/ValidationErrorAlert.js +39 -0
  88. package/lib/components/ValidationMessage.d.ts +9 -0
  89. package/lib/components/ValidationMessage.js +98 -0
  90. package/lib/components/index.d.ts +35 -0
  91. package/lib/components/index.js +64 -0
  92. package/lib/config/apiConfig.d.ts +34 -0
  93. package/lib/config/apiConfig.js +158 -0
  94. package/lib/config/appDataConfig.d.ts +114 -0
  95. package/lib/config/appDataConfig.js +264 -0
  96. package/lib/config/encryptionConfig.d.ts +21 -0
  97. package/lib/config/encryptionConfig.js +61 -0
  98. package/lib/config/workflowConstants.d.ts +37 -0
  99. package/lib/config/workflowConstants.js +38 -0
  100. package/lib/constants/strings/bank.d.ts +72 -0
  101. package/lib/constants/strings/bank.js +86 -0
  102. package/lib/constants/strings/base64Images.d.ts +25 -0
  103. package/lib/constants/strings/base64Images.js +28 -0
  104. package/lib/constants/strings/common.d.ts +53 -0
  105. package/lib/constants/strings/common.js +62 -0
  106. package/lib/constants/strings/employee.d.ts +61 -0
  107. package/lib/constants/strings/employee.js +77 -0
  108. package/lib/constants/strings/faq.d.ts +14 -0
  109. package/lib/constants/strings/faq.js +20 -0
  110. package/lib/constants/strings/fd.d.ts +122 -0
  111. package/lib/constants/strings/fd.js +151 -0
  112. package/lib/constants/strings/home.d.ts +49 -0
  113. package/lib/constants/strings/home.js +62 -0
  114. package/lib/constants/strings/index.d.ts +16 -0
  115. package/lib/constants/strings/index.js +44 -0
  116. package/lib/constants/strings/kyc.d.ts +80 -0
  117. package/lib/constants/strings/kyc.js +94 -0
  118. package/lib/constants/strings/nominee.d.ts +64 -0
  119. package/lib/constants/strings/nominee.js +81 -0
  120. package/lib/hooks/useAuth.d.ts +25 -0
  121. package/lib/hooks/useAuth.js +39 -0
  122. package/lib/hooks/useFDData.d.ts +11 -0
  123. package/lib/hooks/useFDData.js +40 -0
  124. package/lib/index.d.ts +69 -0
  125. package/lib/index.js +182 -0
  126. package/lib/navigation/RootNavigator.d.ts +8 -0
  127. package/lib/navigation/RootNavigator.js +205 -0
  128. package/lib/navigation/SimpleNavigator.d.ts +11 -0
  129. package/lib/navigation/SimpleNavigator.js +107 -0
  130. package/lib/navigation/helpers.d.ts +11 -0
  131. package/lib/navigation/helpers.js +83 -0
  132. package/lib/navigation/index.d.ts +15 -0
  133. package/lib/navigation/index.js +42 -0
  134. package/lib/navigation/types.d.ts +113 -0
  135. package/lib/navigation/types.js +2 -0
  136. package/lib/navigation/workflowNavigator.d.ts +22 -0
  137. package/lib/navigation/workflowNavigator.js +104 -0
  138. package/lib/providers/ApiProvider.d.ts +7 -0
  139. package/lib/providers/ApiProvider.js +34 -0
  140. package/lib/providers/MasterDataProvider.d.ts +10 -0
  141. package/lib/providers/MasterDataProvider.js +54 -0
  142. package/lib/screens/AadhaarVerification.d.ts +7 -0
  143. package/lib/screens/AadhaarVerification.js +627 -0
  144. package/lib/screens/AddBankAccount.d.ts +22 -0
  145. package/lib/screens/AddBankAccount.js +381 -0
  146. package/lib/screens/BankDetail.d.ts +16 -0
  147. package/lib/screens/BankDetail.js +596 -0
  148. package/lib/screens/BookFD.d.ts +0 -0
  149. package/lib/screens/BookFD.js +315 -0
  150. package/lib/screens/Employee.d.ts +18 -0
  151. package/lib/screens/Employee.js +594 -0
  152. package/lib/screens/FDCalculator.d.ts +18 -0
  153. package/lib/screens/FDCalculator.js +759 -0
  154. package/lib/screens/FDList.d.ts +27 -0
  155. package/lib/screens/FDList.js +1008 -0
  156. package/lib/screens/FindIFSC.d.ts +16 -0
  157. package/lib/screens/FindIFSC.js +248 -0
  158. package/lib/screens/Home.d.ts +0 -0
  159. package/lib/screens/Home.js +143 -0
  160. package/lib/screens/NomineeDetail.d.ts +17 -0
  161. package/lib/screens/NomineeDetail.js +592 -0
  162. package/lib/screens/PayNow.d.ts +14 -0
  163. package/lib/screens/PayNow.js +230 -0
  164. package/lib/screens/Payment.d.ts +11 -0
  165. package/lib/screens/Payment.js +191 -0
  166. package/lib/screens/PaymentStatus.d.ts +16 -0
  167. package/lib/screens/PaymentStatus.js +397 -0
  168. package/lib/screens/ReviewKYC.d.ts +21 -0
  169. package/lib/screens/ReviewKYC.js +660 -0
  170. package/lib/state/paymentSession.d.ts +8 -0
  171. package/lib/state/paymentSession.js +13 -0
  172. package/lib/store/fdListSelectedSlice.d.ts +21 -0
  173. package/lib/store/fdListSelectedSlice.js +26 -0
  174. package/lib/store/hooks.d.ts +8 -0
  175. package/lib/store/hooks.js +31 -0
  176. package/lib/store/index.d.ts +3 -0
  177. package/lib/store/index.js +8 -0
  178. package/lib/store/onboardingSlice.d.ts +12 -0
  179. package/lib/store/onboardingSlice.js +32 -0
  180. package/lib/store/store.d.ts +13 -0
  181. package/lib/store/store.js +33 -0
  182. package/lib/theme/ThemeContext.d.ts +210 -0
  183. package/lib/theme/ThemeContext.js +90 -0
  184. package/lib/theme/colors.d.ts +80 -0
  185. package/lib/theme/colors.js +85 -0
  186. package/lib/theme/index.d.ts +34 -0
  187. package/lib/theme/index.js +69 -0
  188. package/lib/theme/shadows.d.ts +53 -0
  189. package/lib/theme/shadows.js +58 -0
  190. package/lib/theme/typography.d.ts +134 -0
  191. package/lib/theme/typography.js +143 -0
  192. package/lib/types/dataTypes.d.ts +34 -0
  193. package/lib/types/dataTypes.js +2 -0
  194. package/lib/types/workflowTypes.d.ts +2 -0
  195. package/lib/types/workflowTypes.js +2 -0
  196. package/lib/utils/apiLogger.d.ts +48 -0
  197. package/lib/utils/apiLogger.js +105 -0
  198. package/lib/utils/encryption.d.ts +28 -0
  199. package/lib/utils/encryption.js +113 -0
  200. package/lib/utils/getFDData.d.ts +48 -0
  201. package/lib/utils/getFDData.js +154 -0
  202. package/lib/utils/globalData.d.ts +2 -0
  203. package/lib/utils/globalData.js +10 -0
  204. package/package.json +76 -0
  205. package/src/api/applicationApi.ts +12 -0
  206. package/src/api/bankApi.ts +42 -0
  207. package/src/api/baseApi.ts +513 -0
  208. package/src/api/customerApi.ts +291 -0
  209. package/src/api/fdApi.ts +150 -0
  210. package/src/api/fdCalculatorApi.ts +41 -0
  211. package/src/api/index.ts +29 -0
  212. package/src/api/interestRateApi.ts +143 -0
  213. package/src/api/kycApi.ts +63 -0
  214. package/src/api/masterDataApi.ts +34 -0
  215. package/src/api/nomineeApi.ts +34 -0
  216. package/src/api/onboardingApi.ts +64 -0
  217. package/src/api/panApi.ts +25 -0
  218. package/src/api/paymentApi.ts +34 -0
  219. package/src/api/workflowApi.ts +94 -0
  220. package/src/assets/images/arrow-filled.png +0 -0
  221. package/src/assets/images/arrow-left.png +0 -0
  222. package/src/assets/images/backicon.png +0 -0
  223. package/src/assets/images/calendar.png +0 -0
  224. package/src/assets/images/chevron-down.png +0 -0
  225. package/src/assets/images/chevron-down@2x.png +0 -0
  226. package/src/assets/images/chevron-down@3x.png +0 -0
  227. package/src/assets/images/images.js +8 -0
  228. package/src/components/AadhaarInput.tsx +91 -0
  229. package/src/components/ActionButton.tsx +129 -0
  230. package/src/components/ActiveFDCard.tsx +158 -0
  231. package/src/components/AmountInput.tsx +217 -0
  232. package/src/components/CheckboxOption.tsx +93 -0
  233. package/src/components/CompanyHeader.tsx +78 -0
  234. package/src/components/DropdownSelector.tsx +77 -0
  235. package/src/components/EmptyState.tsx +109 -0
  236. package/src/components/ErrorDisplay.tsx +135 -0
  237. package/src/components/FAQItem.tsx +90 -0
  238. package/src/components/FDCard.tsx +165 -0
  239. package/src/components/FormDropdown.tsx +214 -0
  240. package/src/components/FormSection.tsx +86 -0
  241. package/src/components/Header.tsx +110 -0
  242. package/src/components/IFSCSearchResultCard.tsx +139 -0
  243. package/src/components/InfoBox.tsx +55 -0
  244. package/src/components/InterestRateCard.tsx +77 -0
  245. package/src/components/LoadingIndicator.tsx +63 -0
  246. package/src/components/OTPInput.tsx +213 -0
  247. package/src/components/PaymentDetailsCard.tsx +120 -0
  248. package/src/components/PendingFDBottomSheet.tsx +235 -0
  249. package/src/components/README.md +210 -0
  250. package/src/components/SafeAreaWrapper.tsx +68 -0
  251. package/src/components/ScreenHeader.tsx +83 -0
  252. package/src/components/StatusDisplay.tsx +139 -0
  253. package/src/components/TextFieldWithLabel.tsx +502 -0
  254. package/src/components/TrustBox.tsx +63 -0
  255. package/src/components/ValidationErrorAlert.tsx +57 -0
  256. package/src/components/ValidationMessage.tsx +134 -0
  257. package/src/components/index.tsx +47 -0
  258. package/src/config/apiConfig.ts +217 -0
  259. package/src/config/appDataConfig.ts +279 -0
  260. package/src/config/encryptionConfig.ts +65 -0
  261. package/src/config/workflowConstants.ts +43 -0
  262. package/src/constants/strings/README.md +146 -0
  263. package/src/constants/strings/bank.ts +92 -0
  264. package/src/constants/strings/base64Images.ts +29 -0
  265. package/src/constants/strings/common.ts +63 -0
  266. package/src/constants/strings/employee.ts +85 -0
  267. package/src/constants/strings/faq.ts +23 -0
  268. package/src/constants/strings/fd.ts +172 -0
  269. package/src/constants/strings/home.ts +67 -0
  270. package/src/constants/strings/index.ts +21 -0
  271. package/src/constants/strings/kyc.ts +100 -0
  272. package/src/constants/strings/nominee.ts +90 -0
  273. package/src/hooks/useAuth.ts +42 -0
  274. package/src/hooks/useFDData.ts +48 -0
  275. package/src/index.tsx +173 -0
  276. package/src/navigation/RootNavigator.tsx +352 -0
  277. package/src/navigation/SimpleNavigator.tsx +107 -0
  278. package/src/navigation/helpers.ts +85 -0
  279. package/src/navigation/index.tsx +81 -0
  280. package/src/navigation/types.ts +124 -0
  281. package/src/navigation/workflowNavigator.ts +131 -0
  282. package/src/providers/ApiProvider.tsx +43 -0
  283. package/src/providers/MasterDataProvider.tsx +30 -0
  284. package/src/screens/AadhaarVerification.tsx +809 -0
  285. package/src/screens/AddBankAccount.tsx +541 -0
  286. package/src/screens/BankDetail.tsx +826 -0
  287. package/src/screens/BookFD.tsx +330 -0
  288. package/src/screens/Employee.tsx +822 -0
  289. package/src/screens/FDCalculator.tsx +987 -0
  290. package/src/screens/FDList.tsx +1284 -0
  291. package/src/screens/FindIFSC.tsx +332 -0
  292. package/src/screens/Home.tsx +152 -0
  293. package/src/screens/NomineeDetail.tsx +800 -0
  294. package/src/screens/PayNow.tsx +282 -0
  295. package/src/screens/Payment.tsx +224 -0
  296. package/src/screens/PaymentStatus.tsx +561 -0
  297. package/src/screens/ReviewKYC.tsx +956 -0
  298. package/src/state/paymentSession.ts +13 -0
  299. package/src/store/fdListSelectedSlice.ts +42 -0
  300. package/src/store/hooks.ts +27 -0
  301. package/src/store/index.ts +3 -0
  302. package/src/store/onboardingSlice.ts +37 -0
  303. package/src/store/store.ts +35 -0
  304. package/src/theme/ThemeContext.tsx +82 -0
  305. package/src/theme/colors.ts +90 -0
  306. package/src/theme/index.ts +64 -0
  307. package/src/theme/shadows.ts +61 -0
  308. package/src/theme/typography.ts +151 -0
  309. package/src/types/dataTypes.ts +37 -0
  310. package/src/types/env.d.ts +93 -0
  311. package/src/types/workflowTypes.ts +12 -0
  312. package/src/utils/apiLogger.ts +166 -0
  313. package/src/utils/encryption.ts +159 -0
  314. package/src/utils/getFDData.ts +175 -0
  315. package/src/utils/globalData.ts +7 -0
@@ -0,0 +1,561 @@
1
+ import React, { useState, useEffect } from 'react';
2
+ import { View, Text, StyleSheet, ScrollView, Alert, Image, BackHandler, Platform, StatusBar } from 'react-native';
3
+ import Icon from 'react-native-vector-icons/Ionicons';
4
+ import { base64Images } from '../constants/strings/base64Images';
5
+ import SafeAreaWrapper from '../components/SafeAreaWrapper';
6
+ import { PaymentDetailsCard } from '../components';
7
+ import ActionButton from '../components/ActionButton';
8
+ import { useColors, useTypography, useTheme } from '../theme/ThemeContext';
9
+ import { usePaymentReverseFeedMutation, usePaymentRetryMutation } from '../api/fdApi';
10
+ import { useGetCustomerApplicationsMutation } from '../api/customerApi';
11
+ import { useAppSelector } from '../store';
12
+ import { getUserInfoForAPI } from '../config/appDataConfig';
13
+ import { navigate } from '../navigation/helpers';
14
+ import { setPaymentSession, getPaymentSession } from '../state/paymentSession';
15
+ import { useRoute } from '@react-navigation/native';
16
+ import { BANK_STRINGS } from '../constants/strings/bank';
17
+ import { COMMON_STRINGS } from '../constants/strings/common';
18
+ import { getApiConfig } from '../config/apiConfig';
19
+
20
+ export interface PaymentStatusProps {
21
+ onRetry?: () => void;
22
+ onContinue?: (fdDetails?: any) => void; // Callback when user clicks Continue on success - should redirect to main app with FD details
23
+ status: 'success' | 'failed' | 'pending';
24
+ transactionId?: string;
25
+ fdData?: {
26
+ companyName: string;
27
+ amount: number;
28
+ fdRate: string;
29
+ tenure: string;
30
+ interestPayout: string;
31
+ };
32
+ }
33
+
34
+ const PaymentStatus: React.FC<PaymentStatusProps> = ({
35
+ onRetry,
36
+ onContinue,
37
+ status,
38
+ transactionId,
39
+ fdData
40
+ }) => {
41
+ const colors = useColors();
42
+ const typography = useTypography();
43
+ const { themeName } = useTheme();
44
+
45
+ // Local state to track current status (can be updated from API responses)
46
+ const [currentStatus, setCurrentStatus] = useState<'success' | 'failed' | 'pending'>(status);
47
+
48
+ const styles = createStyles(colors, typography, currentStatus);
49
+ const route = useRoute();
50
+
51
+ // Get transaction ID from navigation props (route params)
52
+ const navigationTransactionId = (route.params as any)?.transactionId;
53
+
54
+ // Fallback: Get transaction ID from payment session if not in navigation params
55
+ const paymentSession = getPaymentSession();
56
+ const sessionTransactionId = paymentSession.transactionId;
57
+
58
+ const finalTransactionId = navigationTransactionId || sessionTransactionId || transactionId || "";
59
+
60
+ // Redux selectors
61
+ const workflowInstanceId = useAppSelector((state: any) => state?.onboarding?.workflowInstanceId);
62
+ const applicationId = useAppSelector((state: any) => state?.onboarding?.applicationId);
63
+ const entityId = useAppSelector((state: any) => state?.onboarding?.entityid);
64
+ const providerId = useAppSelector((state: any) => state?.onboarding?.providerId);
65
+
66
+ // Payment Reverse Feed API
67
+ const [paymentReverseFeed, {
68
+ data: paymentReverseFeedResponse,
69
+ error: paymentReverseFeedError,
70
+ isLoading: isLoadingPaymentReverseFeed,
71
+ }] = usePaymentReverseFeedMutation();
72
+
73
+ // Payment Retry API
74
+ const [paymentRetry, {
75
+ data: paymentRetryResponse,
76
+ error: paymentRetryError,
77
+ isLoading: isLoadingPaymentRetry,
78
+ }] = usePaymentRetryMutation();
79
+
80
+ // Get Customer Applications API
81
+ const [getCustomerApplications, {
82
+ isLoading: isLoadingCustomerApplications,
83
+ }] = useGetCustomerApplicationsMutation();
84
+
85
+ // Pull FD data: fdListSelected > fdData prop > default
86
+ const fdListSelectedData = useAppSelector((state: any) => state?.fdListSelected);
87
+
88
+ const displayData = fdListSelectedData ? {
89
+ companyName: fdListSelectedData.companyName,
90
+ amount: fdListSelectedData.amount,
91
+ fdRate: fdListSelectedData.fdRate,
92
+ tenure: fdListSelectedData.tenure,
93
+ interestPayout: fdListSelectedData.interestPayout,
94
+ } : fdData || {
95
+ companyName: '',
96
+ amount: 0,
97
+ fdRate: '',
98
+ tenure: '',
99
+ interestPayout: '',
100
+ };
101
+
102
+ const displayTransactionId = finalTransactionId || '';
103
+
104
+ const formatAmount = (amount: number): string => {
105
+ return amount.toLocaleString('en-IN');
106
+ };
107
+
108
+ // Handle payment reverse feed API call for pending status
109
+ const handlePaymentReverseFeed = async () => {
110
+
111
+ try {
112
+
113
+ // Get user info from app data
114
+ const userInfo = getUserInfoForAPI();
115
+
116
+ // Prepare the API request
117
+ const paymentReverseFeedRequest = {
118
+ // Headers
119
+ providerId: providerId,
120
+ workflowInstanceId: workflowInstanceId,
121
+ userreferenceid: userInfo.id,
122
+ applicationid: applicationId,
123
+ entityid: entityId,
124
+ // Body
125
+ transactionId: finalTransactionId,
126
+ };
127
+
128
+ const response = await paymentReverseFeed(paymentReverseFeedRequest).unwrap();
129
+
130
+ // Handle the response based on payment status
131
+ if (response?.data?.paymentStatus?.toLowerCase() === 'success') {
132
+ setCurrentStatus('success');
133
+
134
+ } else if (response?.data?.paymentStatus?.toLowerCase() === 'failed') {
135
+ setCurrentStatus('failed');
136
+
137
+ }
138
+
139
+ } catch (error) {
140
+
141
+ // Alert.alert(COMMON_STRINGS.ERROR, BANK_STRINGS.PAYMENT_GATEWAY_ERROR, [
142
+ // { text: COMMON_STRINGS.OK }
143
+ // ]);
144
+ }
145
+ };
146
+
147
+ // Handle payment retry when status is failed
148
+ const handlePaymentRetry = async () => {
149
+ if (!finalTransactionId) {
150
+ Alert.alert(COMMON_STRINGS.ERROR, BANK_STRINGS.PAYMENT_GATEWAY_ERROR);
151
+ return;
152
+ }
153
+
154
+ try {
155
+
156
+ const userInfo = getUserInfoForAPI();
157
+ const paymentRetryRequest = {
158
+ // Headers
159
+ providerId: providerId,
160
+ workflowInstanceId: workflowInstanceId,
161
+ userreferenceid: userInfo.id,
162
+ applicationid: applicationId,
163
+ entityid: entityId,
164
+ // Body
165
+ transactionId: finalTransactionId,
166
+ };
167
+
168
+ const response = await paymentRetry(paymentRetryRequest).unwrap();
169
+
170
+ const payload: any = Array.isArray((response as any)?.data)
171
+ ? (response as any).data[0]
172
+ : (response as any)?.data ?? (response as any);
173
+
174
+ // Support multiple response key casings
175
+ const newPaymentUrl: string | undefined = payload?.PaymentUrl || payload?.paymentUrl;
176
+ const newTransactionId: string | undefined = payload?.Transactionid || payload?.transactionId || finalTransactionId;
177
+
178
+ if (newPaymentUrl) {
179
+ // Save session and navigate to Payment screen
180
+ setPaymentSession({ paymentUrl: newPaymentUrl, transactionId: newTransactionId });
181
+ navigate('Payment');
182
+ } else {
183
+ Alert.alert(BANK_STRINGS.PAYMENT_FAILED, BANK_STRINGS.PAYMENT_GATEWAY_ERROR);
184
+ }
185
+ } catch (error) {
186
+ }
187
+ };
188
+
189
+ // Handle exit button click - fetch FD details and pass to main app
190
+ const handleExit = async () => {
191
+ try {
192
+ // Get user info from app data
193
+ const userInfo = getUserInfoForAPI();
194
+
195
+ // Get API configuration
196
+ const apiConfig = getApiConfig();
197
+
198
+ // Prepare request payload
199
+ const requestPayload = {
200
+ userReferenceId: userInfo.id
201
+ };
202
+
203
+ // Call API to get customer applications
204
+ const response = await getCustomerApplications(requestPayload).unwrap();
205
+
206
+ // Extract applications from response (handle different response structures)
207
+ let applications: any[] = [];
208
+ if (Array.isArray(response)) {
209
+ applications = response;
210
+ } else if (response?.data && Array.isArray(response.data)) {
211
+ applications = response.data;
212
+ } else if (response?.applications && Array.isArray(response.applications)) {
213
+ applications = response.applications;
214
+ }
215
+
216
+ // Find the currently booked FD - search by transaction_id first (most specific)
217
+ let bookedFD: any = null;
218
+
219
+ // Priority 1: Match by transaction_id from payment
220
+ if (finalTransactionId) {
221
+ bookedFD = applications.find((app: any) =>
222
+ app?.transactionId === finalTransactionId ||
223
+ app?.transaction_id === finalTransactionId ||
224
+ app?.Transactionid === finalTransactionId ||
225
+ app?.TransactionId === finalTransactionId
226
+ );
227
+
228
+ if (__DEV__ && bookedFD) {
229
+ console.log('═══════════════════════════════════════════════════════════════');
230
+ console.log('✅ [PaymentStatus] Found FD by Transaction ID');
231
+ console.log('───────────────────────────────────────────────────────────────');
232
+ console.log('🔍 Searched Transaction ID:', finalTransactionId);
233
+ console.log('📋 Found Application:', bookedFD);
234
+ console.log('═══════════════════════════════════════════════════════════════');
235
+ }
236
+ }
237
+
238
+ // Priority 2: Match by applicationId (fallback)
239
+ if (!bookedFD && applicationId) {
240
+ bookedFD = applications.find((app: any) =>
241
+ app?.applicationId === applicationId ||
242
+ app?.applicationid === applicationId ||
243
+ app?.id === applicationId
244
+ );
245
+
246
+ if (__DEV__ && bookedFD) {
247
+ console.log('═══════════════════════════════════════════════════════════════');
248
+ console.log('✅ [PaymentStatus] Found FD by Application ID');
249
+ console.log('───────────────────────────────────────────────────────────────');
250
+ console.log('🔍 Searched Application ID:', applicationId);
251
+ console.log('📋 Found Application:', bookedFD);
252
+ console.log('═══════════════════════════════════════════════════════════════');
253
+ }
254
+ }
255
+
256
+ // Priority 3: Get the most recent one (last resort)
257
+ if (!bookedFD && applications.length > 0) {
258
+ const sortedApps = [...applications].sort((a: any, b: any) => {
259
+ const dateA = a?.createdDate || a?.created_date || a?.createdAt || 0;
260
+ const dateB = b?.createdDate || b?.created_date || b?.createdAt || 0;
261
+ return new Date(dateB).getTime() - new Date(dateA).getTime();
262
+ });
263
+ bookedFD = sortedApps[0];
264
+
265
+ if (__DEV__ && bookedFD) {
266
+ console.log('═══════════════════════════════════════════════════════════════');
267
+ console.log('⚠️ [PaymentStatus] Using Most Recent FD (fallback)');
268
+ console.log('───────────────────────────────────────────────────────────────');
269
+ console.log('📋 Found Application:', bookedFD);
270
+ console.log('═══════════════════════════════════════════════════════════════');
271
+ }
272
+ }
273
+
274
+ if (__DEV__) {
275
+ console.log('═══════════════════════════════════════════════════════════════');
276
+ console.log('📤 [PaymentStatus] Passing FD Data to Main App');
277
+ console.log('───────────────────────────────────────────────────────────────');
278
+ console.log('💳 Transaction ID:', finalTransactionId);
279
+ console.log('📋 FD Data:', bookedFD);
280
+ console.log('═══════════════════════════════════════════════════════════════');
281
+ }
282
+
283
+ // Pass FD details to main app via onContinue callback
284
+ if (onContinue) {
285
+ onContinue(bookedFD || null);
286
+ }
287
+ } catch (error) {
288
+ if (__DEV__) {
289
+ console.log('═══════════════════════════════════════════════════════════════');
290
+ console.log('❌ [PaymentStatus] Error Fetching FD Data');
291
+ console.log('───────────────────────────────────────────────────────────────');
292
+ console.log('⚠️ Error:', error);
293
+ console.log('═══════════════════════════════════════════════════════════════');
294
+ }
295
+
296
+ // If API call fails, still call onContinue but without FD details
297
+ if (onContinue) {
298
+ onContinue(null);
299
+ }
300
+ }
301
+ };
302
+
303
+ // Disable hardware back button on PaymentStatus screen
304
+ useEffect(() => {
305
+ if (Platform.OS !== 'android') return;
306
+
307
+ const onBackPress = () => {
308
+ // Return true to prevent default behavior (block back button)
309
+ return true;
310
+ };
311
+
312
+ const backHandler = BackHandler.addEventListener(
313
+ 'hardwareBackPress',
314
+ onBackPress
315
+ );
316
+
317
+ return () => backHandler.remove();
318
+ }, []);
319
+
320
+ return (
321
+ <SafeAreaWrapper
322
+ includeTop={true}
323
+ bottomPadding={0}
324
+ statusBarColor="#000000"
325
+ statusBarStyle="light-content"
326
+ >
327
+ {Platform.OS === 'ios' && <StatusBar barStyle="light-content" />}
328
+
329
+ <View style={styles.container}>
330
+ {/* <Text style={styles.headerTitle}>
331
+ {status === 'success' ? 'PAYMENT SUCCESSFUL' : 'PAYMENT FAILED'}
332
+ </Text> */}
333
+
334
+ <ScrollView
335
+ showsVerticalScrollIndicator={false}
336
+ contentContainerStyle={styles.scrollContent}
337
+ >
338
+ {/* Status Icon */}
339
+ <View style={styles.iconContainer}>
340
+ <View style={styles.iconCircleOuter}>
341
+ <View style={styles.iconCircleInner}>
342
+ {currentStatus === 'success' && (
343
+ <Image
344
+ source={{ uri: base64Images.successBig }}
345
+ style={{ width: 60, height: 60 }}
346
+ resizeMode="contain"
347
+ />
348
+ )}
349
+ {currentStatus === 'failed' && (
350
+ <Image
351
+ source={{ uri: base64Images.error }}
352
+ style={{ width: 48, height: 48 }}
353
+ resizeMode="contain"
354
+ />
355
+ )}
356
+ {currentStatus === 'pending' && (
357
+ <Image
358
+ source={{ uri: base64Images.pending }}
359
+ style={{ width: 48, height: 48 }}
360
+ resizeMode="contain"
361
+ />
362
+ )}
363
+ </View>
364
+ </View>
365
+ </View>
366
+
367
+ {/* Status Title */}
368
+ <Text style={styles.statusTitle}>
369
+ {currentStatus === 'success' && BANK_STRINGS.PAYMENT_STATUS_SUCCESS}
370
+ {currentStatus === 'failed' && BANK_STRINGS.PAYMENT_STATUS_FAILED}
371
+ {currentStatus === 'pending' && BANK_STRINGS.PAYMENT_STATUS_PENDING}
372
+ </Text>
373
+
374
+ {/* Pending Status Subtitle */}
375
+ {currentStatus === 'pending' && (
376
+ <Text style={styles.pendingSubtitle}>
377
+ {BANK_STRINGS.PAYMENT_STATUS_PROCESSING}
378
+ </Text>
379
+ )}
380
+
381
+ {/* Transaction ID */}
382
+ <Text style={styles.transactionLabel}>
383
+ Transaction ID
384
+ </Text>
385
+ <Text style={styles.transactionId}>{displayTransactionId}</Text>
386
+
387
+ {/* Details Card */}
388
+ <PaymentDetailsCard
389
+ companyName={displayData.companyName}
390
+ amount={displayData.amount}
391
+ fdRate={displayData.fdRate}
392
+ tenure={displayData.tenure}
393
+ interestPayout={displayData.interestPayout}
394
+ />
395
+
396
+ {/* Success Disclaimer */}
397
+ {currentStatus === 'success' && (
398
+ <View style={styles.disclaimerContainer}>
399
+ {Platform.OS === 'android' && (
400
+ <Icon name="information-circle-outline" size={20} color={colors.textSecondary} style={styles.disclaimerIcon} />
401
+ )}
402
+ <Text style={styles.disclaimerText}>
403
+ {BANK_STRINGS.PAYMENT_SUCCESS_DISCLAIMER}
404
+ </Text>
405
+ </View>
406
+ )}
407
+
408
+ </ScrollView>
409
+
410
+ {/* Action Button */}
411
+ <View style={styles.footer}>
412
+ {currentStatus === 'success' && (
413
+ <ActionButton
414
+ title={isLoadingCustomerApplications ? COMMON_STRINGS.LOADING : COMMON_STRINGS.EXIT}
415
+ onPress={handleExit}
416
+ disabled={isLoadingCustomerApplications}
417
+ />
418
+ )}
419
+ {currentStatus === 'failed' && (
420
+ <ActionButton
421
+ title={isLoadingPaymentRetry ? COMMON_STRINGS.RETRYING : BANK_STRINGS.RETRY_PAYMENT_BUTTON}
422
+ onPress={handlePaymentRetry}
423
+ disabled={isLoadingPaymentRetry}
424
+ />
425
+ )}
426
+ {currentStatus === 'pending' && (
427
+ <ActionButton
428
+ title={isLoadingPaymentReverseFeed ? COMMON_STRINGS.CHECKING : BANK_STRINGS.REFRESH_STATUS_BUTTON}
429
+ onPress={handlePaymentReverseFeed}
430
+ disabled={isLoadingPaymentReverseFeed}
431
+ />
432
+ )}
433
+ </View>
434
+ </View>
435
+ </SafeAreaWrapper>
436
+ );
437
+ };
438
+
439
+ const createStyles = (colors: any, typography: any, status: 'success' | 'failed' | 'pending') => {
440
+ const statusColor = status === 'success' ? '#4CAF50' : status === 'failed' ? '#F44336' : '#FF9800';
441
+ const cardBgColor = status === 'success' ? '#E8F5F0' : status === 'failed' ? '#FFF3F3' : '#FFF8E1';
442
+
443
+ return StyleSheet.create({
444
+ container: {
445
+ flex: 1,
446
+ backgroundColor: colors.background,
447
+ },
448
+ headerTitle: {
449
+ fontSize: 14,
450
+ fontWeight: '600',
451
+ color: colors.textLight,
452
+ textAlign: 'center',
453
+ paddingVertical: 16,
454
+ letterSpacing: 1,
455
+ },
456
+ scrollContent: {
457
+ flexGrow: 1,
458
+ paddingHorizontal: 24,
459
+ paddingBottom: 120,
460
+ },
461
+ iconContainer: {
462
+ alignItems: 'center',
463
+ marginTop: 40,
464
+ marginBottom: 32,
465
+ },
466
+ iconCircleOuter: {
467
+ width: 120,
468
+ height: 120,
469
+ borderRadius: 60,
470
+ backgroundColor: status === 'success' ? '#e8f5e9' : status === 'failed' ? 'rgba(244, 67, 54, 0.1)' : 'rgba(255, 152, 0, 0.1)',
471
+ alignItems: 'center',
472
+ justifyContent: 'center',
473
+ },
474
+ iconCircleInner: {
475
+ width: 60,
476
+ height: 60,
477
+ borderRadius: 30,
478
+ backgroundColor: status === 'success' ? '#ffffff' : status === 'failed' ? 'rgba(244, 67, 54, 0.0)' : 'rgba(255, 152, 0, 0.2)',
479
+ alignItems: 'center',
480
+ justifyContent: 'center',
481
+ },
482
+ statusTitle: {
483
+ ...typography.styles.h1,
484
+ color: colors.text,
485
+ textAlign: 'center',
486
+ marginBottom: 32,
487
+ letterSpacing: 0.5,
488
+ },
489
+ pendingSubtitle: {
490
+ ...typography.styles.bodyMedium,
491
+ color: colors.textSecondary,
492
+ textAlign: 'center',
493
+ marginBottom: 30,
494
+ marginTop: -30,
495
+
496
+ },
497
+ transactionLabel: {
498
+ ...typography.styles.bodyMedium,
499
+ color: colors.textLight,
500
+ textAlign: 'center',
501
+ marginBottom: 8,
502
+ },
503
+ transactionId: {
504
+ ...typography.styles.h2,
505
+ color: colors.text,
506
+ textAlign: 'center',
507
+ marginBottom: 32,
508
+ letterSpacing: 1,
509
+ },
510
+ avatarContainer: {
511
+ alignItems: 'center',
512
+ marginTop: -28,
513
+ marginBottom: 24,
514
+ },
515
+ avatar: {
516
+ width: 56,
517
+ height: 56,
518
+ borderRadius: 28,
519
+ backgroundColor: '#5F9E8F',
520
+ alignItems: 'center',
521
+ justifyContent: 'center',
522
+ borderWidth: 4,
523
+ borderColor: colors.background,
524
+ },
525
+ avatarText: {
526
+ fontSize: 24,
527
+ fontWeight: '600',
528
+ color: 'white',
529
+ },
530
+ footer: {
531
+ position: 'absolute',
532
+ bottom: 0,
533
+ left: 0,
534
+ right: 0,
535
+ backgroundColor: colors.background,
536
+ paddingTop: 16,
537
+ },
538
+ disclaimerContainer: {
539
+ flexDirection: 'row',
540
+ backgroundColor: 'transparent',
541
+ borderRadius: 8,
542
+ padding: 16,
543
+ marginTop: 24,
544
+ marginBottom: 16,
545
+ alignItems: 'flex-start',
546
+ },
547
+ disclaimerIcon: {
548
+ marginRight: 12,
549
+ marginTop: 2,
550
+ },
551
+ disclaimerText: {
552
+ ...typography.styles.bodySmall,
553
+ color: colors.textSecondary,
554
+ flex: 1,
555
+ lineHeight: 18,
556
+ },
557
+ });
558
+ };
559
+
560
+ export default PaymentStatus;
561
+