@finspringinnovations/fixeddepositsdk 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (311) hide show
  1. package/README.md +128 -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 +6 -0
  7. package/lib/api/baseApi.js +406 -0
  8. package/lib/api/customerApi.d.ts +855 -0
  9. package/lib/api/customerApi.js +241 -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 +35 -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 +6 -0
  33. package/lib/assets/images/images.js +12 -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 +18 -0
  39. package/lib/components/ActiveFDCard.js +116 -0
  40. package/lib/components/AmountInput.d.ts +20 -0
  41. package/lib/components/AmountInput.js +142 -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 +59 -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 +23 -0
  55. package/lib/components/FDCard.js +116 -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 +19 -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 +46 -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 +159 -0
  95. package/lib/config/appDataConfig.js +310 -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 +62 -0
  99. package/lib/config/workflowConstants.js +63 -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 +26 -0
  103. package/lib/constants/strings/base64Images.js +29 -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 +48 -0
  125. package/lib/index.js +161 -0
  126. package/lib/navigation/RootNavigator.d.ts +9 -0
  127. package/lib/navigation/RootNavigator.js +459 -0
  128. package/lib/navigation/SimpleNavigator.d.ts +11 -0
  129. package/lib/navigation/SimpleNavigator.js +114 -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 +17 -0
  133. package/lib/navigation/index.js +42 -0
  134. package/lib/navigation/types.d.ts +139 -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 +16 -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/Employee.d.ts +18 -0
  149. package/lib/screens/Employee.js +594 -0
  150. package/lib/screens/FDCalculator.d.ts +18 -0
  151. package/lib/screens/FDCalculator.js +767 -0
  152. package/lib/screens/FDList.d.ts +28 -0
  153. package/lib/screens/FDList.js +1853 -0
  154. package/lib/screens/FindIFSC.d.ts +16 -0
  155. package/lib/screens/FindIFSC.js +248 -0
  156. package/lib/screens/NomineeDetail.d.ts +17 -0
  157. package/lib/screens/NomineeDetail.js +592 -0
  158. package/lib/screens/PayNow.d.ts +14 -0
  159. package/lib/screens/PayNow.js +230 -0
  160. package/lib/screens/Payment.d.ts +11 -0
  161. package/lib/screens/Payment.js +191 -0
  162. package/lib/screens/PaymentStatus.d.ts +16 -0
  163. package/lib/screens/PaymentStatus.js +431 -0
  164. package/lib/screens/ReviewKYC.d.ts +23 -0
  165. package/lib/screens/ReviewKYC.js +727 -0
  166. package/lib/state/paymentSession.d.ts +8 -0
  167. package/lib/state/paymentSession.js +13 -0
  168. package/lib/store/fdListSelectedSlice.d.ts +21 -0
  169. package/lib/store/fdListSelectedSlice.js +26 -0
  170. package/lib/store/hooks.d.ts +8 -0
  171. package/lib/store/hooks.js +8 -0
  172. package/lib/store/index.d.ts +3 -0
  173. package/lib/store/index.js +8 -0
  174. package/lib/store/onboardingSlice.d.ts +12 -0
  175. package/lib/store/onboardingSlice.js +32 -0
  176. package/lib/store/store.d.ts +13 -0
  177. package/lib/store/store.js +27 -0
  178. package/lib/theme/ThemeContext.d.ts +210 -0
  179. package/lib/theme/ThemeContext.js +92 -0
  180. package/lib/theme/colors.d.ts +80 -0
  181. package/lib/theme/colors.js +85 -0
  182. package/lib/theme/index.d.ts +35 -0
  183. package/lib/theme/index.js +78 -0
  184. package/lib/theme/shadows.d.ts +53 -0
  185. package/lib/theme/shadows.js +58 -0
  186. package/lib/theme/typography.d.ts +134 -0
  187. package/lib/theme/typography.js +143 -0
  188. package/lib/types/dataTypes.d.ts +34 -0
  189. package/lib/types/dataTypes.js +2 -0
  190. package/lib/types/workflowTypes.d.ts +2 -0
  191. package/lib/types/workflowTypes.js +2 -0
  192. package/lib/utils/apiLogger.d.ts +48 -0
  193. package/lib/utils/apiLogger.js +105 -0
  194. package/lib/utils/encryption.d.ts +28 -0
  195. package/lib/utils/encryption.js +113 -0
  196. package/lib/utils/getFDData.d.ts +48 -0
  197. package/lib/utils/getFDData.js +145 -0
  198. package/lib/utils/globalData.d.ts +2 -0
  199. package/lib/utils/globalData.js +10 -0
  200. package/package.json +51 -0
  201. package/src/api/applicationApi.ts +12 -0
  202. package/src/api/bankApi.ts +42 -0
  203. package/src/api/baseApi.ts +463 -0
  204. package/src/api/customerApi.ts +324 -0
  205. package/src/api/fdApi.ts +150 -0
  206. package/src/api/fdCalculatorApi.ts +41 -0
  207. package/src/api/index.ts +29 -0
  208. package/src/api/interestRateApi.ts +143 -0
  209. package/src/api/kycApi.ts +63 -0
  210. package/src/api/masterDataApi.ts +37 -0
  211. package/src/api/nomineeApi.ts +34 -0
  212. package/src/api/onboardingApi.ts +64 -0
  213. package/src/api/panApi.ts +25 -0
  214. package/src/api/paymentApi.ts +34 -0
  215. package/src/api/workflowApi.ts +94 -0
  216. package/src/assets/images/Mahindra.png +0 -0
  217. package/src/assets/images/arrow-filled.png +0 -0
  218. package/src/assets/images/arrow-left.png +0 -0
  219. package/src/assets/images/backicon.png +0 -0
  220. package/src/assets/images/calendar.png +0 -0
  221. package/src/assets/images/chevron-down.png +0 -0
  222. package/src/assets/images/chevron-down@2x.png +0 -0
  223. package/src/assets/images/chevron-down@3x.png +0 -0
  224. package/src/assets/images/images.js +10 -0
  225. package/src/assets/images/shriram_logo.png +0 -0
  226. package/src/components/AadhaarInput.tsx +91 -0
  227. package/src/components/ActionButton.tsx +129 -0
  228. package/src/components/ActiveFDCard.tsx +188 -0
  229. package/src/components/AmountInput.tsx +217 -0
  230. package/src/components/CheckboxOption.tsx +93 -0
  231. package/src/components/CompanyHeader.tsx +80 -0
  232. package/src/components/DropdownSelector.tsx +77 -0
  233. package/src/components/EmptyState.tsx +109 -0
  234. package/src/components/ErrorDisplay.tsx +135 -0
  235. package/src/components/FAQItem.tsx +90 -0
  236. package/src/components/FDCard.tsx +186 -0
  237. package/src/components/FormDropdown.tsx +214 -0
  238. package/src/components/FormSection.tsx +86 -0
  239. package/src/components/Header.tsx +110 -0
  240. package/src/components/IFSCSearchResultCard.tsx +139 -0
  241. package/src/components/InfoBox.tsx +55 -0
  242. package/src/components/InterestRateCard.tsx +77 -0
  243. package/src/components/LoadingIndicator.tsx +63 -0
  244. package/src/components/OTPInput.tsx +213 -0
  245. package/src/components/PaymentDetailsCard.tsx +120 -0
  246. package/src/components/PendingFDBottomSheet.tsx +237 -0
  247. package/src/components/README.md +210 -0
  248. package/src/components/SafeAreaWrapper.tsx +68 -0
  249. package/src/components/ScreenHeader.tsx +83 -0
  250. package/src/components/StatusDisplay.tsx +139 -0
  251. package/src/components/TextFieldWithLabel.tsx +502 -0
  252. package/src/components/TrustBox.tsx +63 -0
  253. package/src/components/ValidationErrorAlert.tsx +57 -0
  254. package/src/components/ValidationMessage.tsx +134 -0
  255. package/src/components/index.tsx +47 -0
  256. package/src/config/apiConfig.ts +217 -0
  257. package/src/config/appDataConfig.ts +358 -0
  258. package/src/config/encryptionConfig.ts +65 -0
  259. package/src/config/workflowConstants.ts +70 -0
  260. package/src/constants/strings/README.md +146 -0
  261. package/src/constants/strings/bank.ts +92 -0
  262. package/src/constants/strings/base64Images.ts +31 -0
  263. package/src/constants/strings/common.ts +63 -0
  264. package/src/constants/strings/employee.ts +85 -0
  265. package/src/constants/strings/faq.ts +23 -0
  266. package/src/constants/strings/fd.ts +172 -0
  267. package/src/constants/strings/home.ts +67 -0
  268. package/src/constants/strings/index.ts +21 -0
  269. package/src/constants/strings/kyc.ts +100 -0
  270. package/src/constants/strings/nominee.ts +90 -0
  271. package/src/hooks/useAuth.ts +42 -0
  272. package/src/hooks/useFDData.ts +48 -0
  273. package/src/index.tsx +139 -0
  274. package/src/navigation/RootNavigator.tsx +687 -0
  275. package/src/navigation/SimpleNavigator.tsx +123 -0
  276. package/src/navigation/helpers.ts +85 -0
  277. package/src/navigation/index.tsx +84 -0
  278. package/src/navigation/types.ts +146 -0
  279. package/src/navigation/workflowNavigator.ts +131 -0
  280. package/src/providers/ApiProvider.tsx +23 -0
  281. package/src/providers/MasterDataProvider.tsx +30 -0
  282. package/src/screens/AadhaarVerification.tsx +809 -0
  283. package/src/screens/AddBankAccount.tsx +541 -0
  284. package/src/screens/BankDetail.tsx +826 -0
  285. package/src/screens/Employee.tsx +822 -0
  286. package/src/screens/FDCalculator.tsx +1002 -0
  287. package/src/screens/FDList.tsx +2199 -0
  288. package/src/screens/FindIFSC.tsx +332 -0
  289. package/src/screens/NomineeDetail.tsx +800 -0
  290. package/src/screens/PayNow.tsx +282 -0
  291. package/src/screens/Payment.tsx +224 -0
  292. package/src/screens/PaymentStatus.tsx +595 -0
  293. package/src/screens/ReviewKYC.tsx +1062 -0
  294. package/src/state/paymentSession.ts +13 -0
  295. package/src/store/fdListSelectedSlice.ts +42 -0
  296. package/src/store/hooks.ts +6 -0
  297. package/src/store/index.ts +3 -0
  298. package/src/store/onboardingSlice.ts +37 -0
  299. package/src/store/store.ts +27 -0
  300. package/src/theme/ThemeContext.tsx +84 -0
  301. package/src/theme/colors.ts +90 -0
  302. package/src/theme/index.ts +85 -0
  303. package/src/theme/shadows.ts +61 -0
  304. package/src/theme/typography.ts +151 -0
  305. package/src/types/dataTypes.ts +37 -0
  306. package/src/types/env.d.ts +93 -0
  307. package/src/types/workflowTypes.ts +12 -0
  308. package/src/utils/apiLogger.ts +166 -0
  309. package/src/utils/encryption.ts +159 -0
  310. package/src/utils/getFDData.ts +165 -0
  311. package/src/utils/globalData.ts +7 -0
@@ -0,0 +1,463 @@
1
+ // import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';
2
+ // import { encryptRequest, decryptResponse } from '../utils/encryption';
3
+ // import { getEncryptionConfig } from '../config/encryptionConfig';
4
+ // import { getApiConfig, getSecureHeaders, validateApiConfig } from '../config/apiConfig';
5
+ // import { apiLogger, RequestLogData, ResponseLogData } from '../utils/apiLogger';
6
+ // import type { BaseQueryFn, FetchArgs, FetchBaseQueryError } from '@reduxjs/toolkit/query';
7
+ // import { v4 as uuidv4 } from 'uuid';
8
+
9
+
10
+ // // Get and validate API configuration
11
+ // const apiConfig = getApiConfig();
12
+ // if (!validateApiConfig(apiConfig)) {
13
+ // throw new Error('Invalid API configuration');
14
+ // }
15
+
16
+ // // Generate unique request ID
17
+ // const generateRequestId = (): string => {
18
+ // return uuidv4();
19
+ // };
20
+
21
+ // // Encryption toggle utilities - Enable encryption by default
22
+ // let currentEncryptionState = true; // Enable encryption by default
23
+
24
+ // export const toggleEncryption = (enable?: boolean): boolean => {
25
+ // if (!apiConfig.allowEncryptionToggle) {
26
+ // return currentEncryptionState;
27
+ // }
28
+
29
+ // if (enable !== undefined) {
30
+ // currentEncryptionState = enable;
31
+ // } else {
32
+ // currentEncryptionState = !currentEncryptionState;
33
+ // }
34
+
35
+ // return currentEncryptionState;
36
+ // };
37
+
38
+ // export const isEncryptionEnabled = (): boolean => {
39
+ // return currentEncryptionState;
40
+ // };
41
+
42
+ // export const getCurrentApiConfig = () => {
43
+ // return {
44
+ // ...apiConfig,
45
+ // enableEncryption: currentEncryptionState,
46
+ // };
47
+ // };
48
+
49
+ // // Custom base query with encryption support
50
+ // const baseQueryWithEncryption: BaseQueryFn<
51
+ // string | FetchArgs,
52
+ // unknown,
53
+ // FetchBaseQueryError
54
+ // > = async (args, api, extraOptions) => {
55
+ // const encryptionConfig = getEncryptionConfig();
56
+ // const requestId = generateRequestId();
57
+ // const timestamp = Date.now();
58
+
59
+ // // Handle request encryption BEFORE sending
60
+ // const url = typeof args === 'string' ? args : args.url;
61
+ // const method = typeof args === 'string' ? 'GET' : args.method || 'GET';
62
+ // let body = typeof args === 'string' ? undefined : args.body;
63
+
64
+ // // Log request details BEFORE any encryption
65
+ // try {
66
+ // const preEncryptionBody = body && typeof body === 'string' ? JSON.parse(body) : body;
67
+ // // eslint-disable-next-line no-console
68
+ // console.log('[FDSDK][API] Request BEFORE encryption', {
69
+ // method,
70
+ // url,
71
+ // baseUrl: apiConfig.baseUrl,
72
+ // body: preEncryptionBody,
73
+ // });
74
+ // } catch (_) {
75
+ // // eslint-disable-next-line no-console
76
+ // console.log('[FDSDK][API] Request BEFORE encryption (raw body)', {
77
+ // method,
78
+ // url,
79
+ // baseUrl: apiConfig.baseUrl,
80
+ // body,
81
+ // });
82
+ // }
83
+
84
+ // if (currentEncryptionState && body && typeof args !== 'string') {
85
+ // try {
86
+ // const originalBody = typeof body === 'string' ? JSON.parse(body) : body;
87
+ // const encryptedBody = encryptRequest(originalBody, encryptionConfig);
88
+ // args.body = JSON.stringify(encryptedBody);
89
+ // body = args.body;
90
+ // } catch (error) {
91
+ // }
92
+ // }
93
+
94
+ // // Prepare the base query
95
+ // const baseQuery = fetchBaseQuery({
96
+ // baseUrl: apiConfig.baseUrl,
97
+ // timeout: apiConfig.timeout,
98
+ // prepareHeaders: (headers, { getState, endpoint }) => {
99
+
100
+ // // Add authentication headers if needed
101
+ // const token = (getState() as any)?.auth?.token;
102
+ // if (token) {
103
+ // headers.set('authorization', `Bearer ${token}`);
104
+ // }
105
+
106
+ // // Add secure headers
107
+ // const secureHeaders = getSecureHeaders();
108
+ // Object.entries(secureHeaders).forEach(([key, value]) => {
109
+ // headers.set(key, value);
110
+ // });
111
+
112
+ // // Inject onboarding identifiers if present in store
113
+ // try {
114
+ // const state: any = getState();
115
+ // const onboarding = state?.onboarding;
116
+ // const wf = onboarding?.workflowInstanceId;
117
+ // const appId = onboarding?.applicationId;
118
+ // const entId = onboarding?.entityid;
119
+ // if (wf) headers.set('workflowInstanceId', wf);
120
+ // if (appId) headers.set('applicationId', appId);
121
+ // if (entId) headers.set('entityid', entId);
122
+ // } catch (e) {
123
+ // }
124
+
125
+ // // Add encryption header if enabled
126
+ // if (currentEncryptionState) {
127
+ // headers.set('X-Encrypted', 'true');
128
+ // }
129
+
130
+ // // Log all headers being sent
131
+ // const headerEntries = Array.from(headers.entries());
132
+
133
+ // // Check specifically for providerid header
134
+ // const providerId = headers.get('providerid');
135
+
136
+ // return headers;
137
+ // },
138
+ // });
139
+
140
+ // // Log request
141
+ // const requestLogData: RequestLogData = {
142
+ // method,
143
+ // url,
144
+ // baseUrl: apiConfig.baseUrl,
145
+ // headers: {},
146
+ // body,
147
+ // timestamp,
148
+ // requestId,
149
+ // isEncrypted: currentEncryptionState,
150
+ // };
151
+
152
+ // apiLogger.logRequest(requestLogData);
153
+
154
+ // // Make the actual request
155
+ // const result = await baseQuery(args, api, extraOptions);
156
+
157
+ // // Handle response decryption (both success and error responses)
158
+ // if (currentEncryptionState) {
159
+ // // Decrypt successful response data
160
+ // if (result.data) {
161
+ // try {
162
+ // const decryptedData = decryptResponse(result.data, encryptionConfig);
163
+ // result.data = decryptedData;
164
+ // // eslint-disable-next-line no-console
165
+ // console.log('[FDSDK][API] Response AFTER decryption', {
166
+ // url,
167
+ // baseUrl: apiConfig.baseUrl,
168
+ // status: result.meta?.response?.status || 200,
169
+ // data: decryptedData,
170
+ // });
171
+ // } catch (error) {
172
+ // }
173
+ // }
174
+
175
+ // // Decrypt error response data
176
+ // if (result.error && result.error.data) {
177
+ // try {
178
+ // const decryptedErrorData = decryptResponse(result.error.data, encryptionConfig);
179
+ // result.error.data = decryptedErrorData;
180
+ // // eslint-disable-next-line no-console
181
+ // console.log('[FDSDK][API] Error AFTER decryption', {
182
+ // url,
183
+ // baseUrl: apiConfig.baseUrl,
184
+ // status: result.meta?.response?.status,
185
+ // error: decryptedErrorData,
186
+ // });
187
+ // } catch (error) {
188
+ // }
189
+ // }
190
+ // }
191
+
192
+ // // Log response
193
+ // const responseLogData: ResponseLogData = {
194
+ // status: result.meta?.response?.status || 200,
195
+ // statusText: result.meta?.response?.statusText || 'OK',
196
+ // headers: {},
197
+ // data: result.data,
198
+ // timestamp: Date.now(),
199
+ // requestId,
200
+ // duration: Date.now() - timestamp,
201
+ // isEncrypted: currentEncryptionState,
202
+ // error: result.error,
203
+ // };
204
+
205
+ // apiLogger.logResponse(responseLogData);
206
+
207
+ // return result;
208
+ // };
209
+
210
+ // // Base API configuration
211
+ // export const baseApi = createApi({
212
+ // reducerPath: 'shriramApi',
213
+ // baseQuery: baseQueryWithEncryption,
214
+ // tagTypes: ['InterestRate'],
215
+ // endpoints: () => ({}),
216
+ // });
217
+
218
+ // // Export hooks for usage in functional components
219
+ // export const {
220
+ // usePrefetch,
221
+ // } = baseApi;
222
+
223
+
224
+
225
+
226
+ import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react';
227
+ import { encryptRequest, decryptResponse } from '../utils/encryption';
228
+ import { getEncryptionConfig } from '../config/encryptionConfig';
229
+ import { getApiConfig, getSecureHeaders, validateApiConfig } from '../config/apiConfig';
230
+ import { apiLogger, RequestLogData, ResponseLogData } from '../utils/apiLogger';
231
+ import type { BaseQueryFn, FetchArgs, FetchBaseQueryError } from '@reduxjs/toolkit/query';
232
+ import { v4 as uuidv4 } from 'uuid';
233
+
234
+ // ------------------------------
235
+ // Lazy API Config Loader
236
+ // ------------------------------
237
+ let apiConfig: any = null;
238
+
239
+ const ensureApiConfig = () => {
240
+ if (!apiConfig) {
241
+ apiConfig = getApiConfig();
242
+ if (!validateApiConfig(apiConfig)) {
243
+ throw new Error('Invalid API configuration');
244
+ }
245
+ }
246
+ return apiConfig;
247
+ };
248
+
249
+ // ------------------------------
250
+ // Encryption Toggle Utilities
251
+ // ------------------------------
252
+ let currentEncryptionState = true; // Enable encryption by default
253
+
254
+ export const toggleEncryption = (enable?: boolean): boolean => {
255
+ const cfg = ensureApiConfig();
256
+ if (!cfg.allowEncryptionToggle) return currentEncryptionState;
257
+
258
+ if (enable !== undefined) currentEncryptionState = enable;
259
+ else currentEncryptionState = !currentEncryptionState;
260
+
261
+ return currentEncryptionState;
262
+ };
263
+
264
+ export const isEncryptionEnabled = (): boolean => currentEncryptionState;
265
+
266
+ export const getCurrentApiConfig = () => ({
267
+ ...ensureApiConfig(),
268
+ enableEncryption: currentEncryptionState,
269
+ });
270
+
271
+ // ------------------------------
272
+ // Utility Functions
273
+ // ------------------------------
274
+ const generateRequestId = (): string => uuidv4();
275
+
276
+ // ------------------------------
277
+ // Custom Base Query with Encryption
278
+ // ------------------------------
279
+ const baseQueryWithEncryption: BaseQueryFn<
280
+ string | FetchArgs,
281
+ unknown,
282
+ FetchBaseQueryError
283
+ > = async (args, api, extraOptions) => {
284
+ const apiConfig = ensureApiConfig(); // 👈 Load config before first API call
285
+ const encryptionConfig = getEncryptionConfig();
286
+ const requestId = generateRequestId();
287
+ const timestamp = Date.now();
288
+
289
+ const url = typeof args === 'string' ? args : args.url;
290
+ const method = typeof args === 'string' ? 'GET' : args.method || 'GET';
291
+ let body = typeof args === 'string' ? undefined : args.body;
292
+
293
+ // Log request details in DEV mode (BEFORE encryption)
294
+ if (__DEV__) {
295
+ try {
296
+ const parsedBody = body && typeof body === 'string' ? JSON.parse(body) : body;
297
+ console.log('═══════════════════════════════════════════════════════════════');
298
+ console.log('🚀 [FDSDK] API REQUEST');
299
+ console.log('───────────────────────────────────────────────────────────────');
300
+ console.log('📍 Base URL:', apiConfig.baseUrl);
301
+ console.log('🔗 Endpoint:', url);
302
+ console.log('📌 Full URL:', `${apiConfig.baseUrl}${url}`);
303
+ console.log('🔧 Method:', method);
304
+ console.log('📦 Request Body:', parsedBody || 'No body');
305
+ console.log('🔐 Encryption:', currentEncryptionState ? 'Enabled' : 'Disabled');
306
+ console.log('🆔 Request ID:', requestId);
307
+ console.log('⏰ Timestamp:', new Date(timestamp).toISOString());
308
+ console.log('═══════════════════════════════════════════════════════════════');
309
+ } catch (error) {
310
+ console.log('═══════════════════════════════════════════════════════════════');
311
+ console.log('🚀 [FDSDK] API REQUEST');
312
+ console.log('───────────────────────────────────────────────────────────────');
313
+ console.log('📍 Base URL:', apiConfig.baseUrl);
314
+ console.log('🔗 Endpoint:', url);
315
+ console.log('📌 Full URL:', `${apiConfig.baseUrl}${url}`);
316
+ console.log('🔧 Method:', method);
317
+ console.log('📦 Request Body (raw):', body || 'No body');
318
+ console.log('🔐 Encryption:', currentEncryptionState ? 'Enabled' : 'Disabled');
319
+ console.log('🆔 Request ID:', requestId);
320
+ console.log('⏰ Timestamp:', new Date(timestamp).toISOString());
321
+ console.log('═══════════════════════════════════════════════════════════════');
322
+ }
323
+ }
324
+
325
+ // Encrypt request body if enabled
326
+ if (currentEncryptionState && body && typeof args !== 'string') {
327
+ try {
328
+ const originalBody = typeof body === 'string' ? JSON.parse(body) : body;
329
+ const encryptedBody = await encryptRequest(originalBody, encryptionConfig);
330
+ args.body = JSON.stringify(encryptedBody);
331
+ body = args.body;
332
+ } catch (error) {
333
+ // Handle encryption error silently
334
+ }
335
+ }
336
+
337
+ // Prepare base query
338
+ const baseQuery = fetchBaseQuery({
339
+ baseUrl: apiConfig.baseUrl,
340
+ timeout: apiConfig.timeout,
341
+ prepareHeaders: (headers, { getState }) => {
342
+ const token = (getState() as any)?.auth?.token;
343
+ if (token) headers.set('authorization', `Bearer ${token}`);
344
+
345
+ const secureHeaders = getSecureHeaders();
346
+ Object.entries(secureHeaders).forEach(([key, value]) => {
347
+ headers.set(key, value);
348
+ });
349
+
350
+ // Inject onboarding identifiers
351
+ try {
352
+ const state: any = getState();
353
+ const onboarding = state?.onboarding;
354
+ if (onboarding?.workflowInstanceId)
355
+ headers.set('workflowInstanceId', onboarding.workflowInstanceId);
356
+ if (onboarding?.applicationId)
357
+ headers.set('applicationId', onboarding.applicationId);
358
+ if (onboarding?.entityid)
359
+ headers.set('entityid', onboarding.entityid);
360
+ } catch { }
361
+
362
+ if (currentEncryptionState) headers.set('X-Encrypted', 'true');
363
+
364
+ return headers;
365
+ },
366
+ });
367
+
368
+ // Log request
369
+ const requestLogData: RequestLogData = {
370
+ method,
371
+ url,
372
+ baseUrl: apiConfig.baseUrl,
373
+ headers: {},
374
+ body,
375
+ timestamp,
376
+ requestId,
377
+ isEncrypted: currentEncryptionState,
378
+ };
379
+ apiLogger.logRequest(requestLogData);
380
+
381
+ // Execute the actual request
382
+ const result = await baseQuery(args, api, extraOptions);
383
+
384
+ // Handle decryption (success + error)
385
+ if (currentEncryptionState) {
386
+ if (result.data) {
387
+ try {
388
+ const decryptedData = await decryptResponse(result.data, encryptionConfig);
389
+ result.data = decryptedData;
390
+ } catch (error) {
391
+ // Handle decryption error silently
392
+ }
393
+ }
394
+
395
+ if (result.error && result.error.data) {
396
+ try {
397
+ const decryptedErrorData = await decryptResponse(result.error.data, encryptionConfig);
398
+ result.error.data = decryptedErrorData;
399
+ } catch (error) {
400
+ // Handle decryption error silently
401
+ }
402
+ }
403
+ }
404
+
405
+ // Log response
406
+ const duration = Date.now() - timestamp;
407
+
408
+ const responseLogData: ResponseLogData = {
409
+ status: result.meta?.response?.status || 200,
410
+ statusText: result.meta?.response?.statusText || 'OK',
411
+ headers: {},
412
+ data: result.data,
413
+ timestamp: Date.now(),
414
+ requestId,
415
+ duration,
416
+ isEncrypted: currentEncryptionState,
417
+ error: result.error,
418
+ };
419
+ apiLogger.logResponse(responseLogData);
420
+
421
+ // Log response details in DEV mode (AFTER decryption)
422
+ if (__DEV__) {
423
+ const status = result.meta?.response?.status || 200;
424
+ const isSuccess = status >= 200 && status < 300;
425
+
426
+ console.log('═══════════════════════════════════════════════════════════════');
427
+ console.log(isSuccess ? '✅ [FDSDK] API RESPONSE - SUCCESS' : '❌ [FDSDK] API RESPONSE - ERROR');
428
+ console.log('───────────────────────────────────────────────────────────────');
429
+ console.log('📍 Base URL:', apiConfig.baseUrl);
430
+ console.log('🔗 Endpoint:', url);
431
+ console.log('📌 Full URL:', `${apiConfig.baseUrl}${url}`);
432
+ console.log('🔧 Method:', method);
433
+ console.log('📊 Status:', status, result.meta?.response?.statusText || 'OK');
434
+ console.log('⏱️ Duration:', `${duration}ms`);
435
+ console.log('🔐 Encryption:', currentEncryptionState ? 'Enabled' : 'Disabled');
436
+ console.log('🆔 Request ID:', requestId);
437
+
438
+ if (result.data) {
439
+ console.log('📥 Response Data:', result.data);
440
+ }
441
+
442
+ if (result.error) {
443
+ console.log('⚠️ Error:', result.error);
444
+ }
445
+
446
+ console.log('═══════════════════════════════════════════════════════════════');
447
+ }
448
+
449
+ return result;
450
+ };
451
+
452
+ // ------------------------------
453
+ // Base API Configuration
454
+ // ------------------------------
455
+ export const baseApi = createApi({
456
+ reducerPath: 'fdsdkApi',
457
+ baseQuery: baseQueryWithEncryption,
458
+ tagTypes: ['InterestRate'],
459
+ endpoints: () => ({}),
460
+ });
461
+
462
+ // Export hooks
463
+ export const { usePrefetch } = baseApi;