@finspringinnovations/fixeddepositsdk 1.0.3 → 1.0.4

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 (43) hide show
  1. package/lib/api/customerApi.js +1 -0
  2. package/lib/api/fdApi.d.ts +401 -1
  3. package/lib/api/fdApi.js +24 -2
  4. package/lib/config/workflowConstants.d.ts +40 -30
  5. package/lib/config/workflowConstants.js +35 -24
  6. package/lib/navigation/RootNavigator.js +62 -81
  7. package/lib/navigation/types.d.ts +4 -1
  8. package/lib/navigation/workflowNavigator.d.ts +1 -1
  9. package/lib/navigation/workflowNavigator.js +107 -26
  10. package/lib/screens/AadhaarVerification.js +1 -11
  11. package/lib/screens/AddBankAccount.js +1 -11
  12. package/lib/screens/BankDetail.js +1 -11
  13. package/lib/screens/Employee.js +1 -11
  14. package/lib/screens/FDCalculator.js +1 -11
  15. package/lib/screens/FDList.js +529 -416
  16. package/lib/screens/FindIFSC.js +1 -11
  17. package/lib/screens/NomineeDetail.js +12 -22
  18. package/lib/screens/PayNow.js +1 -11
  19. package/lib/screens/Payment.js +2 -11
  20. package/lib/screens/PaymentStatus.js +11 -21
  21. package/lib/screens/ReviewKYC.js +1 -11
  22. package/lib/types/workflowTypes.d.ts +1 -1
  23. package/package.json +1 -1
  24. package/src/api/customerApi.ts +1 -0
  25. package/src/api/fdApi.ts +28 -1
  26. package/src/config/workflowConstants.ts +51 -39
  27. package/src/constants/strings/bank.ts +80 -80
  28. package/src/navigation/RootNavigator.tsx +646 -663
  29. package/src/navigation/types.ts +4 -1
  30. package/src/navigation/workflowNavigator.ts +170 -107
  31. package/src/screens/AadhaarVerification.tsx +1 -15
  32. package/src/screens/AddBankAccount.tsx +2 -16
  33. package/src/screens/BankDetail.tsx +1 -15
  34. package/src/screens/Employee.tsx +1 -15
  35. package/src/screens/FDCalculator.tsx +1 -15
  36. package/src/screens/FDList.tsx +2311 -2171
  37. package/src/screens/FindIFSC.tsx +2 -16
  38. package/src/screens/NomineeDetail.tsx +762 -775
  39. package/src/screens/PayNow.tsx +2 -16
  40. package/src/screens/Payment.tsx +190 -203
  41. package/src/screens/PaymentStatus.tsx +574 -588
  42. package/src/screens/ReviewKYC.tsx +1 -15
  43. package/src/types/workflowTypes.ts +1 -10
@@ -36,31 +36,30 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
36
36
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
37
  };
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
- const react_1 = __importStar(require("react"));
40
39
  const stack_1 = require("@react-navigation/stack");
40
+ const react_1 = __importStar(require("react"));
41
41
  const react_native_1 = require("react-native");
42
- const helpers_1 = require("./helpers");
43
42
  // Import screens
44
- const FDList_1 = __importDefault(require("../screens/FDList"));
45
- const FDCalculator_1 = __importDefault(require("../screens/FDCalculator"));
46
43
  const AadhaarVerification_1 = __importDefault(require("../screens/AadhaarVerification"));
47
- const ReviewKYC_1 = __importDefault(require("../screens/ReviewKYC"));
48
- const Employee_1 = __importDefault(require("../screens/Employee"));
49
- const NomineeDetail_1 = __importDefault(require("../screens/NomineeDetail"));
50
- const BankDetail_1 = __importDefault(require("../screens/BankDetail"));
51
44
  const AddBankAccount_1 = __importDefault(require("../screens/AddBankAccount"));
45
+ const BankDetail_1 = __importDefault(require("../screens/BankDetail"));
46
+ const Employee_1 = __importDefault(require("../screens/Employee"));
47
+ const FDCalculator_1 = __importDefault(require("../screens/FDCalculator"));
48
+ const FDList_1 = __importDefault(require("../screens/FDList"));
52
49
  const FindIFSC_1 = __importDefault(require("../screens/FindIFSC"));
50
+ const NomineeDetail_1 = __importDefault(require("../screens/NomineeDetail"));
53
51
  const PayNow_1 = __importDefault(require("../screens/PayNow"));
54
52
  const Payment_1 = __importDefault(require("../screens/Payment"));
55
53
  const PaymentStatus_1 = __importDefault(require("../screens/PaymentStatus"));
54
+ const ReviewKYC_1 = __importDefault(require("../screens/ReviewKYC"));
56
55
  // Import full SDK navigators and initialization functions
57
- const shriramfdsdk_1 = require("@finspringinnovations/shriramfdsdk");
58
56
  const mahindrafdsdk_1 = require("@finspringinnovations/mahindrafdsdk");
57
+ const shriramfdsdk_1 = require("@finspringinnovations/shriramfdsdk");
59
58
  // Import NavigationContainer and tree wrappers
60
59
  const native_1 = require("@react-navigation/native");
61
60
  // Import navigation helpers
62
- const helpers_2 = require("./helpers");
63
61
  const paymentSession_1 = require("../state/paymentSession");
62
+ const helpers_1 = require("./helpers");
64
63
  // Import data getters from fdsdk
65
64
  const appDataConfig_1 = require("../config/appDataConfig");
66
65
  const MasterDataProvider_1 = require("../providers/MasterDataProvider");
@@ -70,13 +69,14 @@ const MahindraRootNavigatorAny = mahindrafdsdk_1.RootNavigator;
70
69
  const ShriramSDKContent = ({ masterData, routeParams, onSDKExit, onSDKPanRequired, }) => {
71
70
  const { setMasterData } = (0, shriramfdsdk_1.useMasterData)();
72
71
  const shriramDispatch = (0, shriramfdsdk_1.useAppDispatch)();
72
+ const [initialized, setInitialized] = react_1.default.useState(false);
73
73
  react_1.default.useEffect(() => {
74
+ var _a;
75
+ // Perform all dispatches sequentially to ensure state is ready
74
76
  if (masterData) {
75
77
  const dataToSet = masterData.data || masterData;
76
78
  setMasterData(dataToSet);
77
79
  }
78
- }, [masterData, setMasterData]);
79
- react_1.default.useEffect(() => {
80
80
  if (routeParams.fdListSelectedData) {
81
81
  try {
82
82
  shriramDispatch((0, shriramfdsdk_1.setFDListSelected)(routeParams.fdListSelectedData));
@@ -85,9 +85,6 @@ const ShriramSDKContent = ({ masterData, routeParams, onSDKExit, onSDKPanRequire
85
85
  console.log('[RootNavigator] Error setting Shriram FDListSelected:', e);
86
86
  }
87
87
  }
88
- }, [routeParams.fdListSelectedData, shriramDispatch]);
89
- react_1.default.useEffect(() => {
90
- var _a;
91
88
  if (routeParams.onboardingIds) {
92
89
  try {
93
90
  shriramDispatch((0, shriramfdsdk_1.setOnboardingIds)(Object.assign(Object.assign({}, routeParams.onboardingIds), { providerId: routeParams.providerId || ((_a = routeParams.onboardingIds) === null || _a === void 0 ? void 0 : _a.providerId) })));
@@ -96,8 +93,6 @@ const ShriramSDKContent = ({ masterData, routeParams, onSDKExit, onSDKPanRequire
96
93
  console.log('[RootNavigator] Error setting Shriram OnboardingIds:', e);
97
94
  }
98
95
  }
99
- }, [routeParams.onboardingIds, shriramDispatch]);
100
- react_1.default.useEffect(() => {
101
96
  if (routeParams.shriramSDKGlobalData) {
102
97
  try {
103
98
  const completeFDData = !!routeParams.shriramSDKGlobalData;
@@ -107,7 +102,11 @@ const ShriramSDKContent = ({ masterData, routeParams, onSDKExit, onSDKPanRequire
107
102
  console.log('[RootNavigator] Error setting Shriram GlobalData:', e);
108
103
  }
109
104
  }
110
- }, [routeParams.shriramSDKGlobalData]);
105
+ setInitialized(true);
106
+ }, [masterData, routeParams, shriramDispatch, setMasterData]);
107
+ if (!initialized) {
108
+ return null; // Or a loading spinner if preferred
109
+ }
111
110
  return (react_1.default.createElement(shriramfdsdk_1.RootNavigator, { config: {
112
111
  initialRouteName: routeParams.initialRouteName || 'FDCalculator',
113
112
  initialPaymentStatusParams: routeParams.initialPaymentStatusParams,
@@ -121,13 +120,14 @@ const ShriramSDKContent = ({ masterData, routeParams, onSDKExit, onSDKPanRequire
121
120
  const MahindraSDKContent = ({ masterData, routeParams, onSDKExit, onSDKPanRequired, }) => {
122
121
  const { setMasterData } = (0, mahindrafdsdk_1.useMasterData)();
123
122
  const mahindraDispatch = (0, mahindrafdsdk_1.useAppDispatch)();
123
+ const [initialized, setInitialized] = react_1.default.useState(false);
124
124
  react_1.default.useEffect(() => {
125
+ var _a;
126
+ // Perform all dispatches sequentially to ensure state is ready
125
127
  if (masterData) {
126
128
  const dataToSet = masterData.data || masterData;
127
129
  setMasterData(dataToSet);
128
130
  }
129
- }, [masterData, setMasterData]);
130
- react_1.default.useEffect(() => {
131
131
  if (routeParams.fdListSelectedData) {
132
132
  try {
133
133
  mahindraDispatch((0, mahindrafdsdk_1.setFDListSelected)(routeParams.fdListSelectedData));
@@ -136,9 +136,6 @@ const MahindraSDKContent = ({ masterData, routeParams, onSDKExit, onSDKPanRequir
136
136
  console.log('[RootNavigator] Error setting Mahindra FDListSelected:', e);
137
137
  }
138
138
  }
139
- }, [routeParams.fdListSelectedData, mahindraDispatch]);
140
- react_1.default.useEffect(() => {
141
- var _a;
142
139
  if (routeParams.onboardingIds) {
143
140
  try {
144
141
  mahindraDispatch((0, mahindrafdsdk_1.setOnboardingIds)(Object.assign(Object.assign({}, routeParams.onboardingIds), { providerId: routeParams.providerId || ((_a = routeParams.onboardingIds) === null || _a === void 0 ? void 0 : _a.providerId) })));
@@ -147,10 +144,21 @@ const MahindraSDKContent = ({ masterData, routeParams, onSDKExit, onSDKPanRequir
147
144
  console.log('[RootNavigator] Error setting Mahindra OnboardingIds:', e);
148
145
  }
149
146
  }
150
- }, [routeParams.onboardingIds, mahindraDispatch]);
147
+ if (routeParams.initialPaymentUrl) {
148
+ (0, mahindrafdsdk_1.setPaymentSession)({
149
+ paymentUrl: routeParams.initialPaymentUrl,
150
+ transactionId: routeParams.initialPaymentTransactionId,
151
+ });
152
+ }
153
+ setInitialized(true);
154
+ }, [masterData, routeParams, mahindraDispatch, setMasterData]);
155
+ if (!initialized) {
156
+ return null;
157
+ }
151
158
  return (react_1.default.createElement(MahindraRootNavigatorAny, { config: {
152
159
  initialRouteName: routeParams.initialRouteName || 'FDCalculator',
153
160
  forceFetchCustomerDetails: !!routeParams.forceFetchCustomerDetails,
161
+ initialPaymentStatusParams: routeParams.initialPaymentStatusParams,
154
162
  initialFDContext: {
155
163
  providerId: routeParams.providerId,
156
164
  fdListSelectedData: routeParams.fdListSelectedData,
@@ -167,7 +175,7 @@ const RootNavigator = ({ config = {}, onExit, onPanRequired, }) => {
167
175
  const handleShriramExit = react_1.default.useCallback((fdDetails) => {
168
176
  setExternalSDK(null);
169
177
  setExternalSDKFDData(null);
170
- (0, helpers_2.navigate)('FDList');
178
+ (0, helpers_1.navigate)('FDList');
171
179
  if (fdDetails)
172
180
  onExit === null || onExit === void 0 ? void 0 : onExit(fdDetails);
173
181
  }, [onExit]);
@@ -180,7 +188,7 @@ const RootNavigator = ({ config = {}, onExit, onPanRequired, }) => {
180
188
  const handleMahindraExit = react_1.default.useCallback((fdDetails) => {
181
189
  setExternalSDK(null);
182
190
  setExternalSDKFDData(null);
183
- (0, helpers_2.navigate)('FDList');
191
+ (0, helpers_1.navigate)('FDList');
184
192
  if (fdDetails)
185
193
  onExit === null || onExit === void 0 ? void 0 : onExit(fdDetails);
186
194
  }, [onExit]);
@@ -197,35 +205,8 @@ const RootNavigator = ({ config = {}, onExit, onPanRequired, }) => {
197
205
  (0, react_1.useEffect)(() => {
198
206
  if (react_native_1.Platform.OS !== 'android')
199
207
  return;
200
- let lastBackPressTime = 0;
201
208
  const onBackPress = () => {
202
- var _a, _b, _c;
203
- // Check if navigation is ready
204
- if (!((_a = helpers_1.navigationRef.current) === null || _a === void 0 ? void 0 : _a.isReady())) {
205
- return false;
206
- }
207
- const now = Date.now();
208
- // Ignore synthetic back events triggered during forward navigation (debounce)
209
- if (now - lastBackPressTime < 300) {
210
- return false;
211
- }
212
- lastBackPressTime = now;
213
- const currentRoute = (_c = (_b = helpers_1.navigationRef.current) === null || _b === void 0 ? void 0 : _b.getCurrentRoute()) === null || _c === void 0 ? void 0 : _c.name;
214
- // Block back on Payment and PaymentStatus screens
215
- if (currentRoute === "Payment" || currentRoute === "PaymentStatus") {
216
- return true; // block hardware back
217
- }
218
- // FD Calculator should always redirect to FD List
219
- if (currentRoute === "FDCalculator") {
220
- helpers_1.navigationRef.current.navigate('FDList');
221
- return true;
222
- }
223
- // Skip FDList - let screen-specific handler handle it
224
- if (currentRoute === "FDList") {
225
- return false; // Let screen-specific handler handle it
226
- }
227
- // Enable back navigation everywhere else - use the same goBack() helper that header back buttons use
228
- (0, helpers_2.goBack)(); // This calls the same function as the header back button
209
+ // Return true to consume the event and do nothing (stop back navigation)
229
210
  return true;
230
211
  };
231
212
  const subscription = react_native_1.BackHandler.addEventListener("hardwareBackPress", onBackPress);
@@ -263,14 +244,14 @@ const RootNavigator = ({ config = {}, onExit, onPanRequired, }) => {
263
244
  }
264
245
  }, []);
265
246
  // Default screen options
266
- const defaultScreenOptions = Object.assign({ headerShown: false, cardStyle: { backgroundColor: '#f8f9fa' }, animationEnabled: true, gestureEnabled: true }, customScreenOptions);
247
+ const defaultScreenOptions = Object.assign({ headerShown: false, cardStyle: { backgroundColor: '#f8f9fa' }, animationEnabled: true, gestureEnabled: false }, customScreenOptions);
267
248
  return (react_1.default.createElement(Stack.Navigator, { initialRouteName: initialRouteName, screenOptions: defaultScreenOptions },
268
249
  react_1.default.createElement(Stack.Screen, { name: "FDList", options: { title: 'Fixed Deposits' } }, (props) => (react_1.default.createElement(FDList_1.default, Object.assign({ onGoBack: () => {
269
250
  onExit === null || onExit === void 0 ? void 0 : onExit();
270
251
  }, onSelectFD: (fdId) => {
271
252
  // FD selected
272
253
  }, onNavigateToFDCalculator: (fdData) => {
273
- (0, helpers_2.navigate)('FDCalculator', { fdData });
254
+ (0, helpers_1.navigate)('FDCalculator', { fdData });
274
255
  }, onNavigateToExternalSDK: (sdkType, fdData, context) => {
275
256
  try {
276
257
  // Get app data and environment data from fdsdk
@@ -296,7 +277,7 @@ const RootNavigator = ({ config = {}, onExit, onPanRequired, }) => {
296
277
  // Navigate to external SDK
297
278
  setExternalSDK('shriram');
298
279
  setExternalSDKFDData(fdData);
299
- (0, helpers_2.navigate)('ExternalSDK', {
280
+ (0, helpers_1.navigate)('ExternalSDK', {
300
281
  sdkType: 'shriram',
301
282
  fdData,
302
283
  providerId: context === null || context === void 0 ? void 0 : context.providerId,
@@ -318,7 +299,7 @@ const RootNavigator = ({ config = {}, onExit, onPanRequired, }) => {
318
299
  // Navigate to external SDK
319
300
  setExternalSDK('mahindra');
320
301
  setExternalSDKFDData(fdData);
321
- (0, helpers_2.navigate)('ExternalSDK', {
302
+ (0, helpers_1.navigate)('ExternalSDK', {
322
303
  sdkType: 'mahindra',
323
304
  fdData,
324
305
  providerId: context === null || context === void 0 ? void 0 : context.providerId,
@@ -343,7 +324,7 @@ const RootNavigator = ({ config = {}, onExit, onPanRequired, }) => {
343
324
  } }, props)))),
344
325
  react_1.default.createElement(Stack.Screen, { name: "FDCalculator", options: { title: 'FD Calculator' } }, (props) => {
345
326
  var _a;
346
- return (react_1.default.createElement(FDCalculator_1.default, Object.assign({ onGoBack: () => (0, helpers_2.goBack)(), onNavigateToReviewKYC: () => { var _a; return (0, helpers_2.navigate)('ReviewKYC', { fdData: (_a = props.route.params) === null || _a === void 0 ? void 0 : _a.fdData }); }, fdData: (_a = props.route.params) === null || _a === void 0 ? void 0 : _a.fdData }, props)));
327
+ return (react_1.default.createElement(FDCalculator_1.default, Object.assign({ onGoBack: () => (0, helpers_1.goBack)(), onNavigateToReviewKYC: () => { var _a; return (0, helpers_1.navigate)('ReviewKYC', { fdData: (_a = props.route.params) === null || _a === void 0 ? void 0 : _a.fdData }); }, fdData: (_a = props.route.params) === null || _a === void 0 ? void 0 : _a.fdData }, props)));
347
328
  }),
348
329
  react_1.default.createElement(Stack.Screen, { name: "ExternalSDK", options: { title: 'External SDK', gestureEnabled: false } }, (props) => {
349
330
  var _a, _b, _c, _d;
@@ -385,53 +366,53 @@ const RootNavigator = ({ config = {}, onExit, onPanRequired, }) => {
385
366
  }
386
367
  return null;
387
368
  }),
388
- react_1.default.createElement(Stack.Screen, { name: "AadhaarVerification", options: { title: 'Aadhaar Verification' } }, (props) => (react_1.default.createElement(AadhaarVerification_1.default, Object.assign({ onGoBack: () => (0, helpers_2.goBack)(), onVerificationComplete: () => {
389
- (0, helpers_2.navigate)('Employee');
369
+ react_1.default.createElement(Stack.Screen, { name: "AadhaarVerification", options: { title: 'Aadhaar Verification' } }, (props) => (react_1.default.createElement(AadhaarVerification_1.default, Object.assign({ onGoBack: () => (0, helpers_1.goBack)(), onVerificationComplete: () => {
370
+ (0, helpers_1.navigate)('Employee');
390
371
  } }, props)))),
391
- react_1.default.createElement(Stack.Screen, { name: "ReviewKYC", options: { title: 'Review KYC' } }, (props) => (react_1.default.createElement(ReviewKYC_1.default, Object.assign({ onGoBack: () => (0, helpers_2.goBack)(), onContinue: () => {
392
- (0, helpers_2.navigate)('Employee');
372
+ react_1.default.createElement(Stack.Screen, { name: "ReviewKYC", options: { title: 'Review KYC' } }, (props) => (react_1.default.createElement(ReviewKYC_1.default, Object.assign({ onGoBack: () => (0, helpers_1.goBack)(), onContinue: () => {
373
+ (0, helpers_1.navigate)('Employee');
393
374
  } }, props)))),
394
- react_1.default.createElement(Stack.Screen, { name: "Employee", options: { title: 'Occupation' } }, (props) => (react_1.default.createElement(Employee_1.default, Object.assign({ onGoBack: () => (0, helpers_2.goBack)(), onContinue: () => {
395
- (0, helpers_2.navigate)('NomineeDetail');
375
+ react_1.default.createElement(Stack.Screen, { name: "Employee", options: { title: 'Occupation' } }, (props) => (react_1.default.createElement(Employee_1.default, Object.assign({ onGoBack: () => (0, helpers_1.goBack)(), onContinue: () => {
376
+ (0, helpers_1.navigate)('NomineeDetail');
396
377
  } }, props)))),
397
- react_1.default.createElement(Stack.Screen, { name: "NomineeDetail", options: { title: 'Nominee Details' } }, (props) => (react_1.default.createElement(NomineeDetail_1.default, Object.assign({ onGoBack: () => (0, helpers_2.goBack)(), onSave: () => {
398
- (0, helpers_2.navigate)('BankDetail');
378
+ react_1.default.createElement(Stack.Screen, { name: "NomineeDetail", options: { title: 'Nominee Details' } }, (props) => (react_1.default.createElement(NomineeDetail_1.default, Object.assign({ onGoBack: () => (0, helpers_1.goBack)(), onSave: () => {
379
+ (0, helpers_1.navigate)('BankDetail');
399
380
  } }, props)))),
400
- react_1.default.createElement(Stack.Screen, { name: "BankDetail", options: { title: 'Bank Details' } }, (props) => (react_1.default.createElement(BankDetail_1.default, Object.assign({ onGoBack: () => (0, helpers_2.goBack)(), onContinue: () => {
401
- (0, helpers_2.navigate)('PayNow');
381
+ react_1.default.createElement(Stack.Screen, { name: "BankDetail", options: { title: 'Bank Details' } }, (props) => (react_1.default.createElement(BankDetail_1.default, Object.assign({ onGoBack: () => (0, helpers_1.goBack)(), onContinue: () => {
382
+ (0, helpers_1.navigate)('PayNow');
402
383
  }, onAddAccount: () => {
403
- (0, helpers_2.navigate)('AddBankAccount');
384
+ (0, helpers_1.navigate)('AddBankAccount');
404
385
  } }, props)))),
405
- react_1.default.createElement(Stack.Screen, { name: "AddBankAccount", options: { title: 'Add Bank Account' } }, (props) => (react_1.default.createElement(AddBankAccount_1.default, Object.assign({ onGoBack: () => (0, helpers_2.goBack)(), onContinue: () => {
406
- (0, helpers_2.goBack)();
386
+ react_1.default.createElement(Stack.Screen, { name: "AddBankAccount", options: { title: 'Add Bank Account' } }, (props) => (react_1.default.createElement(AddBankAccount_1.default, Object.assign({ onGoBack: () => (0, helpers_1.goBack)(), onContinue: () => {
387
+ (0, helpers_1.goBack)();
407
388
  }, onFindIFSC: () => {
408
- (0, helpers_2.navigate)('FindIFSC');
389
+ (0, helpers_1.navigate)('FindIFSC');
409
390
  }, selectedIFSC: (() => {
410
391
  const params = props.route.params;
411
392
  return params === null || params === void 0 ? void 0 : params.selectedIFSC;
412
393
  })() }, props)))),
413
394
  react_1.default.createElement(Stack.Screen, { name: "FindIFSC", options: { title: 'Find IFSC' } }, (props) => {
414
395
  var _a;
415
- return (react_1.default.createElement(FindIFSC_1.default, Object.assign({ onGoBack: () => (0, helpers_2.goBack)(), onSelect: (ifscData) => {
416
- (0, helpers_2.pop)(1);
417
- (0, helpers_2.navigate)('AddBankAccount', { selectedIFSC: ifscData });
396
+ return (react_1.default.createElement(FindIFSC_1.default, Object.assign({ onGoBack: () => (0, helpers_1.goBack)(), onSelect: (ifscData) => {
397
+ (0, helpers_1.pop)(1);
398
+ (0, helpers_1.navigate)('AddBankAccount', { selectedIFSC: ifscData });
418
399
  }, initialSearchTerm: (_a = props.route.params) === null || _a === void 0 ? void 0 : _a.initialSearchTerm }, props)));
419
400
  }),
420
401
  react_1.default.createElement(Stack.Screen, { name: "PayNow", options: { title: 'Pay Now' } }, (props) => {
421
402
  var _a;
422
- return (react_1.default.createElement(PayNow_1.default, Object.assign({ onGoBack: () => (0, helpers_2.goBack)(), onConfirm: () => {
403
+ return (react_1.default.createElement(PayNow_1.default, Object.assign({ onGoBack: () => (0, helpers_1.goBack)(), onConfirm: () => {
423
404
  // onConfirm is handled inside PayNow after createFD; keep fallback
424
405
  }, fdData: (_a = props.route.params) === null || _a === void 0 ? void 0 : _a.fdData }, props)));
425
406
  }),
426
407
  react_1.default.createElement(Stack.Screen, { name: "Payment", options: { title: 'Payment' } }, (props) => {
427
408
  var _a, _b, _c;
428
- return (react_1.default.createElement(Payment_1.default, Object.assign({ onGoBack: () => (0, helpers_2.goBack)(), paymentUrl: (_c = (_b = (_a = props.route.params) === null || _a === void 0 ? void 0 : _a.paymentUrl) !== null && _b !== void 0 ? _b : (0, paymentSession_1.getPaymentSession)().paymentUrl) !== null && _c !== void 0 ? _c : '', onPaymentSuccess: (data) => {
429
- (0, helpers_2.navigate)('PaymentStatus', {
409
+ return (react_1.default.createElement(Payment_1.default, Object.assign({ onGoBack: () => (0, helpers_1.goBack)(), paymentUrl: (_c = (_b = (_a = props.route.params) === null || _a === void 0 ? void 0 : _a.paymentUrl) !== null && _b !== void 0 ? _b : (0, paymentSession_1.getPaymentSession)().paymentUrl) !== null && _c !== void 0 ? _c : '', onPaymentSuccess: (data) => {
410
+ (0, helpers_1.navigate)('PaymentStatus', {
430
411
  status: 'success',
431
412
  paymentData: data
432
413
  });
433
414
  }, onPaymentFailure: (error) => {
434
- (0, helpers_2.navigate)('PaymentStatus', {
415
+ (0, helpers_1.navigate)('PaymentStatus', {
435
416
  status: 'failed',
436
417
  paymentData: error
437
418
  });
@@ -440,7 +421,7 @@ const RootNavigator = ({ config = {}, onExit, onPanRequired, }) => {
440
421
  react_1.default.createElement(Stack.Screen, { name: "PaymentStatus", options: { title: 'Payment Status' } }, (props) => {
441
422
  var _a, _b, _c;
442
423
  return (react_1.default.createElement(PaymentStatus_1.default, Object.assign({ status: ((_a = props.route.params) === null || _a === void 0 ? void 0 : _a.status) || 'pending', transactionId: (_b = props.route.params) === null || _b === void 0 ? void 0 : _b.transactionId, fdData: (_c = props.route.params) === null || _c === void 0 ? void 0 : _c.fdData, onRetry: () => {
443
- (0, helpers_2.navigate)('Payment');
424
+ (0, helpers_1.navigate)('Payment');
444
425
  }, onContinue: (fdDetails) => {
445
426
  onExit === null || onExit === void 0 ? void 0 : onExit(fdDetails);
446
427
  } }, props)));
@@ -105,12 +105,15 @@ export type RootStackParamList = {
105
105
  masterData?: any;
106
106
  onboardingIds?: any;
107
107
  initialRouteName?: string;
108
- /** When opening Shriram with initialRouteName 'PaymentStatus', pass status/transactionId/fdData here */
108
+ /** When opening Shriram/Mahindra with initialRouteName 'PaymentStatus', pass status/transactionId/fdData here */
109
109
  initialPaymentStatusParams?: {
110
110
  status?: 'success' | 'failed' | 'pending';
111
111
  transactionId?: string;
112
112
  fdData?: any;
113
113
  };
114
+ /** When opening Mahindra with initialRouteName 'Payment', pass the resolved payment URL and transactionId here */
115
+ initialPaymentUrl?: string;
116
+ initialPaymentTransactionId?: string;
114
117
  shriramSDKGlobalData?: any;
115
118
  mahindraSDKGlobalData?: any;
116
119
  forceFetchCustomerDetails?: boolean;
@@ -1,4 +1,4 @@
1
- import type { InvestmentData, CustomerData, AppData, FDData } from '../types/dataTypes';
1
+ import type { AppData, CustomerData, FDData, InvestmentData } from '../types/dataTypes';
2
2
  import type { WorkflowStateSriram } from '../types/workflowTypes';
3
3
  /**
4
4
  * Centralized navigation for FD workflow based on Flutter implementation
@@ -3,29 +3,87 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.handleWorkflowNavigation = handleWorkflowNavigation;
4
4
  exports.handleFDSelection = handleFDSelection;
5
5
  exports.navigateFDCreationFlow = navigateFDCreationFlow;
6
- const helpers_1 = require("./helpers");
7
6
  const workflowConstants_1 = require("../config/workflowConstants");
7
+ const helpers_1 = require("./helpers");
8
8
  /**
9
9
  * Centralized navigation for FD workflow based on Flutter implementation
10
10
  */
11
11
  async function handleWorkflowNavigation({ workflowState, investmentData, customerData, appData, fdData, completedApplications = [], transactionId, }) {
12
- switch (workflowState) {
12
+ // Normalize workflow state from caption if needed
13
+ let normalizedState = workflowState;
14
+ // Map Shriram captions to common states if necessary, or handle directly
15
+ const isShriramCaption = Object.values(workflowConstants_1.SHRIRAM_WORKFLOW_STATES).includes(workflowState);
16
+ const isMahindraCaption = Object.values(workflowConstants_1.MAHINDRA_WORKFLOW_STATES).includes(workflowState);
17
+ if (isShriramCaption) {
18
+ if (workflowState === workflowConstants_1.SHRIRAM_WORKFLOW_STATES.START || workflowState === workflowConstants_1.SHRIRAM_WORKFLOW_STATES.INITIATION)
19
+ normalizedState = workflowConstants_1.WORKFLOW_STATES.START;
20
+ else if (workflowState === workflowConstants_1.SHRIRAM_WORKFLOW_STATES.KYC)
21
+ normalizedState = workflowConstants_1.WORKFLOW_STATES.KYC;
22
+ else if (workflowState === workflowConstants_1.SHRIRAM_WORKFLOW_STATES.OCCUPATION)
23
+ normalizedState = workflowConstants_1.WORKFLOW_STATES.OCCUPATION;
24
+ else if (workflowState === workflowConstants_1.SHRIRAM_WORKFLOW_STATES.NOMINEE)
25
+ normalizedState = workflowConstants_1.WORKFLOW_STATES.NOMINEE;
26
+ else if (workflowState === workflowConstants_1.SHRIRAM_WORKFLOW_STATES.BANK_DETAILS)
27
+ normalizedState = workflowConstants_1.WORKFLOW_STATES.BANK_DETAILS;
28
+ else if (workflowState === workflowConstants_1.SHRIRAM_WORKFLOW_STATES.CREATE_FD)
29
+ normalizedState = workflowConstants_1.WORKFLOW_STATES.CREATE_FD;
30
+ else if (workflowState === workflowConstants_1.SHRIRAM_WORKFLOW_STATES.PAYMENT)
31
+ normalizedState = workflowConstants_1.WORKFLOW_STATES.PAYMENT;
32
+ else if (workflowState === workflowConstants_1.SHRIRAM_WORKFLOW_STATES.END)
33
+ normalizedState = workflowConstants_1.WORKFLOW_STATES.END;
34
+ }
35
+ else if (isMahindraCaption) {
36
+ if (workflowState === workflowConstants_1.MAHINDRA_WORKFLOW_STATES.START || workflowState === workflowConstants_1.MAHINDRA_WORKFLOW_STATES.INITIATION)
37
+ normalizedState = workflowConstants_1.WORKFLOW_STATES.START;
38
+ else if (workflowState === workflowConstants_1.MAHINDRA_WORKFLOW_STATES.KYC || workflowState === workflowConstants_1.MAHINDRA_WORKFLOW_STATES.AADHAAR_VERIFICATION) {
39
+ (0, helpers_1.navigate)('AadhaarVerification');
40
+ return;
41
+ }
42
+ else if (workflowState === workflowConstants_1.MAHINDRA_WORKFLOW_STATES.DEMOGRAPHIC_INFO)
43
+ normalizedState = workflowConstants_1.WORKFLOW_STATES.KYC; // Map demographic to KYC
44
+ else if (workflowState === workflowConstants_1.MAHINDRA_WORKFLOW_STATES.OCCUPATION)
45
+ normalizedState = workflowConstants_1.WORKFLOW_STATES.OCCUPATION;
46
+ else if (workflowState === workflowConstants_1.MAHINDRA_WORKFLOW_STATES.NOMINEE)
47
+ normalizedState = workflowConstants_1.WORKFLOW_STATES.NOMINEE;
48
+ else if (workflowState === workflowConstants_1.MAHINDRA_WORKFLOW_STATES.BANK_DETAILS)
49
+ normalizedState = workflowConstants_1.WORKFLOW_STATES.BANK_DETAILS;
50
+ else if (workflowState === workflowConstants_1.MAHINDRA_WORKFLOW_STATES.CREATE_FD)
51
+ normalizedState = workflowConstants_1.WORKFLOW_STATES.CREATE_FD;
52
+ else if (workflowState === workflowConstants_1.MAHINDRA_WORKFLOW_STATES.PAYMENT)
53
+ normalizedState = workflowConstants_1.WORKFLOW_STATES.PAYMENT;
54
+ else if (workflowState === workflowConstants_1.MAHINDRA_WORKFLOW_STATES.END)
55
+ normalizedState = workflowConstants_1.WORKFLOW_STATES.END;
56
+ }
57
+ switch (normalizedState) {
13
58
  case workflowConstants_1.WORKFLOW_STATES.START:
14
59
  case workflowConstants_1.WORKFLOW_STATES.INITIATION:
15
60
  // No navigation required
16
61
  break;
17
62
  case workflowConstants_1.WORKFLOW_STATES.CREATE_FD:
18
- // Navigate to FD overview first, then to occupation
19
- (0, helpers_1.navigate)('PayNow', {
20
- fdData: fdData ? {
21
- companyName: fdData.name,
22
- amount: fdData.amount,
23
- fdRate: fdData.roi,
24
- tenure: fdData.tenure,
25
- interestPayout: 'Yearly' // Default value
26
- } : undefined
27
- });
28
- // The flow will continue to occupation after FD selection
63
+ // For Shriram, CREATE_FD means we should show payment if possible
64
+ if (isShriramCaption) {
65
+ (0, helpers_1.navigate)('PayNow', {
66
+ fdData: fdData ? {
67
+ companyName: fdData.name,
68
+ amount: fdData.amount,
69
+ fdRate: fdData.roi,
70
+ tenure: fdData.tenure,
71
+ interestPayout: ''
72
+ } : undefined
73
+ });
74
+ }
75
+ else {
76
+ // Default behavior for other providers
77
+ (0, helpers_1.navigate)('PayNow', {
78
+ fdData: fdData ? {
79
+ companyName: fdData.name,
80
+ amount: fdData.amount,
81
+ fdRate: fdData.roi,
82
+ tenure: fdData.tenure,
83
+ interestPayout: 'Yearly'
84
+ } : undefined
85
+ });
86
+ }
29
87
  break;
30
88
  case workflowConstants_1.WORKFLOW_STATES.OCCUPATION:
31
89
  (0, helpers_1.navigate)('Employee');
@@ -34,7 +92,15 @@ async function handleWorkflowNavigation({ workflowState, investmentData, custome
34
92
  (0, helpers_1.navigate)('NomineeDetail');
35
93
  break;
36
94
  case workflowConstants_1.WORKFLOW_STATES.BANK_DETAILS:
37
- (0, helpers_1.navigate)('BankDetail');
95
+ if (isShriramCaption) {
96
+ (0, helpers_1.navigate)('ExternalSDK', { sdkType: 'shriram', initialRouteName: 'BankDetail' });
97
+ }
98
+ else if (isMahindraCaption) {
99
+ (0, helpers_1.navigate)('ExternalSDK', { sdkType: 'mahindra', initialRouteName: 'BankDetail' });
100
+ }
101
+ else {
102
+ (0, helpers_1.navigate)('BankDetail');
103
+ }
38
104
  break;
39
105
  case workflowConstants_1.WORKFLOW_STATES.KYC:
40
106
  (0, helpers_1.navigate)('ReviewKYC');
@@ -42,7 +108,6 @@ async function handleWorkflowNavigation({ workflowState, investmentData, custome
42
108
  case workflowConstants_1.WORKFLOW_STATES.PAYMENT:
43
109
  // Handle payment status check and navigation
44
110
  if (transactionId) {
45
- // Navigate to payment screen with transaction ID
46
111
  (0, helpers_1.navigate)('Payment');
47
112
  }
48
113
  else {
@@ -52,24 +117,40 @@ async function handleWorkflowNavigation({ workflowState, investmentData, custome
52
117
  amount: fdData.amount,
53
118
  fdRate: fdData.roi,
54
119
  tenure: fdData.tenure,
55
- interestPayout: '' // Default value
120
+ interestPayout: ''
56
121
  } : undefined
57
122
  });
58
123
  }
59
124
  break;
60
125
  case workflowConstants_1.WORKFLOW_STATES.END:
61
- (0, helpers_1.navigate)('PaymentStatus', {
62
- transactionId,
63
- fdData: fdData ? {
64
- companyName: fdData.name,
65
- amount: fdData.amount,
66
- fdRate: fdData.roi,
67
- tenure: fdData.tenure,
68
- interestPayout: '' // Default value
69
- } : undefined
70
- });
126
+ if (isShriramCaption) {
127
+ (0, helpers_1.navigate)('ExternalSDK', {
128
+ sdkType: 'shriram',
129
+ initialRouteName: 'PayNow',
130
+ fdData: fdData ? {
131
+ companyName: fdData.name,
132
+ amount: fdData.amount,
133
+ fdRate: fdData.roi,
134
+ tenure: fdData.tenure,
135
+ interestPayout: ''
136
+ } : undefined
137
+ });
138
+ }
139
+ else {
140
+ (0, helpers_1.navigate)('PaymentStatus', {
141
+ transactionId,
142
+ fdData: fdData ? {
143
+ companyName: fdData.name,
144
+ amount: fdData.amount,
145
+ fdRate: fdData.roi,
146
+ tenure: fdData.tenure,
147
+ interestPayout: ''
148
+ } : undefined
149
+ });
150
+ }
71
151
  break;
72
152
  default:
153
+ break;
73
154
  }
74
155
  }
75
156
  /**
@@ -560,17 +560,7 @@ const AadhaarVerification = ({ onGoBack, onVerificationComplete, }) => {
560
560
  (0, helpers_1.navigate)('ReviewKYC');
561
561
  }
562
562
  };
563
- // Handle Android hardware back button
564
- (0, react_1.useEffect)(() => {
565
- if (react_native_1.Platform.OS !== 'android')
566
- return;
567
- const onHardwareBackPress = () => {
568
- handleBackPress();
569
- return true; // Prevent default behavior
570
- };
571
- const backHandler = react_native_1.BackHandler.addEventListener('hardwareBackPress', onHardwareBackPress);
572
- return () => backHandler.remove();
573
- }, [defultProviderId, workflowInstanceId, applicationId, entityId]);
563
+ // Removed screen-level hardware back handler to allow only header back button navigation
574
564
  return (react_1.default.createElement(SafeAreaWrapper_1.default, { includeTop: false, bottomPadding: 25, statusBarColor: "#000000", statusBarStyle: "light-content" },
575
565
  react_1.default.createElement(components_1.Header, { title: kyc_1.KYC_STRINGS.AADHAAR_VERIFICATION_TITLE, onBackPress: handleBackPress }),
576
566
  react_1.default.createElement(react_native_1.KeyboardAvoidingView, { style: { flex: 1 }, behavior: react_native_1.Platform.OS === 'ios' ? 'padding' : 'height', keyboardVerticalOffset: react_native_1.Platform.OS === 'ios' ? 0 : 20 },
@@ -245,17 +245,7 @@ const AddBankAccount = ({ onGoBack, onContinue, onFindIFSC, initialData, selecte
245
245
  const handleBackPress = () => {
246
246
  (0, helpers_1.navigate)('BankDetail');
247
247
  };
248
- // Handle Android hardware back button
249
- (0, react_1.useEffect)(() => {
250
- if (react_native_1.Platform.OS !== 'android')
251
- return;
252
- const onHardwareBackPress = () => {
253
- handleBackPress();
254
- return true; // Prevent default behavior
255
- };
256
- const backHandler = react_native_1.BackHandler.addEventListener('hardwareBackPress', onHardwareBackPress);
257
- return () => backHandler.remove();
258
- }, []);
248
+ // Removed screen-level hardware back handler to allow only header back button navigation
259
249
  return (react_1.default.createElement(SafeAreaWrapper_1.default, { includeTop: false, bottomPadding: 25, statusBarColor: "#000000", statusBarStyle: "light-content" },
260
250
  react_1.default.createElement(components_1.Header, { title: bank_1.BANK_STRINGS.ADD_BANK_ACCOUNT_TITLE, onBackPress: handleBackPress, backgroundColor: colors.primary }),
261
251
  react_1.default.createElement(react_native_1.KeyboardAvoidingView, { style: { flex: 1 }, behavior: react_native_1.Platform.OS === 'ios' ? 'padding' : undefined, keyboardVerticalOffset: react_native_1.Platform.OS === 'ios' ? 0 : 0 },
@@ -495,17 +495,7 @@ const BankDetail = ({ onGoBack, onContinue, onAddAccount, initialData }) => {
495
495
  (0, helpers_1.navigate)('NomineeDetail');
496
496
  }
497
497
  };
498
- // Handle Android hardware back button
499
- (0, react_1.useEffect)(() => {
500
- if (react_native_1.Platform.OS !== 'android')
501
- return;
502
- const onHardwareBackPress = () => {
503
- handleBackPress();
504
- return true; // Prevent default behavior
505
- };
506
- const backHandler = react_native_1.BackHandler.addEventListener('hardwareBackPress', onHardwareBackPress);
507
- return () => backHandler.remove();
508
- }, [defaultProviderId, workflowInstanceId, applicationId, entityId, appData === null || appData === void 0 ? void 0 : appData.userReferenceId]);
498
+ // Removed screen-level hardware back handler to allow only header back button navigation
509
499
  return (react_1.default.createElement(SafeAreaWrapper_1.default, { includeTop: false, bottomPadding: 25, statusBarColor: "#000000", statusBarStyle: "light-content" },
510
500
  react_1.default.createElement(components_1.Header, { title: bank_1.BANK_STRINGS.BANK_DETAILS_TITLE, onBackPress: handleBackPress, backgroundColor: colors.primary }),
511
501
  react_1.default.createElement(react_native_1.KeyboardAvoidingView, { behavior: react_native_1.Platform.OS === 'ios' ? 'padding' : undefined, style: styles.keyboardAvoidingView, keyboardVerticalOffset: react_native_1.Platform.OS === 'ios' ? 0 : 0 },
@@ -458,17 +458,7 @@ const Employee = ({ onGoBack, onContinue, initialData }) => {
458
458
  (0, helpers_1.navigate)('ReviewKYC');
459
459
  }
460
460
  };
461
- // Handle Android hardware back button
462
- (0, react_1.useEffect)(() => {
463
- if (react_native_1.Platform.OS !== 'android')
464
- return;
465
- const onHardwareBackPress = () => {
466
- handleBackPress();
467
- return true; // Prevent default behavior
468
- };
469
- const backHandler = react_native_1.BackHandler.addEventListener('hardwareBackPress', onHardwareBackPress);
470
- return () => backHandler.remove();
471
- }, [defaultProviderId, workflowInstanceId, applicationId]);
461
+ // Removed screen-level hardware back handler to allow only header back button navigation
472
462
  return (react_1.default.createElement(SafeAreaWrapper_1.default, { includeTop: false, bottomPadding: 25, statusBarColor: "#000000", statusBarStyle: "light-content" },
473
463
  react_1.default.createElement(components_1.Header, { title: employee_1.EMPLOYEE_STRINGS.OCCUPATION_DETAILS_TITLE, onBackPress: handleBackPress, backgroundColor: colors.primary }),
474
464
  react_1.default.createElement(react_native_1.KeyboardAvoidingView, { behavior: react_native_1.Platform.OS === 'ios' ? 'padding' : undefined, style: styles.keyboardAvoidingView, keyboardVerticalOffset: react_native_1.Platform.OS === 'ios' ? 0 : 0 },
@@ -535,17 +535,7 @@ const FDCalculator = ({ onGoBack, onNavigateToReviewKYC, fdData }) => {
535
535
  }
536
536
  return fallback;
537
537
  }, [effectiveMasterData]);
538
- // Handle Android hardware back button - use same navigation as header back button
539
- (0, react_1.useEffect)(() => {
540
- if (react_native_1.Platform.OS !== 'android')
541
- return;
542
- const onHardwareBackPress = () => {
543
- (0, helpers_1.navigate)('FDList'); // Same as header back button
544
- return true; // Prevent default behavior
545
- };
546
- const backHandler = react_native_1.BackHandler.addEventListener('hardwareBackPress', onHardwareBackPress);
547
- return () => backHandler.remove();
548
- }, []);
538
+ // Removed screen-level hardware back handler to allow only header back button navigation
549
539
  return (react_1.default.createElement(SafeAreaWrapper_1.default, { includeTop: false, bottomPadding: 25, statusBarColor: "#000000", statusBarStyle: "light-content" },
550
540
  react_1.default.createElement(react_native_1.View, { style: styles.header },
551
541
  react_1.default.createElement(react_native_1.TouchableOpacity, { onPress: () => (0, helpers_1.navigate)('FDList'), style: styles.backButton },