@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,282 @@
1
+ import React, { useEffect, useState } from 'react';
2
+ import { View, Text, StyleSheet, ScrollView, TouchableOpacity, BackHandler, Platform, ActivityIndicator } from 'react-native';
3
+ import SafeAreaWrapper from '../components/SafeAreaWrapper';
4
+ import { Header, PaymentDetailsCard } from '../components';
5
+ import ActionButton from '../components/ActionButton';
6
+ import { useColors, useTypography, useTheme } from '../theme/ThemeContext';
7
+ import { useCreateFDMutation } from '../api/fdApi';
8
+ import { useAppSelector } from '../store';
9
+ import { getUserInfoForAPI } from '../config/appDataConfig';
10
+ import { navigate } from '../navigation/helpers';
11
+ import { usePreviousStateMutation } from '../api/workflowApi';
12
+ import { setPaymentSession } from '../state/paymentSession';
13
+ import { BANK_STRINGS } from '../constants/strings/bank';
14
+ import { COMMON_STRINGS } from '../constants/strings/common';
15
+
16
+ export interface PayNowProps {
17
+ onGoBack?: () => void;
18
+ onConfirm?: () => void;
19
+ fdData?: {
20
+ companyName: string;
21
+ amount: number;
22
+ fdRate: string;
23
+ tenure: string;
24
+ interestPayout: string;
25
+ };
26
+ }
27
+
28
+ const PayNow: React.FC<PayNowProps> = ({ onGoBack, onConfirm, fdData }) => {
29
+
30
+ const colors = useColors();
31
+ const typography = useTypography();
32
+ const { themeName } = useTheme();
33
+ const styles = createStyles(colors, typography, themeName);
34
+ const workflowInstanceId = useAppSelector((state: any) => state?.onboarding?.workflowInstanceId);
35
+ const applicationId = useAppSelector((state: any) => state?.onboarding?.applicationId);
36
+ const entityId = useAppSelector((state: any) => state?.onboarding?.entityid);
37
+ const fdId = useAppSelector((state: any) => state?.onboarding?.fdId);
38
+
39
+ // Get providerId from app data or use default
40
+ const defaultProviderId = useAppSelector((state: any) => state?.onboarding?.providerId);// Default Shriram provider ID
41
+
42
+ // Get FD data from Redux store (using only fdListSelected data)
43
+ const fdListSelectedData = useAppSelector((state: any) => state?.fdListSelected);
44
+ // const fdCalculationData = useAppSelector((state: any) => state?.fdCalculation);
45
+
46
+ // Create FD API
47
+ const [createFD, {
48
+ data: createFDResponse,
49
+ error: createFDError,
50
+ isLoading: isLoadingCreateFD,
51
+ }] = useCreateFDMutation();
52
+ const [previousState] = usePreviousStateMutation();
53
+
54
+ // Loading state for back navigation
55
+ const [isGoingBack, setIsGoingBack] = useState(false);
56
+
57
+ // Create FD API status monitored
58
+
59
+ // Use FD data with priority: FDList selected > Props > Empty
60
+ const displayData = fdListSelectedData ? {
61
+ // Data from FDList screen (selected FD)
62
+ companyName: fdListSelectedData.companyName || '',
63
+ amount: fdListSelectedData.amount || 0,
64
+ fdRate: fdListSelectedData.fdRate || '',
65
+ tenure: fdListSelectedData.tenure || '',
66
+ interestPayout: fdListSelectedData.interestPayout || '',
67
+ } : fdData || {
68
+ // Fallback to props or empty
69
+ companyName: '',
70
+ amount: 0,
71
+ fdRate: '',
72
+ tenure: '',
73
+ interestPayout: '',
74
+ };
75
+
76
+ // Data source processed
77
+
78
+ // Get first letter for avatar
79
+ const getAvatarLetter = (name: string): string => {
80
+ return name.charAt(0).toUpperCase();
81
+ };
82
+
83
+ const formatAmount = (amount: number): string => {
84
+ return amount.toLocaleString('en-IN');
85
+ };
86
+
87
+ const handleConfirm = async () => {
88
+ try {
89
+
90
+ // Get user info from app data
91
+ const userInfo = getUserInfoForAPI();
92
+
93
+ // Prepare Create FD request body with ONLY required fields
94
+ const createFDRequest = {
95
+ // Headers (will be extracted by API)
96
+ providerId: defaultProviderId,
97
+ workflowInstanceId: workflowInstanceId,
98
+ userreferenceid: userInfo.userReferenceId,
99
+ // entityid: entityId,
100
+ // Body (applicationId is required in body, entityid should NOT be in body)
101
+ applicationId: applicationId,
102
+ fdId: fdId,
103
+ panNo: userInfo.panNumber,
104
+ } as const;
105
+
106
+ const response = await createFD(createFDRequest).unwrap();
107
+
108
+ // Extract paymentUrl and transactionId from response
109
+ const payload: any = Array.isArray((response as any)?.data)
110
+ ? (response as any).data[0]
111
+ : (response as any)?.data ?? (response as any);
112
+
113
+ const paymentUrl: string | undefined = payload?.paymentUrl;
114
+ const transactionId: string | undefined = payload?.transactionId;
115
+
116
+
117
+ // Save to session and navigate to Payment screen
118
+ setPaymentSession({ paymentUrl, transactionId });
119
+ navigate('Payment');
120
+
121
+ } catch (error) {
122
+
123
+ // Optional fallback: allow external handler
124
+ onConfirm?.();
125
+ }
126
+ };
127
+
128
+ // Handler for back button (used by both bottom back button and hardware back button)
129
+ const handleBackPress = async () => {
130
+ setIsGoingBack(true);
131
+ try {
132
+ const userInfo = getUserInfoForAPI();
133
+ await previousState({
134
+ providerId: defaultProviderId,
135
+ workflowInstanceId,
136
+ userreferenceid: userInfo.userReferenceId,
137
+ applicationid: applicationId,
138
+ entityid: entityId,
139
+ });
140
+ } catch (e) {
141
+ // Handle error silently
142
+ } finally {
143
+ setIsGoingBack(false);
144
+ navigate('BankDetail');
145
+ }
146
+ };
147
+
148
+ // Handle Android hardware back button
149
+ useEffect(() => {
150
+ if (Platform.OS !== 'android') return;
151
+
152
+ const onHardwareBackPress = () => {
153
+ handleBackPress();
154
+ return true; // Prevent default behavior
155
+ };
156
+
157
+ const backHandler = BackHandler.addEventListener(
158
+ 'hardwareBackPress',
159
+ onHardwareBackPress
160
+ );
161
+
162
+ return () => backHandler.remove();
163
+ }, [defaultProviderId, workflowInstanceId, applicationId, entityId]);
164
+
165
+ return (
166
+ <SafeAreaWrapper
167
+ includeTop={false}
168
+ bottomPadding={25}
169
+ statusBarColor="#000000"
170
+ statusBarStyle="light-content"
171
+ >
172
+ <View style={styles.container}>
173
+ <ScrollView showsVerticalScrollIndicator={false} contentContainerStyle={styles.scrollContent}>
174
+ <Text style={styles.title}>{BANK_STRINGS.PAYMENT_DETAILS_TITLE}</Text>
175
+
176
+ <PaymentDetailsCard
177
+ companyName={displayData.companyName}
178
+ amount={displayData.amount}
179
+ fdRate={displayData.fdRate}
180
+ tenure={displayData.tenure}
181
+ interestPayout={displayData.interestPayout}
182
+ showCompanyLine={true}
183
+ />
184
+
185
+
186
+ </ScrollView>
187
+
188
+ <View style={styles.footer}>
189
+ <ActionButton
190
+ title={COMMON_STRINGS.BACK}
191
+ onPress={handleBackPress}
192
+ disabled={false}
193
+ style={styles.backButton}
194
+ textStyle={styles.backButtonText}
195
+ />
196
+ <ActionButton
197
+ title={isLoadingCreateFD ? COMMON_STRINGS.CREATING : COMMON_STRINGS.CONFIRM}
198
+ onPress={handleConfirm}
199
+ disabled={isLoadingCreateFD}
200
+ style={styles.confirmButton}
201
+ />
202
+ </View>
203
+ </View>
204
+ {/* Loading overlay for back navigation */}
205
+ {isGoingBack && (
206
+ <View style={styles.loadingOverlay} pointerEvents="auto">
207
+ <ActivityIndicator size="large" color={colors.primary} />
208
+ </View>
209
+ )}
210
+ </SafeAreaWrapper>
211
+ );
212
+ };
213
+
214
+ const createStyles = (colors: any, typography: any, themeName: string) => StyleSheet.create({
215
+ container: {
216
+ flex: 1,
217
+ backgroundColor: colors.background,
218
+ },
219
+ scrollContent: {
220
+ flexGrow: 1,
221
+ paddingHorizontal: 16,
222
+ //paddingTop: 24,
223
+ // paddingBottom: 100,
224
+ // justifyContent: 'center',
225
+ },
226
+ title: {
227
+ ...typography.styles.h1,
228
+ color: colors.text,
229
+ textAlign: 'center',
230
+ marginTop: 100,
231
+ marginBottom: 80,
232
+ },
233
+ footer: {
234
+ position: 'absolute',
235
+ bottom: 0,
236
+ left: 0,
237
+ right: 0,
238
+ backgroundColor: colors.background,
239
+ paddingHorizontal: 16,
240
+ paddingVertical: 16,
241
+ flexDirection: 'row',
242
+ gap: 8,
243
+ },
244
+ backButton: {
245
+ flex: 1,
246
+ backgroundColor: themeName === 'dark' ? colors.cancelButtonBg : 'transparent',
247
+ borderWidth: themeName === 'dark' ? 1 : 0,
248
+ borderColor: themeName === 'dark' ? '#ffffff' : 'transparent',
249
+ borderRadius: themeName === 'dark' ? 10 : 0,
250
+ },
251
+ backButtonText: {
252
+ color: themeName === 'dark' ? '#ffffff' : colors.primary,
253
+ },
254
+ confirmButton: {
255
+ flex: 1,
256
+ },
257
+ debugButton: {
258
+ paddingHorizontal: 16,
259
+ paddingVertical: 12,
260
+ borderRadius: 8,
261
+ marginTop: 20,
262
+ alignItems: 'center',
263
+ },
264
+ debugButtonText: {
265
+ ...typography.styles.bodyMedium,
266
+ fontWeight: '600',
267
+ },
268
+ loadingOverlay: {
269
+ position: 'absolute',
270
+ top: 0,
271
+ left: 0,
272
+ right: 0,
273
+ bottom: 0,
274
+ backgroundColor: 'rgba(0, 0, 0, 0.3)',
275
+ justifyContent: 'center',
276
+ alignItems: 'center',
277
+ zIndex: 1000,
278
+ },
279
+ });
280
+
281
+ export default PayNow;
282
+
@@ -0,0 +1,224 @@
1
+ import React, { useRef, useState, useEffect } from 'react';
2
+ import { View, StyleSheet, ActivityIndicator, BackHandler, Platform, StatusBar } from 'react-native';
3
+ import { WebView } from 'react-native-webview';
4
+ import SafeAreaWrapper from '../components/SafeAreaWrapper';
5
+ import { useColors } from '../theme/ThemeContext';
6
+ import { decryptResponse } from '../utils/encryption';
7
+ import { getEncryptionConfig } from '../config/encryptionConfig';
8
+
9
+ export interface PaymentProps {
10
+ onGoBack?: () => void;
11
+ onPaymentSuccess?: (data?: any) => void;
12
+ onPaymentFailure?: (error?: any) => void;
13
+ paymentUrl: string;
14
+ successUrl?: string;
15
+ failureUrl?: string;
16
+ }
17
+
18
+ const Payment: React.FC<PaymentProps> = ({
19
+ onGoBack,
20
+ onPaymentSuccess,
21
+ onPaymentFailure,
22
+ paymentUrl,
23
+ successUrl = 'payment/success',
24
+ failureUrl = 'payment/failure',
25
+ }) => {
26
+ const colors = useColors();
27
+ const styles = createStyles(colors);
28
+ const webViewRef = useRef<WebView>(null);
29
+ const [loading, setLoading] = useState(true);
30
+
31
+ const handleNavigationStateChange = async (navState: any) => {
32
+ const { url } = navState;
33
+
34
+ if (url.includes('payment/status')) {
35
+ await handlePaymentStatusPage();
36
+ return;
37
+ }
38
+
39
+ if (url.includes(successUrl)) {
40
+ setLoading(false);
41
+ onPaymentSuccess?.(navState);
42
+ return;
43
+ }
44
+
45
+ if (url.includes(failureUrl)) {
46
+ setLoading(false);
47
+ onPaymentFailure?.(navState);
48
+ return;
49
+ }
50
+ };
51
+
52
+ const handleWebViewError = (syntheticEvent: any) => {
53
+ const { nativeEvent } = syntheticEvent;
54
+ setLoading(false);
55
+ onPaymentFailure?.(nativeEvent);
56
+ };
57
+
58
+ const handleLoadStart = () => {
59
+ setLoading(true);
60
+ };
61
+
62
+ const handleLoadEnd = () => {
63
+ setLoading(false);
64
+ };
65
+
66
+ const handleMessage = async (event: any) => {
67
+ try {
68
+ const dataString = event.nativeEvent.data;
69
+
70
+ // Check if data is empty or null
71
+ if (!dataString || dataString.trim() === '') {
72
+ return;
73
+ }
74
+
75
+ // Check if data looks like JSON
76
+ const trimmedData = dataString.trim();
77
+ if (!trimmedData.startsWith('{') && !trimmedData.startsWith('[') && !trimmedData.startsWith('"')) {
78
+ return;
79
+ }
80
+
81
+ const cleaned =
82
+ dataString.startsWith('"') && dataString.endsWith('"')
83
+ ? dataString.substring(1, dataString.length - 1).replaceAll('\\"', '"')
84
+ : dataString;
85
+
86
+ const parsed = JSON.parse(cleaned);
87
+
88
+ let response;
89
+
90
+ // Handle both encrypted and non-encrypted responses using the same method as API responses
91
+ if (parsed.encryptedResponse) {
92
+ const encryptionConfig = getEncryptionConfig();
93
+ try {
94
+ // Use the same decryptResponse function used for API responses
95
+ const decrypted = await decryptResponse({ encryptedResponse: parsed.encryptedResponse }, encryptionConfig);
96
+ response = decrypted;
97
+ } catch (error) {
98
+ response = parsed;
99
+ }
100
+ } else {
101
+ response = parsed;
102
+ }
103
+
104
+ // Check for success status
105
+ if (response.status?.toLowerCase() === 'success') {
106
+ // Check payment status in data
107
+ const paymentStatus = response.data?.paymentStatus?.toLowerCase();
108
+
109
+ if (paymentStatus === 'success') {
110
+ onPaymentSuccess?.(response);
111
+ } else if (paymentStatus === 'failed') {
112
+ onPaymentFailure?.(response);
113
+ } else {
114
+ onPaymentFailure?.(response);
115
+ }
116
+ } else {
117
+ onPaymentFailure?.(response);
118
+ }
119
+
120
+ setLoading(false);
121
+ } catch (error) {
122
+ onPaymentFailure?.(error);
123
+ setLoading(false);
124
+ }
125
+ };
126
+
127
+ const handlePaymentStatusPage = async () => {
128
+ try {
129
+ setLoading(true);
130
+ webViewRef.current?.injectJavaScript(`
131
+ (function() {
132
+ window.ReactNativeWebView.postMessage(document.body.innerText);
133
+ })();
134
+ `);
135
+ } catch (err) {
136
+ setLoading(false);
137
+ onPaymentFailure?.(err);
138
+ }
139
+ };
140
+
141
+ // Disable hardware back button on Payment screen
142
+ useEffect(() => {
143
+ if (Platform.OS !== 'android') return;
144
+
145
+ const onBackPress = () => {
146
+ // Return true to prevent default behavior (block back button)
147
+ return true;
148
+ };
149
+
150
+ const backHandler = BackHandler.addEventListener(
151
+ 'hardwareBackPress',
152
+ onBackPress
153
+ );
154
+
155
+ return () => backHandler.remove();
156
+ }, []);
157
+
158
+ return (
159
+ <SafeAreaWrapper
160
+ includeTop={false}
161
+ bottomPadding={0}
162
+ statusBarColor="#000000"
163
+ statusBarStyle="light-content"
164
+ >
165
+ {Platform.OS === 'ios' && <StatusBar barStyle="light-content" />}
166
+
167
+ <View style={styles.container}>
168
+ {loading && (
169
+ <View style={styles.loadingContainer}>
170
+ <ActivityIndicator size="large" color={colors.primary} />
171
+ </View>
172
+ )}
173
+
174
+ <WebView
175
+ ref={webViewRef}
176
+ source={{ uri: paymentUrl }}
177
+ style={styles.webView}
178
+ onNavigationStateChange={handleNavigationStateChange}
179
+ onError={handleWebViewError}
180
+ onLoadStart={handleLoadStart}
181
+ onLoadEnd={handleLoadEnd}
182
+ onMessage={handleMessage}
183
+ javaScriptEnabled={true}
184
+ domStorageEnabled={false}
185
+ startInLoadingState={true}
186
+ scalesPageToFit={true}
187
+ mixedContentMode="never"
188
+ allowsInlineMediaPlayback={false}
189
+ mediaPlaybackRequiresUserAction={false}
190
+ sharedCookiesEnabled={false}
191
+ thirdPartyCookiesEnabled={false}
192
+ cacheEnabled={false}
193
+ originWhitelist={['*']}
194
+ />
195
+ </View>
196
+ </SafeAreaWrapper>
197
+ );
198
+ };
199
+
200
+ const createStyles = (colors: any) => StyleSheet.create({
201
+ container: {
202
+ flex: 1,
203
+ backgroundColor: colors.background,
204
+ },
205
+ webView: {
206
+ flex: 1,
207
+ backgroundColor: colors.background,
208
+ marginTop: Platform.OS === 'ios' ? 15 : 0,
209
+ },
210
+ loadingContainer: {
211
+ position: 'absolute',
212
+ top: 0,
213
+ left: 0,
214
+ right: 0,
215
+ bottom: 0,
216
+ alignItems: 'center',
217
+ justifyContent: 'center',
218
+ backgroundColor: colors.background,
219
+ zIndex: 1,
220
+ },
221
+ });
222
+
223
+ export default Payment;
224
+