react-native-timacare 3.3.51 → 3.3.53

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