@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.
- package/lib/api/customerApi.js +1 -0
- package/lib/api/fdApi.d.ts +401 -1
- package/lib/api/fdApi.js +24 -2
- package/lib/components/PendingFDBottomSheet.js +27 -18
- package/lib/config/appDataConfig.js +3 -2
- package/lib/config/workflowConstants.d.ts +40 -30
- package/lib/config/workflowConstants.js +35 -24
- package/lib/constants/strings/fd.d.ts +2 -2
- package/lib/constants/strings/fd.js +2 -2
- package/lib/navigation/RootNavigator.js +167 -196
- package/lib/navigation/types.d.ts +4 -1
- package/lib/navigation/workflowNavigator.d.ts +1 -1
- package/lib/navigation/workflowNavigator.js +107 -26
- package/lib/screens/AadhaarVerification.js +1 -11
- package/lib/screens/AddBankAccount.js +1 -11
- package/lib/screens/BankDetail.js +1 -11
- package/lib/screens/Employee.js +1 -11
- package/lib/screens/FDCalculator.js +2 -12
- package/lib/screens/FDList.js +531 -417
- package/lib/screens/FindIFSC.js +1 -11
- package/lib/screens/NomineeDetail.js +12 -22
- package/lib/screens/PayNow.js +1 -11
- package/lib/screens/Payment.js +2 -11
- package/lib/screens/PaymentStatus.js +24 -21
- package/lib/screens/ReviewKYC.js +3 -12
- package/lib/types/workflowTypes.d.ts +1 -1
- package/package.json +50 -50
- package/src/api/customerApi.ts +1 -0
- package/src/api/fdApi.ts +28 -1
- package/src/components/PendingFDBottomSheet.tsx +151 -123
- package/src/config/appDataConfig.ts +245 -242
- package/src/config/workflowConstants.ts +51 -39
- package/src/constants/strings/bank.ts +80 -80
- package/src/constants/strings/fd.ts +2 -2
- package/src/navigation/RootNavigator.tsx +667 -651
- package/src/navigation/types.ts +4 -1
- package/src/navigation/workflowNavigator.ts +170 -107
- package/src/screens/AadhaarVerification.tsx +1 -15
- package/src/screens/AddBankAccount.tsx +2 -16
- package/src/screens/BankDetail.tsx +1 -15
- package/src/screens/Employee.tsx +1 -15
- package/src/screens/FDCalculator.tsx +4 -18
- package/src/screens/FDList.tsx +2311 -2170
- package/src/screens/FindIFSC.tsx +2 -16
- package/src/screens/NomineeDetail.tsx +762 -775
- package/src/screens/PayNow.tsx +2 -16
- package/src/screens/Payment.tsx +190 -203
- package/src/screens/PaymentStatus.tsx +574 -576
- package/src/screens/ReviewKYC.tsx +2 -15
- package/src/types/workflowTypes.ts +1 -10
|
@@ -1,687 +1,703 @@
|
|
|
1
|
-
import React, { useEffect } from 'react';
|
|
2
1
|
import { createStackNavigator } from '@react-navigation/stack';
|
|
2
|
+
import React, { useEffect } from 'react';
|
|
3
|
+
import { Alert, BackHandler, Platform } from 'react-native';
|
|
3
4
|
import type { RootStackParamList, SDKNavigationConfig } from './types';
|
|
4
|
-
import { BackHandler, Platform, Alert } from 'react-native';
|
|
5
|
-
import { navigationRef } from './helpers';
|
|
6
5
|
|
|
7
6
|
// Import screens
|
|
8
|
-
import FDListScreen from '../screens/FDList';
|
|
9
|
-
import FDCalculatorScreen from '../screens/FDCalculator';
|
|
10
7
|
import AadhaarVerificationScreen from '../screens/AadhaarVerification';
|
|
11
|
-
import ReviewKYCScreen from '../screens/ReviewKYC';
|
|
12
|
-
import EmployeeScreen from '../screens/Employee';
|
|
13
|
-
import NomineeDetailScreen from '../screens/NomineeDetail';
|
|
14
|
-
import BankDetailScreen from '../screens/BankDetail';
|
|
15
8
|
import AddBankAccountScreen from '../screens/AddBankAccount';
|
|
9
|
+
import BankDetailScreen from '../screens/BankDetail';
|
|
10
|
+
import EmployeeScreen from '../screens/Employee';
|
|
11
|
+
import FDCalculatorScreen from '../screens/FDCalculator';
|
|
12
|
+
import FDListScreen from '../screens/FDList';
|
|
16
13
|
import FindIFSCScreen from '../screens/FindIFSC';
|
|
14
|
+
import NomineeDetailScreen from '../screens/NomineeDetail';
|
|
17
15
|
import PayNowScreen from '../screens/PayNow';
|
|
18
16
|
import PaymentScreen from '../screens/Payment';
|
|
19
17
|
import PaymentStatusScreen from '../screens/PaymentStatus';
|
|
18
|
+
import ReviewKYCScreen from '../screens/ReviewKYC';
|
|
20
19
|
|
|
21
20
|
// Import full SDK navigators and initialization functions
|
|
22
21
|
import {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
} from '@finspringinnovations/shriramfdsdk';
|
|
38
|
-
import {
|
|
39
|
-
initializeSDK as initializeMahindraSDK,
|
|
40
|
-
initializeEnvironment as initializeMahindraEnvironment,
|
|
41
|
-
RootNavigator as MahindraRootNavigator,
|
|
42
|
-
navigationRef as mahindraNavigationRef,
|
|
43
|
-
ThemeProvider as MahindraThemeProvider,
|
|
44
|
-
ApiProvider as MahindraApiProvider,
|
|
45
|
-
MasterDataProvider as MahindraMasterDataProvider,
|
|
46
|
-
useMasterData as useMahindraMasterData,
|
|
47
|
-
useAppDispatch as useMahindraAppDispatch,
|
|
48
|
-
setFDListSelected as setMahindraFDListSelected,
|
|
49
|
-
setOnboardingIds as setMahindraOnboardingIds,
|
|
50
|
-
type AppData as MahindraAppData,
|
|
51
|
-
type EnvironmentData as MahindraEnvironmentData
|
|
22
|
+
initializeEnvironment as initializeMahindraEnvironment,
|
|
23
|
+
initializeSDK as initializeMahindraSDK,
|
|
24
|
+
ApiProvider as MahindraApiProvider,
|
|
25
|
+
MasterDataProvider as MahindraMasterDataProvider,
|
|
26
|
+
navigationRef as mahindraNavigationRef,
|
|
27
|
+
RootNavigator as MahindraRootNavigator,
|
|
28
|
+
ThemeProvider as MahindraThemeProvider,
|
|
29
|
+
setFDListSelected as setMahindraFDListSelected,
|
|
30
|
+
setOnboardingIds as setMahindraOnboardingIds,
|
|
31
|
+
setPaymentSession as setMahindraPaymentSession,
|
|
32
|
+
useAppDispatch as useMahindraAppDispatch,
|
|
33
|
+
useMasterData as useMahindraMasterData,
|
|
34
|
+
type AppData as MahindraAppData,
|
|
35
|
+
type EnvironmentData as MahindraEnvironmentData
|
|
52
36
|
} from '@finspringinnovations/mahindrafdsdk';
|
|
37
|
+
import {
|
|
38
|
+
initializeEnvironment as initializeShriramEnvironment,
|
|
39
|
+
initializeSDK as initializeShriramSDK,
|
|
40
|
+
setFDListSelected as setShriramFDListSelected,
|
|
41
|
+
setGlobalData as setShriramGlobalData,
|
|
42
|
+
setOnboardingIds as setShriramOnboardingIds,
|
|
43
|
+
ApiProvider as ShriramApiProvider,
|
|
44
|
+
MasterDataProvider as ShriramMasterDataProvider,
|
|
45
|
+
navigationRef as shriramNavigationRef,
|
|
46
|
+
RootNavigator as ShriramRootNavigator,
|
|
47
|
+
ThemeProvider as ShriramThemeProvider,
|
|
48
|
+
useAppDispatch as useShriramAppDispatch,
|
|
49
|
+
useMasterData as useShriramMasterData,
|
|
50
|
+
type AppData as ShriramAppData,
|
|
51
|
+
type EnvironmentData as ShriramEnvironmentData
|
|
52
|
+
} from '@finspringinnovations/shriramfdsdk';
|
|
53
53
|
|
|
54
54
|
// Import NavigationContainer and tree wrappers
|
|
55
55
|
import { NavigationContainer, NavigationIndependentTree } from '@react-navigation/native';
|
|
56
56
|
|
|
57
57
|
// Import navigation helpers
|
|
58
|
-
import { goBack, navigate, replace, pop } from './helpers';
|
|
59
58
|
import { getPaymentSession } from '../state/paymentSession';
|
|
59
|
+
import { goBack, navigate, pop } from './helpers';
|
|
60
60
|
|
|
61
61
|
// Import data getters from fdsdk
|
|
62
62
|
import { getAppData, getEnvironmentData } from '../config/appDataConfig';
|
|
63
63
|
import { useMasterData } from '../providers/MasterDataProvider';
|
|
64
64
|
import { useTheme } from '../theme/ThemeContext';
|
|
65
65
|
|
|
66
|
-
const Stack = createStackNavigator<RootStackParamList>();
|
|
66
|
+
const Stack = createStackNavigator < RootStackParamList > ();
|
|
67
67
|
const MahindraRootNavigatorAny = MahindraRootNavigator as React.ComponentType<any>;
|
|
68
68
|
|
|
69
|
+
// ─── Module-level SDK content components ───────────────────────────────────
|
|
70
|
+
// Defined OUTSIDE the render prop so React sees a stable component type on
|
|
71
|
+
// every parent re-render. Defining them inside the render prop creates a new
|
|
72
|
+
// function reference each render, causing React to unmount + remount the
|
|
73
|
+
// entire SDK NavigationContainer (and all child screens) on every render.
|
|
74
|
+
|
|
75
|
+
interface ShriramSDKContentProps {
|
|
76
|
+
masterData: any;
|
|
77
|
+
routeParams: any;
|
|
78
|
+
onSDKExit: (fdDetails?: any) => void;
|
|
79
|
+
onSDKPanRequired: () => void;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const ShriramSDKContent: React.FC<ShriramSDKContentProps> = ({
|
|
83
|
+
masterData,
|
|
84
|
+
routeParams,
|
|
85
|
+
onSDKExit,
|
|
86
|
+
onSDKPanRequired,
|
|
87
|
+
}) => {
|
|
88
|
+
const { setMasterData } = useShriramMasterData();
|
|
89
|
+
const shriramDispatch = useShriramAppDispatch();
|
|
90
|
+
|
|
91
|
+
const [initialized, setInitialized] = React.useState(false);
|
|
92
|
+
|
|
93
|
+
React.useEffect(() => {
|
|
94
|
+
// Perform all dispatches sequentially to ensure state is ready
|
|
95
|
+
if (masterData) {
|
|
96
|
+
const dataToSet = masterData.data || masterData;
|
|
97
|
+
setMasterData(dataToSet);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (routeParams.fdListSelectedData) {
|
|
101
|
+
try {
|
|
102
|
+
shriramDispatch(setShriramFDListSelected(routeParams.fdListSelectedData));
|
|
103
|
+
} catch (e) {
|
|
104
|
+
console.log('[RootNavigator] Error setting Shriram FDListSelected:', e);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (routeParams.onboardingIds) {
|
|
109
|
+
try {
|
|
110
|
+
shriramDispatch(setShriramOnboardingIds({
|
|
111
|
+
...routeParams.onboardingIds,
|
|
112
|
+
providerId: routeParams.providerId || routeParams.onboardingIds?.providerId,
|
|
113
|
+
}));
|
|
114
|
+
} catch (e) {
|
|
115
|
+
console.log('[RootNavigator] Error setting Shriram OnboardingIds:', e);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
if (routeParams.shriramSDKGlobalData) {
|
|
120
|
+
try {
|
|
121
|
+
const completeFDData = !!routeParams.shriramSDKGlobalData;
|
|
122
|
+
setShriramGlobalData({ completeFDData });
|
|
123
|
+
} catch (e) {
|
|
124
|
+
console.log('[RootNavigator] Error setting Shriram GlobalData:', e);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
setInitialized(true);
|
|
129
|
+
}, [masterData, routeParams, shriramDispatch, setMasterData]);
|
|
130
|
+
|
|
131
|
+
if (!initialized) {
|
|
132
|
+
return null; // Or a loading spinner if preferred
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
return (
|
|
137
|
+
<ShriramRootNavigator
|
|
138
|
+
config={{
|
|
139
|
+
initialRouteName: routeParams.initialRouteName || 'FDCalculator',
|
|
140
|
+
initialPaymentStatusParams: routeParams.initialPaymentStatusParams,
|
|
141
|
+
initialFDContext: {
|
|
142
|
+
providerId: routeParams.providerId,
|
|
143
|
+
fdListSelectedData: routeParams.fdListSelectedData,
|
|
144
|
+
completeFDData: routeParams.completeFDData,
|
|
145
|
+
},
|
|
146
|
+
} as any}
|
|
147
|
+
onExit={onSDKExit}
|
|
148
|
+
onPanRequired={onSDKPanRequired}
|
|
149
|
+
/>
|
|
150
|
+
);
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
interface MahindraSDKContentProps {
|
|
154
|
+
masterData: any;
|
|
155
|
+
routeParams: any;
|
|
156
|
+
onSDKExit: (fdDetails?: any) => void;
|
|
157
|
+
onSDKPanRequired: () => void;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
const MahindraSDKContent: React.FC<MahindraSDKContentProps> = ({
|
|
161
|
+
masterData,
|
|
162
|
+
routeParams,
|
|
163
|
+
onSDKExit,
|
|
164
|
+
onSDKPanRequired,
|
|
165
|
+
}) => {
|
|
166
|
+
const { setMasterData } = useMahindraMasterData();
|
|
167
|
+
const mahindraDispatch = useMahindraAppDispatch();
|
|
168
|
+
|
|
169
|
+
const [initialized, setInitialized] = React.useState(false);
|
|
170
|
+
|
|
171
|
+
React.useEffect(() => {
|
|
172
|
+
// Perform all dispatches sequentially to ensure state is ready
|
|
173
|
+
if (masterData) {
|
|
174
|
+
const dataToSet = masterData.data || masterData;
|
|
175
|
+
setMasterData(dataToSet);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
if (routeParams.fdListSelectedData) {
|
|
179
|
+
try {
|
|
180
|
+
mahindraDispatch(setMahindraFDListSelected(routeParams.fdListSelectedData));
|
|
181
|
+
} catch (e) {
|
|
182
|
+
console.log('[RootNavigator] Error setting Mahindra FDListSelected:', e);
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
if (routeParams.onboardingIds) {
|
|
187
|
+
try {
|
|
188
|
+
mahindraDispatch(setMahindraOnboardingIds({
|
|
189
|
+
...routeParams.onboardingIds,
|
|
190
|
+
providerId: routeParams.providerId || routeParams.onboardingIds?.providerId,
|
|
191
|
+
}));
|
|
192
|
+
} catch (e) {
|
|
193
|
+
console.log('[RootNavigator] Error setting Mahindra OnboardingIds:', e);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
if (routeParams.initialPaymentUrl) {
|
|
198
|
+
setMahindraPaymentSession({
|
|
199
|
+
paymentUrl: routeParams.initialPaymentUrl,
|
|
200
|
+
transactionId: routeParams.initialPaymentTransactionId,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
setInitialized(true);
|
|
205
|
+
}, [masterData, routeParams, mahindraDispatch, setMasterData]);
|
|
206
|
+
|
|
207
|
+
if (!initialized) {
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
|
|
212
|
+
return (
|
|
213
|
+
<MahindraRootNavigatorAny
|
|
214
|
+
config={{
|
|
215
|
+
initialRouteName: routeParams.initialRouteName || 'FDCalculator',
|
|
216
|
+
forceFetchCustomerDetails: !!routeParams.forceFetchCustomerDetails,
|
|
217
|
+
initialPaymentStatusParams: routeParams.initialPaymentStatusParams,
|
|
218
|
+
initialFDContext: {
|
|
219
|
+
providerId: routeParams.providerId,
|
|
220
|
+
fdListSelectedData: routeParams.fdListSelectedData,
|
|
221
|
+
completeFDData: routeParams.completeFDData,
|
|
222
|
+
},
|
|
223
|
+
}}
|
|
224
|
+
onExit={onSDKExit}
|
|
225
|
+
onPanRequired={onSDKPanRequired}
|
|
226
|
+
/>
|
|
227
|
+
);
|
|
228
|
+
};
|
|
229
|
+
// ───────────────────────────────────────────────────────────────────────────
|
|
230
|
+
|
|
69
231
|
interface RootNavigatorProps {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
232
|
+
config?: SDKNavigationConfig;
|
|
233
|
+
onExit?: (fdDetails?: any) => void;
|
|
234
|
+
onPanRequired?: () => void;
|
|
73
235
|
}
|
|
74
236
|
|
|
75
237
|
const RootNavigator: React.FC<RootNavigatorProps> = ({
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
238
|
+
config = {},
|
|
239
|
+
onExit,
|
|
240
|
+
onPanRequired,
|
|
79
241
|
}) => {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
>
|
|
540
|
-
{(props) => (
|
|
541
|
-
<EmployeeScreen
|
|
542
|
-
onGoBack={() => goBack()}
|
|
543
|
-
onContinue={() => {
|
|
544
|
-
navigate('NomineeDetail');
|
|
545
|
-
}}
|
|
546
|
-
{...props}
|
|
547
|
-
/>
|
|
548
|
-
)}
|
|
549
|
-
</Stack.Screen>
|
|
550
|
-
|
|
551
|
-
<Stack.Screen
|
|
552
|
-
name="NomineeDetail"
|
|
553
|
-
options={{ title: 'Nominee Details' }}
|
|
554
|
-
>
|
|
555
|
-
{(props) => (
|
|
556
|
-
<NomineeDetailScreen
|
|
557
|
-
onGoBack={() => goBack()}
|
|
558
|
-
onSave={() => {
|
|
559
|
-
navigate('BankDetail');
|
|
560
|
-
}}
|
|
561
|
-
{...props}
|
|
562
|
-
/>
|
|
563
|
-
)}
|
|
564
|
-
</Stack.Screen>
|
|
565
|
-
|
|
566
|
-
<Stack.Screen
|
|
567
|
-
name="BankDetail"
|
|
568
|
-
options={{ title: 'Bank Details' }}
|
|
569
|
-
>
|
|
570
|
-
{(props) => (
|
|
571
|
-
<BankDetailScreen
|
|
572
|
-
onGoBack={() => goBack()}
|
|
573
|
-
onContinue={() => {
|
|
574
|
-
navigate('PayNow');
|
|
575
|
-
}}
|
|
576
|
-
onAddAccount={() => {
|
|
577
|
-
navigate('AddBankAccount');
|
|
578
|
-
}}
|
|
579
|
-
{...props}
|
|
580
|
-
/>
|
|
581
|
-
)}
|
|
582
|
-
</Stack.Screen>
|
|
583
|
-
|
|
584
|
-
<Stack.Screen
|
|
585
|
-
name="AddBankAccount"
|
|
586
|
-
options={{ title: 'Add Bank Account' }}
|
|
587
|
-
>
|
|
588
|
-
{(props) => (
|
|
589
|
-
<AddBankAccountScreen
|
|
590
|
-
onGoBack={() => goBack()}
|
|
591
|
-
onContinue={() => {
|
|
592
|
-
goBack();
|
|
593
|
-
}}
|
|
594
|
-
onFindIFSC={() => {
|
|
595
|
-
navigate('FindIFSC');
|
|
596
|
-
}}
|
|
597
|
-
selectedIFSC={(() => {
|
|
598
|
-
const params = (props.route.params as any);
|
|
599
|
-
return params?.selectedIFSC;
|
|
600
|
-
})()}
|
|
601
|
-
{...props}
|
|
602
|
-
/>
|
|
603
|
-
)}
|
|
604
|
-
</Stack.Screen>
|
|
605
|
-
|
|
606
|
-
<Stack.Screen
|
|
607
|
-
name="FindIFSC"
|
|
608
|
-
options={{ title: 'Find IFSC' }}
|
|
609
|
-
>
|
|
610
|
-
{(props) => (
|
|
611
|
-
<FindIFSCScreen
|
|
612
|
-
onGoBack={() => goBack()}
|
|
613
|
-
onSelect={(ifscData) => {
|
|
614
|
-
pop(1);
|
|
615
|
-
navigate('AddBankAccount', { selectedIFSC: ifscData });
|
|
616
|
-
}}
|
|
617
|
-
initialSearchTerm={(props.route.params as any)?.initialSearchTerm}
|
|
618
|
-
{...props}
|
|
619
|
-
/>
|
|
620
|
-
)}
|
|
621
|
-
</Stack.Screen>
|
|
622
|
-
|
|
623
|
-
<Stack.Screen
|
|
624
|
-
name="PayNow"
|
|
625
|
-
options={{ title: 'Pay Now' }}
|
|
626
|
-
>
|
|
627
|
-
{(props) => (
|
|
628
|
-
<PayNowScreen
|
|
629
|
-
onGoBack={() => goBack()}
|
|
630
|
-
onConfirm={() => {
|
|
631
|
-
// onConfirm is handled inside PayNow after createFD; keep fallback
|
|
632
|
-
}}
|
|
633
|
-
fdData={(props.route.params as any)?.fdData}
|
|
634
|
-
{...props}
|
|
635
|
-
/>
|
|
636
|
-
)}
|
|
637
|
-
</Stack.Screen>
|
|
638
|
-
|
|
639
|
-
<Stack.Screen
|
|
640
|
-
name="Payment"
|
|
641
|
-
options={{ title: 'Payment' }}
|
|
642
|
-
>
|
|
643
|
-
{(props) => (
|
|
644
|
-
<PaymentScreen
|
|
645
|
-
onGoBack={() => goBack()}
|
|
646
|
-
paymentUrl={(props.route.params as any)?.paymentUrl ?? getPaymentSession().paymentUrl ?? ''}
|
|
647
|
-
onPaymentSuccess={(data) => {
|
|
648
|
-
navigate('PaymentStatus', {
|
|
649
|
-
status: 'success',
|
|
650
|
-
paymentData: data
|
|
651
|
-
} as any);
|
|
652
|
-
}}
|
|
653
|
-
onPaymentFailure={(error) => {
|
|
654
|
-
navigate('PaymentStatus', {
|
|
655
|
-
status: 'failed',
|
|
656
|
-
paymentData: error
|
|
657
|
-
} as any);
|
|
658
|
-
}}
|
|
659
|
-
{...props}
|
|
660
|
-
/>
|
|
661
|
-
)}
|
|
662
|
-
</Stack.Screen>
|
|
663
|
-
|
|
664
|
-
<Stack.Screen
|
|
665
|
-
name="PaymentStatus"
|
|
666
|
-
options={{ title: 'Payment Status' }}
|
|
667
|
-
>
|
|
668
|
-
{(props) => (
|
|
669
|
-
<PaymentStatusScreen
|
|
670
|
-
status={(props.route.params as any)?.status || 'pending'}
|
|
671
|
-
transactionId={(props.route.params as any)?.transactionId}
|
|
672
|
-
fdData={(props.route.params as any)?.fdData}
|
|
673
|
-
onRetry={() => {
|
|
674
|
-
navigate('Payment');
|
|
675
|
-
}}
|
|
676
|
-
onContinue={(fdDetails) => {
|
|
677
|
-
onExit?.(fdDetails);
|
|
678
|
-
}}
|
|
679
|
-
{...props}
|
|
680
|
-
/>
|
|
681
|
-
)}
|
|
682
|
-
</Stack.Screen>
|
|
683
|
-
</Stack.Navigator>
|
|
684
|
-
);
|
|
242
|
+
// State to track external SDK navigation
|
|
243
|
+
const [externalSDK, setExternalSDK] = React.useState < 'shriram' | 'mahindra' | null > (null);
|
|
244
|
+
const [externalSDKFDData, setExternalSDKFDData] = React.useState < any > (null);
|
|
245
|
+
|
|
246
|
+
// Stable exit callbacks — defined here so they're memoized across renders
|
|
247
|
+
// and can be passed as stable props to the module-level SDK content components.
|
|
248
|
+
const handleShriramExit = React.useCallback((fdDetails?: any) => {
|
|
249
|
+
setExternalSDK(null);
|
|
250
|
+
setExternalSDKFDData(null);
|
|
251
|
+
navigate('FDList');
|
|
252
|
+
if (fdDetails) onExit?.(fdDetails);
|
|
253
|
+
}, [onExit]);
|
|
254
|
+
|
|
255
|
+
const handleShriramPanRequired = React.useCallback(() => {
|
|
256
|
+
setExternalSDK(null);
|
|
257
|
+
setExternalSDKFDData(null);
|
|
258
|
+
onPanRequired?.();
|
|
259
|
+
onExit?.();
|
|
260
|
+
}, [onExit, onPanRequired]);
|
|
261
|
+
|
|
262
|
+
const handleMahindraExit = React.useCallback((fdDetails?: any) => {
|
|
263
|
+
setExternalSDK(null);
|
|
264
|
+
setExternalSDKFDData(null);
|
|
265
|
+
navigate('FDList');
|
|
266
|
+
if (fdDetails) onExit?.(fdDetails);
|
|
267
|
+
}, [onExit]);
|
|
268
|
+
|
|
269
|
+
const handleMahindraPanRequired = React.useCallback(() => {
|
|
270
|
+
setExternalSDK(null);
|
|
271
|
+
setExternalSDKFDData(null);
|
|
272
|
+
onPanRequired?.();
|
|
273
|
+
onExit?.();
|
|
274
|
+
}, [onExit, onPanRequired]);
|
|
275
|
+
|
|
276
|
+
// Get master data and theme from fdsdk – same theme (and themeName for dark/primary) is passed to Shriram and Mahindra
|
|
277
|
+
const { masterData } = useMasterData();
|
|
278
|
+
const { theme: fdsdkTheme, themeName: fdsdkThemeName } = useTheme();
|
|
279
|
+
|
|
280
|
+
// Handle Android hardware back button
|
|
281
|
+
useEffect(() => {
|
|
282
|
+
if (Platform.OS !== 'android') return;
|
|
283
|
+
|
|
284
|
+
const onBackPress = () => {
|
|
285
|
+
// Return true to consume the event and do nothing (stop back navigation)
|
|
286
|
+
return true;
|
|
287
|
+
};
|
|
288
|
+
|
|
289
|
+
const subscription = BackHandler.addEventListener("hardwareBackPress", onBackPress);
|
|
290
|
+
|
|
291
|
+
return () => {
|
|
292
|
+
subscription.remove();
|
|
293
|
+
};
|
|
294
|
+
}, []);
|
|
295
|
+
|
|
296
|
+
const {
|
|
297
|
+
initialRouteName = 'FDList',
|
|
298
|
+
customScreenOptions = {},
|
|
299
|
+
} = config;
|
|
300
|
+
|
|
301
|
+
const ensureExternalSdkInitialized = React.useCallback((sdkType: 'shriram' | 'mahindra') => {
|
|
302
|
+
const appData = getAppData();
|
|
303
|
+
const storedEnv = getEnvironmentData();
|
|
304
|
+
const envData = storedEnv as ShriramEnvironmentData & MahindraEnvironmentData | null;
|
|
305
|
+
|
|
306
|
+
if (!appData) {
|
|
307
|
+
Alert.alert('Error', 'FDSDK app data is missing. Please restart the flow.');
|
|
308
|
+
return false;
|
|
309
|
+
}
|
|
310
|
+
if (!envData) {
|
|
311
|
+
Alert.alert('Error', 'FDSDK environment data is missing. Please initialize environment from host app.');
|
|
312
|
+
return false;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
try {
|
|
316
|
+
if (sdkType === 'shriram') {
|
|
317
|
+
initializeShriramEnvironment(envData as ShriramEnvironmentData);
|
|
318
|
+
initializeShriramSDK(appData as ShriramAppData);
|
|
319
|
+
} else {
|
|
320
|
+
initializeMahindraEnvironment(envData as MahindraEnvironmentData);
|
|
321
|
+
initializeMahindraSDK(appData as MahindraAppData);
|
|
322
|
+
}
|
|
323
|
+
return true;
|
|
324
|
+
} catch (error: any) {
|
|
325
|
+
Alert.alert(
|
|
326
|
+
'Error',
|
|
327
|
+
`Failed to initialize ${sdkType === 'shriram' ? 'Shriram' : 'Mahindra'} SDK: ${error?.message || 'Unknown error'}`
|
|
328
|
+
);
|
|
329
|
+
return false;
|
|
330
|
+
}
|
|
331
|
+
}, []);
|
|
332
|
+
|
|
333
|
+
// Default screen options
|
|
334
|
+
const defaultScreenOptions = {
|
|
335
|
+
headerShown: false,
|
|
336
|
+
cardStyle: { backgroundColor: '#f8f9fa' },
|
|
337
|
+
animationEnabled: true,
|
|
338
|
+
gestureEnabled: false,
|
|
339
|
+
...customScreenOptions,
|
|
340
|
+
};
|
|
341
|
+
|
|
342
|
+
return (
|
|
343
|
+
<Stack.Navigator
|
|
344
|
+
initialRouteName={initialRouteName}
|
|
345
|
+
screenOptions={defaultScreenOptions}
|
|
346
|
+
>
|
|
347
|
+
<Stack.Screen
|
|
348
|
+
name="FDList"
|
|
349
|
+
options={{ title: 'Fixed Deposits' }}
|
|
350
|
+
>
|
|
351
|
+
{(props) => (
|
|
352
|
+
<FDListScreen
|
|
353
|
+
onGoBack={() => {
|
|
354
|
+
onExit?.();
|
|
355
|
+
}}
|
|
356
|
+
onSelectFD={(fdId) => {
|
|
357
|
+
// FD selected
|
|
358
|
+
}}
|
|
359
|
+
onNavigateToFDCalculator={(fdData) => {
|
|
360
|
+
navigate('FDCalculator', { fdData });
|
|
361
|
+
}}
|
|
362
|
+
onNavigateToExternalSDK={(sdkType, fdData, context) => {
|
|
363
|
+
try {
|
|
364
|
+
// Get app data and environment data from fdsdk
|
|
365
|
+
const appData = getAppData();
|
|
366
|
+
const envData = getEnvironmentData();
|
|
367
|
+
|
|
368
|
+
// Validate that we have the required data
|
|
369
|
+
if (!appData) {
|
|
370
|
+
console.error('Cannot navigate to external SDK: App data not initialized');
|
|
371
|
+
Alert.alert('Error', 'App data not available. Please initialize the SDK first.');
|
|
372
|
+
return;
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
if (!envData) {
|
|
376
|
+
console.error('Cannot navigate to external SDK: Environment data not initialized');
|
|
377
|
+
Alert.alert('Error', 'Environment data not available. Please initialize the SDK first.');
|
|
378
|
+
return;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
// Initialize the target SDK with all data
|
|
382
|
+
if (sdkType === 'shriram') {
|
|
383
|
+
try {
|
|
384
|
+
// Initialize Shriram SDK
|
|
385
|
+
initializeShriramEnvironment(envData as ShriramEnvironmentData);
|
|
386
|
+
initializeShriramSDK(appData as ShriramAppData);
|
|
387
|
+
|
|
388
|
+
// Navigate to external SDK
|
|
389
|
+
setExternalSDK('shriram');
|
|
390
|
+
setExternalSDKFDData(fdData);
|
|
391
|
+
navigate('ExternalSDK', {
|
|
392
|
+
sdkType: 'shriram',
|
|
393
|
+
fdData,
|
|
394
|
+
providerId: context?.providerId,
|
|
395
|
+
fdListSelectedData: context?.fdListSelectedData,
|
|
396
|
+
completeFDData: context?.completeFDData,
|
|
397
|
+
onboardingIds: context?.onboardingIds,
|
|
398
|
+
});
|
|
399
|
+
} catch (error: any) {
|
|
400
|
+
console.error('Failed to initialize Shriram SDK:', error);
|
|
401
|
+
Alert.alert('Error', `Failed to initialize Shriram SDK: ${error?.message || 'Unknown error'}`);
|
|
402
|
+
}
|
|
403
|
+
} else if (sdkType === 'mahindra') {
|
|
404
|
+
try {
|
|
405
|
+
// Initialize Mahindra SDK
|
|
406
|
+
initializeMahindraEnvironment(envData as MahindraEnvironmentData);
|
|
407
|
+
initializeMahindraSDK(appData as MahindraAppData);
|
|
408
|
+
|
|
409
|
+
// Navigate to external SDK
|
|
410
|
+
setExternalSDK('mahindra');
|
|
411
|
+
setExternalSDKFDData(fdData);
|
|
412
|
+
navigate('ExternalSDK', {
|
|
413
|
+
sdkType: 'mahindra',
|
|
414
|
+
fdData,
|
|
415
|
+
providerId: context?.providerId,
|
|
416
|
+
fdListSelectedData: context?.fdListSelectedData,
|
|
417
|
+
completeFDData: context?.completeFDData,
|
|
418
|
+
onboardingIds: context?.onboardingIds,
|
|
419
|
+
});
|
|
420
|
+
} catch (error: any) {
|
|
421
|
+
console.error('Failed to initialize Mahindra SDK:', error);
|
|
422
|
+
Alert.alert('Error', `Failed to initialize Mahindra SDK: ${error?.message || 'Unknown error'}`);
|
|
423
|
+
}
|
|
424
|
+
} else {
|
|
425
|
+
console.warn('Unknown SDK type:', sdkType);
|
|
426
|
+
}
|
|
427
|
+
} catch (error: any) {
|
|
428
|
+
console.error('Error in onNavigateToExternalSDK:', error);
|
|
429
|
+
Alert.alert('Error', `Navigation error: ${error?.message || 'Unknown error'}`);
|
|
430
|
+
}
|
|
431
|
+
}}
|
|
432
|
+
{...props}
|
|
433
|
+
/>
|
|
434
|
+
)}
|
|
435
|
+
</Stack.Screen>
|
|
436
|
+
|
|
437
|
+
<Stack.Screen
|
|
438
|
+
name="FDCalculator"
|
|
439
|
+
options={{ title: 'FD Calculator' }}
|
|
440
|
+
>
|
|
441
|
+
{(props) => (
|
|
442
|
+
<FDCalculatorScreen
|
|
443
|
+
onGoBack={() => goBack()}
|
|
444
|
+
onNavigateToReviewKYC={() => navigate('ReviewKYC', { fdData: props.route.params?.fdData })}
|
|
445
|
+
fdData={(props.route.params as any)?.fdData}
|
|
446
|
+
{...props}
|
|
447
|
+
/>
|
|
448
|
+
)}
|
|
449
|
+
</Stack.Screen>
|
|
450
|
+
|
|
451
|
+
<Stack.Screen
|
|
452
|
+
name="ExternalSDK"
|
|
453
|
+
options={{ title: 'External SDK', gestureEnabled: false }}
|
|
454
|
+
>
|
|
455
|
+
{(props) => {
|
|
456
|
+
const { sdkType } = (props.route.params as any) || {};
|
|
457
|
+
const routeParams = (props.route.params as any) || {};
|
|
458
|
+
const externalMasterData = routeParams.masterData;
|
|
459
|
+
// #region agent log
|
|
460
|
+
fetch('http://127.0.0.1:7653/ingest/94b18a39-caf3-48fd-98f5-bf1838d9491a', { method: 'POST', headers: { 'Content-Type': 'application/json', 'X-Debug-Session-Id': '04da7c' }, body: JSON.stringify({ sessionId: '04da7c', runId: 'pending-masterdata-trace', hypothesisId: 'H3', location: 'fdsdk/navigation/RootNavigator.tsx:295', message: 'ExternalSDK route handoff', data: { sdkType: sdkType || null, providerId: routeParams?.providerId || null, onboardingProviderId: routeParams?.onboardingIds?.providerId || null, fdListSelectedProviderId: routeParams?.fdListSelectedData?.providerId || null, hasMasterData: !!externalMasterData, masterDataHasDataKey: !!externalMasterData?.data }, timestamp: Date.now() }) }).catch(() => { });
|
|
461
|
+
// #endregion agent log
|
|
462
|
+
console.log('[RootNavigator][DEBUG][ExternalSDK] ENTRY', {
|
|
463
|
+
sdkType,
|
|
464
|
+
providerId: routeParams.providerId,
|
|
465
|
+
onboardingProviderId: routeParams.onboardingIds?.providerId,
|
|
466
|
+
fdListSelectedProviderId: routeParams.fdListSelectedData?.providerId,
|
|
467
|
+
hasMasterData: !!externalMasterData,
|
|
468
|
+
masterDataTopKeys: externalMasterData ? Object.keys(externalMasterData).slice(0, 20) : [],
|
|
469
|
+
nestedDataTopKeys: externalMasterData?.data ? Object.keys(externalMasterData.data).slice(0, 20) : [],
|
|
470
|
+
});
|
|
471
|
+
if (sdkType === 'shriram' || sdkType === 'mahindra') {
|
|
472
|
+
const ok = ensureExternalSdkInitialized(sdkType);
|
|
473
|
+
if (!ok) return null;
|
|
474
|
+
}
|
|
475
|
+
|
|
476
|
+
if (sdkType === 'shriram') {
|
|
477
|
+
return (
|
|
478
|
+
<ShriramApiProvider>
|
|
479
|
+
<ShriramMasterDataProvider>
|
|
480
|
+
<ShriramThemeProvider theme={fdsdkTheme as any} initialTheme={fdsdkThemeName as any}>
|
|
481
|
+
<NavigationIndependentTree>
|
|
482
|
+
<NavigationContainer ref={shriramNavigationRef}>
|
|
483
|
+
<ShriramSDKContent
|
|
484
|
+
masterData={externalMasterData}
|
|
485
|
+
routeParams={routeParams}
|
|
486
|
+
onSDKExit={handleShriramExit}
|
|
487
|
+
onSDKPanRequired={handleShriramPanRequired}
|
|
488
|
+
/>
|
|
489
|
+
</NavigationContainer>
|
|
490
|
+
</NavigationIndependentTree>
|
|
491
|
+
</ShriramThemeProvider>
|
|
492
|
+
</ShriramMasterDataProvider>
|
|
493
|
+
</ShriramApiProvider>
|
|
494
|
+
);
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
if (sdkType === 'mahindra') {
|
|
498
|
+
return (
|
|
499
|
+
<MahindraApiProvider>
|
|
500
|
+
<MahindraMasterDataProvider>
|
|
501
|
+
<MahindraThemeProvider theme={fdsdkTheme as any} initialTheme={fdsdkThemeName as any}>
|
|
502
|
+
<NavigationIndependentTree>
|
|
503
|
+
<NavigationContainer ref={mahindraNavigationRef}>
|
|
504
|
+
<MahindraSDKContent
|
|
505
|
+
masterData={externalMasterData}
|
|
506
|
+
routeParams={routeParams}
|
|
507
|
+
onSDKExit={handleMahindraExit}
|
|
508
|
+
onSDKPanRequired={handleMahindraPanRequired}
|
|
509
|
+
/>
|
|
510
|
+
</NavigationContainer>
|
|
511
|
+
</NavigationIndependentTree>
|
|
512
|
+
</MahindraThemeProvider>
|
|
513
|
+
</MahindraMasterDataProvider>
|
|
514
|
+
</MahindraApiProvider>
|
|
515
|
+
);
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
return null;
|
|
519
|
+
}}
|
|
520
|
+
</Stack.Screen>
|
|
521
|
+
|
|
522
|
+
<Stack.Screen
|
|
523
|
+
name="AadhaarVerification"
|
|
524
|
+
options={{ title: 'Aadhaar Verification' }}
|
|
525
|
+
>
|
|
526
|
+
{(props) => (
|
|
527
|
+
<AadhaarVerificationScreen
|
|
528
|
+
onGoBack={() => goBack()}
|
|
529
|
+
onVerificationComplete={() => {
|
|
530
|
+
navigate('Employee');
|
|
531
|
+
}}
|
|
532
|
+
{...props}
|
|
533
|
+
/>
|
|
534
|
+
)}
|
|
535
|
+
</Stack.Screen>
|
|
536
|
+
|
|
537
|
+
<Stack.Screen
|
|
538
|
+
name="ReviewKYC"
|
|
539
|
+
options={{ title: 'Review KYC' }}
|
|
540
|
+
>
|
|
541
|
+
{(props) => (
|
|
542
|
+
<ReviewKYCScreen
|
|
543
|
+
onGoBack={() => goBack()}
|
|
544
|
+
onContinue={() => {
|
|
545
|
+
navigate('Employee');
|
|
546
|
+
}}
|
|
547
|
+
{...props}
|
|
548
|
+
/>
|
|
549
|
+
)}
|
|
550
|
+
</Stack.Screen>
|
|
551
|
+
|
|
552
|
+
<Stack.Screen
|
|
553
|
+
name="Employee"
|
|
554
|
+
options={{ title: 'Occupation' }}
|
|
555
|
+
>
|
|
556
|
+
{(props) => (
|
|
557
|
+
<EmployeeScreen
|
|
558
|
+
onGoBack={() => goBack()}
|
|
559
|
+
onContinue={() => {
|
|
560
|
+
navigate('NomineeDetail');
|
|
561
|
+
}}
|
|
562
|
+
{...props}
|
|
563
|
+
/>
|
|
564
|
+
)}
|
|
565
|
+
</Stack.Screen>
|
|
566
|
+
|
|
567
|
+
<Stack.Screen
|
|
568
|
+
name="NomineeDetail"
|
|
569
|
+
options={{ title: 'Nominee Details' }}
|
|
570
|
+
>
|
|
571
|
+
{(props) => (
|
|
572
|
+
<NomineeDetailScreen
|
|
573
|
+
onGoBack={() => goBack()}
|
|
574
|
+
onSave={() => {
|
|
575
|
+
navigate('BankDetail');
|
|
576
|
+
}}
|
|
577
|
+
{...props}
|
|
578
|
+
/>
|
|
579
|
+
)}
|
|
580
|
+
</Stack.Screen>
|
|
581
|
+
|
|
582
|
+
<Stack.Screen
|
|
583
|
+
name="BankDetail"
|
|
584
|
+
options={{ title: 'Bank Details' }}
|
|
585
|
+
>
|
|
586
|
+
{(props) => (
|
|
587
|
+
<BankDetailScreen
|
|
588
|
+
onGoBack={() => goBack()}
|
|
589
|
+
onContinue={() => {
|
|
590
|
+
navigate('PayNow');
|
|
591
|
+
}}
|
|
592
|
+
onAddAccount={() => {
|
|
593
|
+
navigate('AddBankAccount');
|
|
594
|
+
}}
|
|
595
|
+
{...props}
|
|
596
|
+
/>
|
|
597
|
+
)}
|
|
598
|
+
</Stack.Screen>
|
|
599
|
+
|
|
600
|
+
<Stack.Screen
|
|
601
|
+
name="AddBankAccount"
|
|
602
|
+
options={{ title: 'Add Bank Account' }}
|
|
603
|
+
>
|
|
604
|
+
{(props) => (
|
|
605
|
+
<AddBankAccountScreen
|
|
606
|
+
onGoBack={() => goBack()}
|
|
607
|
+
onContinue={() => {
|
|
608
|
+
goBack();
|
|
609
|
+
}}
|
|
610
|
+
onFindIFSC={() => {
|
|
611
|
+
navigate('FindIFSC');
|
|
612
|
+
}}
|
|
613
|
+
selectedIFSC={(() => {
|
|
614
|
+
const params = (props.route.params as any);
|
|
615
|
+
return params?.selectedIFSC;
|
|
616
|
+
})()}
|
|
617
|
+
{...props}
|
|
618
|
+
/>
|
|
619
|
+
)}
|
|
620
|
+
</Stack.Screen>
|
|
621
|
+
|
|
622
|
+
<Stack.Screen
|
|
623
|
+
name="FindIFSC"
|
|
624
|
+
options={{ title: 'Find IFSC' }}
|
|
625
|
+
>
|
|
626
|
+
{(props) => (
|
|
627
|
+
<FindIFSCScreen
|
|
628
|
+
onGoBack={() => goBack()}
|
|
629
|
+
onSelect={(ifscData) => {
|
|
630
|
+
pop(1);
|
|
631
|
+
navigate('AddBankAccount', { selectedIFSC: ifscData });
|
|
632
|
+
}}
|
|
633
|
+
initialSearchTerm={(props.route.params as any)?.initialSearchTerm}
|
|
634
|
+
{...props}
|
|
635
|
+
/>
|
|
636
|
+
)}
|
|
637
|
+
</Stack.Screen>
|
|
638
|
+
|
|
639
|
+
<Stack.Screen
|
|
640
|
+
name="PayNow"
|
|
641
|
+
options={{ title: 'Pay Now' }}
|
|
642
|
+
>
|
|
643
|
+
{(props) => (
|
|
644
|
+
<PayNowScreen
|
|
645
|
+
onGoBack={() => goBack()}
|
|
646
|
+
onConfirm={() => {
|
|
647
|
+
// onConfirm is handled inside PayNow after createFD; keep fallback
|
|
648
|
+
}}
|
|
649
|
+
fdData={(props.route.params as any)?.fdData}
|
|
650
|
+
{...props}
|
|
651
|
+
/>
|
|
652
|
+
)}
|
|
653
|
+
</Stack.Screen>
|
|
654
|
+
|
|
655
|
+
<Stack.Screen
|
|
656
|
+
name="Payment"
|
|
657
|
+
options={{ title: 'Payment' }}
|
|
658
|
+
>
|
|
659
|
+
{(props) => (
|
|
660
|
+
<PaymentScreen
|
|
661
|
+
onGoBack={() => goBack()}
|
|
662
|
+
paymentUrl={(props.route.params as any)?.paymentUrl ?? getPaymentSession().paymentUrl ?? ''}
|
|
663
|
+
onPaymentSuccess={(data) => {
|
|
664
|
+
navigate('PaymentStatus', {
|
|
665
|
+
status: 'success',
|
|
666
|
+
paymentData: data
|
|
667
|
+
} as any);
|
|
668
|
+
}}
|
|
669
|
+
onPaymentFailure={(error) => {
|
|
670
|
+
navigate('PaymentStatus', {
|
|
671
|
+
status: 'failed',
|
|
672
|
+
paymentData: error
|
|
673
|
+
} as any);
|
|
674
|
+
}}
|
|
675
|
+
{...props}
|
|
676
|
+
/>
|
|
677
|
+
)}
|
|
678
|
+
</Stack.Screen>
|
|
679
|
+
|
|
680
|
+
<Stack.Screen
|
|
681
|
+
name="PaymentStatus"
|
|
682
|
+
options={{ title: 'Payment Status' }}
|
|
683
|
+
>
|
|
684
|
+
{(props) => (
|
|
685
|
+
<PaymentStatusScreen
|
|
686
|
+
status={(props.route.params as any)?.status || 'pending'}
|
|
687
|
+
transactionId={(props.route.params as any)?.transactionId}
|
|
688
|
+
fdData={(props.route.params as any)?.fdData}
|
|
689
|
+
onRetry={() => {
|
|
690
|
+
navigate('Payment');
|
|
691
|
+
}}
|
|
692
|
+
onContinue={(fdDetails) => {
|
|
693
|
+
onExit?.(fdDetails);
|
|
694
|
+
}}
|
|
695
|
+
{...props}
|
|
696
|
+
/>
|
|
697
|
+
)}
|
|
698
|
+
</Stack.Screen>
|
|
699
|
+
</Stack.Navigator>
|
|
700
|
+
);
|
|
685
701
|
};
|
|
686
702
|
|
|
687
703
|
export default RootNavigator;
|