@finspringinnovations/fixeddepositsdk 1.0.2 → 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 (50) 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/components/PendingFDBottomSheet.js +27 -18
  5. package/lib/config/appDataConfig.js +3 -2
  6. package/lib/config/workflowConstants.d.ts +40 -30
  7. package/lib/config/workflowConstants.js +35 -24
  8. package/lib/constants/strings/fd.d.ts +2 -2
  9. package/lib/constants/strings/fd.js +2 -2
  10. package/lib/navigation/RootNavigator.js +167 -196
  11. package/lib/navigation/types.d.ts +4 -1
  12. package/lib/navigation/workflowNavigator.d.ts +1 -1
  13. package/lib/navigation/workflowNavigator.js +107 -26
  14. package/lib/screens/AadhaarVerification.js +1 -11
  15. package/lib/screens/AddBankAccount.js +1 -11
  16. package/lib/screens/BankDetail.js +1 -11
  17. package/lib/screens/Employee.js +1 -11
  18. package/lib/screens/FDCalculator.js +2 -12
  19. package/lib/screens/FDList.js +531 -417
  20. package/lib/screens/FindIFSC.js +1 -11
  21. package/lib/screens/NomineeDetail.js +12 -22
  22. package/lib/screens/PayNow.js +1 -11
  23. package/lib/screens/Payment.js +2 -11
  24. package/lib/screens/PaymentStatus.js +24 -21
  25. package/lib/screens/ReviewKYC.js +3 -12
  26. package/lib/types/workflowTypes.d.ts +1 -1
  27. package/package.json +50 -50
  28. package/src/api/customerApi.ts +1 -0
  29. package/src/api/fdApi.ts +28 -1
  30. package/src/components/PendingFDBottomSheet.tsx +151 -123
  31. package/src/config/appDataConfig.ts +245 -242
  32. package/src/config/workflowConstants.ts +51 -39
  33. package/src/constants/strings/bank.ts +80 -80
  34. package/src/constants/strings/fd.ts +2 -2
  35. package/src/navigation/RootNavigator.tsx +667 -651
  36. package/src/navigation/types.ts +4 -1
  37. package/src/navigation/workflowNavigator.ts +170 -107
  38. package/src/screens/AadhaarVerification.tsx +1 -15
  39. package/src/screens/AddBankAccount.tsx +2 -16
  40. package/src/screens/BankDetail.tsx +1 -15
  41. package/src/screens/Employee.tsx +1 -15
  42. package/src/screens/FDCalculator.tsx +4 -18
  43. package/src/screens/FDList.tsx +2311 -2170
  44. package/src/screens/FindIFSC.tsx +2 -16
  45. package/src/screens/NomineeDetail.tsx +762 -775
  46. package/src/screens/PayNow.tsx +2 -16
  47. package/src/screens/Payment.tsx +190 -203
  48. package/src/screens/PaymentStatus.tsx +574 -576
  49. package/src/screens/ReviewKYC.tsx +2 -15
  50. package/src/types/workflowTypes.ts +1 -10
@@ -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,24 +535,14 @@ 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 },
552
542
  react_1.default.createElement(react_native_1.Image, { source: { uri: base64Images_1.base64Images.backArrow }, style: [styles.backIcon, { tintColor: themeName === 'dark' ? colors.headerText : undefined }], resizeMode: "contain", width: 24, height: 24 }))),
553
543
  react_1.default.createElement(react_native_1.View, { style: { flex: 1, justifyContent: 'space-between' } },
554
544
  react_1.default.createElement(react_native_1.ScrollView, { style: styles.scrollContainer, contentContainerStyle: styles.scrollContent, showsVerticalScrollIndicator: false, onScrollBeginDrag: closeAllMenus, scrollEnabled: !(isOnboarding || isBooking), keyboardShouldPersistTaps: "handled", bounces: true, alwaysBounceVertical: true },
555
- react_1.default.createElement(components_1.CompanyHeader, { companyName: (effectiveFdData === null || effectiveFdData === void 0 ? void 0 : effectiveFdData.name) || '', rating: (effectiveFdData === null || effectiveFdData === void 0 ? void 0 : effectiveFdData.creditRating) || 'AA+' }),
545
+ react_1.default.createElement(components_1.CompanyHeader, { companyName: (effectiveFdData === null || effectiveFdData === void 0 ? void 0 : effectiveFdData.name) || '', rating: "AAA" }),
556
546
  react_1.default.createElement(components_1.AmountInput, { label: strings_1.FD_STRINGS.INVESTMENT_AMOUNT_LABEL, value: amount, onChangeText: handleAmountChange, onFocus: closeAllMenus, placeholder: strings_1.FD_STRINGS.AMOUNT_PLACEHOLDER, noteText: strings_1.FD_STRINGS.AMOUNT_NOTE, minMaxText: strings_1.FD_STRINGS.AMOUNT_MIN_MAX, errorMessage: amountError }),
557
547
  react_1.default.createElement(components_1.DropdownSelector, { label: strings_1.FD_STRINGS.TENURE_LABEL, value: tenureValue || strings_1.COMMON_STRINGS.SELECT, onPress: () => {
558
548
  react_native_1.Keyboard.dismiss();