@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,381 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const react_1 = __importStar(require("react"));
40
+ const react_native_1 = require("react-native");
41
+ const Ionicons_1 = __importDefault(require("react-native-vector-icons/Ionicons"));
42
+ const SafeAreaWrapper_1 = __importDefault(require("../components/SafeAreaWrapper"));
43
+ const components_1 = require("../components");
44
+ const ActionButton_1 = __importDefault(require("../components/ActionButton"));
45
+ const TextFieldWithLabel_1 = __importDefault(require("../components/TextFieldWithLabel"));
46
+ const ThemeContext_1 = require("../theme/ThemeContext");
47
+ const MasterDataProvider_1 = require("../providers/MasterDataProvider");
48
+ const fdApi_1 = require("../api/fdApi");
49
+ const store_1 = require("../store");
50
+ const appDataConfig_1 = require("../config/appDataConfig");
51
+ const helpers_1 = require("../navigation/helpers");
52
+ const bank_1 = require("../constants/strings/bank");
53
+ const common_1 = require("../constants/strings/common");
54
+ const base64Images_1 = require("../constants/strings/base64Images");
55
+ const defaultAccountTypeOptions = ['Saving', 'Current'];
56
+ const AddBankAccount = ({ onGoBack, onContinue, onFindIFSC, initialData, selectedIFSC }) => {
57
+ const colors = (0, ThemeContext_1.useColors)();
58
+ const typography = (0, ThemeContext_1.useTypography)();
59
+ const { themeName } = (0, ThemeContext_1.useTheme)();
60
+ const styles = createStyles(colors, typography, themeName);
61
+ const workflowInstanceId = (0, store_1.useAppSelector)((state) => { var _a; return (_a = state === null || state === void 0 ? void 0 : state.onboarding) === null || _a === void 0 ? void 0 : _a.workflowInstanceId; });
62
+ const applicationId = (0, store_1.useAppSelector)((state) => { var _a; return (_a = state === null || state === void 0 ? void 0 : state.onboarding) === null || _a === void 0 ? void 0 : _a.applicationId; });
63
+ const customerId = (0, store_1.useAppSelector)((state) => { var _a; return (_a = state === null || state === void 0 ? void 0 : state.onboarding) === null || _a === void 0 ? void 0 : _a.customerId; });
64
+ const { masterData } = (0, MasterDataProvider_1.useMasterData)();
65
+ // Get providerId from app data or use default
66
+ const defaultProviderId = (0, store_1.useAppSelector)((state) => { var _a; return (_a = state === null || state === void 0 ? void 0 : state.onboarding) === null || _a === void 0 ? void 0 : _a.providerId; }); // Default Shriram provider ID
67
+ // FD Bank Account API
68
+ const [fdBankAccount, { data: fdBankAccountResponse, error: fdBankAccountError, isLoading: isLoadingFDBankAccount, }] = (0, fdApi_1.useFdBankAccountMutation)();
69
+ // Normalize helper for arrays or CSV strings
70
+ const normalizeOptions = (raw, fallback) => {
71
+ if (Array.isArray(raw))
72
+ return raw.map((v) => String(v)).filter(Boolean);
73
+ if (typeof raw === 'string' && raw.trim().length)
74
+ return raw.split(',').map((v) => v.trim()).filter(Boolean);
75
+ return fallback;
76
+ };
77
+ // Prefer nested data if present, memoized to avoid re-creation on each render
78
+ const mdRoot = react_1.default.useMemo(() => {
79
+ return (masterData === null || masterData === void 0 ? void 0 : masterData.data) || masterData || {};
80
+ }, [masterData]);
81
+ // Get account type options from master data with fallback, memoized
82
+ const accountTypeOptions = react_1.default.useMemo(() => {
83
+ const raw = (mdRoot === null || mdRoot === void 0 ? void 0 : mdRoot.bankAccountType) || (mdRoot === null || mdRoot === void 0 ? void 0 : mdRoot.accountTypeOptions) || (mdRoot === null || mdRoot === void 0 ? void 0 : mdRoot.accountTypes);
84
+ return normalizeOptions(raw, defaultAccountTypeOptions);
85
+ }, [mdRoot]);
86
+ const [form, setForm] = (0, react_1.useState)({
87
+ accountType: (initialData === null || initialData === void 0 ? void 0 : initialData.accountType) || '',
88
+ accountNumber: (initialData === null || initialData === void 0 ? void 0 : initialData.accountNumber) || '',
89
+ });
90
+ // Keep account type valid if options change after load
91
+ react_1.default.useEffect(() => {
92
+ setForm(prev => (Object.assign(Object.assign({}, prev), { accountType: accountTypeOptions.includes(prev.accountType) ? prev.accountType : '' })));
93
+ }, [accountTypeOptions]);
94
+ // Track which fields have been touched by the user
95
+ const [touchedFields, setTouchedFields] = (0, react_1.useState)({
96
+ accountType: false,
97
+ accountNumber: false,
98
+ });
99
+ // Show errors only for touched fields
100
+ react_1.default.useEffect(() => {
101
+ // Validate account type only if it has been touched
102
+ if (touchedFields.accountType && !form.accountType.trim()) {
103
+ setErrors(prev => (Object.assign(Object.assign({}, prev), { accountType: bank_1.BANK_STRINGS.ACCOUNT_TYPE_REQUIRED })));
104
+ }
105
+ else if (touchedFields.accountType && form.accountType.trim()) {
106
+ setErrors(prev => (Object.assign(Object.assign({}, prev), { accountType: undefined })));
107
+ }
108
+ // Validate account number if it has content and has been touched
109
+ if (touchedFields.accountNumber && form.accountNumber.trim() && !isAccountNumberValid(form.accountNumber)) {
110
+ setErrors(prev => (Object.assign(Object.assign({}, prev), { accountNumber: bank_1.BANK_STRINGS.INVALID_ACCOUNT_NUMBER })));
111
+ }
112
+ else if (touchedFields.accountNumber && form.accountNumber.trim() && isAccountNumberValid(form.accountNumber)) {
113
+ setErrors(prev => (Object.assign(Object.assign({}, prev), { accountNumber: undefined })));
114
+ }
115
+ }, [form.accountType, form.accountNumber, touchedFields]);
116
+ const [errors, setErrors] = (0, react_1.useState)({});
117
+ const [openMenus, setOpenMenus] = (0, react_1.useState)({
118
+ accountType: false,
119
+ });
120
+ // Ref for account number text input to blur when dropdown is opened
121
+ const accountNumberRef = (0, react_1.useRef)(null);
122
+ // Ref for ScrollView to enable auto-scroll when input is focused
123
+ const scrollViewRef = (0, react_1.useRef)(null);
124
+ const updateField = (field, value) => {
125
+ setForm(prev => (Object.assign(Object.assign({}, prev), { [field]: value })));
126
+ // Mark field as touched when user interacts with it
127
+ setTouchedFields(prev => (Object.assign(Object.assign({}, prev), { [field]: true })));
128
+ };
129
+ const toggleMenu = (key) => {
130
+ var _a;
131
+ // Remove focus from account number field when dropdown is opened
132
+ (_a = accountNumberRef.current) === null || _a === void 0 ? void 0 : _a.blur();
133
+ // Mark field as touched when user opens dropdown
134
+ if (key === 'accountType') {
135
+ setTouchedFields(prev => (Object.assign(Object.assign({}, prev), { accountType: true })));
136
+ }
137
+ setOpenMenus(prev => ({
138
+ accountType: key === 'accountType' ? !prev.accountType : false,
139
+ }));
140
+ };
141
+ const closeAllMenus = () => setOpenMenus({ accountType: false });
142
+ // FD bank account API status monitored
143
+ // Pure validation (does not update state)
144
+ const isAccountNumberValid = (accountNumber) => {
145
+ const cleaned = accountNumber.replace(/\s/g, '');
146
+ if (!cleaned)
147
+ return false;
148
+ if (!/^\d{9,18}$/.test(cleaned))
149
+ return false;
150
+ return true;
151
+ };
152
+ // Validation and set error
153
+ const validateAccountNumber = (accountNumber) => {
154
+ const valid = isAccountNumberValid(accountNumber);
155
+ if (!valid) {
156
+ setErrors(prev => (Object.assign(Object.assign({}, prev), { accountNumber: bank_1.BANK_STRINGS.INVALID_ACCOUNT_NUMBER })));
157
+ }
158
+ else {
159
+ setErrors(prev => (Object.assign(Object.assign({}, prev), { accountNumber: undefined })));
160
+ }
161
+ return valid;
162
+ };
163
+ const handleAccountNumberBlur = () => {
164
+ if (form.accountNumber) {
165
+ validateAccountNumber(form.accountNumber);
166
+ }
167
+ };
168
+ const renderDropdown = (label, value, field, options, menuKey) => (react_1.default.createElement(react_native_1.View, null,
169
+ react_1.default.createElement(TextFieldWithLabel_1.default, { label: label, value: value, onChangeText: (text) => updateField(field, text), variant: "dropdown", options: options, isDropdownOpen: openMenus[menuKey], onDropdownToggle: () => toggleMenu(menuKey), onDropdownSelect: (option) => {
170
+ closeAllMenus();
171
+ updateField(field, option);
172
+ setOpenMenus(prev => (Object.assign(Object.assign({}, prev), { [menuKey]: false })));
173
+ }, placeholder: bank_1.BANK_STRINGS.ACCOUNT_TYPE_PLACEHOLDER }),
174
+ errors[field] && !openMenus[menuKey] && (react_1.default.createElement(react_native_1.View, { style: styles.errorContainer },
175
+ react_native_1.Platform.OS === 'android' && (react_1.default.createElement(Ionicons_1.default, { name: "warning", size: 16, color: colors.error || '#FF0000', style: styles.errorIcon })),
176
+ react_1.default.createElement(react_native_1.Text, { style: styles.errorText }, errors[field]))),
177
+ openMenus[menuKey] && (react_1.default.createElement(react_native_1.View, { style: styles.inlineMenu }, options.map((option) => (react_1.default.createElement(react_native_1.TouchableOpacity, { key: option, style: styles.modalOption, onPress: () => {
178
+ closeAllMenus();
179
+ updateField(field, option);
180
+ setOpenMenus(prev => (Object.assign(Object.assign({}, prev), { [menuKey]: false })));
181
+ } },
182
+ react_1.default.createElement(react_native_1.Text, { style: styles.modalOptionText }, option))))))));
183
+ // Validation function to check if all required fields are filled (pure, no setErrors)
184
+ const isFormValid = () => {
185
+ const isAccountTypeValid = !!form.accountType;
186
+ const isAccountNumberValidVal = isAccountNumberValid(form.accountNumber);
187
+ const isIFSCSelected = !!selectedIFSC;
188
+ return isAccountTypeValid && isAccountNumberValidVal && isIFSCSelected;
189
+ };
190
+ const handleContinue = async () => {
191
+ // Mark all fields as touched when validating form
192
+ setTouchedFields({
193
+ accountType: true,
194
+ accountNumber: true,
195
+ });
196
+ // Validate all fields and set errors if needed
197
+ let valid = true;
198
+ if (!form.accountType) {
199
+ setErrors(prev => (Object.assign(Object.assign({}, prev), { accountType: bank_1.BANK_STRINGS.ACCOUNT_TYPE_REQUIRED })));
200
+ valid = false;
201
+ }
202
+ if (!isAccountNumberValid(form.accountNumber)) {
203
+ setErrors(prev => (Object.assign(Object.assign({}, prev), { accountNumber: bank_1.BANK_STRINGS.INVALID_ACCOUNT_NUMBER })));
204
+ valid = false;
205
+ }
206
+ if (!valid) {
207
+ react_native_1.Alert.alert(common_1.COMMON_STRINGS.REQUIRED_FIELD, common_1.COMMON_STRINGS.FILL_REQUIRED_FIELDS);
208
+ return;
209
+ }
210
+ // Check if IFSC data is available
211
+ if (!selectedIFSC) {
212
+ react_native_1.Alert.alert(common_1.COMMON_STRINGS.REQUIRED_FIELD, bank_1.BANK_STRINGS.IFSC_CODE_REQUIRED);
213
+ return;
214
+ }
215
+ try {
216
+ // Get user info from app data
217
+ const userInfo = (0, appDataConfig_1.getUserInfoForAPI)();
218
+ if (!customerId) {
219
+ react_native_1.Alert.alert(common_1.COMMON_STRINGS.ERROR, 'Customer ID not found. Please try again.');
220
+ return;
221
+ }
222
+ // Prepare FD bank account request data with required parameters
223
+ const fdBankAccountRequest = {
224
+ providerId: defaultProviderId,
225
+ workflowInstanceId: workflowInstanceId,
226
+ userreferenceid: userInfo.userReferenceId,
227
+ applicationid: applicationId,
228
+ accountType: form.accountType,
229
+ accountNumber: form.accountNumber,
230
+ ifscCode: selectedIFSC.ifscCode,
231
+ bankName: selectedIFSC.bankName,
232
+ branchName: selectedIFSC.branchName,
233
+ customerId: customerId,
234
+ };
235
+ const response = await fdBankAccount(fdBankAccountRequest).unwrap();
236
+ // Navigate to PayNow screen after successful API call
237
+ (0, helpers_1.navigate)('PayNow');
238
+ }
239
+ catch (error) {
240
+ // Show error message to user and stay on current screen
241
+ react_native_1.Alert.alert(common_1.COMMON_STRINGS.ERROR, bank_1.BANK_STRINGS.BANK_ACCOUNT_ADDED_FAILED);
242
+ }
243
+ };
244
+ // Handler for back button (used by both header and hardware back button)
245
+ const handleBackPress = () => {
246
+ (0, helpers_1.navigate)('BankDetail');
247
+ };
248
+ // Handle Android hardware back button
249
+ (0, react_1.useEffect)(() => {
250
+ if (react_native_1.Platform.OS !== 'android')
251
+ return;
252
+ const onHardwareBackPress = () => {
253
+ handleBackPress();
254
+ return true; // Prevent default behavior
255
+ };
256
+ const backHandler = react_native_1.BackHandler.addEventListener('hardwareBackPress', onHardwareBackPress);
257
+ return () => backHandler.remove();
258
+ }, []);
259
+ return (react_1.default.createElement(SafeAreaWrapper_1.default, { includeTop: false, bottomPadding: 25, statusBarColor: "#000000", statusBarStyle: "light-content" },
260
+ react_1.default.createElement(components_1.Header, { title: bank_1.BANK_STRINGS.ADD_BANK_ACCOUNT_TITLE, onBackPress: handleBackPress, backgroundColor: colors.primary }),
261
+ react_1.default.createElement(react_native_1.KeyboardAvoidingView, { style: { flex: 1 }, behavior: react_native_1.Platform.OS === 'ios' ? 'padding' : undefined, keyboardVerticalOffset: react_native_1.Platform.OS === 'ios' ? 0 : 0 },
262
+ react_1.default.createElement(react_native_1.ScrollView, { ref: scrollViewRef, style: styles.scrollContent, showsVerticalScrollIndicator: false, keyboardShouldPersistTaps: "handled", onScrollBeginDrag: closeAllMenus, contentContainerStyle: styles.scrollContentContainer, scrollEnabled: !isLoadingFDBankAccount },
263
+ react_1.default.createElement(react_native_1.TouchableWithoutFeedback, { onPress: isLoadingFDBankAccount ? undefined : closeAllMenus },
264
+ react_1.default.createElement(react_native_1.View, null,
265
+ renderDropdown(bank_1.BANK_STRINGS.ACCOUNT_TYPE_LABEL, form.accountType, 'accountType', accountTypeOptions, 'accountType'),
266
+ react_1.default.createElement(react_native_1.View, null,
267
+ react_1.default.createElement(TextFieldWithLabel_1.default, { label: bank_1.BANK_STRINGS.ACCOUNT_NUMBER_LABEL, value: form.accountNumber, onChangeText: (text) => {
268
+ // Allow only numbers
269
+ const cleaned = text.replace(/\D/g, '');
270
+ updateField('accountNumber', cleaned);
271
+ }, onFocus: () => {
272
+ closeAllMenus();
273
+ setTouchedFields(prev => (Object.assign(Object.assign({}, prev), { accountNumber: true })));
274
+ // Scroll to input when focused to keep it visible above keyboard
275
+ setTimeout(() => {
276
+ var _a;
277
+ (_a = scrollViewRef.current) === null || _a === void 0 ? void 0 : _a.scrollToEnd({ animated: true });
278
+ }, 300);
279
+ }, textInputRef: accountNumberRef, placeholder: bank_1.BANK_STRINGS.ACCOUNT_NUMBER_PLACEHOLDER, variant: "numeric", keyboardType: "numeric", maxLength: 18 }),
280
+ errors.accountNumber && (react_1.default.createElement(react_native_1.View, { style: styles.errorContainer },
281
+ react_native_1.Platform.OS === 'android' && (react_1.default.createElement(Ionicons_1.default, { name: "warning", size: 16, color: colors.error || '#FF0000', style: styles.errorIcon })),
282
+ react_1.default.createElement(react_native_1.Text, { style: styles.errorText }, errors.accountNumber)))),
283
+ react_1.default.createElement(react_native_1.View, null,
284
+ react_1.default.createElement(react_native_1.Text, { style: styles.ifscLabel },
285
+ bank_1.BANK_STRINGS.IFSC_CODE_LABEL,
286
+ " (Required)"),
287
+ (() => {
288
+ return null;
289
+ })(),
290
+ selectedIFSC ? (react_1.default.createElement(components_1.IFSCSearchResultCard, { bankName: selectedIFSC.bankName, branchName: selectedIFSC.branchName, ifscCode: selectedIFSC.ifscCode, bankShortDesc: selectedIFSC.bankShortDesc, bankCode: selectedIFSC.bankCode, onSelect: onFindIFSC || (() => { }), buttonTitle: "Change" })) : (react_1.default.createElement(react_native_1.TouchableOpacity, { style: styles.findIFSCButton, onPress: () => { closeAllMenus(); onFindIFSC === null || onFindIFSC === void 0 ? void 0 : onFindIFSC(); } },
291
+ react_1.default.createElement(react_native_1.View, { style: styles.findIFSCContainer },
292
+ react_1.default.createElement(react_native_1.Image, { source: { uri: base64Images_1.base64Images.search }, style: styles.searchIcon }),
293
+ react_1.default.createElement(react_native_1.Text, { style: styles.findIFSCText }, bank_1.BANK_STRINGS.FIND_IFSC_BUTTON))))))))),
294
+ react_1.default.createElement(react_native_1.View, { style: styles.footer },
295
+ react_1.default.createElement(ActionButton_1.default, { title: common_1.COMMON_STRINGS.CONTINUE, onPress: handleContinue, disabled: isLoadingFDBankAccount || !isFormValid(), loading: isLoadingFDBankAccount })),
296
+ isLoadingFDBankAccount && (react_1.default.createElement(react_native_1.View, { style: styles.loadingOverlay, pointerEvents: "auto" }))));
297
+ };
298
+ const createStyles = (colors, typography, themeName) => react_native_1.StyleSheet.create({
299
+ scrollContent: {
300
+ flex: 1,
301
+ paddingHorizontal: 16,
302
+ paddingTop: 20,
303
+ },
304
+ scrollContentContainer: {
305
+ flexGrow: 1,
306
+ paddingBottom: 200,
307
+ },
308
+ footer: {
309
+ position: 'absolute',
310
+ bottom: 0,
311
+ left: 0,
312
+ right: 0,
313
+ backgroundColor: colors.background,
314
+ paddingHorizontal: 16,
315
+ paddingTop: 16,
316
+ paddingBottom: 25,
317
+ },
318
+ inlineMenu: {
319
+ backgroundColor: themeName === 'dark' ? colors.inputBackground : colors.background,
320
+ borderWidth: themeName === 'dark' ? 1 : 0.5,
321
+ borderColor: themeName === 'dark' ? '#ffffff' : 'rgba(0,0,0,0.2)',
322
+ borderRadius: 8,
323
+ marginTop: -20,
324
+ marginBottom: 10,
325
+ paddingHorizontal: 12,
326
+ paddingVertical: 6,
327
+ },
328
+ modalOption: {
329
+ paddingVertical: 14,
330
+ },
331
+ modalOptionText: Object.assign(Object.assign({}, typography.styles.bodyLarge), { color: colors.text }),
332
+ ifscLabel: Object.assign(Object.assign({}, typography.styles.bodySmall), { color: colors.textLight, marginBottom: 8 }),
333
+ findIFSCButton: {
334
+ marginBottom: 10,
335
+ },
336
+ findIFSCContainer: {
337
+ flexDirection: 'row',
338
+ alignItems: 'flex-start',
339
+ justifyContent: 'flex-start',
340
+ },
341
+ searchIcon: {
342
+ width: 14,
343
+ height: 14,
344
+ marginRight: 4,
345
+ marginTop: 2,
346
+ tintColor: colors.primary,
347
+ },
348
+ findIFSCText: Object.assign(Object.assign({}, typography.styles.bodyMedium), { color: colors.primary }),
349
+ debugButton: {
350
+ paddingHorizontal: 16,
351
+ paddingVertical: 12,
352
+ borderRadius: 8,
353
+ marginBottom: 16,
354
+ alignItems: 'center',
355
+ },
356
+ debugButtonText: Object.assign(Object.assign({}, typography.styles.bodyMedium), { fontWeight: '600' }),
357
+ errorContainer: {
358
+ flexDirection: 'row',
359
+ alignItems: 'center',
360
+ marginTop: -20,
361
+ marginBottom: 20,
362
+ },
363
+ errorIcon: {
364
+ marginRight: 6,
365
+ },
366
+ errorText: {
367
+ fontSize: 12,
368
+ color: colors.error || '#FF0000',
369
+ flex: 1,
370
+ },
371
+ loadingOverlay: {
372
+ position: 'absolute',
373
+ top: 0,
374
+ left: 0,
375
+ right: 0,
376
+ bottom: 0,
377
+ backgroundColor: 'rgba(0, 0, 0, 0.3)',
378
+ zIndex: 1000,
379
+ },
380
+ });
381
+ exports.default = AddBankAccount;
@@ -0,0 +1,16 @@
1
+ import React from 'react';
2
+ export interface BankDetailProps {
3
+ onGoBack?: () => void;
4
+ onContinue?: (data: BankData) => void;
5
+ onAddAccount?: () => void;
6
+ initialData?: Partial<BankData>;
7
+ }
8
+ export interface BankData {
9
+ accountType: string;
10
+ accountNumber: string;
11
+ ifscCode: string;
12
+ bankName: string;
13
+ branchName: string;
14
+ }
15
+ declare const BankDetail: React.FC<BankDetailProps>;
16
+ export default BankDetail;