@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,594 +1,592 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import { useRoute } from '@react-navigation/native';
|
|
2
|
+
import React, { useState } from 'react';
|
|
3
|
+
import { Alert, Image, Platform, ScrollView, StatusBar, StyleSheet, Text, TouchableOpacity, View } from 'react-native';
|
|
3
4
|
import Icon from 'react-native-vector-icons/Ionicons';
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
5
|
+
import { useGetCustomerApplicationsMutation } from '../api/customerApi';
|
|
6
|
+
import { usePaymentRetryMutation, usePaymentReverseFeedMutation } from '../api/fdApi';
|
|
6
7
|
import { PaymentDetailsCard } from '../components';
|
|
7
8
|
import ActionButton from '../components/ActionButton';
|
|
8
|
-
import
|
|
9
|
-
import {
|
|
10
|
-
import { useGetCustomerApplicationsMutation } from '../api/customerApi';
|
|
11
|
-
import { useAppSelector } from '../store';
|
|
9
|
+
import SafeAreaWrapper from '../components/SafeAreaWrapper';
|
|
10
|
+
import { getApiConfig } from '../config/apiConfig';
|
|
12
11
|
import { getUserInfoForAPI } from '../config/appDataConfig';
|
|
13
|
-
import { navigate } from '../navigation/helpers';
|
|
14
|
-
import { setPaymentSession, getPaymentSession } from '../state/paymentSession';
|
|
15
|
-
import { useRoute } from '@react-navigation/native';
|
|
16
12
|
import { BANK_STRINGS } from '../constants/strings/bank';
|
|
13
|
+
import { base64Images } from '../constants/strings/base64Images';
|
|
17
14
|
import { COMMON_STRINGS } from '../constants/strings/common';
|
|
18
|
-
import {
|
|
15
|
+
import { navigate } from '../navigation/helpers';
|
|
16
|
+
import { getPaymentSession, setPaymentSession } from '../state/paymentSession';
|
|
17
|
+
import { useAppSelector } from '../store';
|
|
18
|
+
import { useColors, useTheme, useTypography } from '../theme/ThemeContext';
|
|
19
19
|
|
|
20
20
|
export interface PaymentStatusProps {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
21
|
+
onRetry?: () => void;
|
|
22
|
+
onContinue?: (fdDetails?: any) => void; // Callback when user clicks Continue on success - should redirect to main app with FD details
|
|
23
|
+
status: 'success' | 'failed' | 'pending';
|
|
24
|
+
transactionId?: string;
|
|
25
|
+
fdData?: {
|
|
26
|
+
companyName: string;
|
|
27
|
+
amount: number;
|
|
28
|
+
fdRate: string;
|
|
29
|
+
tenure: string;
|
|
30
|
+
interestPayout: string;
|
|
31
|
+
};
|
|
32
32
|
}
|
|
33
33
|
|
|
34
34
|
const PaymentStatus: React.FC<PaymentStatusProps> = ({
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
35
|
+
onRetry,
|
|
36
|
+
onContinue,
|
|
37
|
+
status,
|
|
38
|
+
transactionId,
|
|
39
|
+
fdData
|
|
40
40
|
}) => {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
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
|
-
title={isLoadingPaymentReverseFeed ? COMMON_STRINGS.CHECKING : BANK_STRINGS.REFRESH_STATUS_BUTTON}
|
|
463
|
-
onPress={handlePaymentReverseFeed}
|
|
464
|
-
disabled={isLoadingPaymentReverseFeed}
|
|
465
|
-
/>
|
|
466
|
-
)}
|
|
467
|
-
</View>
|
|
468
|
-
</View>
|
|
469
|
-
</SafeAreaWrapper>
|
|
470
|
-
);
|
|
41
|
+
const colors = useColors();
|
|
42
|
+
const typography = useTypography();
|
|
43
|
+
const { themeName } = useTheme();
|
|
44
|
+
|
|
45
|
+
// Local state to track current status (can be updated from API responses)
|
|
46
|
+
const [currentStatus, setCurrentStatus] = useState < 'success' | 'failed' | 'pending' > (status);
|
|
47
|
+
|
|
48
|
+
const styles = createStyles(colors, typography, currentStatus);
|
|
49
|
+
const route = useRoute();
|
|
50
|
+
|
|
51
|
+
// Get transaction ID from navigation props (route params)
|
|
52
|
+
const navigationTransactionId = (route.params as any)?.transactionId;
|
|
53
|
+
|
|
54
|
+
// Fallback: Get transaction ID from payment session if not in navigation params
|
|
55
|
+
const paymentSession = getPaymentSession();
|
|
56
|
+
const sessionTransactionId = paymentSession.transactionId;
|
|
57
|
+
|
|
58
|
+
const finalTransactionId = navigationTransactionId || sessionTransactionId || transactionId || "";
|
|
59
|
+
|
|
60
|
+
// Redux selectors
|
|
61
|
+
const workflowInstanceId = useAppSelector((state: any) => state?.onboarding?.workflowInstanceId);
|
|
62
|
+
const applicationId = useAppSelector((state: any) => state?.onboarding?.applicationId);
|
|
63
|
+
const entityId = useAppSelector((state: any) => state?.onboarding?.entityid);
|
|
64
|
+
const providerId = useAppSelector((state: any) => state?.onboarding?.providerId);
|
|
65
|
+
|
|
66
|
+
// Payment Reverse Feed API
|
|
67
|
+
const [paymentReverseFeed, {
|
|
68
|
+
data: paymentReverseFeedResponse,
|
|
69
|
+
error: paymentReverseFeedError,
|
|
70
|
+
isLoading: isLoadingPaymentReverseFeed,
|
|
71
|
+
}] = usePaymentReverseFeedMutation();
|
|
72
|
+
|
|
73
|
+
// Payment Retry API
|
|
74
|
+
const [paymentRetry, {
|
|
75
|
+
data: paymentRetryResponse,
|
|
76
|
+
error: paymentRetryError,
|
|
77
|
+
isLoading: isLoadingPaymentRetry,
|
|
78
|
+
}] = usePaymentRetryMutation();
|
|
79
|
+
|
|
80
|
+
// Get Customer Applications API
|
|
81
|
+
const [getCustomerApplications, {
|
|
82
|
+
isLoading: isLoadingCustomerApplications,
|
|
83
|
+
}] = useGetCustomerApplicationsMutation();
|
|
84
|
+
|
|
85
|
+
// Pull FD data: fdListSelected > fdData prop > default
|
|
86
|
+
const fdListSelectedData = useAppSelector((state: any) => state?.fdListSelected);
|
|
87
|
+
|
|
88
|
+
const displayData = fdListSelectedData ? {
|
|
89
|
+
companyName: fdListSelectedData.companyName,
|
|
90
|
+
amount: fdListSelectedData.amount,
|
|
91
|
+
fdRate: fdListSelectedData.fdRate,
|
|
92
|
+
tenure: fdListSelectedData.tenure,
|
|
93
|
+
interestPayout: fdListSelectedData.interestPayout,
|
|
94
|
+
} : fdData || {
|
|
95
|
+
companyName: '',
|
|
96
|
+
amount: 0,
|
|
97
|
+
fdRate: '',
|
|
98
|
+
tenure: '',
|
|
99
|
+
interestPayout: '',
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
const displayTransactionId = finalTransactionId || '';
|
|
103
|
+
|
|
104
|
+
const formatAmount = (amount: number): string => {
|
|
105
|
+
return amount.toLocaleString('en-IN');
|
|
106
|
+
};
|
|
107
|
+
|
|
108
|
+
// Handle payment reverse feed API call for pending status
|
|
109
|
+
const handlePaymentReverseFeed = async () => {
|
|
110
|
+
|
|
111
|
+
try {
|
|
112
|
+
|
|
113
|
+
// Get user info from app data
|
|
114
|
+
const userInfo = getUserInfoForAPI();
|
|
115
|
+
|
|
116
|
+
// Prepare the API request
|
|
117
|
+
const paymentReverseFeedRequest = {
|
|
118
|
+
// Headers
|
|
119
|
+
providerId: providerId,
|
|
120
|
+
workflowInstanceId: workflowInstanceId,
|
|
121
|
+
userreferenceid: userInfo.id,
|
|
122
|
+
applicationid: applicationId,
|
|
123
|
+
entityid: entityId,
|
|
124
|
+
// Body
|
|
125
|
+
transactionId: finalTransactionId,
|
|
126
|
+
};
|
|
127
|
+
|
|
128
|
+
const response = await paymentReverseFeed(paymentReverseFeedRequest).unwrap();
|
|
129
|
+
|
|
130
|
+
// Handle the response based on payment status
|
|
131
|
+
if (response?.data?.paymentStatus?.toLowerCase() === 'success') {
|
|
132
|
+
setCurrentStatus('success');
|
|
133
|
+
|
|
134
|
+
} else if (response?.data?.paymentStatus?.toLowerCase() === 'failed') {
|
|
135
|
+
setCurrentStatus('failed');
|
|
136
|
+
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
} catch (error) {
|
|
140
|
+
|
|
141
|
+
// Alert.alert(COMMON_STRINGS.ERROR, BANK_STRINGS.PAYMENT_GATEWAY_ERROR, [
|
|
142
|
+
// { text: COMMON_STRINGS.OK }
|
|
143
|
+
// ]);
|
|
144
|
+
}
|
|
145
|
+
};
|
|
146
|
+
|
|
147
|
+
// Handle payment retry when status is failed
|
|
148
|
+
const handlePaymentRetry = async () => {
|
|
149
|
+
if (!finalTransactionId) {
|
|
150
|
+
Alert.alert(COMMON_STRINGS.ERROR, BANK_STRINGS.PAYMENT_GATEWAY_ERROR);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
const userInfo = getUserInfoForAPI();
|
|
155
|
+
const userRefId = userInfo?.userReferenceId ?? (userInfo as any)?.id;
|
|
156
|
+
const paymentRetryRequest = {
|
|
157
|
+
providerId,
|
|
158
|
+
workflowInstanceId,
|
|
159
|
+
userreferenceid: userRefId,
|
|
160
|
+
applicationid: applicationId,
|
|
161
|
+
entityid: entityId,
|
|
162
|
+
transactionId: finalTransactionId,
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
try {
|
|
166
|
+
console.log('[FDSDK][PaymentStatus] Retry API calling...');
|
|
167
|
+
const response = await paymentRetry(paymentRetryRequest).unwrap();
|
|
168
|
+
console.log('[FDSDK][PaymentStatus] Retry API success, parsing response');
|
|
169
|
+
|
|
170
|
+
const payload: any = Array.isArray((response as any)?.data)
|
|
171
|
+
? (response as any).data[0]
|
|
172
|
+
: (response as any)?.data ?? (response as any);
|
|
173
|
+
|
|
174
|
+
const newPaymentUrl: string | undefined =
|
|
175
|
+
payload?.PaymentUrl || payload?.paymentUrl || (payload as any)?.payment_url;
|
|
176
|
+
const newTransactionId: string | undefined =
|
|
177
|
+
payload?.Transactionid || payload?.transactionId || (payload as any)?.transaction_id || finalTransactionId;
|
|
178
|
+
|
|
179
|
+
console.log('[FDSDK][PaymentStatus] Retry response:', {
|
|
180
|
+
hasPaymentUrl: Boolean(newPaymentUrl),
|
|
181
|
+
paymentUrlLength: newPaymentUrl?.length ?? 0,
|
|
182
|
+
applicationId: applicationId?.slice(0, 8) + '...',
|
|
183
|
+
});
|
|
184
|
+
|
|
185
|
+
if (newPaymentUrl) {
|
|
186
|
+
setPaymentSession({ paymentUrl: newPaymentUrl, transactionId: newTransactionId });
|
|
187
|
+
console.log('[FDSDK][PaymentStatus] NAV_TO_PAYMENT: success_with_new_url');
|
|
188
|
+
navigate('Payment', {
|
|
189
|
+
paymentUrl: newPaymentUrl,
|
|
190
|
+
transactionId: newTransactionId,
|
|
191
|
+
applicationId,
|
|
192
|
+
workflowInstanceId,
|
|
193
|
+
entityId,
|
|
194
|
+
providerId,
|
|
195
|
+
} as any);
|
|
196
|
+
} else {
|
|
197
|
+
console.log('[FDSDK][PaymentStatus] No payment URL in response, showing alert');
|
|
198
|
+
Alert.alert(BANK_STRINGS.PAYMENT_FAILED, BANK_STRINGS.PAYMENT_GATEWAY_ERROR);
|
|
199
|
+
}
|
|
200
|
+
} catch (error: any) {
|
|
201
|
+
console.log('[FDSDK][PaymentStatus] Retry catch:', error?.message ?? String(error));
|
|
202
|
+
const session = getPaymentSession();
|
|
203
|
+
if (session.paymentUrl) {
|
|
204
|
+
console.log('[FDSDK][PaymentStatus] NAV_TO_PAYMENT: catch_with_session');
|
|
205
|
+
navigate('Payment', {
|
|
206
|
+
paymentUrl: session.paymentUrl,
|
|
207
|
+
transactionId: session.transactionId,
|
|
208
|
+
applicationId,
|
|
209
|
+
workflowInstanceId,
|
|
210
|
+
entityId,
|
|
211
|
+
providerId,
|
|
212
|
+
} as any);
|
|
213
|
+
} else if (onRetry) {
|
|
214
|
+
console.log('[FDSDK][PaymentStatus] NAV_TO_PAYMENT: catch_calling_onRetry');
|
|
215
|
+
onRetry();
|
|
216
|
+
} else {
|
|
217
|
+
console.log('[FDSDK][PaymentStatus] NAV_TO_PAYMENT: catch_navigate_no_params');
|
|
218
|
+
navigate('Payment');
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
// Handle exit button click - fetch FD details and pass to main app
|
|
224
|
+
const handleExit = async () => {
|
|
225
|
+
try {
|
|
226
|
+
// Get user info from app data
|
|
227
|
+
const userInfo = getUserInfoForAPI();
|
|
228
|
+
|
|
229
|
+
// Get API configuration
|
|
230
|
+
const apiConfig = getApiConfig();
|
|
231
|
+
|
|
232
|
+
// Prepare request payload
|
|
233
|
+
const requestPayload = {
|
|
234
|
+
userReferenceId: userInfo.id
|
|
235
|
+
};
|
|
236
|
+
|
|
237
|
+
// Call API to get customer applications
|
|
238
|
+
const response = await getCustomerApplications(requestPayload).unwrap();
|
|
239
|
+
|
|
240
|
+
// Extract applications from response (handle different response structures)
|
|
241
|
+
let applications: any[] = [];
|
|
242
|
+
if (Array.isArray(response)) {
|
|
243
|
+
applications = response;
|
|
244
|
+
} else if (response?.data && Array.isArray(response.data)) {
|
|
245
|
+
applications = response.data;
|
|
246
|
+
} else if (response?.applications && Array.isArray(response.applications)) {
|
|
247
|
+
applications = response.applications;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
// Find the currently booked FD - search by transaction_id first (most specific)
|
|
251
|
+
let bookedFD: any = null;
|
|
252
|
+
|
|
253
|
+
// Priority 1: Match by transaction_id from payment
|
|
254
|
+
if (finalTransactionId) {
|
|
255
|
+
bookedFD = applications.find((app: any) =>
|
|
256
|
+
app?.transactionId === finalTransactionId ||
|
|
257
|
+
app?.transaction_id === finalTransactionId ||
|
|
258
|
+
app?.Transactionid === finalTransactionId ||
|
|
259
|
+
app?.TransactionId === finalTransactionId
|
|
260
|
+
);
|
|
261
|
+
|
|
262
|
+
if (__DEV__ && bookedFD) {
|
|
263
|
+
console.log('═══════════════════════════════════════════════════════════════');
|
|
264
|
+
console.log('✅ [PaymentStatus] Found FD by Transaction ID');
|
|
265
|
+
console.log('───────────────────────────────────────────────────────────────');
|
|
266
|
+
console.log('🔍 Searched Transaction ID:', finalTransactionId);
|
|
267
|
+
console.log('📋 Found Application:', bookedFD);
|
|
268
|
+
console.log('═══════════════════════════════════════════════════════════════');
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
// Priority 2: Match by applicationId (fallback)
|
|
273
|
+
if (!bookedFD && applicationId) {
|
|
274
|
+
bookedFD = applications.find((app: any) =>
|
|
275
|
+
app?.applicationId === applicationId ||
|
|
276
|
+
app?.applicationid === applicationId ||
|
|
277
|
+
app?.id === applicationId
|
|
278
|
+
);
|
|
279
|
+
|
|
280
|
+
if (__DEV__ && bookedFD) {
|
|
281
|
+
console.log('═══════════════════════════════════════════════════════════════');
|
|
282
|
+
console.log('✅ [PaymentStatus] Found FD by Application ID');
|
|
283
|
+
console.log('───────────────────────────────────────────────────────────────');
|
|
284
|
+
console.log('🔍 Searched Application ID:', applicationId);
|
|
285
|
+
console.log('📋 Found Application:', bookedFD);
|
|
286
|
+
console.log('═══════════════════════════════════════════════════════════════');
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// Priority 3: Get the most recent one (last resort)
|
|
291
|
+
if (!bookedFD && applications.length > 0) {
|
|
292
|
+
const sortedApps = [...applications].sort((a: any, b: any) => {
|
|
293
|
+
const dateA = a?.createdDate || a?.created_date || a?.createdAt || 0;
|
|
294
|
+
const dateB = b?.createdDate || b?.created_date || b?.createdAt || 0;
|
|
295
|
+
return new Date(dateB).getTime() - new Date(dateA).getTime();
|
|
296
|
+
});
|
|
297
|
+
bookedFD = sortedApps[0];
|
|
298
|
+
|
|
299
|
+
if (__DEV__ && bookedFD) {
|
|
300
|
+
console.log('═══════════════════════════════════════════════════════════════');
|
|
301
|
+
console.log('⚠️ [PaymentStatus] Using Most Recent FD (fallback)');
|
|
302
|
+
console.log('───────────────────────────────────────────────────────────────');
|
|
303
|
+
console.log('📋 Found Application:', bookedFD);
|
|
304
|
+
console.log('═══════════════════════════════════════════════════════════════');
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
if (__DEV__) {
|
|
309
|
+
console.log('═══════════════════════════════════════════════════════════════');
|
|
310
|
+
console.log('📤 [PaymentStatus] Passing FD Data to Main App');
|
|
311
|
+
console.log('───────────────────────────────────────────────────────────────');
|
|
312
|
+
console.log('💳 Transaction ID:', finalTransactionId);
|
|
313
|
+
console.log('📋 FD Data:', bookedFD);
|
|
314
|
+
console.log('═══════════════════════════════════════════════════════════════');
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// Pass FD details to main app via onContinue callback
|
|
318
|
+
if (onContinue) {
|
|
319
|
+
onContinue(bookedFD || null);
|
|
320
|
+
}
|
|
321
|
+
} catch (error) {
|
|
322
|
+
if (__DEV__) {
|
|
323
|
+
console.log('═══════════════════════════════════════════════════════════════');
|
|
324
|
+
console.log('❌ [PaymentStatus] Error Fetching FD Data');
|
|
325
|
+
console.log('───────────────────────────────────────────────────────────────');
|
|
326
|
+
console.log('⚠️ Error:', error);
|
|
327
|
+
console.log('═══════════════════════════════════════════════════════════════');
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
// If API call fails, still call onContinue but without FD details
|
|
331
|
+
if (onContinue) {
|
|
332
|
+
onContinue(null);
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
};
|
|
336
|
+
|
|
337
|
+
// Back button: navigate to FDList for all statuses
|
|
338
|
+
const handleNavigateToFDList = () => {
|
|
339
|
+
navigate('FDList');
|
|
340
|
+
};
|
|
341
|
+
|
|
342
|
+
// Removed screen-level hardware back handler to allow only header back button navigation
|
|
343
|
+
|
|
344
|
+
|
|
345
|
+
return (
|
|
346
|
+
<SafeAreaWrapper
|
|
347
|
+
includeTop={true}
|
|
348
|
+
bottomPadding={0}
|
|
349
|
+
statusBarColor="#000000"
|
|
350
|
+
statusBarStyle="light-content"
|
|
351
|
+
>
|
|
352
|
+
{Platform.OS === 'ios' && <StatusBar barStyle="light-content" />}
|
|
353
|
+
|
|
354
|
+
<View style={styles.container}>
|
|
355
|
+
<TouchableOpacity onPress={handleNavigateToFDList} style={styles.backIconBtn}>
|
|
356
|
+
<Icon name="arrow-back" size={24} color={colors.text} />
|
|
357
|
+
</TouchableOpacity>
|
|
358
|
+
|
|
359
|
+
<ScrollView
|
|
360
|
+
showsVerticalScrollIndicator={false}
|
|
361
|
+
contentContainerStyle={styles.scrollContent}
|
|
362
|
+
>
|
|
363
|
+
{/* Status Icon */}
|
|
364
|
+
<View style={styles.iconContainer}>
|
|
365
|
+
<View style={styles.iconCircleOuter}>
|
|
366
|
+
<View style={styles.iconCircleInner}>
|
|
367
|
+
{currentStatus === 'success' && (
|
|
368
|
+
<Image
|
|
369
|
+
source={{ uri: base64Images.successBig }}
|
|
370
|
+
style={{ width: 60, height: 60 }}
|
|
371
|
+
resizeMode="contain"
|
|
372
|
+
/>
|
|
373
|
+
)}
|
|
374
|
+
{currentStatus === 'failed' && (
|
|
375
|
+
<Image
|
|
376
|
+
source={{ uri: base64Images.error }}
|
|
377
|
+
style={{ width: 48, height: 48 }}
|
|
378
|
+
resizeMode="contain"
|
|
379
|
+
/>
|
|
380
|
+
)}
|
|
381
|
+
{currentStatus === 'pending' && (
|
|
382
|
+
<Image
|
|
383
|
+
source={{ uri: base64Images.pending }}
|
|
384
|
+
style={{ width: 48, height: 48 }}
|
|
385
|
+
resizeMode="contain"
|
|
386
|
+
/>
|
|
387
|
+
)}
|
|
388
|
+
</View>
|
|
389
|
+
</View>
|
|
390
|
+
</View>
|
|
391
|
+
|
|
392
|
+
{/* Status Title */}
|
|
393
|
+
<Text style={styles.statusTitle}>
|
|
394
|
+
{currentStatus === 'success' && BANK_STRINGS.PAYMENT_STATUS_SUCCESS}
|
|
395
|
+
{currentStatus === 'failed' && BANK_STRINGS.PAYMENT_STATUS_FAILED}
|
|
396
|
+
{currentStatus === 'pending' && BANK_STRINGS.PAYMENT_STATUS_PENDING}
|
|
397
|
+
</Text>
|
|
398
|
+
|
|
399
|
+
{/* Pending Status Subtitle */}
|
|
400
|
+
{currentStatus === 'pending' && (
|
|
401
|
+
<Text style={styles.pendingSubtitle}>
|
|
402
|
+
{BANK_STRINGS.PAYMENT_STATUS_PROCESSING}
|
|
403
|
+
</Text>
|
|
404
|
+
)}
|
|
405
|
+
|
|
406
|
+
{/* Transaction ID */}
|
|
407
|
+
<Text style={styles.transactionLabel}>
|
|
408
|
+
Transaction ID
|
|
409
|
+
</Text>
|
|
410
|
+
<Text style={styles.transactionId}>{displayTransactionId}</Text>
|
|
411
|
+
|
|
412
|
+
{/* Details Card */}
|
|
413
|
+
<PaymentDetailsCard
|
|
414
|
+
companyName={displayData.companyName}
|
|
415
|
+
amount={displayData.amount}
|
|
416
|
+
fdRate={displayData.fdRate}
|
|
417
|
+
tenure={displayData.tenure}
|
|
418
|
+
interestPayout={displayData.interestPayout}
|
|
419
|
+
/>
|
|
420
|
+
|
|
421
|
+
{/* Success Disclaimer */}
|
|
422
|
+
{currentStatus === 'success' && (
|
|
423
|
+
<View style={styles.disclaimerContainer}>
|
|
424
|
+
{Platform.OS === 'android' && (
|
|
425
|
+
<Icon name="information-circle-outline" size={20} color={colors.textSecondary} style={styles.disclaimerIcon} />
|
|
426
|
+
)}
|
|
427
|
+
<Text style={styles.disclaimerText}>
|
|
428
|
+
{BANK_STRINGS.PAYMENT_SUCCESS_DISCLAIMER}
|
|
429
|
+
</Text>
|
|
430
|
+
</View>
|
|
431
|
+
)}
|
|
432
|
+
|
|
433
|
+
</ScrollView>
|
|
434
|
+
|
|
435
|
+
{/* Action Button */}
|
|
436
|
+
<View style={styles.footer}>
|
|
437
|
+
{currentStatus === 'success' && (
|
|
438
|
+
<ActionButton
|
|
439
|
+
title={isLoadingCustomerApplications ? COMMON_STRINGS.LOADING : COMMON_STRINGS.EXIT}
|
|
440
|
+
onPress={handleExit}
|
|
441
|
+
disabled={isLoadingCustomerApplications}
|
|
442
|
+
/>
|
|
443
|
+
)}
|
|
444
|
+
{currentStatus === 'failed' && (
|
|
445
|
+
<ActionButton
|
|
446
|
+
title={isLoadingPaymentRetry ? COMMON_STRINGS.RETRYING : BANK_STRINGS.RETRY_PAYMENT_BUTTON}
|
|
447
|
+
onPress={handlePaymentRetry}
|
|
448
|
+
disabled={isLoadingPaymentRetry}
|
|
449
|
+
/>
|
|
450
|
+
)}
|
|
451
|
+
{currentStatus === 'pending' && (
|
|
452
|
+
<ActionButton
|
|
453
|
+
title={isLoadingPaymentReverseFeed ? COMMON_STRINGS.CHECKING : BANK_STRINGS.REFRESH_STATUS_BUTTON}
|
|
454
|
+
onPress={handlePaymentReverseFeed}
|
|
455
|
+
disabled={isLoadingPaymentReverseFeed}
|
|
456
|
+
/>
|
|
457
|
+
)}
|
|
458
|
+
</View>
|
|
459
|
+
</View>
|
|
460
|
+
</SafeAreaWrapper>
|
|
461
|
+
);
|
|
471
462
|
};
|
|
472
463
|
|
|
473
464
|
const createStyles = (colors: any, typography: any, status: 'success' | 'failed' | 'pending') => {
|
|
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
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
465
|
+
const statusColor = status === 'success' ? '#4CAF50' : status === 'failed' ? '#F44336' : '#FF9800';
|
|
466
|
+
const cardBgColor = status === 'success' ? '#E8F5F0' : status === 'failed' ? '#FFF3F3' : '#FFF8E1';
|
|
467
|
+
|
|
468
|
+
return StyleSheet.create({
|
|
469
|
+
container: {
|
|
470
|
+
flex: 1,
|
|
471
|
+
backgroundColor: colors.background,
|
|
472
|
+
},
|
|
473
|
+
backIconBtn: {
|
|
474
|
+
position: 'absolute',
|
|
475
|
+
top: 16,
|
|
476
|
+
left: 16,
|
|
477
|
+
zIndex: 10,
|
|
478
|
+
padding: 8,
|
|
479
|
+
},
|
|
480
|
+
headerTitle: {
|
|
481
|
+
fontSize: 14,
|
|
482
|
+
fontWeight: '600',
|
|
483
|
+
color: colors.textLight,
|
|
484
|
+
textAlign: 'center',
|
|
485
|
+
paddingVertical: 16,
|
|
486
|
+
letterSpacing: 1,
|
|
487
|
+
},
|
|
488
|
+
scrollContent: {
|
|
489
|
+
flexGrow: 1,
|
|
490
|
+
paddingHorizontal: 24,
|
|
491
|
+
paddingBottom: 120,
|
|
492
|
+
},
|
|
493
|
+
iconContainer: {
|
|
494
|
+
alignItems: 'center',
|
|
495
|
+
marginTop: 40,
|
|
496
|
+
marginBottom: 32,
|
|
497
|
+
},
|
|
498
|
+
iconCircleOuter: {
|
|
499
|
+
width: 120,
|
|
500
|
+
height: 120,
|
|
501
|
+
borderRadius: 60,
|
|
502
|
+
backgroundColor: status === 'success' ? '#e8f5e9' : status === 'failed' ? 'rgba(244, 67, 54, 0.1)' : 'rgba(255, 152, 0, 0.1)',
|
|
503
|
+
alignItems: 'center',
|
|
504
|
+
justifyContent: 'center',
|
|
505
|
+
},
|
|
506
|
+
iconCircleInner: {
|
|
507
|
+
width: 60,
|
|
508
|
+
height: 60,
|
|
509
|
+
borderRadius: 30,
|
|
510
|
+
backgroundColor: status === 'success' ? '#ffffff' : status === 'failed' ? 'rgba(244, 67, 54, 0.0)' : 'rgba(255, 152, 0, 0.2)',
|
|
511
|
+
alignItems: 'center',
|
|
512
|
+
justifyContent: 'center',
|
|
513
|
+
},
|
|
514
|
+
statusTitle: {
|
|
515
|
+
...typography.styles.h1,
|
|
516
|
+
color: colors.text,
|
|
517
|
+
textAlign: 'center',
|
|
518
|
+
marginBottom: 32,
|
|
519
|
+
letterSpacing: 0.5,
|
|
520
|
+
},
|
|
521
|
+
pendingSubtitle: {
|
|
522
|
+
...typography.styles.bodyMedium,
|
|
523
|
+
color: colors.textSecondary,
|
|
524
|
+
textAlign: 'center',
|
|
525
|
+
marginBottom: 30,
|
|
526
|
+
marginTop: -30,
|
|
527
|
+
|
|
528
|
+
},
|
|
529
|
+
transactionLabel: {
|
|
530
|
+
...typography.styles.bodyMedium,
|
|
531
|
+
color: colors.textLight,
|
|
532
|
+
textAlign: 'center',
|
|
533
|
+
marginBottom: 8,
|
|
534
|
+
},
|
|
535
|
+
transactionId: {
|
|
536
|
+
...typography.styles.h2,
|
|
537
|
+
color: colors.text,
|
|
538
|
+
textAlign: 'center',
|
|
539
|
+
marginBottom: 32,
|
|
540
|
+
letterSpacing: 1,
|
|
541
|
+
},
|
|
542
|
+
avatarContainer: {
|
|
543
|
+
alignItems: 'center',
|
|
544
|
+
marginTop: -28,
|
|
545
|
+
marginBottom: 24,
|
|
546
|
+
},
|
|
547
|
+
avatar: {
|
|
548
|
+
width: 56,
|
|
549
|
+
height: 56,
|
|
550
|
+
borderRadius: 28,
|
|
551
|
+
backgroundColor: '#5F9E8F',
|
|
552
|
+
alignItems: 'center',
|
|
553
|
+
justifyContent: 'center',
|
|
554
|
+
borderWidth: 4,
|
|
555
|
+
borderColor: colors.background,
|
|
556
|
+
},
|
|
557
|
+
avatarText: {
|
|
558
|
+
fontSize: 24,
|
|
559
|
+
fontWeight: '600',
|
|
560
|
+
color: 'white',
|
|
561
|
+
},
|
|
562
|
+
footer: {
|
|
563
|
+
position: 'absolute',
|
|
564
|
+
bottom: 0,
|
|
565
|
+
left: 0,
|
|
566
|
+
right: 0,
|
|
567
|
+
backgroundColor: colors.background,
|
|
568
|
+
paddingTop: 16,
|
|
569
|
+
},
|
|
570
|
+
disclaimerContainer: {
|
|
571
|
+
flexDirection: 'row',
|
|
572
|
+
backgroundColor: 'transparent',
|
|
573
|
+
borderRadius: 8,
|
|
574
|
+
padding: 16,
|
|
575
|
+
marginTop: 24,
|
|
576
|
+
marginBottom: 16,
|
|
577
|
+
alignItems: 'flex-start',
|
|
578
|
+
},
|
|
579
|
+
disclaimerIcon: {
|
|
580
|
+
marginRight: 12,
|
|
581
|
+
marginTop: 2,
|
|
582
|
+
},
|
|
583
|
+
disclaimerText: {
|
|
584
|
+
...typography.styles.bodySmall,
|
|
585
|
+
color: colors.textSecondary,
|
|
586
|
+
flex: 1,
|
|
587
|
+
lineHeight: 18,
|
|
588
|
+
},
|
|
589
|
+
});
|
|
592
590
|
};
|
|
593
591
|
|
|
594
592
|
export default PaymentStatus;
|