@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,513 @@
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('[ShriramSDK][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('[ShriramSDK][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('[ShriramSDK][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('[ShriramSDK][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('🚀 [ShriramSDK] 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('🚀 [ShriramSDK] 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
+ // ✅ FIX: Always use SDK's store state to prevent conflicts with parent app's store
352
+ try {
353
+ // First, try to get state from SDK's store (if available)
354
+ // This ensures we always use the SDK's store state, not the parent app's store
355
+ let state: any = null;
356
+ if (sdkStoreRef) {
357
+ state = sdkStoreRef.getState();
358
+ if (__DEV__) {
359
+ console.log('✅ [baseApi Interceptor] Using SDK store state for headers');
360
+ }
361
+ } else {
362
+ // Fallback to middleware's getState() if SDK store ref not set
363
+ state = getState();
364
+ if (__DEV__) {
365
+ console.warn('⚠️ [baseApi Interceptor] SDK store ref not set, using middleware getState()');
366
+ }
367
+ }
368
+
369
+ const onboarding = state?.onboarding;
370
+ if (onboarding?.workflowInstanceId)
371
+ headers.set('workflowInstanceId', onboarding.workflowInstanceId);
372
+ if (onboarding?.applicationId)
373
+ headers.set('applicationId', onboarding.applicationId);
374
+ if (onboarding?.entityid) {
375
+ headers.set('entityid', onboarding.entityid);
376
+ if (__DEV__) {
377
+ console.log('✅ [baseApi Interceptor] entityId header set:', onboarding.entityid);
378
+ }
379
+ } else {
380
+ if (__DEV__) {
381
+ console.warn('⚠️ [baseApi Interceptor] entityId is missing from store state');
382
+ console.warn('Store state keys:', Object.keys(state || {}));
383
+ console.warn('Has onboarding?', 'onboarding' in (state || {}));
384
+ console.warn('onboarding state:', onboarding);
385
+ if (!sdkStoreRef) {
386
+ console.error('❌ [baseApi Interceptor] SDK store ref is not set! This may cause entityId to be missing.');
387
+ }
388
+ }
389
+ }
390
+ } catch (error) {
391
+ if (__DEV__) {
392
+ console.error('❌ [baseApi Interceptor] Error getting onboarding state:', error);
393
+ }
394
+ }
395
+
396
+ if (currentEncryptionState) headers.set('X-Encrypted', 'true');
397
+
398
+ return headers;
399
+ },
400
+ });
401
+
402
+ // Log request
403
+ const requestLogData: RequestLogData = {
404
+ method,
405
+ url,
406
+ baseUrl: apiConfig.baseUrl,
407
+ headers: {},
408
+ body,
409
+ timestamp,
410
+ requestId,
411
+ isEncrypted: currentEncryptionState,
412
+ };
413
+ apiLogger.logRequest(requestLogData);
414
+
415
+ // Execute the actual request
416
+ const result = await baseQuery(args, api, extraOptions);
417
+
418
+ // Handle decryption (success + error)
419
+ if (currentEncryptionState) {
420
+ if (result.data) {
421
+ try {
422
+ const decryptedData = await decryptResponse(result.data, encryptionConfig);
423
+ result.data = decryptedData;
424
+ } catch (error) {
425
+ // Handle decryption error silently
426
+ }
427
+ }
428
+
429
+ if (result.error && result.error.data) {
430
+ try {
431
+ const decryptedErrorData = await decryptResponse(result.error.data, encryptionConfig);
432
+ result.error.data = decryptedErrorData;
433
+ } catch (error) {
434
+ // Handle decryption error silently
435
+ }
436
+ }
437
+ }
438
+
439
+ // Log response
440
+ const duration = Date.now() - timestamp;
441
+
442
+ const responseLogData: ResponseLogData = {
443
+ status: result.meta?.response?.status || 200,
444
+ statusText: result.meta?.response?.statusText || 'OK',
445
+ headers: {},
446
+ data: result.data,
447
+ timestamp: Date.now(),
448
+ requestId,
449
+ duration,
450
+ isEncrypted: currentEncryptionState,
451
+ error: result.error,
452
+ };
453
+ apiLogger.logResponse(responseLogData);
454
+
455
+ // Log response details in DEV mode (AFTER decryption)
456
+ if (__DEV__) {
457
+ const status = result.meta?.response?.status || 200;
458
+ const isSuccess = status >= 200 && status < 300;
459
+
460
+ console.log('═══════════════════════════════════════════════════════════════');
461
+ console.log(isSuccess ? '✅ [ShriramSDK] API RESPONSE - SUCCESS' : '❌ [ShriramSDK] API RESPONSE - ERROR');
462
+ console.log('───────────────────────────────────────────────────────────────');
463
+ console.log('📍 Base URL:', apiConfig.baseUrl);
464
+ console.log('🔗 Endpoint:', url);
465
+ console.log('📌 Full URL:', `${apiConfig.baseUrl}${url}`);
466
+ console.log('🔧 Method:', method);
467
+ console.log('📊 Status:', status, result.meta?.response?.statusText || 'OK');
468
+ console.log('⏱️ Duration:', `${duration}ms`);
469
+ console.log('🔐 Encryption:', currentEncryptionState ? 'Enabled' : 'Disabled');
470
+ console.log('🆔 Request ID:', requestId);
471
+
472
+ if (result.data) {
473
+ console.log('📥 Response Data:', result.data);
474
+ }
475
+
476
+ if (result.error) {
477
+ console.log('⚠️ Error:', result.error);
478
+ }
479
+
480
+ console.log('═══════════════════════════════════════════════════════════════');
481
+ }
482
+
483
+ return result;
484
+ };
485
+
486
+ // ------------------------------
487
+ // SDK Store Reference
488
+ // ------------------------------
489
+ // Store reference to SDK's store to ensure interceptor always uses SDK's store state
490
+ // This prevents conflicts when parent app also uses baseApi.middleware
491
+ let sdkStoreRef: any = null;
492
+
493
+ export const setSDKStoreRef = (store: any) => {
494
+ sdkStoreRef = store;
495
+ if (__DEV__) {
496
+ console.log('✅ [baseApi] SDK store reference set');
497
+ }
498
+ };
499
+
500
+ export const getSDKStoreRef = () => sdkStoreRef;
501
+
502
+ // ------------------------------
503
+ // Base API Configuration
504
+ // ------------------------------
505
+ export const baseApi = createApi({
506
+ reducerPath: 'shriramApi',
507
+ baseQuery: baseQueryWithEncryption,
508
+ tagTypes: ['InterestRate'],
509
+ endpoints: () => ({}),
510
+ });
511
+
512
+ // Export hooks
513
+ export const { usePrefetch } = baseApi;