@finspringinnovations/fixeddepositsdk 1.0.2 → 1.0.3
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/components/PendingFDBottomSheet.js +27 -18
- package/lib/config/appDataConfig.js +3 -2
- package/lib/constants/strings/fd.d.ts +2 -2
- package/lib/constants/strings/fd.js +2 -2
- package/lib/navigation/RootNavigator.js +121 -131
- package/lib/screens/FDCalculator.js +1 -1
- package/lib/screens/FDList.js +34 -33
- package/lib/screens/PaymentStatus.js +13 -0
- package/lib/screens/ReviewKYC.js +2 -1
- package/package.json +50 -50
- package/src/components/PendingFDBottomSheet.tsx +151 -123
- package/src/config/appDataConfig.ts +245 -242
- package/src/constants/strings/fd.ts +2 -2
- package/src/navigation/RootNavigator.tsx +186 -153
- package/src/screens/FDCalculator.tsx +3 -3
- package/src/screens/FDList.tsx +35 -34
- package/src/screens/PaymentStatus.tsx +16 -4
- package/src/screens/ReviewKYC.tsx +1 -0
|
@@ -66,6 +66,150 @@ import { useTheme } from '../theme/ThemeContext';
|
|
|
66
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
|
+
React.useEffect(() => {
|
|
92
|
+
if (masterData) {
|
|
93
|
+
const dataToSet = masterData.data || masterData;
|
|
94
|
+
setMasterData(dataToSet);
|
|
95
|
+
}
|
|
96
|
+
}, [masterData, setMasterData]);
|
|
97
|
+
|
|
98
|
+
React.useEffect(() => {
|
|
99
|
+
if (routeParams.fdListSelectedData) {
|
|
100
|
+
try {
|
|
101
|
+
shriramDispatch(setShriramFDListSelected(routeParams.fdListSelectedData));
|
|
102
|
+
} catch (e) {
|
|
103
|
+
console.log('[RootNavigator] Error setting Shriram FDListSelected:', e);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}, [routeParams.fdListSelectedData, shriramDispatch]);
|
|
107
|
+
|
|
108
|
+
React.useEffect(() => {
|
|
109
|
+
if (routeParams.onboardingIds) {
|
|
110
|
+
try {
|
|
111
|
+
shriramDispatch(setShriramOnboardingIds({
|
|
112
|
+
...routeParams.onboardingIds,
|
|
113
|
+
providerId: routeParams.providerId || routeParams.onboardingIds?.providerId,
|
|
114
|
+
}));
|
|
115
|
+
} catch (e) {
|
|
116
|
+
console.log('[RootNavigator] Error setting Shriram OnboardingIds:', e);
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}, [routeParams.onboardingIds, shriramDispatch]);
|
|
120
|
+
|
|
121
|
+
React.useEffect(() => {
|
|
122
|
+
if (routeParams.shriramSDKGlobalData) {
|
|
123
|
+
try {
|
|
124
|
+
const completeFDData = !!routeParams.shriramSDKGlobalData;
|
|
125
|
+
setShriramGlobalData({ completeFDData });
|
|
126
|
+
} catch (e) {
|
|
127
|
+
console.log('[RootNavigator] Error setting Shriram GlobalData:', e);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}, [routeParams.shriramSDKGlobalData]);
|
|
131
|
+
|
|
132
|
+
return (
|
|
133
|
+
<ShriramRootNavigator
|
|
134
|
+
config={{
|
|
135
|
+
initialRouteName: routeParams.initialRouteName || 'FDCalculator',
|
|
136
|
+
initialPaymentStatusParams: routeParams.initialPaymentStatusParams,
|
|
137
|
+
initialFDContext: {
|
|
138
|
+
providerId: routeParams.providerId,
|
|
139
|
+
fdListSelectedData: routeParams.fdListSelectedData,
|
|
140
|
+
completeFDData: routeParams.completeFDData,
|
|
141
|
+
},
|
|
142
|
+
} as any}
|
|
143
|
+
onExit={onSDKExit}
|
|
144
|
+
onPanRequired={onSDKPanRequired}
|
|
145
|
+
/>
|
|
146
|
+
);
|
|
147
|
+
};
|
|
148
|
+
|
|
149
|
+
interface MahindraSDKContentProps {
|
|
150
|
+
masterData: any;
|
|
151
|
+
routeParams: any;
|
|
152
|
+
onSDKExit: (fdDetails?: any) => void;
|
|
153
|
+
onSDKPanRequired: () => void;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
const MahindraSDKContent: React.FC<MahindraSDKContentProps> = ({
|
|
157
|
+
masterData,
|
|
158
|
+
routeParams,
|
|
159
|
+
onSDKExit,
|
|
160
|
+
onSDKPanRequired,
|
|
161
|
+
}) => {
|
|
162
|
+
const { setMasterData } = useMahindraMasterData();
|
|
163
|
+
const mahindraDispatch = useMahindraAppDispatch();
|
|
164
|
+
|
|
165
|
+
React.useEffect(() => {
|
|
166
|
+
if (masterData) {
|
|
167
|
+
const dataToSet = masterData.data || masterData;
|
|
168
|
+
setMasterData(dataToSet);
|
|
169
|
+
}
|
|
170
|
+
}, [masterData, setMasterData]);
|
|
171
|
+
|
|
172
|
+
React.useEffect(() => {
|
|
173
|
+
if (routeParams.fdListSelectedData) {
|
|
174
|
+
try {
|
|
175
|
+
mahindraDispatch(setMahindraFDListSelected(routeParams.fdListSelectedData));
|
|
176
|
+
} catch (e) {
|
|
177
|
+
console.log('[RootNavigator] Error setting Mahindra FDListSelected:', e);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}, [routeParams.fdListSelectedData, mahindraDispatch]);
|
|
181
|
+
|
|
182
|
+
React.useEffect(() => {
|
|
183
|
+
if (routeParams.onboardingIds) {
|
|
184
|
+
try {
|
|
185
|
+
mahindraDispatch(setMahindraOnboardingIds({
|
|
186
|
+
...routeParams.onboardingIds,
|
|
187
|
+
providerId: routeParams.providerId || routeParams.onboardingIds?.providerId,
|
|
188
|
+
}));
|
|
189
|
+
} catch (e) {
|
|
190
|
+
console.log('[RootNavigator] Error setting Mahindra OnboardingIds:', e);
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
}, [routeParams.onboardingIds, mahindraDispatch]);
|
|
194
|
+
|
|
195
|
+
return (
|
|
196
|
+
<MahindraRootNavigatorAny
|
|
197
|
+
config={{
|
|
198
|
+
initialRouteName: routeParams.initialRouteName || 'FDCalculator',
|
|
199
|
+
forceFetchCustomerDetails: !!routeParams.forceFetchCustomerDetails,
|
|
200
|
+
initialFDContext: {
|
|
201
|
+
providerId: routeParams.providerId,
|
|
202
|
+
fdListSelectedData: routeParams.fdListSelectedData,
|
|
203
|
+
completeFDData: routeParams.completeFDData,
|
|
204
|
+
},
|
|
205
|
+
}}
|
|
206
|
+
onExit={onSDKExit}
|
|
207
|
+
onPanRequired={onSDKPanRequired}
|
|
208
|
+
/>
|
|
209
|
+
);
|
|
210
|
+
};
|
|
211
|
+
// ───────────────────────────────────────────────────────────────────────────
|
|
212
|
+
|
|
69
213
|
interface RootNavigatorProps {
|
|
70
214
|
config?: SDKNavigationConfig;
|
|
71
215
|
onExit?: (fdDetails?: any) => void;
|
|
@@ -81,6 +225,36 @@ const RootNavigator: React.FC<RootNavigatorProps> = ({
|
|
|
81
225
|
const [externalSDK, setExternalSDK] = React.useState<'shriram' | 'mahindra' | null>(null);
|
|
82
226
|
const [externalSDKFDData, setExternalSDKFDData] = React.useState<any>(null);
|
|
83
227
|
|
|
228
|
+
// Stable exit callbacks — defined here so they're memoized across renders
|
|
229
|
+
// and can be passed as stable props to the module-level SDK content components.
|
|
230
|
+
const handleShriramExit = React.useCallback((fdDetails?: any) => {
|
|
231
|
+
setExternalSDK(null);
|
|
232
|
+
setExternalSDKFDData(null);
|
|
233
|
+
navigate('FDList');
|
|
234
|
+
if (fdDetails) onExit?.(fdDetails);
|
|
235
|
+
}, [onExit]);
|
|
236
|
+
|
|
237
|
+
const handleShriramPanRequired = React.useCallback(() => {
|
|
238
|
+
setExternalSDK(null);
|
|
239
|
+
setExternalSDKFDData(null);
|
|
240
|
+
onPanRequired?.();
|
|
241
|
+
onExit?.();
|
|
242
|
+
}, [onExit, onPanRequired]);
|
|
243
|
+
|
|
244
|
+
const handleMahindraExit = React.useCallback((fdDetails?: any) => {
|
|
245
|
+
setExternalSDK(null);
|
|
246
|
+
setExternalSDKFDData(null);
|
|
247
|
+
navigate('FDList');
|
|
248
|
+
if (fdDetails) onExit?.(fdDetails);
|
|
249
|
+
}, [onExit]);
|
|
250
|
+
|
|
251
|
+
const handleMahindraPanRequired = React.useCallback(() => {
|
|
252
|
+
setExternalSDK(null);
|
|
253
|
+
setExternalSDKFDData(null);
|
|
254
|
+
onPanRequired?.();
|
|
255
|
+
onExit?.();
|
|
256
|
+
}, [onExit, onPanRequired]);
|
|
257
|
+
|
|
84
258
|
// Get master data and theme from fdsdk – same theme (and themeName for dark/primary) is passed to Shriram and Mahindra
|
|
85
259
|
const { masterData } = useMasterData();
|
|
86
260
|
const { theme: fdsdkTheme, themeName: fdsdkThemeName } = useTheme();
|
|
@@ -316,157 +490,6 @@ const RootNavigator: React.FC<RootNavigatorProps> = ({
|
|
|
316
490
|
if (!ok) return null;
|
|
317
491
|
}
|
|
318
492
|
|
|
319
|
-
// Component to set master data and initial FD context in external SDK
|
|
320
|
-
const ShriramSDKWithMasterData: React.FC<{ masterData: any }> = ({ masterData }) => {
|
|
321
|
-
const { setMasterData } = useShriramMasterData();
|
|
322
|
-
const shriramDispatch = useShriramAppDispatch();
|
|
323
|
-
const routeParams = (props.route.params as any) || {};
|
|
324
|
-
|
|
325
|
-
// Set master data
|
|
326
|
-
React.useEffect(() => {
|
|
327
|
-
if (masterData) {
|
|
328
|
-
const dataToSet = masterData.data || masterData;
|
|
329
|
-
setMasterData(dataToSet);
|
|
330
|
-
}
|
|
331
|
-
}, [masterData, setMasterData]);
|
|
332
|
-
|
|
333
|
-
// Set FDListSelectedData using Shriram setter
|
|
334
|
-
React.useEffect(() => {
|
|
335
|
-
if (routeParams.fdListSelectedData) {
|
|
336
|
-
try {
|
|
337
|
-
shriramDispatch(setShriramFDListSelected(routeParams.fdListSelectedData));
|
|
338
|
-
} catch (e) {
|
|
339
|
-
console.log('[RootNavigator] Error setting Shriram FDListSelected:', e);
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
}, [routeParams.fdListSelectedData, shriramDispatch]);
|
|
343
|
-
|
|
344
|
-
// Set OnboardingIds using Shriram setter
|
|
345
|
-
React.useEffect(() => {
|
|
346
|
-
if (routeParams.onboardingIds) {
|
|
347
|
-
try {
|
|
348
|
-
shriramDispatch(setShriramOnboardingIds({
|
|
349
|
-
...routeParams.onboardingIds,
|
|
350
|
-
providerId: routeParams.providerId || routeParams.onboardingIds?.providerId,
|
|
351
|
-
}));
|
|
352
|
-
} catch (e) {
|
|
353
|
-
console.log('[RootNavigator] Error setting Shriram OnboardingIds:', e);
|
|
354
|
-
}
|
|
355
|
-
}
|
|
356
|
-
}, [routeParams.onboardingIds, shriramDispatch]);
|
|
357
|
-
|
|
358
|
-
// Set GlobalData using Shriram setter if present - only set completeFDData boolean
|
|
359
|
-
React.useEffect(() => {
|
|
360
|
-
if (routeParams.shriramSDKGlobalData) {
|
|
361
|
-
try {
|
|
362
|
-
const completeFDData = !!routeParams.shriramSDKGlobalData;
|
|
363
|
-
setShriramGlobalData({ completeFDData });
|
|
364
|
-
console.log('[RootNavigator] Set ShriramSDKGlobalData completeFDData:', completeFDData);
|
|
365
|
-
} catch (e) {
|
|
366
|
-
console.log('[RootNavigator] Error setting Shriram GlobalData:', e);
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
}, [routeParams.shriramSDKGlobalData]);
|
|
370
|
-
|
|
371
|
-
return (
|
|
372
|
-
<ShriramRootNavigator
|
|
373
|
-
config={{
|
|
374
|
-
initialRouteName: routeParams.initialRouteName || 'FDCalculator',
|
|
375
|
-
initialPaymentStatusParams: routeParams.initialPaymentStatusParams,
|
|
376
|
-
initialFDContext: {
|
|
377
|
-
providerId: routeParams.providerId,
|
|
378
|
-
fdListSelectedData: routeParams.fdListSelectedData,
|
|
379
|
-
completeFDData: routeParams.completeFDData,
|
|
380
|
-
},
|
|
381
|
-
} as any}
|
|
382
|
-
onExit={(fdDetails?: any) => {
|
|
383
|
-
// When exiting external SDK, go back to FDList
|
|
384
|
-
setExternalSDK(null);
|
|
385
|
-
setExternalSDKFDData(null);
|
|
386
|
-
navigate('FDList');
|
|
387
|
-
if (fdDetails) {
|
|
388
|
-
onExit?.(fdDetails);
|
|
389
|
-
}
|
|
390
|
-
}}
|
|
391
|
-
onPanRequired={() => {
|
|
392
|
-
// Exit full SDK flow back to host app and notify callback
|
|
393
|
-
setExternalSDK(null);
|
|
394
|
-
setExternalSDKFDData(null);
|
|
395
|
-
onPanRequired?.();
|
|
396
|
-
onExit?.();
|
|
397
|
-
}}
|
|
398
|
-
/>
|
|
399
|
-
);
|
|
400
|
-
};
|
|
401
|
-
|
|
402
|
-
const MahindraSDKWithMasterData: React.FC<{ masterData: any }> = ({ masterData }) => {
|
|
403
|
-
const { setMasterData } = useMahindraMasterData();
|
|
404
|
-
const mahindraDispatch = useMahindraAppDispatch();
|
|
405
|
-
|
|
406
|
-
// Set master data
|
|
407
|
-
React.useEffect(() => {
|
|
408
|
-
if (masterData) {
|
|
409
|
-
const dataToSet = masterData.data || masterData;
|
|
410
|
-
setMasterData(dataToSet);
|
|
411
|
-
}
|
|
412
|
-
}, [masterData, setMasterData]);
|
|
413
|
-
|
|
414
|
-
// Set FDListSelectedData using Mahindra setter
|
|
415
|
-
React.useEffect(() => {
|
|
416
|
-
if (routeParams.fdListSelectedData) {
|
|
417
|
-
try {
|
|
418
|
-
mahindraDispatch(setMahindraFDListSelected(routeParams.fdListSelectedData));
|
|
419
|
-
} catch (e) {
|
|
420
|
-
console.log('[RootNavigator] Error setting Mahindra FDListSelected:', e);
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
}, [routeParams.fdListSelectedData, mahindraDispatch]);
|
|
424
|
-
|
|
425
|
-
// Set OnboardingIds using Mahindra setter
|
|
426
|
-
React.useEffect(() => {
|
|
427
|
-
if (routeParams.onboardingIds) {
|
|
428
|
-
try {
|
|
429
|
-
mahindraDispatch(setMahindraOnboardingIds({
|
|
430
|
-
...routeParams.onboardingIds,
|
|
431
|
-
providerId: routeParams.providerId || routeParams.onboardingIds?.providerId,
|
|
432
|
-
}));
|
|
433
|
-
} catch (e) {
|
|
434
|
-
console.log('[RootNavigator] Error setting Mahindra OnboardingIds:', e);
|
|
435
|
-
}
|
|
436
|
-
}
|
|
437
|
-
}, [routeParams.onboardingIds, mahindraDispatch]);
|
|
438
|
-
|
|
439
|
-
return (
|
|
440
|
-
<MahindraRootNavigatorAny
|
|
441
|
-
config={{
|
|
442
|
-
initialRouteName: routeParams.initialRouteName || 'FDCalculator',
|
|
443
|
-
forceFetchCustomerDetails: !!routeParams.forceFetchCustomerDetails,
|
|
444
|
-
initialFDContext: {
|
|
445
|
-
providerId: routeParams.providerId,
|
|
446
|
-
fdListSelectedData: routeParams.fdListSelectedData,
|
|
447
|
-
completeFDData: routeParams.completeFDData,
|
|
448
|
-
},
|
|
449
|
-
}}
|
|
450
|
-
onExit={(fdDetails?: any) => {
|
|
451
|
-
// When exiting external SDK, go back to FDList
|
|
452
|
-
setExternalSDK(null);
|
|
453
|
-
setExternalSDKFDData(null);
|
|
454
|
-
navigate('FDList');
|
|
455
|
-
if (fdDetails) {
|
|
456
|
-
onExit?.(fdDetails);
|
|
457
|
-
}
|
|
458
|
-
}}
|
|
459
|
-
onPanRequired={() => {
|
|
460
|
-
// Exit full SDK flow back to host app and notify callback
|
|
461
|
-
setExternalSDK(null);
|
|
462
|
-
setExternalSDKFDData(null);
|
|
463
|
-
onPanRequired?.();
|
|
464
|
-
onExit?.();
|
|
465
|
-
}}
|
|
466
|
-
/>
|
|
467
|
-
);
|
|
468
|
-
};
|
|
469
|
-
|
|
470
493
|
if (sdkType === 'shriram') {
|
|
471
494
|
return (
|
|
472
495
|
<ShriramApiProvider>
|
|
@@ -474,7 +497,12 @@ const RootNavigator: React.FC<RootNavigatorProps> = ({
|
|
|
474
497
|
<ShriramThemeProvider theme={fdsdkTheme as any} initialTheme={fdsdkThemeName as any}>
|
|
475
498
|
<NavigationIndependentTree>
|
|
476
499
|
<NavigationContainer ref={shriramNavigationRef}>
|
|
477
|
-
<
|
|
500
|
+
<ShriramSDKContent
|
|
501
|
+
masterData={externalMasterData}
|
|
502
|
+
routeParams={routeParams}
|
|
503
|
+
onSDKExit={handleShriramExit}
|
|
504
|
+
onSDKPanRequired={handleShriramPanRequired}
|
|
505
|
+
/>
|
|
478
506
|
</NavigationContainer>
|
|
479
507
|
</NavigationIndependentTree>
|
|
480
508
|
</ShriramThemeProvider>
|
|
@@ -490,7 +518,12 @@ const RootNavigator: React.FC<RootNavigatorProps> = ({
|
|
|
490
518
|
<MahindraThemeProvider theme={fdsdkTheme as any} initialTheme={fdsdkThemeName as any}>
|
|
491
519
|
<NavigationIndependentTree>
|
|
492
520
|
<NavigationContainer ref={mahindraNavigationRef}>
|
|
493
|
-
<
|
|
521
|
+
<MahindraSDKContent
|
|
522
|
+
masterData={externalMasterData}
|
|
523
|
+
routeParams={routeParams}
|
|
524
|
+
onSDKExit={handleMahindraExit}
|
|
525
|
+
onSDKPanRequired={handleMahindraPanRequired}
|
|
526
|
+
/>
|
|
494
527
|
</NavigationContainer>
|
|
495
528
|
</NavigationIndependentTree>
|
|
496
529
|
</MahindraThemeProvider>
|
|
@@ -285,7 +285,7 @@ const FDCalculator: React.FC<FDCalculatorProps> = ({ onGoBack, onNavigateToRevie
|
|
|
285
285
|
}, [interestRates]);
|
|
286
286
|
|
|
287
287
|
useEffect(() => {
|
|
288
|
-
console.log("following are the tenure options at the fd",tenureOptions)
|
|
288
|
+
console.log("following are the tenure options at the fd", tenureOptions)
|
|
289
289
|
})
|
|
290
290
|
|
|
291
291
|
const [tenureValue, setTenureValue] = useState<string>('');
|
|
@@ -636,7 +636,7 @@ const FDCalculator: React.FC<FDCalculatorProps> = ({ onGoBack, onNavigateToRevie
|
|
|
636
636
|
{/* Company Header */}
|
|
637
637
|
<CompanyHeader
|
|
638
638
|
companyName={effectiveFdData?.name || ''}
|
|
639
|
-
rating=
|
|
639
|
+
rating="AAA"
|
|
640
640
|
/>
|
|
641
641
|
|
|
642
642
|
{/* Amount Input */}
|
|
@@ -998,5 +998,5 @@ const createStyles = (typography: any, colors: any, themeName: string) => StyleS
|
|
|
998
998
|
backgroundColor: 'rgba(0, 0, 0, 0.3)',
|
|
999
999
|
zIndex: 1000,
|
|
1000
1000
|
},
|
|
1001
|
-
|
|
1001
|
+
|
|
1002
1002
|
});
|
package/src/screens/FDList.tsx
CHANGED
|
@@ -60,8 +60,8 @@ function getLogoTypeForFD(fd: { name?: string; providerId?: string }): 'shriram'
|
|
|
60
60
|
function getStaticCreditRatingForFD(fd: { name?: string; providerId?: string }): string {
|
|
61
61
|
const logoType = getLogoTypeForFD(fd);
|
|
62
62
|
if (logoType === 'mahindra') return 'AAA';
|
|
63
|
-
if (logoType === 'shriram') return '
|
|
64
|
-
return '
|
|
63
|
+
if (logoType === 'shriram') return 'AAA';
|
|
64
|
+
return 'AAA';
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
/** Statuses that count as pending/active (in-progress) workflow. */
|
|
@@ -1086,23 +1086,23 @@ const FDList: React.FC<FDListProps> = ({
|
|
|
1086
1086
|
const shriramComplete = completeApplications.find((app: any) => (app.fd_provider_id || app.fdProviderId || app.provider_id || app.providerId || '').toLowerCase() === ShriramProviderId.toLowerCase());
|
|
1087
1087
|
if (shriramComplete) ShriramSDKGlobalDataPayment = shriramComplete;
|
|
1088
1088
|
}
|
|
1089
|
-
const fdListSelectedDataPayment =
|
|
1089
|
+
const fdListSelectedDataPayment = fdDisplay ? {
|
|
1090
1090
|
id: appData.fd_id || appData.fdId || 'active-fd',
|
|
1091
1091
|
providerId: providerIdFromApp,
|
|
1092
|
-
name:
|
|
1092
|
+
name: fdDisplay.name,
|
|
1093
1093
|
accountNumber: appData.account_number || appData.accountNumber || '',
|
|
1094
|
-
roi: `${
|
|
1095
|
-
tenure:
|
|
1096
|
-
amount: Number(
|
|
1097
|
-
maturityDate:
|
|
1094
|
+
roi: `${fdDisplay.returns}% p.a.`,
|
|
1095
|
+
tenure: fdDisplay.maturityDate || '-',
|
|
1096
|
+
amount: Number(fdDisplay.invested) || 0,
|
|
1097
|
+
maturityDate: fdDisplay.maturityDate || '-',
|
|
1098
1098
|
status: 'active' as const,
|
|
1099
1099
|
creditRating: getStaticCreditRatingForFD({
|
|
1100
|
-
name:
|
|
1100
|
+
name: fdDisplay.name,
|
|
1101
1101
|
providerId: providerIdFromApp,
|
|
1102
1102
|
}),
|
|
1103
|
-
companyName:
|
|
1104
|
-
fdRate: `${
|
|
1105
|
-
interestPayout:
|
|
1103
|
+
companyName: fdDisplay.name,
|
|
1104
|
+
fdRate: `${fdDisplay.returns}% p.a.`,
|
|
1105
|
+
interestPayout: fdDisplay.interestPayout || 'Yearly',
|
|
1106
1106
|
} : null;
|
|
1107
1107
|
const masterDataPayment = ShriramMasterData;
|
|
1108
1108
|
|
|
@@ -1157,23 +1157,23 @@ const FDList: React.FC<FDListProps> = ({
|
|
|
1157
1157
|
const shriramComplete = completeApplications.find((app: any) => (app.fd_provider_id || app.fdProviderId || app.provider_id || app.providerId || '').toLowerCase() === ShriramProviderId.toLowerCase());
|
|
1158
1158
|
if (shriramComplete) ShriramSDKGlobalDataPayment = shriramComplete;
|
|
1159
1159
|
}
|
|
1160
|
-
const fdListSelectedDataPayment =
|
|
1160
|
+
const fdListSelectedDataPayment = fdDisplay ? {
|
|
1161
1161
|
id: appData.fd_id || appData.fdId || 'active-fd',
|
|
1162
1162
|
providerId: providerIdFromApp,
|
|
1163
|
-
name:
|
|
1163
|
+
name: fdDisplay.name,
|
|
1164
1164
|
accountNumber: appData.account_number || appData.accountNumber || '',
|
|
1165
|
-
roi: `${
|
|
1166
|
-
tenure:
|
|
1167
|
-
amount: Number(
|
|
1168
|
-
maturityDate:
|
|
1165
|
+
roi: `${fdDisplay.returns}% p.a.`,
|
|
1166
|
+
tenure: fdDisplay.maturityDate || '-',
|
|
1167
|
+
amount: Number(fdDisplay.invested) || 0,
|
|
1168
|
+
maturityDate: fdDisplay.maturityDate || '-',
|
|
1169
1169
|
status: 'active' as const,
|
|
1170
1170
|
creditRating: getStaticCreditRatingForFD({
|
|
1171
|
-
name:
|
|
1171
|
+
name: fdDisplay.name,
|
|
1172
1172
|
providerId: providerIdFromApp,
|
|
1173
1173
|
}),
|
|
1174
|
-
companyName:
|
|
1175
|
-
fdRate: `${
|
|
1176
|
-
interestPayout:
|
|
1174
|
+
companyName: fdDisplay.name,
|
|
1175
|
+
fdRate: `${fdDisplay.returns}% p.a.`,
|
|
1176
|
+
interestPayout: fdDisplay.interestPayout || 'Yearly',
|
|
1177
1177
|
} : null;
|
|
1178
1178
|
const masterDataPayment = ShriramMasterData;
|
|
1179
1179
|
navigate('ExternalSDK', {
|
|
@@ -1277,25 +1277,26 @@ const FDList: React.FC<FDListProps> = ({
|
|
|
1277
1277
|
const onboardingIdsToPass = onboardingIdsFromApp || onboardingIds;
|
|
1278
1278
|
|
|
1279
1279
|
// Get fdListSelectedData (already set in Redux, but we need it for navigation)
|
|
1280
|
-
|
|
1280
|
+
// Use fdDisplay (derived from the tapped app) not activeFD (always first active app)
|
|
1281
|
+
const fdListSelectedDataToPass = fdDisplay ? {
|
|
1281
1282
|
id: appData.fd_id || appData.fdId || 'active-fd',
|
|
1282
1283
|
providerId: providerIdFromApp,
|
|
1283
|
-
name:
|
|
1284
|
+
name: fdDisplay.name,
|
|
1284
1285
|
accountNumber: appData.account_number || appData.accountNumber || '',
|
|
1285
|
-
roi: `${
|
|
1286
|
-
tenure:
|
|
1287
|
-
? `${
|
|
1286
|
+
roi: `${fdDisplay.returns}% p.a.`,
|
|
1287
|
+
tenure: appData.tenure_in_months
|
|
1288
|
+
? `${appData.tenure_in_months} Months`
|
|
1288
1289
|
: '-',
|
|
1289
|
-
amount: Number(
|
|
1290
|
-
maturityDate:
|
|
1290
|
+
amount: Number(fdDisplay.invested) || 0,
|
|
1291
|
+
maturityDate: fdDisplay.maturityDate || '-',
|
|
1291
1292
|
status: 'active' as const,
|
|
1292
1293
|
creditRating: getStaticCreditRatingForFD({
|
|
1293
|
-
name:
|
|
1294
|
+
name: fdDisplay.name,
|
|
1294
1295
|
providerId: providerIdFromApp,
|
|
1295
1296
|
}),
|
|
1296
|
-
companyName:
|
|
1297
|
-
fdRate: `${
|
|
1298
|
-
interestPayout:
|
|
1297
|
+
companyName: fdDisplay.name,
|
|
1298
|
+
fdRate: `${fdDisplay.returns}% p.a.`,
|
|
1299
|
+
interestPayout: fdDisplay.interestPayout || '',
|
|
1299
1300
|
} : null;
|
|
1300
1301
|
|
|
1301
1302
|
// Navigate to appropriate SDK if provider is detected
|
|
@@ -1304,7 +1305,7 @@ const FDList: React.FC<FDListProps> = ({
|
|
|
1304
1305
|
const sdkType = isMahindra ? 'mahindra' : 'shriram';
|
|
1305
1306
|
if (!initializeExternalSDKFromFDList(sdkType)) return;
|
|
1306
1307
|
// #region agent log
|
|
1307
|
-
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:'H2',location:'fdsdk/screens/FDList.tsx:1315',message:'Pending continue pre-navigation payload',data:{forcedSdkType:forcedSdkType||null,resolvedSdkType:sdkType,providerIdFromApp:providerIdFromApp||null,onboardingProviderId:onboardingIdsToPass?.providerId||null,fdListSelectedProviderId:fdListSelectedDataToPass?.providerId||null,usingMahindraMasterData
|
|
1308
|
+
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: 'H2', location: 'fdsdk/screens/FDList.tsx:1315', message: 'Pending continue pre-navigation payload', data: { forcedSdkType: forcedSdkType || null, resolvedSdkType: sdkType, providerIdFromApp: providerIdFromApp || null, onboardingProviderId: onboardingIdsToPass?.providerId || null, fdListSelectedProviderId: fdListSelectedDataToPass?.providerId || null, usingMahindraMasterData: !!(sdkType === 'mahindra' && masterDataToPass), usingShriramMasterData: !!(sdkType === 'shriram' && masterDataToPass), masterDataHasDataKey: !!masterDataToPass?.data }, timestamp: Date.now() }) }).catch(() => { });
|
|
1308
1309
|
// #endregion agent log
|
|
1309
1310
|
|
|
1310
1311
|
navigate('ExternalSDK', {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React, { useState, useEffect } from 'react';
|
|
2
|
-
import { View, Text, StyleSheet, ScrollView, Alert, Image, BackHandler, Platform, StatusBar } from 'react-native';
|
|
2
|
+
import { View, Text, StyleSheet, ScrollView, Alert, Image, BackHandler, Platform, StatusBar, TouchableOpacity } from 'react-native';
|
|
3
3
|
import Icon from 'react-native-vector-icons/Ionicons';
|
|
4
4
|
import { base64Images } from '../constants/strings/base64Images';
|
|
5
5
|
import SafeAreaWrapper from '../components/SafeAreaWrapper';
|
|
@@ -334,6 +334,11 @@ const PaymentStatus: React.FC<PaymentStatusProps> = ({
|
|
|
334
334
|
}
|
|
335
335
|
};
|
|
336
336
|
|
|
337
|
+
// Back button: navigate to FDList for all statuses
|
|
338
|
+
const handleNavigateToFDList = () => {
|
|
339
|
+
navigate('FDList');
|
|
340
|
+
};
|
|
341
|
+
|
|
337
342
|
// Disable hardware back button on PaymentStatus screen
|
|
338
343
|
useEffect(() => {
|
|
339
344
|
if (Platform.OS !== 'android') return;
|
|
@@ -361,9 +366,9 @@ const PaymentStatus: React.FC<PaymentStatusProps> = ({
|
|
|
361
366
|
{Platform.OS === 'ios' && <StatusBar barStyle="light-content" />}
|
|
362
367
|
|
|
363
368
|
<View style={styles.container}>
|
|
364
|
-
{
|
|
365
|
-
|
|
366
|
-
</
|
|
369
|
+
<TouchableOpacity onPress={handleNavigateToFDList} style={styles.backIconBtn}>
|
|
370
|
+
<Icon name="arrow-back" size={24} color={colors.text} />
|
|
371
|
+
</TouchableOpacity>
|
|
367
372
|
|
|
368
373
|
<ScrollView
|
|
369
374
|
showsVerticalScrollIndicator={false}
|
|
@@ -479,6 +484,13 @@ const createStyles = (colors: any, typography: any, status: 'success' | 'failed'
|
|
|
479
484
|
flex: 1,
|
|
480
485
|
backgroundColor: colors.background,
|
|
481
486
|
},
|
|
487
|
+
backIconBtn: {
|
|
488
|
+
position: 'absolute',
|
|
489
|
+
top: 16,
|
|
490
|
+
left: 16,
|
|
491
|
+
zIndex: 10,
|
|
492
|
+
padding: 8,
|
|
493
|
+
},
|
|
482
494
|
headerTitle: {
|
|
483
495
|
fontSize: 14,
|
|
484
496
|
fontWeight: '600',
|
|
@@ -946,6 +946,7 @@ const ReviewKYC: React.FC<ReviewKYCProps> = ({
|
|
|
946
946
|
{/* Overlay to disable screen interactions during API call */}
|
|
947
947
|
{isLoadingPanRapid && (
|
|
948
948
|
<View style={styles.loadingOverlay} pointerEvents="auto">
|
|
949
|
+
<ActivityIndicator size="large" color={colors.primary} />
|
|
949
950
|
</View>
|
|
950
951
|
)}
|
|
951
952
|
{/* Loading overlay for back navigation */}
|