react-native-timacare 3.3.64 → 3.3.66
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/commonjs/components/AlertLoan.js +1 -1
- package/lib/commonjs/components/AlertLoan.js.flow +12 -2
- package/lib/commonjs/components/AlertLoan.js.map +1 -1
- package/lib/commonjs/components/ItemTimaOne.js +1 -1
- package/lib/commonjs/components/ItemTimaOne.js.flow +2 -0
- package/lib/commonjs/components/ItemTimaOne.js.map +1 -1
- package/lib/commonjs/navigation/primary-navigator.js +1 -1
- package/lib/commonjs/navigation/primary-navigator.js.flow +9 -0
- package/lib/commonjs/navigation/primary-navigator.js.map +1 -1
- package/lib/commonjs/screens/full-submit/selfie.js +1 -1
- package/lib/commonjs/screens/full-submit/selfie.js.flow +257 -114
- package/lib/commonjs/screens/full-submit/selfie.js.map +1 -1
- package/lib/commonjs/screens/motobike/InfoLoanMotobike.js +1 -1
- package/lib/commonjs/screens/motobike/InfoLoanMotobike.js.flow +3 -2
- package/lib/commonjs/screens/motobike/InfoLoanMotobike.js.map +1 -1
- package/lib/commonjs/screens/motobike/ReviewLoanMotobike.js +1 -1
- package/lib/commonjs/screens/motobike/ReviewLoanMotobike.js.flow +1 -0
- package/lib/commonjs/screens/motobike/ReviewLoanMotobike.js.map +1 -1
- package/lib/commonjs/screens/selfie/SelfieCamera.js +2 -0
- package/lib/commonjs/screens/selfie/SelfieCamera.js.flow +302 -0
- package/lib/commonjs/screens/selfie/SelfieCamera.js.map +1 -0
- package/lib/commonjs/screens/selfie/index.js +1 -1
- package/lib/commonjs/screens/selfie/index.js.flow +295 -165
- package/lib/commonjs/screens/selfie/index.js.map +1 -1
- package/lib/commonjs/screens/toan-trinh-so/ReviewInformation.js +1 -1
- package/lib/commonjs/screens/toan-trinh-so/ReviewInformation.js.flow +1 -0
- package/lib/commonjs/screens/toan-trinh-so/ReviewInformation.js.map +1 -1
- package/lib/commonjs/screens/toan-trinh-so/ReviewInformationOther.js +1 -1
- package/lib/commonjs/screens/toan-trinh-so/ReviewInformationOther.js.flow +1 -0
- package/lib/commonjs/screens/toan-trinh-so/ReviewInformationOther.js.map +1 -1
- package/lib/commonjs/screens/toan-trinh-so/ReviewLoan.js +1 -1
- package/lib/commonjs/screens/toan-trinh-so/ReviewLoan.js.flow +1 -0
- package/lib/commonjs/screens/toan-trinh-so/ReviewLoan.js.map +1 -1
- package/lib/commonjs/screens/toan-trinh-so/TopupLoanInfo.js +1 -1
- package/lib/commonjs/screens/toan-trinh-so/TopupLoanInfo.js.flow +8 -5
- package/lib/commonjs/screens/toan-trinh-so/TopupLoanInfo.js.map +1 -1
- package/lib/commonjs/screens/v3/AssetInformation.js +1 -1
- package/lib/commonjs/screens/v3/AssetInformation.js.flow +1 -0
- package/lib/commonjs/screens/v3/AssetInformation.js.map +1 -1
- package/lib/commonjs/screens/v3/ReviewInfoLoanBuyCar.js +2 -0
- package/lib/commonjs/screens/v3/ReviewInfoLoanBuyCar.js.flow +522 -0
- package/lib/commonjs/screens/v3/ReviewInfoLoanBuyCar.js.map +1 -0
- package/lib/commonjs/services/api/api.js +1 -1
- package/lib/commonjs/services/api/api.js.flow +41 -7
- package/lib/commonjs/services/api/api.js.map +1 -1
- package/lib/module/components/AlertLoan.js +1 -1
- package/lib/module/components/AlertLoan.js.map +1 -1
- package/lib/module/components/ItemTimaOne.js +1 -1
- package/lib/module/components/ItemTimaOne.js.map +1 -1
- package/lib/module/navigation/primary-navigator.js +1 -1
- package/lib/module/navigation/primary-navigator.js.map +1 -1
- package/lib/module/screens/full-submit/selfie.js +1 -1
- package/lib/module/screens/full-submit/selfie.js.map +1 -1
- package/lib/module/screens/motobike/InfoLoanMotobike.js +1 -1
- package/lib/module/screens/motobike/InfoLoanMotobike.js.map +1 -1
- package/lib/module/screens/motobike/ReviewLoanMotobike.js +1 -1
- package/lib/module/screens/motobike/ReviewLoanMotobike.js.map +1 -1
- package/lib/module/screens/selfie/SelfieCamera.js +2 -0
- package/lib/module/screens/selfie/SelfieCamera.js.map +1 -0
- package/lib/module/screens/selfie/index.js +1 -1
- package/lib/module/screens/selfie/index.js.map +1 -1
- package/lib/module/screens/toan-trinh-so/ReviewInformation.js +1 -1
- package/lib/module/screens/toan-trinh-so/ReviewInformation.js.map +1 -1
- package/lib/module/screens/toan-trinh-so/ReviewInformationOther.js +1 -1
- package/lib/module/screens/toan-trinh-so/ReviewInformationOther.js.map +1 -1
- package/lib/module/screens/toan-trinh-so/ReviewLoan.js +1 -1
- package/lib/module/screens/toan-trinh-so/ReviewLoan.js.map +1 -1
- package/lib/module/screens/toan-trinh-so/TopupLoanInfo.js +1 -1
- package/lib/module/screens/toan-trinh-so/TopupLoanInfo.js.map +1 -1
- package/lib/module/screens/v3/AssetInformation.js +1 -1
- package/lib/module/screens/v3/AssetInformation.js.map +1 -1
- package/lib/module/screens/v3/ReviewInfoLoanBuyCar.js +2 -0
- package/lib/module/screens/v3/ReviewInfoLoanBuyCar.js.map +1 -0
- package/lib/module/services/api/api.js +1 -1
- package/lib/module/services/api/api.js.map +1 -1
- package/lib/typescript/components/AlertLoan.d.ts.map +1 -1
- package/lib/typescript/components/ItemTimaOne.d.ts.map +1 -1
- package/lib/typescript/navigation/primary-navigator.d.ts +2 -0
- package/lib/typescript/navigation/primary-navigator.d.ts.map +1 -1
- package/lib/typescript/screens/full-submit/selfie.d.ts.map +1 -1
- package/lib/typescript/screens/selfie/SelfieCamera.d.ts +2 -0
- package/lib/typescript/screens/selfie/SelfieCamera.d.ts.map +1 -0
- package/lib/typescript/screens/selfie/index.d.ts.map +1 -1
- package/lib/typescript/screens/toan-trinh-so/TopupLoanInfo.d.ts.map +1 -1
- package/lib/typescript/screens/v3/ReviewInfoLoanBuyCar.d.ts +2 -0
- package/lib/typescript/screens/v3/ReviewInfoLoanBuyCar.d.ts.map +1 -0
- package/lib/typescript/services/api/api.d.ts +32 -0
- package/lib/typescript/services/api/api.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/components/AlertLoan.tsx +12 -2
- package/src/components/ItemTimaOne.tsx +2 -0
- package/src/navigation/primary-navigator.tsx +9 -0
- package/src/screens/full-submit/selfie.tsx +257 -114
- package/src/screens/motobike/InfoLoanMotobike.tsx +3 -2
- package/src/screens/motobike/ReviewLoanMotobike.tsx +1 -0
- package/src/screens/selfie/SelfieCamera.tsx +302 -0
- package/src/screens/selfie/index.tsx +295 -165
- package/src/screens/toan-trinh-so/ReviewInformation.tsx +1 -0
- package/src/screens/toan-trinh-so/ReviewInformationOther.tsx +1 -0
- package/src/screens/toan-trinh-so/ReviewLoan.tsx +1 -0
- package/src/screens/toan-trinh-so/TopupLoanInfo.tsx +8 -5
- package/src/screens/v3/AssetInformation.tsx +1 -0
- package/src/screens/v3/ReviewInfoLoanBuyCar.tsx +522 -0
- package/src/services/api/api.ts +41 -7
|
@@ -1,20 +1,19 @@
|
|
|
1
1
|
//@ts-nocheck
|
|
2
2
|
import { StackActions, useNavigation } from '@react-navigation/native';
|
|
3
|
-
import { observer
|
|
4
|
-
import React, { useState } from 'react';
|
|
3
|
+
import { observer } from 'mobx-react-lite';
|
|
4
|
+
import React, { useCallback, useEffect, useRef, useState } from 'react';
|
|
5
5
|
import {
|
|
6
6
|
ActivityIndicator,
|
|
7
|
-
|
|
7
|
+
Animated,
|
|
8
|
+
Easing,
|
|
8
9
|
Image,
|
|
9
|
-
ImageStyle,
|
|
10
10
|
SafeAreaView,
|
|
11
11
|
ScrollView,
|
|
12
|
-
|
|
13
|
-
TouchableOpacity,
|
|
12
|
+
StyleSheet,
|
|
14
13
|
View,
|
|
15
14
|
} from 'react-native';
|
|
16
15
|
import LinearGradient from 'react-native-linear-gradient';
|
|
17
|
-
import { CIMBBank,
|
|
16
|
+
import { CIMBBank, IConCamera, Tick2, TimaSmall } from '../../assets/icons';
|
|
18
17
|
import CIMBLoading from '../../components/CIMBLoading';
|
|
19
18
|
import MButton from '../../components/MButton';
|
|
20
19
|
import { MText } from '../../components/MText';
|
|
@@ -23,30 +22,55 @@ import { commonStyles } from '../CommonStyles';
|
|
|
23
22
|
import FullSubmitStore from './store';
|
|
24
23
|
import MHeader from '../../components/MHeader';
|
|
25
24
|
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
25
|
+
// require() ở module scope: không phải resolve lại asset mỗi lần render
|
|
26
|
+
const BACKGROUND = require('../../assets/img/EKYC.png');
|
|
27
|
+
const PLACEHOLDER = require('../../assets/img/selfie.png');
|
|
28
|
+
|
|
29
|
+
// Khung dọc 3:4 - đúng tỉ lệ ảnh máy ảnh trước trả về nên ảnh khách chụp
|
|
30
|
+
// không bị cắt hai bên như khung 356/534 cũ
|
|
31
|
+
const PREVIEW_ASPECT = 3 / 4;
|
|
32
|
+
|
|
33
|
+
const NOTES = [
|
|
34
|
+
'Nhìn thẳng vào máy ảnh, khuôn mặt nằm gọn trong khung hình',
|
|
35
|
+
'Chụp nơi đủ sáng, tránh ngược sáng hoặc bóng đổ lên mặt',
|
|
36
|
+
'Không đeo kính, khẩu trang, mũ và để lộ rõ đường nét khuôn mặt',
|
|
37
|
+
];
|
|
32
38
|
|
|
33
39
|
export const CimbSelfie = observer(function CimbSelfie(props: any) {
|
|
34
|
-
const [isLoading, setIsLoading] = useState(false);
|
|
35
40
|
const navigation = useNavigation();
|
|
41
|
+
const [isLoading, setIsLoading] = useState(false);
|
|
36
42
|
const [photo, setPhoto] = useState(null);
|
|
43
|
+
// Chặn double-submit: setIsLoading là bất đồng bộ nên hai lần bấm liên tiếp
|
|
44
|
+
// vẫn lọt qua được nếu chỉ dựa vào state.
|
|
45
|
+
const submitting = useRef(false);
|
|
37
46
|
const loan = props?.route.params?.loan;
|
|
38
|
-
|
|
39
|
-
|
|
47
|
+
|
|
48
|
+
// Ảnh vừa chụp hiện lên bằng fade + scale nhẹ để thấy rõ khung ảnh đã đổi
|
|
49
|
+
const reveal = useRef(new Animated.Value(1)).current;
|
|
50
|
+
useEffect(() => {
|
|
51
|
+
if (!photo) return;
|
|
52
|
+
reveal.setValue(0);
|
|
53
|
+
Animated.timing(reveal, {
|
|
54
|
+
toValue: 1,
|
|
55
|
+
duration: 260,
|
|
56
|
+
easing: Easing.out(Easing.cubic),
|
|
57
|
+
useNativeDriver: true,
|
|
58
|
+
}).start();
|
|
59
|
+
}, [photo, reveal]);
|
|
60
|
+
|
|
61
|
+
const takePhoto = useCallback(() => {
|
|
62
|
+
navigation.push(ScreenNames.SelfieCamera, {
|
|
40
63
|
front: true,
|
|
41
64
|
selfie: true,
|
|
42
|
-
callback:
|
|
43
|
-
setPhoto(photo);
|
|
44
|
-
},
|
|
65
|
+
callback: setPhoto,
|
|
45
66
|
});
|
|
46
|
-
};
|
|
67
|
+
}, [navigation]);
|
|
47
68
|
|
|
48
|
-
const nextStep = () => {
|
|
69
|
+
const nextStep = useCallback(() => {
|
|
70
|
+
if (!photo || submitting.current) return;
|
|
71
|
+
submitting.current = true;
|
|
49
72
|
setIsLoading(true);
|
|
73
|
+
|
|
50
74
|
const formData = new FormData();
|
|
51
75
|
formData.append('loanbriefId', loan?.id);
|
|
52
76
|
formData.append('TypeDocumentId', 487);
|
|
@@ -55,126 +79,123 @@ export const CimbSelfie = observer(function CimbSelfie(props: any) {
|
|
|
55
79
|
type: 'image/jpg',
|
|
56
80
|
name: 'image.jpg',
|
|
57
81
|
});
|
|
82
|
+
|
|
58
83
|
FullSubmitStore.uploadDocument(
|
|
59
84
|
formData,
|
|
60
85
|
() => {
|
|
86
|
+
submitting.current = false;
|
|
61
87
|
setIsLoading(false);
|
|
62
88
|
setTimeout(() => {
|
|
63
89
|
navigation.dispatch(
|
|
64
|
-
StackActions.push(ScreenNames.MRZScanner, {
|
|
65
|
-
loan: loan,
|
|
66
|
-
})
|
|
90
|
+
StackActions.push(ScreenNames.MRZScanner, { loan })
|
|
67
91
|
);
|
|
68
92
|
}, 600);
|
|
69
93
|
},
|
|
70
94
|
() => {
|
|
95
|
+
submitting.current = false;
|
|
71
96
|
setIsLoading(false);
|
|
72
97
|
}
|
|
73
98
|
);
|
|
74
|
-
};
|
|
99
|
+
}, [photo, loan, navigation]);
|
|
100
|
+
|
|
101
|
+
const goBack = useCallback(() => navigation.goBack(), [navigation]);
|
|
102
|
+
|
|
103
|
+
const canSubmit = !!photo && !isLoading;
|
|
75
104
|
|
|
76
105
|
return (
|
|
77
|
-
<View style={
|
|
78
|
-
<Image source={
|
|
79
|
-
<MHeader title="Xác thực khuôn mặt" onBack={
|
|
106
|
+
<View style={commonStyles.fill}>
|
|
107
|
+
<Image source={BACKGROUND} style={styles.background} />
|
|
108
|
+
<MHeader title="Xác thực khuôn mặt" onBack={goBack} />
|
|
80
109
|
<SafeAreaView style={commonStyles.fill}>
|
|
81
|
-
<ScrollView
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
110
|
+
<ScrollView
|
|
111
|
+
style={commonStyles.fill}
|
|
112
|
+
contentContainerStyle={styles.scrollContent}
|
|
113
|
+
showsVerticalScrollIndicator={false}
|
|
114
|
+
>
|
|
115
|
+
<View style={styles.card}>
|
|
116
|
+
{/* Bọc một lớp cắt riêng: để Image tự bo góc thì mép ảnh vẫn thò ra
|
|
117
|
+
ngoài đường cong của card trên Android */}
|
|
118
|
+
<View style={styles.previewFrame}>
|
|
119
|
+
<Animated.Image
|
|
120
|
+
source={photo ? { uri: photo } : PLACEHOLDER}
|
|
121
|
+
resizeMode="cover"
|
|
122
|
+
style={[
|
|
123
|
+
styles.preview,
|
|
124
|
+
{
|
|
125
|
+
opacity: reveal,
|
|
126
|
+
transform: [
|
|
127
|
+
{
|
|
128
|
+
scale: reveal.interpolate({
|
|
129
|
+
inputRange: [0, 1],
|
|
130
|
+
outputRange: [0.97, 1],
|
|
131
|
+
}),
|
|
132
|
+
},
|
|
133
|
+
],
|
|
134
|
+
},
|
|
135
|
+
]}
|
|
136
|
+
/>
|
|
137
|
+
</View>
|
|
138
|
+
{/* Nhãn trạng thái: phân biệt rõ ảnh mẫu minh hoạ và ảnh đã chụp */}
|
|
139
|
+
<View style={[styles.badge, photo && styles.badgeDone]}>
|
|
140
|
+
{photo ? <Tick2 /> : null}
|
|
141
|
+
<MText style={[styles.badgeText, photo && styles.badgeTextDone]}>
|
|
142
|
+
{photo ? 'Ảnh của bạn' : 'Ảnh mẫu'}
|
|
143
|
+
</MText>
|
|
144
|
+
</View>
|
|
145
|
+
</View>
|
|
146
|
+
|
|
147
|
+
<View style={styles.noteCard}>
|
|
148
|
+
<MText style={styles.noteTitle}>Lưu ý khi chụp ảnh khuôn mặt</MText>
|
|
149
|
+
{NOTES.map((note) => (
|
|
150
|
+
<View key={note} style={styles.noteRow}>
|
|
151
|
+
<TimaSmall style={styles.noteBullet} />
|
|
152
|
+
<MText style={styles.noteText}>{note}</MText>
|
|
153
|
+
</View>
|
|
154
|
+
))}
|
|
96
155
|
</View>
|
|
97
156
|
</ScrollView>
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
flexDirection: 'row',
|
|
101
|
-
paddingHorizontal: 16,
|
|
102
|
-
marginBottom: 30,
|
|
103
|
-
}}
|
|
104
|
-
>
|
|
157
|
+
|
|
158
|
+
<View style={styles.footer}>
|
|
105
159
|
<MButton
|
|
106
|
-
|
|
107
|
-
onPress={() => {
|
|
108
|
-
takePhoto();
|
|
109
|
-
}}
|
|
160
|
+
onPress={takePhoto}
|
|
110
161
|
disabled={isLoading}
|
|
111
|
-
style={[
|
|
112
|
-
commonStyles.row,
|
|
113
|
-
commonStyles.alignCenter,
|
|
114
|
-
commonStyles.justifyCenter,
|
|
115
|
-
{
|
|
116
|
-
backgroundColor: '#FFFFFF',
|
|
117
|
-
height: 40,
|
|
118
|
-
borderRadius: 30,
|
|
119
|
-
flex: 1,
|
|
120
|
-
marginRight: 8,
|
|
121
|
-
borderWidth: 1,
|
|
122
|
-
borderColor: '#EF4123',
|
|
123
|
-
},
|
|
124
|
-
]}
|
|
162
|
+
style={[styles.captureButton, isLoading && styles.buttonMuted]}
|
|
125
163
|
>
|
|
126
|
-
<
|
|
127
|
-
|
|
164
|
+
<IConCamera width={16} height={16} />
|
|
165
|
+
<MText style={styles.captureText}>
|
|
166
|
+
{photo ? 'Chụp lại' : 'Chụp ảnh'}
|
|
128
167
|
</MText>
|
|
129
168
|
</MButton>
|
|
130
169
|
|
|
131
|
-
<
|
|
132
|
-
{
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
170
|
+
<MButton
|
|
171
|
+
disabled={!canSubmit}
|
|
172
|
+
onPress={nextStep}
|
|
173
|
+
style={commonStyles.fill}
|
|
174
|
+
>
|
|
175
|
+
{canSubmit ? (
|
|
176
|
+
<LinearGradient
|
|
177
|
+
colors={['#FF7A00', '#EF4123']}
|
|
178
|
+
start={{ x: 0, y: 0 }}
|
|
179
|
+
end={{ x: 1, y: 1 }}
|
|
180
|
+
style={[styles.submitButton, styles.submitShadow]}
|
|
138
181
|
>
|
|
139
|
-
<
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
},
|
|
151
|
-
]}
|
|
152
|
-
>
|
|
153
|
-
{isLoading ? (
|
|
154
|
-
<ActivityIndicator color={'white'} size="small" />
|
|
155
|
-
) : (
|
|
156
|
-
<MText
|
|
157
|
-
style={[commonStyles.textNormal, { color: 'white' }]}
|
|
158
|
-
>
|
|
159
|
-
Tiếp tục
|
|
160
|
-
</MText>
|
|
161
|
-
)}
|
|
162
|
-
</LinearGradient>
|
|
163
|
-
</MButton>
|
|
182
|
+
<MText style={styles.submitText}>Tiếp tục</MText>
|
|
183
|
+
</LinearGradient>
|
|
184
|
+
) : (
|
|
185
|
+
// Trạng thái chưa chụp/đang xử lý phải nhìn là biết chưa bấm được
|
|
186
|
+
<View style={[styles.submitButton, styles.submitDisabled]}>
|
|
187
|
+
{isLoading ? (
|
|
188
|
+
<ActivityIndicator color={'#FFFFFF'} size="small" />
|
|
189
|
+
) : (
|
|
190
|
+
<MText style={styles.submitText}>Tiếp tục</MText>
|
|
191
|
+
)}
|
|
192
|
+
</View>
|
|
164
193
|
)}
|
|
165
|
-
</
|
|
194
|
+
</MButton>
|
|
166
195
|
</View>
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
marginTop: 8,
|
|
171
|
-
flexDirection: 'row',
|
|
172
|
-
justifyContent: 'center',
|
|
173
|
-
}}
|
|
174
|
-
>
|
|
175
|
-
<MText style={{ fontSize: 12, color: '#333333' }}>
|
|
176
|
-
Cung cấp bởi{' '}
|
|
177
|
-
</MText>
|
|
196
|
+
|
|
197
|
+
<View style={styles.cimbRow}>
|
|
198
|
+
<MText style={styles.cimbText}>Cung cấp bởi </MText>
|
|
178
199
|
<CIMBBank />
|
|
179
200
|
</View>
|
|
180
201
|
</SafeAreaView>
|
|
@@ -182,3 +203,125 @@ export const CimbSelfie = observer(function CimbSelfie(props: any) {
|
|
|
182
203
|
</View>
|
|
183
204
|
);
|
|
184
205
|
});
|
|
206
|
+
|
|
207
|
+
const styles = StyleSheet.create({
|
|
208
|
+
background: {
|
|
209
|
+
position: 'absolute',
|
|
210
|
+
width: '100%',
|
|
211
|
+
height: '100%',
|
|
212
|
+
resizeMode: 'cover',
|
|
213
|
+
},
|
|
214
|
+
scrollContent: { paddingHorizontal: 24, paddingBottom: 24 },
|
|
215
|
+
|
|
216
|
+
card: {
|
|
217
|
+
marginTop: 20,
|
|
218
|
+
padding: 8,
|
|
219
|
+
borderRadius: 20,
|
|
220
|
+
backgroundColor: '#FFFFFF',
|
|
221
|
+
shadowColor: '#7A2E12',
|
|
222
|
+
shadowOffset: { width: 0, height: 10 },
|
|
223
|
+
shadowOpacity: 0.18,
|
|
224
|
+
shadowRadius: 20,
|
|
225
|
+
elevation: 8,
|
|
226
|
+
},
|
|
227
|
+
// Bán kính trong = bán kính card (20) - padding (8) để hai đường cong khớp nhau
|
|
228
|
+
previewFrame: {
|
|
229
|
+
width: '100%',
|
|
230
|
+
aspectRatio: PREVIEW_ASPECT,
|
|
231
|
+
borderRadius: 12,
|
|
232
|
+
overflow: 'hidden',
|
|
233
|
+
backgroundColor: '#F5EDE9',
|
|
234
|
+
},
|
|
235
|
+
preview: { width: '100%', height: '100%' },
|
|
236
|
+
badge: {
|
|
237
|
+
position: 'absolute',
|
|
238
|
+
left: 20,
|
|
239
|
+
bottom: 20,
|
|
240
|
+
flexDirection: 'row',
|
|
241
|
+
alignItems: 'center',
|
|
242
|
+
paddingHorizontal: 10,
|
|
243
|
+
paddingVertical: 5,
|
|
244
|
+
borderRadius: 14,
|
|
245
|
+
backgroundColor: 'rgba(0, 0, 0, 0.45)',
|
|
246
|
+
},
|
|
247
|
+
badgeDone: { backgroundColor: 'rgba(255, 255, 255, 0.94)' },
|
|
248
|
+
badgeText: { color: '#FFFFFF', fontSize: 11, fontWeight: '600' },
|
|
249
|
+
badgeTextDone: { color: '#28A745', marginLeft: 6 },
|
|
250
|
+
|
|
251
|
+
noteCard: {
|
|
252
|
+
marginTop: 20,
|
|
253
|
+
padding: 16,
|
|
254
|
+
borderRadius: 16,
|
|
255
|
+
backgroundColor: 'rgba(255, 255, 255, 0.75)',
|
|
256
|
+
borderWidth: 1,
|
|
257
|
+
borderColor: '#FFE1D3',
|
|
258
|
+
},
|
|
259
|
+
noteTitle: {
|
|
260
|
+
...commonStyles.textNormalBold,
|
|
261
|
+
fontSize: 15,
|
|
262
|
+
color: '#333333',
|
|
263
|
+
},
|
|
264
|
+
noteRow: { flexDirection: 'row', marginTop: 12 },
|
|
265
|
+
noteBullet: { marginTop: 5 },
|
|
266
|
+
noteText: {
|
|
267
|
+
color: '#5A5A5A',
|
|
268
|
+
marginLeft: 10,
|
|
269
|
+
fontSize: 13,
|
|
270
|
+
lineHeight: 20,
|
|
271
|
+
flex: 1,
|
|
272
|
+
},
|
|
273
|
+
|
|
274
|
+
// SafeAreaView đã cộng inset dưới trên iOS nên chỉ cần khoảng thở cố định
|
|
275
|
+
footer: {
|
|
276
|
+
flexDirection: 'row',
|
|
277
|
+
paddingHorizontal: 24,
|
|
278
|
+
paddingTop: 4,
|
|
279
|
+
marginBottom: 16,
|
|
280
|
+
},
|
|
281
|
+
captureButton: {
|
|
282
|
+
flexDirection: 'row',
|
|
283
|
+
alignItems: 'center',
|
|
284
|
+
justifyContent: 'center',
|
|
285
|
+
backgroundColor: '#FFFFFF',
|
|
286
|
+
height: 48,
|
|
287
|
+
borderRadius: 24,
|
|
288
|
+
flex: 1,
|
|
289
|
+
marginRight: 10,
|
|
290
|
+
borderWidth: 1.5,
|
|
291
|
+
borderColor: '#EF4123',
|
|
292
|
+
},
|
|
293
|
+
buttonMuted: { opacity: 0.5 },
|
|
294
|
+
captureText: {
|
|
295
|
+
...commonStyles.textNormal,
|
|
296
|
+
color: '#F05123',
|
|
297
|
+
fontWeight: '600',
|
|
298
|
+
marginLeft: 8,
|
|
299
|
+
},
|
|
300
|
+
submitButton: {
|
|
301
|
+
alignItems: 'center',
|
|
302
|
+
justifyContent: 'center',
|
|
303
|
+
height: 48,
|
|
304
|
+
borderRadius: 24,
|
|
305
|
+
},
|
|
306
|
+
submitShadow: {
|
|
307
|
+
shadowColor: '#EF4123',
|
|
308
|
+
shadowOffset: { width: 0, height: 6 },
|
|
309
|
+
shadowOpacity: 0.35,
|
|
310
|
+
shadowRadius: 12,
|
|
311
|
+
elevation: 6,
|
|
312
|
+
},
|
|
313
|
+
submitDisabled: { backgroundColor: '#D8D2CF' },
|
|
314
|
+
submitText: {
|
|
315
|
+
...commonStyles.textNormal,
|
|
316
|
+
color: '#FFFFFF',
|
|
317
|
+
fontWeight: '600',
|
|
318
|
+
},
|
|
319
|
+
|
|
320
|
+
cimbRow: {
|
|
321
|
+
marginBottom: 24,
|
|
322
|
+
flexDirection: 'row',
|
|
323
|
+
justifyContent: 'center',
|
|
324
|
+
alignItems: 'center',
|
|
325
|
+
},
|
|
326
|
+
cimbText: { fontSize: 12, color: '#333333' },
|
|
327
|
+
});
|
|
@@ -353,8 +353,8 @@ export default function InfoLoanMotobike(props: any) {
|
|
|
353
353
|
{values.gender === 0
|
|
354
354
|
? 'Nam'
|
|
355
355
|
: values.gender === 1
|
|
356
|
-
|
|
357
|
-
|
|
356
|
+
? 'Nữ'
|
|
357
|
+
: ''}
|
|
358
358
|
</MText>
|
|
359
359
|
<DropDown2 />
|
|
360
360
|
</TouchableOpacity>
|
|
@@ -625,6 +625,7 @@ const $textInput: ViewStyle = {
|
|
|
625
625
|
height: 40,
|
|
626
626
|
paddingHorizontal: 8,
|
|
627
627
|
fontFamily: 'BeVietnamPro-Medium',
|
|
628
|
+
fontSize: 14,
|
|
628
629
|
};
|
|
629
630
|
|
|
630
631
|
const $label: TextStyle = {
|