@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,759 @@
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
+ // FDCalculator.tsx
40
+ const react_1 = __importStar(require("react"));
41
+ const react_native_1 = require("react-native");
42
+ const Ionicons_1 = __importDefault(require("react-native-vector-icons/Ionicons"));
43
+ const SafeAreaWrapper_1 = __importDefault(require("../components/SafeAreaWrapper"));
44
+ const components_1 = require("../components");
45
+ const ThemeContext_1 = require("../theme/ThemeContext");
46
+ const MasterDataProvider_1 = require("../providers/MasterDataProvider");
47
+ const fdCalculatorApi_1 = require("../api/fdCalculatorApi");
48
+ const interestRateApi_1 = require("../api/interestRateApi");
49
+ const onboardingApi_1 = require("../api/onboardingApi");
50
+ const masterDataApi_1 = require("../api/masterDataApi");
51
+ const appDataConfig_1 = require("../config/appDataConfig");
52
+ const store_1 = require("../store");
53
+ // import { setFDCalculationData } from '../store/fdCalculationSlice';
54
+ const fdListSelectedSlice_1 = require("../store/fdListSelectedSlice");
55
+ const helpers_1 = require("../navigation/helpers");
56
+ const strings_1 = require("../constants/strings");
57
+ const base64Images_1 = require("../constants/strings/base64Images");
58
+ const FDCalculator = ({ onGoBack, onNavigateToReviewKYC, fdData }) => {
59
+ const typography = (0, ThemeContext_1.useTypography)();
60
+ const colors = (0, ThemeContext_1.useColors)();
61
+ const { themeName } = (0, ThemeContext_1.useTheme)();
62
+ const styles = react_1.default.useMemo(() => createStyles(typography, colors, themeName), [typography, colors, themeName]);
63
+ const { masterData, setMasterData } = (0, MasterDataProvider_1.useMasterData)();
64
+ // Get FD data from Redux as fallback if not passed as props
65
+ const fdListSelectedData = (0, store_1.useAppSelector)((state) => state === null || state === void 0 ? void 0 : state.fdListSelected);
66
+ const effectiveFdData = fdData || fdListSelectedData;
67
+ const [amount, setAmount] = (0, react_1.useState)('');
68
+ const [seniorCitizen, setSeniorCitizen] = (0, react_1.useState)(false);
69
+ const [taxResident, setTaxResident] = (0, react_1.useState)(true);
70
+ const [autoRenewal, setAutoRenewal] = (0, react_1.useState)(false);
71
+ const [expandedIndex, setExpandedIndex] = (0, react_1.useState)(null);
72
+ const [calculationResult, setCalculationResult] = (0, react_1.useState)(null);
73
+ const [debounceTimer, setDebounceTimer] = (0, react_1.useState)(null);
74
+ const [amountError, setAmountError] = (0, react_1.useState)('');
75
+ const [taxResidentError, setTaxResidentError] = (0, react_1.useState)('');
76
+ const [isAmountEditing, setIsAmountEditing] = (0, react_1.useState)(false);
77
+ // Calculate age from DOB and set senior citizen status
78
+ const calculateAgeAndSetSeniorCitizen = react_1.default.useCallback((dob) => {
79
+ if (!dob)
80
+ return;
81
+ const today = new Date();
82
+ const birthDate = new Date(dob);
83
+ let age = today.getFullYear() - birthDate.getFullYear();
84
+ const monthDiff = today.getMonth() - birthDate.getMonth();
85
+ if (monthDiff < 0 || (monthDiff === 0 && today.getDate() < birthDate.getDate())) {
86
+ age--;
87
+ }
88
+ setSeniorCitizen(age >= 60);
89
+ }, []);
90
+ // Interest payout dropdown state - will be updated after master data is loaded
91
+ const [payoutValue, setPayoutValue] = (0, react_1.useState)('');
92
+ const [showPayoutModal, setShowPayoutModal] = (0, react_1.useState)(false);
93
+ // Map dropdown values to API values
94
+ const mapPayoutToAPI = (dropdownValue) => {
95
+ const mapping = {
96
+ 'On Maturity': 'On Maturity',
97
+ 'Monthly': 'Monthly',
98
+ 'Quarterly': 'Quarterly',
99
+ 'Yearly': 'Yearly',
100
+ 'Half-Yearly': 'Half-Yearly',
101
+ };
102
+ return mapping[dropdownValue] || '';
103
+ };
104
+ // Check senior citizen status on component mount
105
+ react_1.default.useEffect(() => {
106
+ try {
107
+ const appData = (0, appDataConfig_1.getAppData)();
108
+ if (appData === null || appData === void 0 ? void 0 : appData.dob) {
109
+ calculateAgeAndSetSeniorCitizen(appData.dob);
110
+ }
111
+ }
112
+ catch (error) {
113
+ // Handle error silently
114
+ }
115
+ }, [calculateAgeAndSetSeniorCitizen]);
116
+ // Interest rates for Tenure options (real API)
117
+ const [getInterestRates, { data: interestRates }] = (0, interestRateApi_1.useGetInterestRatesMutation)();
118
+ react_1.default.useEffect(() => {
119
+ try {
120
+ getInterestRates({});
121
+ }
122
+ catch (e) {
123
+ // Handle error silently
124
+ }
125
+ }, [getInterestRates]);
126
+ // Fallback: Load master data if not available from global state
127
+ 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
128
+ // Default Shriram provider ID
129
+ const { data: fallbackMasterData, isLoading: isLoadingFallback, error: fallbackError, refetch: refetchMasterData } = (0, masterDataApi_1.useGetMasterDataQuery)({ providerId: defaultProviderId }, // Use default provider ID
130
+ { skip: !!masterData } // Skip if master data is already available
131
+ );
132
+ // Use fallback master data if global master data is not available
133
+ // Store only the data parameter after stringifying instead of complete response
134
+ const effectiveMasterData = react_1.default.useMemo(() => {
135
+ const sourceData = masterData || fallbackMasterData;
136
+ if (!sourceData)
137
+ return null;
138
+ // If sourceData has a data property, extract and stringify it
139
+ if (sourceData.data) {
140
+ return JSON.stringify(sourceData.data);
141
+ }
142
+ // If sourceData is already the data object, stringify it
143
+ return JSON.stringify(sourceData);
144
+ }, [masterData, fallbackMasterData]);
145
+ // Default payout options as fallback
146
+ // const defaultPayoutOptions = ['Maturity', 'Monthly eee', 'Quarterly', 'Half-Yearly', 'Yearly'];
147
+ const payoutOptions = react_1.default.useMemo(() => {
148
+ try {
149
+ const parsedData = JSON.parse(effectiveMasterData || '{}');
150
+ // If master data gives a single value instead of an array
151
+ const rawValue = parsedData === null || parsedData === void 0 ? void 0 : parsedData.interestPayoutTerm;
152
+ if (!rawValue)
153
+ return [];
154
+ // Handle both array and string types
155
+ if (Array.isArray(rawValue)) {
156
+ return rawValue;
157
+ }
158
+ // If it's a comma-separated string or a single string
159
+ if (typeof rawValue === 'string') {
160
+ // e.g. "Maturity,Monthly,Quarterly" → ['Maturity', 'Monthly', 'Quarterly']
161
+ return rawValue.split(',').map(v => v.trim());
162
+ }
163
+ return [];
164
+ }
165
+ catch (error) {
166
+ return [];
167
+ }
168
+ }, [effectiveMasterData]);
169
+ // Store fallback master data in global state if it becomes available
170
+ react_1.default.useEffect(() => {
171
+ if (fallbackMasterData && !masterData) {
172
+ setMasterData(fallbackMasterData);
173
+ }
174
+ }, [fallbackMasterData, masterData, setMasterData]);
175
+ // Update payout value when master data becomes available
176
+ react_1.default.useEffect(() => {
177
+ if (payoutOptions.length > 0 && !payoutValue) {
178
+ // Set "On Maturity" as default if available, otherwise use first option
179
+ const defaultOption = payoutOptions.find(option => option === 'On Maturity') || payoutOptions[0];
180
+ setPayoutValue(defaultOption);
181
+ }
182
+ }, [payoutOptions]);
183
+ react_1.default.useEffect(() => {
184
+ if (amount && payoutValue) {
185
+ // Only call if amount is valid
186
+ const numericValue = parseInt(amount.replace(/,/g, ''), 10);
187
+ if (numericValue >= 5000 && numericValue <= 50000000 && numericValue % 1000 === 0) {
188
+ handleCalculateFD(amount, payoutValue);
189
+ }
190
+ }
191
+ }, [payoutValue]);
192
+ // Master data processing complete
193
+ // FD Calculator API
194
+ const [calculateFD, { isLoading: isCalculating }] = (0, fdCalculatorApi_1.useCalculateFDMutation)();
195
+ // Onboarding API
196
+ const [startOnboarding, { isLoading: isOnboarding }] = (0, onboardingApi_1.useStartOnboardingMutation)();
197
+ const [isBooking, setIsBooking] = react_1.default.useState(false);
198
+ const dispatch = (0, store_1.useAppDispatch)();
199
+ const { setOnboardingIds } = require('../store/onboardingSlice');
200
+ const tenureOptions = react_1.default.useMemo(() => {
201
+ var _a, _b;
202
+ const months = [];
203
+ const sdr = ((_a = interestRates === null || interestRates === void 0 ? void 0 : interestRates.data) === null || _a === void 0 ? void 0 : _a.sdrScheme) || [];
204
+ const fdr = ((_b = interestRates === null || interestRates === void 0 ? void 0 : interestRates.data) === null || _b === void 0 ? void 0 : _b.fdrScheme) || [];
205
+ sdr.forEach((r) => { if (typeof (r === null || r === void 0 ? void 0 : r.perdMonth) === 'number')
206
+ months.push(r.perdMonth); });
207
+ fdr.forEach((r) => { if (typeof (r === null || r === void 0 ? void 0 : r.perdMonth) === 'number')
208
+ months.push(r.perdMonth); });
209
+ const unique = Array.from(new Set(months)).sort((a, b) => a - b);
210
+ return unique.map(m => `${m} Months`);
211
+ }, [interestRates]);
212
+ const [tenureValue, setTenureValue] = (0, react_1.useState)('');
213
+ react_1.default.useEffect(() => {
214
+ if (tenureOptions.length > 0) {
215
+ // If effectiveFdData has tenure, use it; otherwise use first option
216
+ if (effectiveFdData === null || effectiveFdData === void 0 ? void 0 : effectiveFdData.tenure) {
217
+ // Check if the effectiveFdData tenure exists in tenureOptions
218
+ const matchingTenure = tenureOptions.find(option => option === effectiveFdData.tenure);
219
+ setTenureValue(matchingTenure || effectiveFdData.tenure);
220
+ }
221
+ else {
222
+ setTenureValue(tenureOptions[0]);
223
+ }
224
+ }
225
+ }, [tenureOptions, effectiveFdData === null || effectiveFdData === void 0 ? void 0 : effectiveFdData.tenure]);
226
+ const [showTenureMenu, setShowTenureMenu] = (0, react_1.useState)(false);
227
+ // Function to close all dropdown menus
228
+ const closeAllMenus = () => {
229
+ setShowTenureMenu(false);
230
+ setShowPayoutModal(false);
231
+ };
232
+ // Function to call FD calculator API
233
+ const handleCalculateFD = react_1.default.useCallback(async (currentAmount, selectedPayout) => {
234
+ var _a, _b;
235
+ const payoutToUse = selectedPayout || payoutValue;
236
+ const amountToUse = currentAmount || amount; // ✅ use latest if provided
237
+ if (!amountToUse || !payoutToUse)
238
+ return;
239
+ try {
240
+ const amountValue = parseFloat(amountToUse.replace(/,/g, ''));
241
+ const tenureMonths = parseInt(tenureValue.replace(' Months', ''));
242
+ if (isNaN(amountValue) || isNaN(tenureMonths) || amountValue <= 0 || tenureMonths <= 0)
243
+ return;
244
+ const sdr = ((_a = interestRates === null || interestRates === void 0 ? void 0 : interestRates.data) === null || _a === void 0 ? void 0 : _a.sdrScheme) || [];
245
+ const fdr = ((_b = interestRates === null || interestRates === void 0 ? void 0 : interestRates.data) === null || _b === void 0 ? void 0 : _b.fdrScheme) || [];
246
+ const firstRate = sdr[0] || fdr[0];
247
+ const providerId = firstRate === null || firstRate === void 0 ? void 0 : firstRate.providerId;
248
+ const appData = (0, appDataConfig_1.getAppData)();
249
+ const userDob = (appData === null || appData === void 0 ? void 0 : appData.dob) || '1990-01-01';
250
+ const isWomenDepositor = (appData === null || appData === void 0 ? void 0 : appData.gender) === 'F';
251
+ const requestData = {
252
+ principalAmount: amountValue,
253
+ tenureInMonths: tenureMonths,
254
+ dob: userDob,
255
+ isWomenDepositor,
256
+ investmentType: payoutToUse === 'On Maturity' ? 'SDR' : 'FDR',
257
+ providerId,
258
+ interestPayout: payoutToUse,
259
+ };
260
+ const result = await calculateFD(requestData).unwrap();
261
+ setCalculationResult(result);
262
+ }
263
+ catch (error) {
264
+ // FD calculation failed
265
+ }
266
+ finally {
267
+ setIsAmountEditing(false);
268
+ }
269
+ }, [amount, tenureValue, payoutValue, calculateFD, interestRates]);
270
+ // Debounced amount change handler
271
+ const handleAmountChange = react_1.default.useCallback((text) => {
272
+ setIsAmountEditing(true);
273
+ // Step 1: Always remove commas first
274
+ const unformatted = text.replace(/,/g, '');
275
+ // Step 2: Allow only numbers
276
+ let cleanedText = unformatted.replace(/[^0-9]/g, '');
277
+ if (cleanedText.length > 1 && cleanedText.startsWith('0')) {
278
+ cleanedText = cleanedText.replace(/^0+/, '');
279
+ }
280
+ // Step 3: Stop if greater than 5 crores
281
+ const numericValue = parseInt(cleanedText || '0', 10);
282
+ if (numericValue > 50000000)
283
+ return;
284
+ // Step 4: Update state with raw digits (not formatted)
285
+ setAmount(cleanedText);
286
+ // Step 5: Validate
287
+ if (!cleanedText) {
288
+ setAmountError('');
289
+ setIsAmountEditing(false);
290
+ }
291
+ else if (numericValue < 5000)
292
+ setAmountError(strings_1.FD_STRINGS.MINIMUM_AMOUNT_ERROR);
293
+ else if (numericValue % 1000 !== 0)
294
+ setAmountError(strings_1.FD_STRINGS.AMOUNT_MULTIPLES_ERROR);
295
+ else
296
+ setAmountError('');
297
+ // Step 6: Clear previous debounce timer
298
+ if (debounceTimer)
299
+ clearTimeout(debounceTimer);
300
+ // Step 7: Debounced API call
301
+ const isValidLocal = numericValue >= 5000 && numericValue <= 50000000 && numericValue % 1000 === 0;
302
+ if (cleanedText && isValidLocal && payoutValue) {
303
+ const newTimer = setTimeout(() => {
304
+ // Pass latest cleanedText directly to avoid stale state
305
+ handleCalculateFD(cleanedText);
306
+ }, 1000);
307
+ setDebounceTimer(newTimer);
308
+ }
309
+ }, [debounceTimer, handleCalculateFD, payoutValue]);
310
+ // Function to call onboarding API
311
+ const handleStartOnboarding = react_1.default.useCallback(async (selectedPayout) => {
312
+ var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l, _m, _o;
313
+ if (isBooking)
314
+ return;
315
+ setIsBooking(true);
316
+ const payoutToUse = selectedPayout || payoutValue;
317
+ try {
318
+ // Check if required fields are filled
319
+ if (!amount || !tenureValue) {
320
+ return;
321
+ }
322
+ const amountValue = parseFloat(amount.replace(/,/g, ''));
323
+ const tenureMonths = parseInt(tenureValue.replace(' Months', ''));
324
+ if (isNaN(amountValue) || isNaN(tenureMonths) || amountValue <= 0 || tenureMonths <= 0) {
325
+ return;
326
+ }
327
+ // Check minimum amount requirement
328
+ if (amountValue < 5000) {
329
+ return;
330
+ }
331
+ // Get providerId from interest rates data
332
+ const sdr = ((_a = interestRates === null || interestRates === void 0 ? void 0 : interestRates.data) === null || _a === void 0 ? void 0 : _a.sdrScheme) || [];
333
+ const fdr = ((_b = interestRates === null || interestRates === void 0 ? void 0 : interestRates.data) === null || _b === void 0 ? void 0 : _b.fdrScheme) || [];
334
+ const firstRate = sdr[0] || fdr[0];
335
+ const providerId = firstRate === null || firstRate === void 0 ? void 0 : firstRate.providerId;
336
+ // Get user data for all required fields
337
+ const appData = (0, appDataConfig_1.getAppData)();
338
+ const userDob = (appData === null || appData === void 0 ? void 0 : appData.dob) || '1990-01-01';
339
+ const isWomenDepositor = (appData === null || appData === void 0 ? void 0 : appData.gender) === 'F';
340
+ // Get calculated values from API response based on investment type
341
+ const investmentType = payoutValue === 'On Maturity' ? 'SDR' : 'FDR';
342
+ const calcData = investmentType === 'SDR'
343
+ ? (_d = (_c = calculationResult === null || calculationResult === void 0 ? void 0 : calculationResult.data) === null || _c === void 0 ? void 0 : _c.sdrCalc) === null || _d === void 0 ? void 0 : _d[0]
344
+ : (_f = (_e = calculationResult === null || calculationResult === void 0 ? void 0 : calculationResult.data) === null || _e === void 0 ? void 0 : _e.fdrCalc) === null || _f === void 0 ? void 0 : _f[0];
345
+ const interestRate = calcData === null || calcData === void 0 ? void 0 : calcData.wRoi;
346
+ const maturityAmount = calcData === null || calcData === void 0 ? void 0 : calcData.maturityAmount;
347
+ // Calculate maturity date
348
+ const maturityDate = new Date();
349
+ maturityDate.setMonth(maturityDate.getMonth() + tenureMonths);
350
+ const formattedMaturityDate = maturityDate.toISOString().split('T')[0];
351
+ const onboardingData = {
352
+ // User personal details
353
+ mobile: (appData === null || appData === void 0 ? void 0 : appData.mobNo) || '',
354
+ prefix: (appData === null || appData === void 0 ? void 0 : appData.gender) === 'M' ? 'Mr.' : ((appData === null || appData === void 0 ? void 0 : appData.gender) === 'F' ? 'Ms.' : 'Mr.'),
355
+ fullName: (appData === null || appData === void 0 ? void 0 : appData.name) || '',
356
+ firstName: ((_g = appData === null || appData === void 0 ? void 0 : appData.name) === null || _g === void 0 ? void 0 : _g.split(' ')[0]) || '',
357
+ lastName: ((_h = appData === null || appData === void 0 ? void 0 : appData.name) === null || _h === void 0 ? void 0 : _h.split(' ').slice(1).join(' ')) || '',
358
+ userReferenceId: (appData === null || appData === void 0 ? void 0 : appData.id) || '',
359
+ dob: userDob,
360
+ email: (appData === null || appData === void 0 ? void 0 : appData.email) || '',
361
+ gender: (appData === null || appData === void 0 ? void 0 : appData.gender) === 'M' ? 'Male' : ((appData === null || appData === void 0 ? void 0 : appData.gender) === 'F' ? 'Female' : 'Male'),
362
+ // FD details
363
+ autoRenewal: autoRenewal,
364
+ investmentAmount: amountValue,
365
+ tenureInMonths: tenureMonths,
366
+ interestPayoutTerm: payoutToUse,
367
+ interestRate: interestRate,
368
+ maturityDate: formattedMaturityDate,
369
+ maturityAmount: Math.round(maturityAmount),
370
+ // Additional fields
371
+ principalAmount: amountValue,
372
+ isWomenDepositor: isWomenDepositor,
373
+ investmentType: payoutToUse === 'On Maturity' ? 'SDR' : 'FDR',
374
+ providerId: providerId,
375
+ eventNotifyUrl: appData === null || appData === void 0 ? void 0 : appData.eventNotifyUrl,
376
+ };
377
+ const result = await startOnboarding(onboardingData).unwrap();
378
+ // Store FD calculation data directly into FDListSelected for PayNow screen
379
+ try {
380
+ const fdListSelectedData = {
381
+ id: (effectiveFdData === null || effectiveFdData === void 0 ? void 0 : effectiveFdData.id) || '',
382
+ providerId: providerId || '',
383
+ name: (effectiveFdData === null || effectiveFdData === void 0 ? void 0 : effectiveFdData.name) || '',
384
+ accountNumber: '',
385
+ roi: (effectiveFdData === null || effectiveFdData === void 0 ? void 0 : effectiveFdData.roi) || '',
386
+ tenure: tenureValue,
387
+ amount: parseInt(amount) || 0,
388
+ maturityDate: '',
389
+ status: 'pending',
390
+ creditRating: (effectiveFdData === null || effectiveFdData === void 0 ? void 0 : effectiveFdData.creditRating) || 'NA',
391
+ companyName: (effectiveFdData === null || effectiveFdData === void 0 ? void 0 : effectiveFdData.name) || '',
392
+ fdRate: (effectiveFdData === null || effectiveFdData === void 0 ? void 0 : effectiveFdData.roi) || '',
393
+ interestPayout: payoutToUse,
394
+ };
395
+ dispatch((0, fdListSelectedSlice_1.setFDListSelected)(fdListSelectedData));
396
+ }
397
+ catch (e) {
398
+ // Handle error silently
399
+ }
400
+ // Persist onboarding identifiers globally for subsequent API calls
401
+ try {
402
+ const ids = {
403
+ workflowInstanceId: (_j = result === null || result === void 0 ? void 0 : result.data) === null || _j === void 0 ? void 0 : _j.workflowInstanceId,
404
+ applicationId: (_k = result === null || result === void 0 ? void 0 : result.data) === null || _k === void 0 ? void 0 : _k.applicationId,
405
+ entityid: (_l = result === null || result === void 0 ? void 0 : result.data) === null || _l === void 0 ? void 0 : _l.entityid,
406
+ customerId: (_m = result === null || result === void 0 ? void 0 : result.data) === null || _m === void 0 ? void 0 : _m.customerId,
407
+ fdId: (_o = result === null || result === void 0 ? void 0 : result.data) === null || _o === void 0 ? void 0 : _o.fdId,
408
+ };
409
+ if (dispatch && setOnboardingIds) {
410
+ dispatch(setOnboardingIds(ids));
411
+ }
412
+ else {
413
+ // Dispatch or setOnboardingIds unavailable
414
+ }
415
+ }
416
+ catch (e) {
417
+ // Handle error silently
418
+ }
419
+ // Navigate to ReviewKYC after successful onboarding
420
+ if (result.status === 'success' && onNavigateToReviewKYC) {
421
+ onNavigateToReviewKYC();
422
+ }
423
+ }
424
+ catch (error) {
425
+ // Handle error silently
426
+ }
427
+ finally {
428
+ setIsBooking(false);
429
+ }
430
+ }, [amount, tenureValue, interestRates, startOnboarding, onNavigateToReviewKYC, isBooking, payoutValue, calculationResult, autoRenewal]);
431
+ // Cleanup timer on unmount
432
+ react_1.default.useEffect(() => {
433
+ return () => {
434
+ if (debounceTimer) {
435
+ clearTimeout(debounceTimer);
436
+ }
437
+ };
438
+ }, [debounceTimer]);
439
+ // Derived validation state for amount input
440
+ const isAmountValid = react_1.default.useMemo(() => {
441
+ const amountValue = parseFloat(amount.replace(/,/g, ''));
442
+ return !!amount && !isNaN(amountValue) && amountValue >= 5000 && amountValue <= 50000000 && amountValue % 1000 === 0;
443
+ }, [amount]);
444
+ // Derived validation state for payout selection
445
+ const isPayoutValid = react_1.default.useMemo(() => {
446
+ return !!payoutValue && payoutValue.trim() !== '';
447
+ }, [payoutValue]);
448
+ // Handle tax resident checkbox change
449
+ const handleTaxResidentChange = () => {
450
+ const newValue = !taxResident;
451
+ setTaxResident(newValue);
452
+ // Show error if unchecked
453
+ if (!newValue) {
454
+ setTaxResidentError(strings_1.FD_STRINGS.TAX_RESIDENT_ERROR);
455
+ }
456
+ else {
457
+ setTaxResidentError('');
458
+ }
459
+ };
460
+ // Extract FAQ data from master data API response
461
+ const faqData = react_1.default.useMemo(() => {
462
+ try {
463
+ const parsedData = JSON.parse(effectiveMasterData || '{}');
464
+ // Check if master data contains FAQ information (exact field name from API response)
465
+ const masterDataFaq = (parsedData === null || parsedData === void 0 ? void 0 : parsedData.Faq) || (parsedData === null || parsedData === void 0 ? void 0 : parsedData.faq) || (parsedData === null || parsedData === void 0 ? void 0 : parsedData.faqData) || (parsedData === null || parsedData === void 0 ? void 0 : parsedData.frequentlyAskedQuestions);
466
+ if (masterDataFaq && Array.isArray(masterDataFaq) && masterDataFaq.length > 0) {
467
+ return masterDataFaq.map((faq) => ({
468
+ title: faq.title || faq.question || faq.q || '',
469
+ description: faq.description || faq.answer || faq.a || ''
470
+ })).filter((faq) => faq.title && faq.description);
471
+ }
472
+ // Fallback to hardcoded FAQ strings if master data doesn't contain FAQ
473
+ return [
474
+ {
475
+ title: strings_1.FAQ_STRINGS.FAQ_WITHDRAWAL_QUESTION,
476
+ description: strings_1.FAQ_STRINGS.FAQ_WITHDRAWAL_ANSWER,
477
+ },
478
+ {
479
+ title: strings_1.FAQ_STRINGS.FAQ_CREDIT_QUESTION,
480
+ description: strings_1.FAQ_STRINGS.FAQ_CREDIT_ANSWER
481
+ },
482
+ {
483
+ title: strings_1.FAQ_STRINGS.FAQ_TAX_EXEMPTION_QUESTION,
484
+ description: strings_1.FAQ_STRINGS.FAQ_TAX_EXEMPTION_ANSWER
485
+ },
486
+ {
487
+ title: strings_1.FAQ_STRINGS.FAQ_CUMULATIVE_QUESTION,
488
+ description: strings_1.FAQ_STRINGS.FAQ_CUMULATIVE_ANSWER
489
+ },
490
+ {
491
+ title: strings_1.FAQ_STRINGS.FAQ_OPENING_TIME_QUESTION,
492
+ description: strings_1.FAQ_STRINGS.FAQ_OPENING_TIME_ANSWER
493
+ },
494
+ {
495
+ title: strings_1.FAQ_STRINGS.FAQ_TDS_AVOIDANCE_QUESTION,
496
+ description: strings_1.FAQ_STRINGS.FAQ_TDS_AVOIDANCE_ANSWER
497
+ },
498
+ ];
499
+ }
500
+ catch (error) {
501
+ // Return fallback FAQ data on error
502
+ return [
503
+ {
504
+ title: strings_1.FAQ_STRINGS.FAQ_WITHDRAWAL_QUESTION,
505
+ description: strings_1.FAQ_STRINGS.FAQ_WITHDRAWAL_ANSWER,
506
+ },
507
+ {
508
+ title: strings_1.FAQ_STRINGS.FAQ_CREDIT_QUESTION,
509
+ description: strings_1.FAQ_STRINGS.FAQ_CREDIT_ANSWER
510
+ },
511
+ {
512
+ title: strings_1.FAQ_STRINGS.FAQ_TAX_EXEMPTION_QUESTION,
513
+ description: strings_1.FAQ_STRINGS.FAQ_TAX_EXEMPTION_ANSWER
514
+ },
515
+ {
516
+ title: strings_1.FAQ_STRINGS.FAQ_CUMULATIVE_QUESTION,
517
+ description: strings_1.FAQ_STRINGS.FAQ_CUMULATIVE_ANSWER
518
+ },
519
+ {
520
+ title: strings_1.FAQ_STRINGS.FAQ_OPENING_TIME_QUESTION,
521
+ description: strings_1.FAQ_STRINGS.FAQ_OPENING_TIME_ANSWER
522
+ },
523
+ {
524
+ title: strings_1.FAQ_STRINGS.FAQ_TDS_AVOIDANCE_QUESTION,
525
+ description: strings_1.FAQ_STRINGS.FAQ_TDS_AVOIDANCE_ANSWER
526
+ },
527
+ ];
528
+ }
529
+ }, [effectiveMasterData]);
530
+ // Handle Android hardware back button - use same navigation as header back button
531
+ (0, react_1.useEffect)(() => {
532
+ if (react_native_1.Platform.OS !== 'android')
533
+ return;
534
+ const onHardwareBackPress = () => {
535
+ (0, helpers_1.navigate)('FDList'); // Same as header back button
536
+ return true; // Prevent default behavior
537
+ };
538
+ const backHandler = react_native_1.BackHandler.addEventListener('hardwareBackPress', onHardwareBackPress);
539
+ return () => backHandler.remove();
540
+ }, []);
541
+ return (react_1.default.createElement(SafeAreaWrapper_1.default, { includeTop: false, bottomPadding: 25, statusBarColor: "#000000", statusBarStyle: "light-content" },
542
+ react_1.default.createElement(react_native_1.View, { style: styles.header },
543
+ react_1.default.createElement(react_native_1.TouchableOpacity, { onPress: () => (0, helpers_1.navigate)('FDList'), style: styles.backButton },
544
+ react_1.default.createElement(react_native_1.Image, { source: { uri: base64Images_1.base64Images.backArrow }, style: [styles.backIcon, { tintColor: themeName === 'dark' ? colors.headerText : undefined }], resizeMode: "contain", width: 24, height: 24 }))),
545
+ react_1.default.createElement(react_native_1.View, { style: { flex: 1, justifyContent: 'space-between' } },
546
+ react_1.default.createElement(react_native_1.ScrollView, { style: styles.scrollContainer, contentContainerStyle: styles.scrollContent, showsVerticalScrollIndicator: false, onScrollBeginDrag: closeAllMenus, scrollEnabled: !(isOnboarding || isBooking), keyboardShouldPersistTaps: "handled", bounces: true, alwaysBounceVertical: true },
547
+ react_1.default.createElement(components_1.CompanyHeader, { companyName: (effectiveFdData === null || effectiveFdData === void 0 ? void 0 : effectiveFdData.name) || '', rating: (effectiveFdData === null || effectiveFdData === void 0 ? void 0 : effectiveFdData.creditRating) || 'AA+' }),
548
+ react_1.default.createElement(components_1.AmountInput, { label: strings_1.FD_STRINGS.INVESTMENT_AMOUNT_LABEL, value: amount, onChangeText: handleAmountChange, onFocus: closeAllMenus, placeholder: strings_1.FD_STRINGS.AMOUNT_PLACEHOLDER, noteText: strings_1.FD_STRINGS.AMOUNT_NOTE, minMaxText: strings_1.FD_STRINGS.AMOUNT_MIN_MAX, errorMessage: amountError }),
549
+ react_1.default.createElement(components_1.DropdownSelector, { label: strings_1.FD_STRINGS.TENURE_LABEL, value: tenureValue || strings_1.COMMON_STRINGS.SELECT, onPress: () => {
550
+ react_native_1.Keyboard.dismiss();
551
+ closeAllMenus();
552
+ setShowTenureMenu(prev => !prev);
553
+ } }),
554
+ showTenureMenu && (react_1.default.createElement(react_native_1.View, { style: styles.inlineMenu }, (tenureOptions.length > 0 ? tenureOptions : [strings_1.FD_STRINGS.TENURE_12_MONTHS, strings_1.FD_STRINGS.TENURE_24_MONTHS, strings_1.FD_STRINGS.TENURE_36_MONTHS]).map((option) => (react_1.default.createElement(react_native_1.TouchableOpacity, { key: option, style: styles.modalOption, onPress: () => {
555
+ setTenureValue(option);
556
+ setShowTenureMenu(false);
557
+ // Call API after dropdown value changes
558
+ setTimeout(() => handleCalculateFD(), 100);
559
+ } },
560
+ react_1.default.createElement(react_native_1.Text, { style: styles.modalOptionText }, option)))))),
561
+ react_1.default.createElement(components_1.DropdownSelector, { label: strings_1.FD_STRINGS.INTEREST_PAYOUT_TERM_LABEL, value: payoutValue, onPress: () => {
562
+ react_native_1.Keyboard.dismiss();
563
+ closeAllMenus();
564
+ setShowPayoutModal(prev => !prev);
565
+ }, placeholder: strings_1.FD_STRINGS.PAYOUT_MONTHLY }),
566
+ showPayoutModal && (react_1.default.createElement(react_native_1.View, { style: styles.inlineMenu }, payoutOptions
567
+ .filter((v, i, a) => !!v && a.indexOf(v) === i)
568
+ .map((option) => (react_1.default.createElement(react_native_1.TouchableOpacity, { key: option, style: styles.modalOption, onPress: () => {
569
+ setPayoutValue(option);
570
+ setShowPayoutModal(false);
571
+ handleCalculateFD(amount, option);
572
+ // Pass the selected option directly to avoid stale state
573
+ // setTimeout(() => handleCalculateFD(option), 100);
574
+ } },
575
+ react_1.default.createElement(react_native_1.Text, { style: styles.modalOptionText }, option)))))),
576
+ isCalculating && (react_1.default.createElement(react_native_1.View, { style: styles.loadingContainer },
577
+ react_1.default.createElement(react_native_1.ActivityIndicator, { size: "small", color: colors.primary }),
578
+ react_1.default.createElement(react_native_1.Text, { style: styles.loadingText }, strings_1.COMMON_STRINGS.PROCESSING))),
579
+ react_1.default.createElement(components_1.InterestRateCard, { interestRate: (() => {
580
+ var _a, _b;
581
+ const data = calculationResult === null || calculationResult === void 0 ? void 0 : calculationResult.data;
582
+ const investmentType = payoutValue === 'On Maturity' ? 'SDR' : 'FDR';
583
+ const calcData = investmentType === 'SDR'
584
+ ? (_a = data === null || data === void 0 ? void 0 : data.sdrCalc) === null || _a === void 0 ? void 0 : _a[0]
585
+ : (_b = data === null || data === void 0 ? void 0 : data.fdrCalc) === null || _b === void 0 ? void 0 : _b[0];
586
+ const wroi = (calcData === null || calcData === void 0 ? void 0 : calcData.wRoi) || (data === null || data === void 0 ? void 0 : data.wroi) || (data === null || data === void 0 ? void 0 : data.interestRate) || (data === null || data === void 0 ? void 0 : data.rate);
587
+ return wroi ? `${Number(wroi).toFixed(1)}% p.a.` : "";
588
+ })(), maturityAmount: (() => {
589
+ var _a, _b;
590
+ const data = calculationResult === null || calculationResult === void 0 ? void 0 : calculationResult.data;
591
+ const investmentType = payoutValue === 'On Maturity' ? 'SDR' : 'FDR';
592
+ const calcData = investmentType === 'SDR'
593
+ ? (_a = data === null || data === void 0 ? void 0 : data.sdrCalc) === null || _a === void 0 ? void 0 : _a[0]
594
+ : (_b = data === null || data === void 0 ? void 0 : data.fdrCalc) === null || _b === void 0 ? void 0 : _b[0];
595
+ const maturityAmount = (calcData === null || calcData === void 0 ? void 0 : calcData.maturityAmount) || (data === null || data === void 0 ? void 0 : data.maturityAmount) || (data === null || data === void 0 ? void 0 : data.totalAmount) || (data === null || data === void 0 ? void 0 : data.finalAmount) || (data === null || data === void 0 ? void 0 : data.amount);
596
+ return maturityAmount ? `₹${maturityAmount.toLocaleString()}` : "";
597
+ })() },
598
+ react_1.default.createElement(components_1.CheckboxOption, { label: strings_1.FD_STRINGS.SENIOR_CITIZEN_BENEFIT, checked: seniorCitizen, onPress: () => setSeniorCitizen(!seniorCitizen), numberOfLines: 1, containerStyle: { marginTop: 12 }, disabled: true })),
599
+ react_1.default.createElement(react_native_1.View, { style: [styles.checkboxCard, !taxResident && styles.checkboxCardError] },
600
+ react_1.default.createElement(components_1.CheckboxOption, { label: strings_1.FD_STRINGS.TAX_RESIDENT_CONFIRMATION, checked: taxResident, onPress: handleTaxResidentChange })),
601
+ taxResidentError && (react_1.default.createElement(react_native_1.View, { style: styles.errorContainer },
602
+ react_native_1.Platform.OS === 'android' && (react_1.default.createElement(Ionicons_1.default, { name: "warning", size: 16, color: colors.error || '#FF0000', style: styles.errorIcon })),
603
+ react_1.default.createElement(react_native_1.Text, { style: styles.errorText }, taxResidentError))),
604
+ react_1.default.createElement(react_native_1.View, { style: styles.checkboxCard },
605
+ react_1.default.createElement(components_1.CheckboxOption, { label: strings_1.FD_STRINGS.MATURITY_AUTO_RENEWAL, checked: autoRenewal, onPress: () => setAutoRenewal(!autoRenewal) })),
606
+ react_1.default.createElement(components_1.InfoBox, { message: strings_1.FD_STRINGS.WITHDRAWAL_INFO, containerStyle: styles.infoBoxCard, showNonStockIcon: true }),
607
+ react_1.default.createElement(react_native_1.Text, { style: styles.sectionTitle }, strings_1.FD_STRINGS.SAFETY_TRUST_TITLE),
608
+ react_1.default.createElement(react_native_1.View, { style: styles.trustRow },
609
+ react_1.default.createElement(components_1.TrustBox, { title1: strings_1.FD_STRINGS.TRUSTED_BY, title2: strings_1.FD_STRINGS.CRORES_INDIANS }),
610
+ react_1.default.createElement(components_1.TrustBox, { title1: strings_1.FD_STRINGS.AAA_RATING, title2: strings_1.FD_STRINGS.RATING, style: { marginLeft: 10 } })),
611
+ react_1.default.createElement(react_native_1.Text, { style: styles.sectionTitle }, strings_1.FD_STRINGS.FAQ_TITLE),
612
+ faqData.map((item, index) => (react_1.default.createElement(components_1.FAQItem, { key: index, question: item.title, answer: item.description, isExpanded: expandedIndex === index, onToggle: () => setExpandedIndex(expandedIndex === index ? null : index) })))),
613
+ react_1.default.createElement(react_native_1.TouchableOpacity, { style: [
614
+ styles.startButton,
615
+ (!taxResident || isOnboarding || isBooking || !isAmountValid || !isPayoutValid || isCalculating || isAmountEditing) ? styles.startButtonDisabled : null
616
+ ], disabled: !taxResident || isOnboarding || isBooking || !isAmountValid || !isPayoutValid || isCalculating || isAmountEditing, activeOpacity: (!taxResident || isOnboarding || isBooking || !isAmountValid || !isPayoutValid || isCalculating || isAmountEditing) ? 1 : 0.7, onPress: () => {
617
+ if (taxResident && !isOnboarding && !isBooking && isAmountValid && isPayoutValid && !isCalculating && !isAmountEditing) {
618
+ handleStartOnboarding(payoutValue);
619
+ }
620
+ } }, (isOnboarding || isBooking) ? (react_1.default.createElement(react_native_1.View, { style: { flexDirection: 'row', alignItems: 'center', justifyContent: 'center' } },
621
+ react_1.default.createElement(react_native_1.ActivityIndicator, { size: "small", color: themeName === 'dark' ? colors.buttonTextColor : colors.background, style: { marginRight: 8 } }),
622
+ react_1.default.createElement(react_native_1.Text, { style: [
623
+ styles.startButtonText,
624
+ (!taxResident || isOnboarding || isBooking || !isAmountValid || !isPayoutValid || isCalculating || isAmountEditing) ? styles.startButtonTextDisabled : null
625
+ ] }, strings_1.COMMON_STRINGS.PROCESSING))) : (react_1.default.createElement(react_native_1.Text, { style: [
626
+ styles.startButtonText,
627
+ (!taxResident || isOnboarding || isBooking || !isAmountValid || !isPayoutValid || isCalculating || isAmountEditing) ? styles.startButtonTextDisabled : null
628
+ ] }, strings_1.FD_STRINGS.BOOK_FD_BUTTON)))),
629
+ (isOnboarding || isBooking) && (react_1.default.createElement(react_native_1.View, { style: styles.loadingOverlay, pointerEvents: "auto" }))));
630
+ };
631
+ exports.default = FDCalculator;
632
+ const isAndroid15OrHigher = react_native_1.Platform.OS === "android" && react_native_1.Platform.Version >= 15;
633
+ const createStyles = (typography, colors, themeName) => react_native_1.StyleSheet.create({
634
+ header: {
635
+ flexDirection: 'row',
636
+ justifyContent: 'flex-start',
637
+ alignItems: 'center',
638
+ paddingHorizontal: 16,
639
+ paddingTop: react_native_1.Platform.OS === 'ios' ? 40 : 20,
640
+ paddingBottom: 10,
641
+ backgroundColor: colors.background,
642
+ },
643
+ backIcon: {
644
+ // Icon styling handled by Ionicons component
645
+ width: 24,
646
+ height: 24,
647
+ resizeMode: 'contain',
648
+ // backgroundColor: "red",
649
+ },
650
+ backButton: {
651
+ padding: 8,
652
+ marginTop: isAndroid15OrHigher ? 10 : 0,
653
+ },
654
+ scrollContainer: {
655
+ flex: 1,
656
+ },
657
+ scrollContent: {
658
+ paddingHorizontal: 16,
659
+ paddingBottom: 40,
660
+ },
661
+ checkboxCard: {
662
+ backgroundColor: themeName === 'dark' ? colors.inputBackground : 'rgba(0,235,180,0.1)',
663
+ padding: 12,
664
+ borderRadius: 4,
665
+ marginTop: 16,
666
+ },
667
+ infoBoxCard: {
668
+ backgroundColor: themeName === 'dark' ? colors.inputBackground : 'rgba(0,235,180,0.1)',
669
+ padding: 16,
670
+ borderRadius: 4,
671
+ marginTop: 16,
672
+ },
673
+ sectionTitle: Object.assign(Object.assign({}, typography.styles.bodyMedium), { fontWeight: typography.fontWeight.semiBold, marginTop: 25, marginBottom: 8, color: colors.text, fontSize: 16 }),
674
+ trustRow: {
675
+ flexDirection: 'row',
676
+ justifyContent: 'space-between',
677
+ marginTop: 10,
678
+ },
679
+ startButtonWrapper: {
680
+ position: 'relative',
681
+ },
682
+ startButton: {
683
+ backgroundColor: themeName === 'dark' ? colors.buttonBackground : colors.headerBg,
684
+ paddingVertical: themeName === 'dark' ? 1 : 20,
685
+ paddingHorizontal: 20,
686
+ borderRadius: themeName === 'dark' ? 10 : 30,
687
+ marginTop: 30,
688
+ alignItems: 'center',
689
+ justifyContent: 'center',
690
+ height: themeName === 'dark' ? 50 : 56,
691
+ width: '90%',
692
+ alignSelf: 'center',
693
+ },
694
+ startButtonDisabled: {
695
+ backgroundColor: '#909090',
696
+ color: '#ffffff',
697
+ },
698
+ startButtonText: Object.assign(Object.assign({}, typography.styles.button), { color: themeName === 'dark' ? colors.buttonTextColor : colors.background, lineHeight: themeName === 'dark' ? 24 : typography.styles.button.lineHeight, fontSize: 16 }),
699
+ startButtonTextDisabled: {
700
+ color: themeName === 'dark' ? "#ffffff" : colors.tabSelected,
701
+ },
702
+ inlineMenu: {
703
+ backgroundColor: themeName === 'dark' ? colors.inputBackground : colors.background,
704
+ borderWidth: themeName === 'dark' ? 1 : 0.5,
705
+ borderColor: themeName === 'dark' ? '#ffffff' : 'rgba(0,0,0,0.2)',
706
+ borderRadius: 8,
707
+ marginTop: 6,
708
+ paddingHorizontal: 12,
709
+ paddingVertical: 6,
710
+ },
711
+ modalOption: {
712
+ paddingVertical: 14,
713
+ },
714
+ modalOptionText: Object.assign(Object.assign({}, typography.styles.bodyLarge), { color: colors.text, fontSize: 16, placeholderTextColor: '#9ca9b0' }),
715
+ loadingContainer: {
716
+ flexDirection: 'row',
717
+ alignItems: 'center',
718
+ justifyContent: 'center',
719
+ paddingVertical: 12,
720
+ fontSize: 14,
721
+ marginTop: 16,
722
+ },
723
+ loadingText: Object.assign(Object.assign({}, typography.styles.bodyMedium), { color: colors.textLight, marginLeft: 8 }),
724
+ overlayAboveInterestRate: {
725
+ position: 'absolute',
726
+ top: 0,
727
+ left: 0,
728
+ right: 0,
729
+ height: 20,
730
+ backgroundColor: 'rgba(128, 128, 128, 0.3)', // Light gray translucent overlay
731
+ zIndex: 1,
732
+ },
733
+ errorContainer: {
734
+ flexDirection: 'row',
735
+ alignItems: 'center',
736
+ marginTop: 8,
737
+ },
738
+ errorIcon: {
739
+ marginRight: 6,
740
+ },
741
+ errorText: {
742
+ fontSize: 14,
743
+ color: colors.error || '#FF0000',
744
+ fontWeight: '500',
745
+ flex: 1,
746
+ },
747
+ checkboxCardError: {
748
+ backgroundColor: 'rgba(255, 0, 0, 0.08)', // Red with same opacity as the original green
749
+ },
750
+ loadingOverlay: {
751
+ position: 'absolute',
752
+ top: 0,
753
+ left: 0,
754
+ right: 0,
755
+ bottom: 0,
756
+ backgroundColor: 'rgba(0, 0, 0, 0.3)',
757
+ zIndex: 1000,
758
+ },
759
+ });