@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.
@@ -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
- <ShriramSDKWithMasterData masterData={externalMasterData} />
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
- <MahindraSDKWithMasterData masterData={externalMasterData} />
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={effectiveFdData?.creditRating || 'AA+'}
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
  });
@@ -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 'AA+';
64
- return 'AA+';
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 = activeFD ? {
1089
+ const fdListSelectedDataPayment = fdDisplay ? {
1090
1090
  id: appData.fd_id || appData.fdId || 'active-fd',
1091
1091
  providerId: providerIdFromApp,
1092
- name: activeFD.name,
1092
+ name: fdDisplay.name,
1093
1093
  accountNumber: appData.account_number || appData.accountNumber || '',
1094
- roi: `${activeFD.returns}% p.a.`,
1095
- tenure: activeFD.maturityDate || '-',
1096
- amount: Number(activeFD.invested) || 0,
1097
- maturityDate: activeFD.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: activeFD.name,
1100
+ name: fdDisplay.name,
1101
1101
  providerId: providerIdFromApp,
1102
1102
  }),
1103
- companyName: activeFD.name,
1104
- fdRate: `${activeFD.returns}% p.a.`,
1105
- interestPayout: activeFD.interestPayout || 'Yearly',
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 = activeFD ? {
1160
+ const fdListSelectedDataPayment = fdDisplay ? {
1161
1161
  id: appData.fd_id || appData.fdId || 'active-fd',
1162
1162
  providerId: providerIdFromApp,
1163
- name: activeFD.name,
1163
+ name: fdDisplay.name,
1164
1164
  accountNumber: appData.account_number || appData.accountNumber || '',
1165
- roi: `${activeFD.returns}% p.a.`,
1166
- tenure: activeFD.maturityDate || '-',
1167
- amount: Number(activeFD.invested) || 0,
1168
- maturityDate: activeFD.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: activeFD.name,
1171
+ name: fdDisplay.name,
1172
1172
  providerId: providerIdFromApp,
1173
1173
  }),
1174
- companyName: activeFD.name,
1175
- fdRate: `${activeFD.returns}% p.a.`,
1176
- interestPayout: activeFD.interestPayout || 'Yearly',
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
- const fdListSelectedDataToPass = activeFD ? {
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: activeFD.name,
1284
+ name: fdDisplay.name,
1284
1285
  accountNumber: appData.account_number || appData.accountNumber || '',
1285
- roi: `${activeFD.returns}% p.a.`,
1286
- tenure: activeFD.tenure_in_months
1287
- ? `${activeFD.tenure_in_months} Months`
1286
+ roi: `${fdDisplay.returns}% p.a.`,
1287
+ tenure: appData.tenure_in_months
1288
+ ? `${appData.tenure_in_months} Months`
1288
1289
  : '-',
1289
- amount: Number(activeFD.invested) || 0,
1290
- maturityDate: activeFD.maturityDate || '-',
1290
+ amount: Number(fdDisplay.invested) || 0,
1291
+ maturityDate: fdDisplay.maturityDate || '-',
1291
1292
  status: 'active' as const,
1292
1293
  creditRating: getStaticCreditRatingForFD({
1293
- name: activeFD.name,
1294
+ name: fdDisplay.name,
1294
1295
  providerId: providerIdFromApp,
1295
1296
  }),
1296
- companyName: activeFD.name,
1297
- fdRate: `${activeFD.returns}% p.a.`,
1298
- interestPayout: activeFD.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:!!(sdkType==='mahindra'&&masterDataToPass),usingShriramMasterData:!!(sdkType==='shriram'&&masterDataToPass),masterDataHasDataKey:!!masterDataToPass?.data},timestamp:Date.now()})}).catch(()=>{});
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
- {/* <Text style={styles.headerTitle}>
365
- {status === 'success' ? 'PAYMENT SUCCESSFUL' : 'PAYMENT FAILED'}
366
- </Text> */}
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 */}