react-native-timacare 3.3.50 → 3.3.52

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/lib/commonjs/assets/v3/13.svg +19 -0
  2. package/lib/commonjs/assets/v3/14.svg +24 -0
  3. package/lib/commonjs/assets/v3/index.js +1 -1
  4. package/lib/commonjs/assets/v3/index.js.flow +4 -0
  5. package/lib/commonjs/assets/v3/index.js.map +1 -1
  6. package/lib/commonjs/components/ItemTimaOneV3.js +1 -1
  7. package/lib/commonjs/components/ItemTimaOneV3.js.flow +574 -946
  8. package/lib/commonjs/components/ItemTimaOneV3.js.map +1 -1
  9. package/lib/commonjs/screens/detail-loan/Payment.js +1 -1
  10. package/lib/commonjs/screens/detail-loan/Payment.js.flow +211 -234
  11. package/lib/commonjs/screens/detail-loan/Payment.js.map +1 -1
  12. package/lib/commonjs/screens/home/DigitalTopupItem.js +1 -1
  13. package/lib/commonjs/screens/home/DigitalTopupItem.js.flow +565 -822
  14. package/lib/commonjs/screens/home/DigitalTopupItem.js.map +1 -1
  15. package/lib/commonjs/screens/home/ItemMotoBikeLoan.js +1 -1
  16. package/lib/commonjs/screens/home/ItemMotoBikeLoan.js.flow +499 -705
  17. package/lib/commonjs/screens/home/ItemMotoBikeLoan.js.map +1 -1
  18. package/lib/commonjs/screens/home/index.js +1 -1
  19. package/lib/commonjs/screens/home/index.js.flow +28 -18
  20. package/lib/commonjs/screens/home/index.js.map +1 -1
  21. package/lib/module/assets/v3/13.svg +19 -0
  22. package/lib/module/assets/v3/14.svg +24 -0
  23. package/lib/module/assets/v3/index.js +1 -1
  24. package/lib/module/assets/v3/index.js.map +1 -1
  25. package/lib/module/components/ItemTimaOneV3.js +1 -1
  26. package/lib/module/components/ItemTimaOneV3.js.map +1 -1
  27. package/lib/module/screens/detail-loan/Payment.js +1 -1
  28. package/lib/module/screens/detail-loan/Payment.js.map +1 -1
  29. package/lib/module/screens/home/DigitalTopupItem.js +1 -1
  30. package/lib/module/screens/home/DigitalTopupItem.js.map +1 -1
  31. package/lib/module/screens/home/ItemMotoBikeLoan.js +1 -1
  32. package/lib/module/screens/home/ItemMotoBikeLoan.js.map +1 -1
  33. package/lib/module/screens/home/index.js +1 -1
  34. package/lib/module/screens/home/index.js.map +1 -1
  35. package/lib/typescript/assets/v3/index.d.ts +3 -1
  36. package/lib/typescript/assets/v3/index.d.ts.map +1 -1
  37. package/lib/typescript/components/ItemTimaOneV3.d.ts.map +1 -1
  38. package/lib/typescript/screens/detail-loan/Payment.d.ts.map +1 -1
  39. package/lib/typescript/screens/home/DigitalTopupItem.d.ts.map +1 -1
  40. package/lib/typescript/screens/home/ItemMotoBikeLoan.d.ts.map +1 -1
  41. package/lib/typescript/screens/home/index.d.ts.map +1 -1
  42. package/package.json +1 -1
  43. package/src/assets/v3/13.svg +19 -0
  44. package/src/assets/v3/14.svg +24 -0
  45. package/src/assets/v3/index.tsx +4 -0
  46. package/src/components/ItemTimaOneV3.tsx +574 -946
  47. package/src/screens/detail-loan/Payment.tsx +211 -234
  48. package/src/screens/home/DigitalTopupItem.tsx +565 -822
  49. package/src/screens/home/ItemMotoBikeLoan.tsx +499 -705
  50. package/src/screens/home/index.tsx +28 -18
@@ -1,6 +1,6 @@
1
1
  //@ts-nocheck
2
2
  import React from 'react';
3
- import { TouchableOpacity, View, ViewStyle } from 'react-native';
3
+ import { StyleSheet, TouchableOpacity, View, ViewStyle } from 'react-native';
4
4
  import LinearGradient from 'react-native-linear-gradient';
5
5
  import { IconMoney2, IconQuestion, IconTick, IconTima16 } from '../assets/svgs';
6
6
  import { formatMoney } from '../utils';
@@ -8,6 +8,8 @@ import { MText } from './MText';
8
8
  import {
9
9
  Icon1,
10
10
  Icon10,
11
+ Icon13,
12
+ Icon14,
11
13
  Icon2,
12
14
  Icon3,
13
15
  Icon4,
@@ -32,9 +34,8 @@ import {
32
34
  IconStep5Success,
33
35
  IconSuccess,
34
36
  } from '../assets/v3';
35
- import { Close2Icon, CloseIcon, Info } from '../assets/icons';
37
+ import { Close2Icon, Info } from '../assets/icons';
36
38
  import { ScreenNames } from '../navigation';
37
- import { color } from '../theme';
38
39
  import Modal from 'react-native-modal';
39
40
  import { commonStyles } from '../screens/CommonStyles';
40
41
 
@@ -43,679 +44,326 @@ interface IProps {
43
44
  navigation: any;
44
45
  }
45
46
 
46
- const $action: ViewStyle = {
47
- flexDirection: 'column',
48
- alignItems: 'center',
49
- gap: 5,
50
- };
47
+ const GRADIENT_ORANGE = ['#FF8E4F', '#EF592E'];
48
+
49
+ const COLOR_ACTIVE = '#EF592E';
50
+ const COLOR_DONE = '#333333';
51
+ const COLOR_DISABLED = '#999999';
52
+
53
+ const LEGEND_ROWS = [
54
+ { label: 'Đang cần thực hiện', icons: [Icon1, Icon2, Icon3, Icon4, Icon5] },
55
+ { label: 'Chưa thể thực hiện', icons: [Icon6, Icon7, Icon8, Icon9, Icon10] },
56
+ { label: 'Đã hoàn thành', icons: [IconSuccess] },
57
+ ];
58
+
59
+ const StepAction = ({ icon, label, color, disabled, onPress }: any) => (
60
+ <TouchableOpacity disabled={disabled} style={styles.action} onPress={onPress}>
61
+ {icon}
62
+ <MText style={[styles.stepLabel, { color }]}>{label}</MText>
63
+ </TouchableOpacity>
64
+ );
65
+
66
+ const UpdateButton = ({ label, onPress }: any) => (
67
+ <TouchableOpacity onPress={onPress}>
68
+ <LinearGradient colors={GRADIENT_ORANGE} style={styles.updateButton}>
69
+ <MText style={styles.updateButtonText}>{label}</MText>
70
+ </LinearGradient>
71
+ </TouchableOpacity>
72
+ );
51
73
 
52
74
  export default function ItemTimaOneV3({ item, navigation }: IProps) {
53
75
  const [showModal, setShowModal] = React.useState(false);
54
76
 
77
+ const GUIDE_STEPS =
78
+ item.typeLoan === 5 || item.typeLoan === 7
79
+ ? [
80
+ {
81
+ icon: Icon1,
82
+ title: 'CẬP NHẬT THÔNG TIN XE',
83
+ description: 'Giấy tờ Đăng ký xe, thông tin xe',
84
+ },
85
+ {
86
+ icon: Icon5,
87
+ title: 'CẬP NHẬT THÔNG TIN KHOẢN VAY',
88
+ description: 'Số tiền vay, thời hạn vay, hình thức vay, ...',
89
+ },
90
+ {
91
+ icon: Icon3,
92
+ title: 'CẬP NHẬT THÔNG TIN CÁ NHÂN',
93
+ description: 'Giấy tờ CCCD/CC, ảnh chân dung, thông tin cá nhân',
94
+ },
95
+ { icon: Icon14, title: 'CHỜ PHÊ DUYỆT' },
96
+ { icon: Icon5, title: 'KÝ HỢP ĐỒNG ĐIỆN TỬ' },
97
+ { icon: Icon2, title: 'NHẬN TIỀN GIẢI NGÂN' },
98
+ ]
99
+ : [
100
+ {
101
+ icon: Icon1,
102
+ title: 'CẬP NHẬT THÔNG TIN KHOẢN VAY',
103
+ description: 'Số tiền vay, thời hạn vay, hình thức vay, ...',
104
+ },
105
+ {
106
+ icon: Icon3,
107
+ title: 'CẬP NHẬT THÔNG TIN CÁ NHÂN',
108
+ description: 'Giấy tờ CCCD/CC, ảnh chân dung, thông tin cá nhân',
109
+ },
110
+ { icon: Icon14, title: 'CHỜ PHÊ DUYỆT' },
111
+ { icon: Icon5, title: 'KÝ HỢP ĐỒNG ĐIỆN TỬ' },
112
+ { icon: Icon2, title: 'NHẬN TIỀN GIẢI NGÂN' },
113
+ ];
114
+
115
+ const step = item?.step;
116
+ const autoDEList = item?.listLoanAllAutoDE;
117
+ const hasAutoDE = autoDEList?.length > 0;
118
+ const sumBy = (key) =>
119
+ hasAutoDE ? autoDEList.reduce((sum, x) => sum + x[key], 0) : 0;
120
+
121
+ const isPersonalStep = step === 4 || step === 5 || step === 6;
122
+
123
+ const goAsset = () => {
124
+ if (item?.typeLoan === 7) {
125
+ navigation.push(ScreenNames.LoanBuyCar, { loan: item });
126
+ } else if (step === 0) {
127
+ navigation.push(ScreenNames.VehicleCamera, { loan: item, front: true });
128
+ } else {
129
+ navigation.push(ScreenNames.AssetInformation, { loan: item });
130
+ }
131
+ };
132
+
133
+ const goLoanInfo = () => {
134
+ navigation.push(ScreenNames.ReviewLoan, { loan: item });
135
+ };
136
+
137
+ const goPersonal = () => {
138
+ if (step === 4) {
139
+ navigation.push(ScreenNames.OCR, { loan: item, front: true });
140
+ } else if (step === 5) {
141
+ navigation.push(
142
+ item?.typeLoan === 5
143
+ ? ScreenNames.ReviewInformation
144
+ : ScreenNames.TopupLoanInfo,
145
+ { loan: item }
146
+ );
147
+ } else if (step === 6) {
148
+ navigation.push(ScreenNames.ReviewInformationOther, { loan: item });
149
+ }
150
+ };
151
+
152
+ const goEkyc = () => {
153
+ navigation.push(ScreenNames.LivenessV2, { loan: item });
154
+ };
155
+
156
+ const goSign = () => {
157
+ navigation.push(ScreenNames.TTSSignLoan, { loan: item });
158
+ };
159
+
160
+ // Nút "Cập nhật" / "Ký hợp đồng" ở phần trạng thái, theo bước hiện tại
161
+ const primaryAction =
162
+ step <= 1
163
+ ? { label: 'Cập nhật', onPress: goAsset }
164
+ : step === 3
165
+ ? { label: 'Cập nhật', onPress: goLoanInfo }
166
+ : isPersonalStep
167
+ ? { label: 'Cập nhật', onPress: goPersonal }
168
+ : step === 9
169
+ ? { label: 'Cập nhật', onPress: goEkyc }
170
+ : step === 10
171
+ ? { label: 'Ký hợp đồng', onPress: goSign }
172
+ : null;
173
+
55
174
  return (
56
175
  <>
57
- <View
58
- style={{
59
- backgroundColor: '#FFFFFF',
60
- paddingHorizontal: 16,
61
- marginBottom: 16,
62
- borderRadius: 8,
63
- borderWidth: 0.5,
64
- borderColor: '#E0E0E0',
65
- }}
66
- >
176
+ <View style={styles.card}>
67
177
  <LinearGradient
68
- colors={
69
- item?.listLoanAllAutoDE && item?.listLoanAllAutoDE.length > 0
70
- ? ['#4CBA3D', '#98D788']
71
- : ['#FF8E4F', '#EF592E']
72
- }
73
- style={{
74
- borderTopLeftRadius: 8,
75
- borderTopRightRadius: 8,
76
- marginHorizontal: -16,
77
- }}
178
+ colors={hasAutoDE ? ['#4CBA3D', '#98D788'] : GRADIENT_ORANGE}
179
+ style={styles.headerGradient}
78
180
  >
79
- <View
80
- style={{
81
- flexDirection: 'row',
82
- justifyContent: 'space-between',
83
- alignItems: 'center',
84
- paddingHorizontal: 16,
85
- paddingVertical: 8,
86
- }}
87
- >
88
- <View
89
- style={{
90
- flexDirection: 'row',
91
- alignItems: 'center',
92
- gap: 8,
93
- }}
94
- >
181
+ <View style={styles.headerRow}>
182
+ <View style={styles.headerLeft}>
95
183
  <IconMoney2 />
96
- <MText
97
- style={{
98
- fontSize: 12,
99
- color: 'white',
100
- }}
101
- >
102
- HD-{item?.id}
103
- </MText>
184
+ <MText style={styles.headerText}>HD-{item?.id}</MText>
104
185
  </View>
105
- <MText
106
- style={{
107
- fontSize: 12,
108
- color: 'white',
109
- fontWeight: 'bold',
110
- }}
111
- >
112
- {item?.listLoanAllAutoDE && item?.listLoanAllAutoDE.length > 0
113
- ? formatMoney(
114
- item?.listLoanAllAutoDE.reduce(
115
- (sum, item) => sum + item.totalMoney,
116
- 0
117
- )
118
- )
119
- : formatMoney(item?.loanAmount)}
120
- đ
186
+ <MText style={styles.headerAmount}>
187
+ {formatMoney(hasAutoDE ? sumBy('totalMoney') : item?.loanAmount)}đ
121
188
  </MText>
122
189
  </View>
123
190
  </LinearGradient>
124
191
 
125
- {item?.listLoanAllAutoDE && item?.listLoanAllAutoDE.length > 0 && (
126
- <View
127
- style={{
128
- marginHorizontal: -16,
129
- backgroundColor: '#ECFFE8',
130
- paddingHorizontal: 16,
131
- paddingVertical: 8,
132
- }}
133
- >
134
- <View
135
- style={{
136
- flexDirection: 'row',
137
- justifyContent: 'space-between',
138
- }}
139
- >
140
- <MText
141
- style={{
142
- fontSize: 10,
143
- color: '#878787',
144
- marginLeft: 24,
145
- }}
146
- >
147
- Số tiền giải ngân
148
- </MText>
149
- <MText
150
- style={{
151
- fontSize: 10,
152
- color: '#333333',
153
- }}
154
- >
155
- {formatMoney(
156
- item?.listLoanAllAutoDE.reduce(
157
- (sum, item) => sum + item.loanAmount,
158
- 0
159
- )
160
- )}{' '}
161
- đ
192
+ {hasAutoDE && (
193
+ <View style={styles.autoDESummary}>
194
+ <View style={styles.spaceBetween}>
195
+ <MText style={styles.summaryLabel}>Số tiền giải ngân</MText>
196
+ <MText style={styles.summaryValue}>
197
+ {formatMoney(sumBy('loanAmount'))} đ
162
198
  </MText>
163
199
  </View>
164
- <View
165
- style={{
166
- flexDirection: 'row',
167
- justifyContent: 'space-between',
168
- marginTop: 6,
169
- }}
170
- >
171
- <MText
172
- style={{
173
- fontSize: 10,
174
- color: '#878787',
175
- marginLeft: 24,
176
- }}
177
- >
178
- Số tiền bảo hiểm
179
- </MText>
180
- <MText
181
- style={{
182
- fontSize: 10,
183
- color: '#333333',
184
- }}
185
- >
186
- {formatMoney(
187
- item?.listLoanAllAutoDE.reduce(
188
- (sum, item) => sum + item.insurenceMoney,
189
- 0
190
- )
191
- )}{' '}
192
- đ
200
+ <View style={[styles.spaceBetween, styles.summaryRowSpacing]}>
201
+ <MText style={styles.summaryLabel}>Số tiền bảo hiểm</MText>
202
+ <MText style={styles.summaryValue}>
203
+ {formatMoney(sumBy('insurenceMoney'))} đ
193
204
  </MText>
194
205
  </View>
195
206
  </View>
196
207
  )}
197
208
 
198
- <View
199
- style={{
200
- flexDirection: 'row',
201
- justifyContent: 'space-between',
202
- marginTop:
203
- item?.listLoanAllAutoDE && item?.listLoanAllAutoDE.length > 0
204
- ? 16
205
- : 32,
206
- // paddingHorizontal: 16,
207
- }}
208
- >
209
+ <View style={[styles.stepsRow, { marginTop: hasAutoDE ? 16 : 32 }]}>
209
210
  {/* Đơn topup = 6 sẽ không có phần thông tin tài sản */}
210
211
  {(item?.typeLoan === 5 || item.typeLoan === 7) && (
211
- <TouchableOpacity
212
- disabled={item?.step === 0 || item?.step === 1 ? false : true}
213
- style={$action}
214
- onPress={() => {
215
- if (item?.typeLoan === 7) {
216
- navigation.push(ScreenNames.LoanBuyCar, {
217
- loan: item,
218
- });
219
- } else {
220
- if (item?.step === 0) {
221
- navigation.push(ScreenNames.VehicleCamera, {
222
- loan: item,
223
- front: true,
224
- });
225
- } else {
226
- navigation.push(ScreenNames.AssetInformation, {
227
- loan: item,
228
- });
229
- }
230
- }
231
- }}
232
- >
233
- {item?.step <= 1 ? <IconStep1 /> : <IconStep1Success />}
234
- <MText
235
- style={{
236
- textAlign: 'center',
237
- fontSize: 10,
238
- marginTop: 5,
239
- color: item?.step <= 1 ? '#EF592E' : '#333333',
240
- }}
241
- >
242
- Thông tin{'\n'}tài sản
243
- </MText>
244
- </TouchableOpacity>
212
+ <StepAction
213
+ disabled={!(step === 0 || step === 1)}
214
+ onPress={goAsset}
215
+ icon={step <= 1 ? <IconStep1 /> : <IconStep1Success />}
216
+ label={'Thông tin\ntài sản'}
217
+ color={step <= 1 ? COLOR_ACTIVE : COLOR_DONE}
218
+ />
245
219
  )}
246
- <TouchableOpacity
247
- disabled={item?.step === 3 ? false : true}
248
- style={$action}
249
- onPress={() => {
250
- navigation.push(ScreenNames.ReviewLoan, {
251
- loan: item,
252
- });
253
- }}
254
- >
255
- {item?.step < 3 ? (
256
- <IconStep2Disable />
257
- ) : item?.step === 3 ? (
258
- <IconStep2 />
259
- ) : (
260
- <IconStep2Success />
261
- )}
262
- <MText
263
- style={{
264
- textAlign: 'center',
265
- fontSize: 10,
266
- marginTop: 5,
267
- color:
268
- item?.step < 3
269
- ? '#999999'
270
- : item?.step === 3
271
- ? '#EF592E'
272
- : '#333333',
273
- }}
274
- >
275
- Thông tin{'\n'}khoản vay
276
- </MText>
277
- </TouchableOpacity>
278
- <TouchableOpacity
279
- disabled={
280
- item?.step === 4 || item?.step === 5 || item?.step === 6
281
- ? false
282
- : true
220
+ <StepAction
221
+ disabled={step !== 3}
222
+ onPress={goLoanInfo}
223
+ icon={
224
+ step < 3 ? (
225
+ <IconStep2Disable />
226
+ ) : step === 3 ? (
227
+ <IconStep2 />
228
+ ) : (
229
+ <IconStep2Success />
230
+ )
283
231
  }
284
- style={$action}
285
- onPress={() => {
286
- if (item?.step === 4) {
287
- navigation.push(ScreenNames.OCR, {
288
- loan: item,
289
- front: true,
290
- });
291
- } else if (item?.step === 5) {
292
- if (item?.typeLoan === 5) {
293
- navigation.push(ScreenNames.ReviewInformation, {
294
- loan: item,
295
- });
296
- } else {
297
- navigation.push(ScreenNames.TopupLoanInfo, {
298
- loan: item,
299
- });
300
- }
301
- } else if (item?.step === 6) {
302
- navigation.push(ScreenNames.ReviewInformationOther, {
303
- loan: item,
304
- });
305
- }
306
- }}
307
- >
308
- {item?.step < 4 ? (
309
- <IconStep3Disable />
310
- ) : item?.step === 4 || item?.step === 5 || item?.step === 6 ? (
311
- <IconStep3 />
312
- ) : (
313
- <IconStep3Success />
314
- )}
315
- <MText
316
- style={{
317
- textAlign: 'center',
318
- fontSize: 10,
319
- marginTop: 5,
320
- color:
321
- item?.step < 4
322
- ? '#999999'
323
- : item?.step === 4 || item?.step === 5 || item?.step === 6
324
- ? '#EF592E'
325
- : '#333333',
326
- }}
327
- >
328
- Thông tin{'\n'}cá nhân
329
- </MText>
330
- </TouchableOpacity>
331
- <TouchableOpacity
332
- disabled={item?.step === 9 ? false : true}
333
- style={$action}
334
- onPress={() => {
335
- navigation.push(ScreenNames.LivenessV2, {
336
- loan: item,
337
- });
338
- }}
339
- >
340
- {item?.step < 9 || item?.step === 100 ? (
341
- <IconStep4Disable />
342
- ) : item?.step === 9 ? (
343
- <IconStep4 />
344
- ) : (
345
- <IconStep4Success />
346
- )}
347
- <MText
348
- style={{
349
- textAlign: 'center',
350
- fontSize: 10,
351
- marginTop: 5,
352
- color:
353
- item?.step < 9 || item?.step === 100
354
- ? '#999999'
355
- : item?.step === 9
356
- ? '#EF592E'
357
- : '#333333',
358
- }}
359
- >
360
- EKYC
361
- </MText>
362
- </TouchableOpacity>
363
- <TouchableOpacity
364
- disabled={item?.step === 10 ? false : true}
365
- style={$action}
366
- onPress={() => {
367
- navigation.push(ScreenNames.TTSSignLoan, {
368
- loan: item,
369
- });
370
- }}
371
- >
372
- {item?.step < 10 || item?.step === 100 ? (
373
- <IconStep5Disable />
374
- ) : item?.step === 10 ? (
375
- <IconStep5 />
376
- ) : (
377
- <IconStep5Success />
378
- )}
379
- <MText
380
- style={{
381
- textAlign: 'center',
382
- fontSize: 10,
383
- marginTop: 5,
384
- color:
385
- item?.step < 10 || item?.step === 100
386
- ? '#999999'
387
- : item?.step === 10
388
- ? '#EF592E'
389
- : '#333333',
390
- }}
391
- >
392
- Ký hợp{'\n'}đồng
393
- </MText>
394
- </TouchableOpacity>
232
+ label={'Thông tin\nkhoản vay'}
233
+ color={
234
+ step < 3 ? COLOR_DISABLED : step === 3 ? COLOR_ACTIVE : COLOR_DONE
235
+ }
236
+ />
237
+ <StepAction
238
+ disabled={!isPersonalStep}
239
+ onPress={goPersonal}
240
+ icon={
241
+ step < 4 ? (
242
+ <IconStep3Disable />
243
+ ) : isPersonalStep ? (
244
+ <IconStep3 />
245
+ ) : (
246
+ <IconStep3Success />
247
+ )
248
+ }
249
+ label={'Thông tin\ncá nhân'}
250
+ color={
251
+ step < 4
252
+ ? COLOR_DISABLED
253
+ : isPersonalStep
254
+ ? COLOR_ACTIVE
255
+ : COLOR_DONE
256
+ }
257
+ />
258
+ <StepAction
259
+ disabled={step !== 9}
260
+ onPress={goEkyc}
261
+ icon={
262
+ step < 9 || step === 100 ? (
263
+ <IconStep4Disable />
264
+ ) : step === 9 ? (
265
+ <IconStep4 />
266
+ ) : (
267
+ <IconStep4Success />
268
+ )
269
+ }
270
+ label="EKYC"
271
+ color={
272
+ step < 9 || step === 100
273
+ ? COLOR_DISABLED
274
+ : step === 9
275
+ ? COLOR_ACTIVE
276
+ : COLOR_DONE
277
+ }
278
+ />
279
+ <StepAction
280
+ disabled={step !== 10}
281
+ onPress={goSign}
282
+ icon={
283
+ step < 10 || step === 100 ? (
284
+ <IconStep5Disable />
285
+ ) : step === 10 ? (
286
+ <IconStep5 />
287
+ ) : (
288
+ <IconStep5Success />
289
+ )
290
+ }
291
+ label={'Ký hợp\nđồng'}
292
+ color={
293
+ step < 10 || step === 100
294
+ ? COLOR_DISABLED
295
+ : step === 10
296
+ ? COLOR_ACTIVE
297
+ : COLOR_DONE
298
+ }
299
+ />
395
300
  </View>
396
301
 
397
- {item?.step !== 11 ? (
398
- <View
399
- style={{
400
- backgroundColor: '#EEF7FF',
401
- flexDirection: 'row',
402
- alignItems: 'center',
403
- gap: 4,
404
- borderRadius: 4,
405
- paddingHorizontal: 8,
406
- paddingVertical: 10,
407
- marginTop: 16,
408
- }}
409
- >
302
+ {step !== 11 ? (
303
+ <View style={styles.guideBanner}>
410
304
  <IconQuestion />
411
- <MText
412
- style={{
413
- fontSize: 10,
414
- flex: 1,
415
- }}
416
- >
305
+ <MText style={styles.guideBannerText}>
417
306
  Hướng dẫn các bước hoàn thiện đơn vay
418
307
  </MText>
419
308
  <TouchableOpacity onPress={() => setShowModal(true)}>
420
- <MText
421
- style={{
422
- fontSize: 10,
423
- color: '#2F80ED',
424
- textDecorationLine: 'underline',
425
- }}
426
- >
427
- Xem thêm
428
- </MText>
309
+ <MText style={styles.linkText}>Xem thêm</MText>
429
310
  </TouchableOpacity>
430
311
  </View>
431
312
  ) : (
432
- <View
433
- style={{
434
- backgroundColor: '#E8FFE9',
435
- flexDirection: 'row',
436
- alignItems: 'center',
437
- gap: 8,
438
- borderRadius: 4,
439
- paddingHorizontal: 8,
440
- paddingVertical: 10,
441
- marginTop: 16,
442
- }}
443
- >
313
+ <View style={styles.successBanner}>
444
314
  <IconTick />
445
- <MText style={{ color: '#28A745', fontSize: 10, flex: 1 }}>
315
+ <MText style={styles.successText}>
446
316
  Hợp đồng đã ký thành công. Quý khách vui lòng chờ Chuyên viên tư
447
317
  vấn liên hệ để hoàn tất bước giải ngân.
448
318
  </MText>
449
319
  </View>
450
320
  )}
451
321
 
452
- {item?.step !== 11 ? (
322
+ {step !== 11 && (
453
323
  <View style={$row}>
454
- <View style={{ flex: 1, paddingRight: 24 }}>
455
- <MText
456
- style={{
457
- color: '#999999',
458
- fontSize: 12,
459
- }}
460
- >
461
- Trạng thái
462
- </MText>
463
- <MText
464
- style={{
465
- fontSize: 12,
466
- fontWeight: 'bold',
467
- }}
468
- >
469
- {item?.step <= 1
324
+ <View style={styles.statusLeft}>
325
+ <MText style={styles.statusLabel}>Trạng thái</MText>
326
+ <MText style={styles.statusValue}>
327
+ {step <= 1
470
328
  ? 'Chờ cập nhật thông tin tài sản'
471
- : item?.step === 3
472
- ? `Chờ cập nhật thông tin khoản vay`
473
- : item?.step === 4 || item?.step === 5 || item?.step === 6
474
- ? `Chờ cập nhật thông tin cá nhân`
475
- : item?.step === 9
476
- ? `Chờ cập nhật eKYC`
477
- : item?.step === 11
478
- ? `Hợp đồng đã ký thành công. Vui lòng chờ chuyên viên tư vấn liên hệ`
329
+ : step === 3
330
+ ? 'Chờ cập nhật thông tin khoản vay'
331
+ : isPersonalStep
332
+ ? 'Chờ cập nhật thông tin cá nhân'
333
+ : step === 9
334
+ ? 'Chờ cập nhật eKYC'
479
335
  : 'Đơn vay đang trong quá trình xử lý'}
480
336
  </MText>
481
337
  </View>
482
- {item?.step <= 1 ? (
483
- <TouchableOpacity
484
- onPress={() => {
485
- if (item?.typeLoan === 7) {
486
- navigation.push(ScreenNames.LoanBuyCar, {
487
- loan: item,
488
- });
489
- } else {
490
- if (item?.step === 0) {
491
- navigation.push(ScreenNames.VehicleCamera, {
492
- loan: item,
493
- front: true,
494
- });
495
- } else {
496
- navigation.push(ScreenNames.AssetInformation, {
497
- loan: item,
498
- });
499
- }
500
- }
501
- }}
502
- >
503
- <LinearGradient
504
- colors={['#FF8E4F', '#EF592E']}
505
- style={{
506
- height: 30,
507
- alignItems: 'center',
508
- justifyContent: 'center',
509
- borderRadius: 24,
510
- paddingHorizontal: 10,
511
- }}
512
- >
513
- <MText
514
- style={{
515
- color: 'white',
516
- fontSize: 12,
517
- }}
518
- >
519
- Cập nhật
520
- </MText>
521
- </LinearGradient>
522
- </TouchableOpacity>
523
- ) : item?.step === 3 ? (
524
- <TouchableOpacity
525
- onPress={() => {
526
- if (item?.step === 3) {
527
- navigation.push(ScreenNames.ReviewLoan, {
528
- loan: item,
529
- });
530
- }
531
- }}
532
- >
533
- <LinearGradient
534
- colors={['#FF8E4F', '#EF592E']}
535
- style={{
536
- height: 30,
537
- alignItems: 'center',
538
- justifyContent: 'center',
539
- borderRadius: 24,
540
- paddingHorizontal: 10,
541
- }}
542
- >
543
- <MText
544
- style={{
545
- color: 'white',
546
- fontSize: 12,
547
- }}
548
- >
549
- Cập nhật
550
- </MText>
551
- </LinearGradient>
552
- </TouchableOpacity>
553
- ) : item?.step === 4 || item?.step === 5 || item?.step === 6 ? (
554
- <TouchableOpacity
555
- onPress={() => {
556
- if (item?.step === 4) {
557
- navigation.push(ScreenNames.OCR, {
558
- loan: item,
559
- front: true,
560
- });
561
- } else if (item?.step === 5) {
562
- if (item?.typeLoan === 5) {
563
- navigation.push(ScreenNames.ReviewInformation, {
564
- loan: item,
565
- });
566
- } else {
567
- navigation.push(ScreenNames.TopupLoanInfo, {
568
- loan: item,
569
- });
570
- }
571
- } else if (item?.step === 6) {
572
- navigation.push(ScreenNames.ReviewInformationOther, {
573
- loan: item,
574
- });
575
- }
576
- }}
577
- >
578
- <LinearGradient
579
- colors={['#FF8E4F', '#EF592E']}
580
- style={{
581
- height: 30,
582
- alignItems: 'center',
583
- justifyContent: 'center',
584
- borderRadius: 24,
585
- paddingHorizontal: 10,
586
- }}
587
- >
588
- <MText
589
- style={{
590
- color: 'white',
591
- fontSize: 12,
592
- }}
593
- >
594
- Cập nhật
595
- </MText>
596
- </LinearGradient>
597
- </TouchableOpacity>
598
- ) : item?.step === 9 ? (
599
- <TouchableOpacity
600
- onPress={() => {
601
- navigation.push(ScreenNames.LivenessV2, {
602
- loan: item,
603
- });
604
- }}
605
- >
606
- <LinearGradient
607
- colors={['#FF8E4F', '#EF592E']}
608
- style={{
609
- height: 30,
610
- alignItems: 'center',
611
- justifyContent: 'center',
612
- borderRadius: 24,
613
- paddingHorizontal: 10,
614
- }}
615
- >
616
- <MText
617
- style={{
618
- color: 'white',
619
- fontSize: 12,
620
- }}
621
- >
622
- Cập nhật
623
- </MText>
624
- </LinearGradient>
625
- </TouchableOpacity>
626
- ) : item?.step === 10 ? (
627
- <TouchableOpacity
628
- onPress={() => {
629
- navigation.push(ScreenNames.TTSSignLoan, {
630
- loan: item,
631
- });
632
- }}
633
- >
634
- <LinearGradient
635
- colors={['#FF8E4F', '#EF592E']}
636
- style={{
637
- height: 30,
638
- alignItems: 'center',
639
- justifyContent: 'center',
640
- borderRadius: 24,
641
- paddingHorizontal: 10,
642
- }}
643
- >
644
- <MText
645
- style={{
646
- color: 'white',
647
- fontSize: 12,
648
- }}
649
- >
650
- Ký hợp đồng
651
- </MText>
652
- </LinearGradient>
653
- </TouchableOpacity>
654
- ) : (
655
- <></>
338
+ {primaryAction && (
339
+ <UpdateButton
340
+ label={primaryAction.label}
341
+ onPress={primaryAction.onPress}
342
+ />
656
343
  )}
657
344
  </View>
658
- ) : (
659
- <></>
660
345
  )}
661
346
 
662
- {item?.listLoanAllAutoDE && item?.listLoanAllAutoDE.length > 0 && (
347
+ {hasAutoDE && (
663
348
  <View>
664
- <MText
665
- style={{
666
- fontSize: 12,
667
- fontWeight: 'bold',
668
- marginTop: 16,
669
- color: '#333333',
670
- }}
671
- >
672
- Danh sách đơn chia nhỏ
673
- </MText>
674
- {item?.listLoanAllAutoDE.map((x, index) => (
349
+ <MText style={styles.autoDETitle}>Danh sách đơn chia nhỏ</MText>
350
+ {autoDEList.map((x, index) => (
675
351
  <View
676
352
  key={index}
677
- style={{
678
- marginTop: 8,
679
- borderBottomWidth:
680
- index + 1 === item?.listLoanAllAutoDE.length ? 0 : 1,
681
- borderColor: '#E0E0E0',
682
- paddingBottom: 8,
683
- }}
353
+ style={[
354
+ styles.autoDEItem,
355
+ index + 1 !== autoDEList.length && styles.autoDEItemDivider,
356
+ ]}
684
357
  >
685
- <View
686
- style={{
687
- flexDirection: 'row',
688
- justifyContent: 'space-between',
689
- }}
690
- >
691
- <View
692
- style={{
693
- flexDirection: 'row',
694
- alignItems: 'center',
695
- gap: 10,
696
- }}
697
- >
358
+ <View style={styles.spaceBetween}>
359
+ <View style={styles.autoDEItemLeft}>
698
360
  <IconTima16 />
699
- <MText
700
- style={[
701
- commonStyles.textNormal,
702
- {
703
- color: '#333333',
704
- fontSize: 12,
705
- },
706
- ]}
707
- >
361
+ <MText style={[commonStyles.textNormal, styles.autoDEText]}>
708
362
  HD-{x?.loanBriefId} ({index + 1})
709
363
  </MText>
710
364
  </View>
711
365
  <MText
712
- style={[
713
- commonStyles.textNormalBold,
714
- {
715
- color: '#333333',
716
- fontSize: 12,
717
- },
718
- ]}
366
+ style={[commonStyles.textNormalBold, styles.autoDEText]}
719
367
  >
720
368
  {formatMoney(x?.totalMoney)} đ
721
369
  </MText>
@@ -724,356 +372,77 @@ export default function ItemTimaOneV3({ item, navigation }: IProps) {
724
372
  ))}
725
373
  </View>
726
374
  )}
727
- {item?.listLoanAllAutoDE && item?.listLoanAllAutoDE.length > 0 && (
375
+ {hasAutoDE && (
728
376
  <TouchableOpacity
729
377
  onPress={() => {
730
- navigation.push(ScreenNames.LoanInterestRate, {
731
- loan: item,
732
- });
733
- }}
734
- style={{
735
- flex: 1,
736
- alignItems: 'center',
737
- backgroundColor: '#EDF6FF',
738
- marginHorizontal: -16,
739
- paddingVertical: 10,
378
+ navigation.push(ScreenNames.LoanInterestRate, { loan: item });
740
379
  }}
380
+ style={styles.interestRateButton}
741
381
  >
742
- <MText
743
- style={[
744
- {
745
- fontSize: 12,
746
- color: '#2F80ED',
747
- },
748
- ]}
749
- >
382
+ <MText style={styles.interestRateText}>
750
383
  Bảng biểu lãi phí đơn vay {`->`}
751
384
  </MText>
752
385
  </TouchableOpacity>
753
386
  )}
754
- {item?.step !== 11 ? (
755
- <View
756
- style={{
757
- flexDirection: 'row',
758
- alignItems: 'center',
759
- gap: 8,
760
- backgroundColor: '#FFF2F2',
761
- marginHorizontal: -16,
762
- paddingVertical: 10,
763
- borderBottomRightRadius: 8,
764
- borderBottomLeftRadius: 8,
765
- paddingHorizontal: 10,
766
- }}
767
- >
387
+ {step !== 11 && (
388
+ <View style={styles.warningBanner}>
768
389
  <Info />
769
- <MText
770
- style={[
771
- {
772
- fontSize: 10,
773
- color: '#E40010',
774
- flex: 1,
775
- },
776
- ]}
777
- >
778
- {item?.step <= 1
390
+ <MText style={styles.warningText}>
391
+ {step <= 1
779
392
  ? 'Vui lòng cập nhật thông tin tài sản để được giải ngân sớm nhất!'
780
- : item?.step === 3
781
- ? `Vui lòng cập nhật thông tin khoản vay để được giải ngân sớm nhất!`
782
- : item?.step === 4 || item?.step === 5 || item?.step === 6
783
- ? `Vui lòng cập nhật thông tin cá nhân để được giải ngân sớm nhất!`
784
- : item?.step === 9
785
- ? `Bước cuối cùng rồi, vui lòng ký hợp đồng để được giải ngân sớm nhất nhé!`
393
+ : step === 3
394
+ ? 'Vui lòng cập nhật thông tin khoản vay để được giải ngân sớm nhất!'
395
+ : isPersonalStep
396
+ ? 'Vui lòng cập nhật thông tin cá nhân để được giải ngân sớm nhất!'
397
+ : step === 9
398
+ ? 'Bước cuối cùng rồi, vui lòng ký hợp đồng để được giải ngân sớm nhất nhé!'
786
399
  : 'Đơn vay đang trong quá trình xử lý'}
787
400
  </MText>
788
401
  </View>
789
- ) : (
790
- <></>
791
402
  )}
792
403
  </View>
793
404
 
794
405
  <Modal isVisible={showModal} onBackdropPress={() => setShowModal(false)}>
795
- <View
796
- style={{
797
- backgroundColor: 'white',
798
- borderRadius: 8,
799
- padding: 16,
800
- }}
801
- >
802
- <MText
803
- style={{
804
- fontSize: 16,
805
- fontWeight: 'bold',
806
- textAlign: 'center',
807
- marginTop: 16,
808
- }}
809
- >
810
- Các bước hoàn thiện khoản vay
811
- </MText>
812
- <MText
813
- style={{
814
- textAlign: 'center',
815
- color: '#828282',
816
- }}
817
- >
818
- Thực hiện theo các bước sau
819
- </MText>
820
- <View>
821
- <View
822
- style={{
823
- flexDirection: 'row',
824
- alignItems: 'center',
825
- gap: 8,
826
- marginTop: 16,
827
- }}
828
- >
829
- <View
830
- style={{
831
- width: 30,
832
- height: 30,
833
- borderRadius: 4,
834
- backgroundColor: '#FFF2F2',
835
- alignItems: 'center',
836
- justifyContent: 'center',
837
- }}
838
- >
839
- <Icon1 />
840
- </View>
841
- <View>
842
- <MText
843
- style={{ fontWeight: 'bold', fontSize: 8, color: '#EF592E' }}
844
- >
845
- Bước 1
846
- </MText>
847
- <MText style={{ fontWeight: 'bold', fontSize: 10 }}>
848
- THÔNG TIN XE
849
- </MText>
850
- </View>
851
- </View>
852
- <MText style={{ fontSize: 10, marginTop: 5 }}>
853
- Chụp 2 mặt hình ảnh Đăng ký xe
854
- </MText>
855
- </View>
856
- <View>
857
- <View
858
- style={{
859
- flexDirection: 'row',
860
- alignItems: 'center',
861
- gap: 8,
862
- marginTop: 16,
863
- }}
864
- >
865
- <View
866
- style={{
867
- width: 30,
868
- height: 30,
869
- borderRadius: 4,
870
- backgroundColor: '#FFF2F2',
871
- alignItems: 'center',
872
- justifyContent: 'center',
873
- }}
874
- >
875
- <Icon2 />
876
- </View>
877
- <View>
878
- <MText
879
- style={{ fontWeight: 'bold', fontSize: 8, color: '#EF592E' }}
880
- >
881
- Bước 2
882
- </MText>
883
- <MText style={{ fontWeight: 'bold', fontSize: 10 }}>
884
- THÔNG TIN KHOẢN VAY
885
- </MText>
886
- </View>
887
- </View>
888
- <MText style={{ fontSize: 10, marginTop: 5 }}>
889
- Lựa chọn: Số tiền vay, Thời hạn vay, ...
890
- </MText>
891
- </View>
892
- <View>
893
- <View
894
- style={{
895
- flexDirection: 'row',
896
- alignItems: 'center',
897
- gap: 8,
898
- marginTop: 16,
899
- }}
900
- >
901
- <View
902
- style={{
903
- width: 30,
904
- height: 30,
905
- borderRadius: 4,
906
- backgroundColor: '#FFF2F2',
907
- alignItems: 'center',
908
- justifyContent: 'center',
909
- }}
910
- >
911
- <Icon3 />
912
- </View>
913
- <View>
914
- <MText
915
- style={{ fontWeight: 'bold', fontSize: 8, color: '#EF592E' }}
916
- >
917
- Bước 3
918
- </MText>
919
- <MText style={{ fontWeight: 'bold', fontSize: 10 }}>
920
- THÔNG TIN CÁ NHÂN
921
- </MText>
922
- </View>
923
- </View>
924
- <MText style={{ fontSize: 10, marginTop: 5 }}>
925
- Thực hiện NFC/ OCR giấy tờ CCCD/CC và chụp 1 ảnh chân dung
926
- </MText>
927
- </View>
928
- <View>
929
- <View
930
- style={{
931
- flexDirection: 'row',
932
- alignItems: 'center',
933
- gap: 8,
934
- marginTop: 16,
935
- }}
936
- >
937
- <View
938
- style={{
939
- width: 30,
940
- height: 30,
941
- borderRadius: 4,
942
- backgroundColor: '#FFF2F2',
943
- alignItems: 'center',
944
- justifyContent: 'center',
945
- }}
946
- >
947
- <Icon4 />
948
- </View>
949
- <View>
950
- <MText
951
- style={{ fontWeight: 'bold', fontSize: 8, color: '#EF592E' }}
952
- >
953
- Bước 4
954
- </MText>
955
- <MText style={{ fontWeight: 'bold', fontSize: 10 }}>EKYC</MText>
956
- </View>
957
- </View>
958
- <MText style={{ fontSize: 10, marginTop: 5 }}>
959
- Thực hiện eKYC khuôn mặt
960
- </MText>
961
- </View>
962
- <View>
963
- <View
964
- style={{
965
- flexDirection: 'row',
966
- alignItems: 'center',
967
- gap: 8,
968
- marginTop: 16,
969
- }}
970
- >
971
- <View
972
- style={{
973
- width: 30,
974
- height: 30,
975
- borderRadius: 4,
976
- backgroundColor: '#FFF2F2',
977
- alignItems: 'center',
978
- justifyContent: 'center',
979
- }}
980
- >
981
- <Icon5 />
982
- </View>
983
- <View>
984
- <MText
985
- style={{ fontWeight: 'bold', fontSize: 8, color: '#EF592E' }}
986
- >
987
- Bước 5
988
- </MText>
989
- <MText style={{ fontWeight: 'bold', fontSize: 10 }}>
990
- KÝ HỢP ĐỒNG
991
- </MText>
406
+ <View style={styles.modalCard}>
407
+ <MText style={styles.modalTitle}>Các bước hoàn thiện khoản vay</MText>
408
+ {GUIDE_STEPS.map(({ icon: StepIcon, title, description }, index) => (
409
+ <React.Fragment key={title}>
410
+ <View style={styles.guideStepRow}>
411
+ <View style={styles.guideStepIconBox}>
412
+ <StepIcon />
413
+ </View>
414
+ <View>
415
+ <MText style={styles.guideStepBadge}>Bước {index + 1}</MText>
416
+ <MText style={styles.guideStepTitle}>{title}</MText>
417
+ {!!description && (
418
+ <MText style={styles.guideStepDesc}>{description}</MText>
419
+ )}
420
+ </View>
992
421
  </View>
993
- </View>
994
- <MText style={{ fontSize: 10, marginTop: 5 }}>
995
- số bằng OTP hoặc qua Ứng dụng Mysign
996
- </MText>
997
- <MText style={{ fontSize: 10, color: '#999999' }}>
998
- Lưu ý: Để bảo mật thông tin cá nhân, hợp đồng sẽ được ký tại
999
- Viettel qua Ứng dụng MySign, Website hopdongdientu.viettel.vn,...
1000
- </MText>
1001
- </View>
422
+ {index < GUIDE_STEPS.length - 1 && (
423
+ <View style={styles.dashedDivider}>
424
+ <View style={styles.dashedDividerInner} />
425
+ </View>
426
+ )}
427
+ </React.Fragment>
428
+ ))}
1002
429
 
1003
- <View
1004
- style={{
1005
- backgroundColor: '#FFF8F2',
1006
- padding: 12,
1007
- borderRadius: 8,
1008
- marginTop: 16,
1009
- }}
1010
- >
1011
- <MText style={{ fontSize: 12, fontWeight: 'bold' }}>
1012
- Ý nghĩa biểu tượng
1013
- </MText>
1014
- <View
1015
- style={{
1016
- flexDirection: 'row',
1017
- alignItems: 'center',
1018
- gap: 16,
1019
- marginTop: 8,
1020
- }}
1021
- >
1022
- <MText style={{ fontSize: 10, width: '35%' }}>
1023
- Đang cần thực hiện
1024
- </MText>
1025
- <View
1026
- style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}
1027
- >
1028
- <Icon1 />
1029
- <Icon2 />
1030
- <Icon3 />
1031
- <Icon4 />
1032
- <Icon5 />
1033
- </View>
1034
- </View>
1035
- <View
1036
- style={{
1037
- flexDirection: 'row',
1038
- alignItems: 'center',
1039
- gap: 16,
1040
- marginTop: 8,
1041
- }}
1042
- >
1043
- <MText style={{ fontSize: 10, width: '35%' }}>
1044
- Chưa thể thực hiện
1045
- </MText>
1046
- <View
1047
- style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}
1048
- >
1049
- <Icon6 />
1050
- <Icon7 />
1051
- <Icon8 />
1052
- <Icon9 />
1053
- <Icon10 />
1054
- </View>
1055
- </View>
1056
- <View
1057
- style={{
1058
- flexDirection: 'row',
1059
- alignItems: 'center',
1060
- gap: 16,
1061
- marginTop: 8,
1062
- }}
1063
- >
1064
- <MText style={{ fontSize: 10, width: '35%' }}>
1065
- Đã hoàn thành
1066
- </MText>
1067
- <View
1068
- style={{ flexDirection: 'row', alignItems: 'center', gap: 8 }}
1069
- >
1070
- <IconSuccess />
430
+ <View style={styles.legendBox}>
431
+ <MText style={styles.legendTitle}>Ý nghĩa biểu tượng</MText>
432
+ {LEGEND_ROWS.map(({ label, icons }) => (
433
+ <View key={label} style={styles.legendRow}>
434
+ <MText style={styles.legendLabel}>{label}</MText>
435
+ <View style={styles.legendIcons}>
436
+ {icons.map((LegendIcon, index) => (
437
+ <LegendIcon key={index} />
438
+ ))}
439
+ </View>
1071
440
  </View>
1072
- </View>
441
+ ))}
1073
442
  </View>
1074
443
 
1075
444
  <TouchableOpacity
1076
- style={{ position: 'absolute', top: 16, right: 16 }}
445
+ style={styles.modalClose}
1077
446
  onPress={() => setShowModal(false)}
1078
447
  >
1079
448
  <Close2Icon />
@@ -1083,10 +452,269 @@ export default function ItemTimaOneV3({ item, navigation }: IProps) {
1083
452
  </>
1084
453
  );
1085
454
  }
455
+
1086
456
  const $row: ViewStyle = {
1087
457
  flexDirection: 'row',
1088
- // borderBottomWidth: 1,
1089
- // borderColor: '#E0E0E0',
1090
458
  paddingBottom: 16,
1091
459
  marginTop: 16,
1092
460
  };
461
+
462
+ const styles = StyleSheet.create({
463
+ action: {
464
+ flexDirection: 'column',
465
+ alignItems: 'center',
466
+ gap: 5,
467
+ },
468
+ card: {
469
+ backgroundColor: '#FFFFFF',
470
+ paddingHorizontal: 16,
471
+ marginBottom: 16,
472
+ borderRadius: 8,
473
+ borderWidth: 0.5,
474
+ borderColor: '#E0E0E0',
475
+ },
476
+ headerGradient: {
477
+ borderTopLeftRadius: 8,
478
+ borderTopRightRadius: 8,
479
+ marginHorizontal: -16,
480
+ },
481
+ headerRow: {
482
+ flexDirection: 'row',
483
+ justifyContent: 'space-between',
484
+ alignItems: 'center',
485
+ paddingHorizontal: 16,
486
+ paddingVertical: 8,
487
+ },
488
+ headerLeft: {
489
+ flexDirection: 'row',
490
+ alignItems: 'center',
491
+ gap: 8,
492
+ },
493
+ headerText: {
494
+ fontSize: 12,
495
+ color: 'white',
496
+ },
497
+ headerAmount: {
498
+ fontSize: 12,
499
+ color: 'white',
500
+ fontWeight: 'bold',
501
+ },
502
+ autoDESummary: {
503
+ marginHorizontal: -16,
504
+ backgroundColor: '#ECFFE8',
505
+ paddingHorizontal: 16,
506
+ paddingVertical: 8,
507
+ },
508
+ spaceBetween: {
509
+ flexDirection: 'row',
510
+ justifyContent: 'space-between',
511
+ },
512
+ summaryRowSpacing: {
513
+ marginTop: 6,
514
+ },
515
+ summaryLabel: {
516
+ fontSize: 10,
517
+ color: '#878787',
518
+ marginLeft: 24,
519
+ },
520
+ summaryValue: {
521
+ fontSize: 10,
522
+ color: '#333333',
523
+ },
524
+ stepsRow: {
525
+ flexDirection: 'row',
526
+ justifyContent: 'space-between',
527
+ },
528
+ stepLabel: {
529
+ textAlign: 'center',
530
+ fontSize: 10,
531
+ marginTop: 5,
532
+ },
533
+ guideBanner: {
534
+ backgroundColor: '#EEF7FF',
535
+ flexDirection: 'row',
536
+ alignItems: 'center',
537
+ gap: 4,
538
+ borderRadius: 4,
539
+ paddingHorizontal: 8,
540
+ paddingVertical: 10,
541
+ marginTop: 16,
542
+ },
543
+ guideBannerText: {
544
+ fontSize: 10,
545
+ flex: 1,
546
+ },
547
+ linkText: {
548
+ fontSize: 10,
549
+ color: '#2F80ED',
550
+ textDecorationLine: 'underline',
551
+ },
552
+ successBanner: {
553
+ backgroundColor: '#E8FFE9',
554
+ flexDirection: 'row',
555
+ alignItems: 'center',
556
+ gap: 8,
557
+ borderRadius: 4,
558
+ paddingHorizontal: 8,
559
+ paddingVertical: 10,
560
+ marginTop: 16,
561
+ },
562
+ successText: {
563
+ color: '#28A745',
564
+ fontSize: 10,
565
+ flex: 1,
566
+ },
567
+ statusLeft: {
568
+ flex: 1,
569
+ paddingRight: 24,
570
+ },
571
+ statusLabel: {
572
+ color: '#999999',
573
+ fontSize: 12,
574
+ },
575
+ statusValue: {
576
+ fontSize: 12,
577
+ fontWeight: 'bold',
578
+ },
579
+ updateButton: {
580
+ height: 30,
581
+ alignItems: 'center',
582
+ justifyContent: 'center',
583
+ borderRadius: 24,
584
+ paddingHorizontal: 10,
585
+ },
586
+ updateButtonText: {
587
+ color: 'white',
588
+ fontSize: 12,
589
+ },
590
+ autoDETitle: {
591
+ fontSize: 12,
592
+ fontWeight: 'bold',
593
+ marginTop: 16,
594
+ color: '#333333',
595
+ },
596
+ autoDEItem: {
597
+ marginTop: 8,
598
+ paddingBottom: 8,
599
+ },
600
+ autoDEItemDivider: {
601
+ borderBottomWidth: 1,
602
+ borderColor: '#E0E0E0',
603
+ },
604
+ autoDEItemLeft: {
605
+ flexDirection: 'row',
606
+ alignItems: 'center',
607
+ gap: 10,
608
+ },
609
+ autoDEText: {
610
+ color: '#333333',
611
+ fontSize: 12,
612
+ },
613
+ interestRateButton: {
614
+ flex: 1,
615
+ alignItems: 'center',
616
+ backgroundColor: '#EDF6FF',
617
+ marginHorizontal: -16,
618
+ paddingVertical: 10,
619
+ },
620
+ interestRateText: {
621
+ fontSize: 12,
622
+ color: '#2F80ED',
623
+ },
624
+ warningBanner: {
625
+ flexDirection: 'row',
626
+ alignItems: 'center',
627
+ gap: 8,
628
+ backgroundColor: '#FFF2F2',
629
+ marginHorizontal: -16,
630
+ paddingVertical: 10,
631
+ borderBottomRightRadius: 8,
632
+ borderBottomLeftRadius: 8,
633
+ paddingHorizontal: 10,
634
+ },
635
+ warningText: {
636
+ fontSize: 10,
637
+ color: '#E40010',
638
+ flex: 1,
639
+ },
640
+ modalCard: {
641
+ backgroundColor: 'white',
642
+ borderRadius: 8,
643
+ padding: 16,
644
+ },
645
+ modalTitle: {
646
+ fontSize: 16,
647
+ fontWeight: 'bold',
648
+ textAlign: 'center',
649
+ marginTop: 16,
650
+ },
651
+ guideStepRow: {
652
+ flexDirection: 'row',
653
+ alignItems: 'flex-start',
654
+ gap: 8,
655
+ marginTop: 16,
656
+ },
657
+ dashedDivider: {
658
+ height: 1,
659
+ marginTop: 16,
660
+ overflow: 'hidden',
661
+ },
662
+ dashedDividerInner: {
663
+ height: 2,
664
+ borderWidth: 1,
665
+ borderColor: '#E5E5E5',
666
+ borderStyle: 'dashed',
667
+ },
668
+ guideStepIconBox: {
669
+ width: 30,
670
+ height: 30,
671
+ borderRadius: 4,
672
+ backgroundColor: '#FFF2F2',
673
+ alignItems: 'center',
674
+ justifyContent: 'center',
675
+ },
676
+ guideStepBadge: {
677
+ fontWeight: 'bold',
678
+ fontSize: 8,
679
+ color: '#EF592E',
680
+ },
681
+ guideStepTitle: {
682
+ fontWeight: 'bold',
683
+ fontSize: 10,
684
+ marginTop: 5,
685
+ },
686
+ guideStepDesc: {
687
+ fontSize: 10,
688
+ marginTop: 5,
689
+ },
690
+ legendBox: {
691
+ backgroundColor: '#FFF8F2',
692
+ padding: 12,
693
+ borderRadius: 8,
694
+ marginTop: 16,
695
+ },
696
+ legendTitle: {
697
+ fontSize: 12,
698
+ fontWeight: 'bold',
699
+ },
700
+ legendRow: {
701
+ flexDirection: 'row',
702
+ alignItems: 'center',
703
+ gap: 16,
704
+ marginTop: 8,
705
+ },
706
+ legendLabel: {
707
+ fontSize: 10,
708
+ width: '35%',
709
+ },
710
+ legendIcons: {
711
+ flexDirection: 'row',
712
+ alignItems: 'center',
713
+ gap: 8,
714
+ },
715
+ modalClose: {
716
+ position: 'absolute',
717
+ top: 16,
718
+ right: 16,
719
+ },
720
+ });