@ha_tecno/live-id-sdk 2.5.1 → 2.7.0
Sign up to get free protection for your applications and to get access to all the features.
- package/lib/commonjs/components/deviceNotFound/deviceNotFound.js.map +1 -1
- package/lib/commonjs/components/deviceNotFound/styles.js.map +1 -1
- package/lib/commonjs/components/recordButton/styles.js.map +1 -1
- package/lib/commonjs/index.js +6 -0
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/screens/FingerAuth/FingerAuth.js +5 -4
- package/lib/commonjs/screens/FingerAuth/FingerAuth.js.map +1 -1
- package/lib/commonjs/screens/FingerRegister/FingerRegister.js +6 -5
- package/lib/commonjs/screens/FingerRegister/FingerRegister.js.map +1 -1
- package/lib/commonjs/screens/LifeCertificate/LifeCertificate.js +6 -4
- package/lib/commonjs/screens/LifeCertificate/LifeCertificate.js.map +1 -1
- package/lib/commonjs/screens/MultiFingerRegister/MultiFingerRegister.js +239 -0
- package/lib/commonjs/screens/MultiFingerRegister/MultiFingerRegister.js.map +1 -0
- package/lib/commonjs/screens/MultiFingerRegister/styles.js +60 -0
- package/lib/commonjs/screens/MultiFingerRegister/styles.js.map +1 -0
- package/lib/commonjs/screens/index.js +7 -0
- package/lib/commonjs/screens/index.js.map +1 -1
- package/lib/commonjs/services/services.js +2 -2
- package/lib/commonjs/services/services.js.map +1 -1
- package/lib/commonjs/services/types.js +18 -0
- package/lib/commonjs/services/types.js.map +1 -1
- package/lib/commonjs/store/modules/fingerAuth/slice.js +9 -1
- package/lib/commonjs/store/modules/fingerAuth/slice.js.map +1 -1
- package/lib/commonjs/store/modules/fingerRegister/slice.js +38 -4
- package/lib/commonjs/store/modules/fingerRegister/slice.js.map +1 -1
- package/lib/commonjs/store/modules/fingerRegister/types.js +18 -0
- package/lib/commonjs/store/modules/fingerRegister/types.js.map +1 -1
- package/lib/commonjs/store/modules/lifeCertificate/slice.js +11 -1
- package/lib/commonjs/store/modules/lifeCertificate/slice.js.map +1 -1
- package/lib/commonjs/utils/index.js +7 -0
- package/lib/commonjs/utils/index.js.map +1 -1
- package/lib/commonjs/utils/utils.js +11 -0
- package/lib/commonjs/utils/utils.js.map +1 -0
- package/lib/module/components/deviceNotFound/deviceNotFound.js.map +1 -1
- package/lib/module/components/deviceNotFound/styles.js.map +1 -1
- package/lib/module/components/recordButton/styles.js.map +1 -1
- package/lib/module/index.js +2 -2
- package/lib/module/index.js.map +1 -1
- package/lib/module/screens/FingerAuth/FingerAuth.js +5 -4
- package/lib/module/screens/FingerAuth/FingerAuth.js.map +1 -1
- package/lib/module/screens/FingerRegister/FingerRegister.js +6 -5
- package/lib/module/screens/FingerRegister/FingerRegister.js.map +1 -1
- package/lib/module/screens/LifeCertificate/LifeCertificate.js +6 -4
- package/lib/module/screens/LifeCertificate/LifeCertificate.js.map +1 -1
- package/lib/module/screens/MultiFingerRegister/MultiFingerRegister.js +230 -0
- package/lib/module/screens/MultiFingerRegister/MultiFingerRegister.js.map +1 -0
- package/lib/module/screens/MultiFingerRegister/styles.js +54 -0
- package/lib/module/screens/MultiFingerRegister/styles.js.map +1 -0
- package/lib/module/screens/index.js +2 -1
- package/lib/module/screens/index.js.map +1 -1
- package/lib/module/services/services.js +2 -2
- package/lib/module/services/services.js.map +1 -1
- package/lib/module/services/types.js +13 -1
- package/lib/module/services/types.js.map +1 -1
- package/lib/module/store/modules/fingerAuth/slice.js +9 -1
- package/lib/module/store/modules/fingerAuth/slice.js.map +1 -1
- package/lib/module/store/modules/fingerRegister/slice.js +38 -4
- package/lib/module/store/modules/fingerRegister/slice.js.map +1 -1
- package/lib/module/store/modules/fingerRegister/types.js +13 -1
- package/lib/module/store/modules/fingerRegister/types.js.map +1 -1
- package/lib/module/store/modules/lifeCertificate/slice.js +12 -2
- package/lib/module/store/modules/lifeCertificate/slice.js.map +1 -1
- package/lib/module/utils/index.js +2 -1
- package/lib/module/utils/index.js.map +1 -1
- package/lib/module/utils/utils.js +5 -0
- package/lib/module/utils/utils.js.map +1 -0
- package/lib/typescript/src/components/deviceNotFound/deviceNotFound.d.ts.map +1 -1
- package/lib/typescript/src/index.d.ts +2 -2
- package/lib/typescript/src/index.d.ts.map +1 -1
- package/lib/typescript/src/screens/FingerAuth/FingerAuth.d.ts +2 -1
- package/lib/typescript/src/screens/FingerAuth/FingerAuth.d.ts.map +1 -1
- package/lib/typescript/src/screens/FingerRegister/FingerRegister.d.ts +2 -1
- package/lib/typescript/src/screens/FingerRegister/FingerRegister.d.ts.map +1 -1
- package/lib/typescript/src/screens/LifeCertificate/LifeCertificate.d.ts +2 -1
- package/lib/typescript/src/screens/LifeCertificate/LifeCertificate.d.ts.map +1 -1
- package/lib/typescript/src/screens/MultiFingerRegister/MultiFingerRegister.d.ts +10 -0
- package/lib/typescript/src/screens/MultiFingerRegister/MultiFingerRegister.d.ts.map +1 -0
- package/lib/typescript/src/screens/MultiFingerRegister/styles.d.ts +50 -0
- package/lib/typescript/src/screens/MultiFingerRegister/styles.d.ts.map +1 -0
- package/lib/typescript/src/screens/index.d.ts +2 -1
- package/lib/typescript/src/screens/index.d.ts.map +1 -1
- package/lib/typescript/src/services/services.d.ts +1 -1
- package/lib/typescript/src/services/services.d.ts.map +1 -1
- package/lib/typescript/src/services/types.d.ts +13 -0
- package/lib/typescript/src/services/types.d.ts.map +1 -1
- package/lib/typescript/src/store/modules/fingerAuth/selectors.d.ts +1 -1
- package/lib/typescript/src/store/modules/fingerAuth/slice.d.ts.map +1 -1
- package/lib/typescript/src/store/modules/fingerAuth/type.d.ts +1 -1
- package/lib/typescript/src/store/modules/fingerAuth/type.d.ts.map +1 -1
- package/lib/typescript/src/store/modules/fingerRegister/selectors.d.ts +5 -1
- package/lib/typescript/src/store/modules/fingerRegister/selectors.d.ts.map +1 -1
- package/lib/typescript/src/store/modules/fingerRegister/slice.d.ts.map +1 -1
- package/lib/typescript/src/store/modules/fingerRegister/types.d.ts +17 -1
- package/lib/typescript/src/store/modules/fingerRegister/types.d.ts.map +1 -1
- package/lib/typescript/src/store/modules/lifeCertificate/slice.d.ts.map +1 -1
- package/lib/typescript/src/store/modules/lifeCertificate/types.d.ts +1 -0
- package/lib/typescript/src/store/modules/lifeCertificate/types.d.ts.map +1 -1
- package/lib/typescript/src/utils/index.d.ts +2 -1
- package/lib/typescript/src/utils/index.d.ts.map +1 -1
- package/lib/typescript/src/utils/utils.d.ts +3 -0
- package/lib/typescript/src/utils/utils.d.ts.map +1 -0
- package/package.json +3 -2
- package/src/components/deviceNotFound/deviceNotFound.tsx +10 -12
- package/src/components/deviceNotFound/styles.ts +26 -26
- package/src/components/recordButton/styles.ts +11 -11
- package/src/index.tsx +2 -2
- package/src/screens/FingerAuth/FingerAuth.tsx +5 -4
- package/src/screens/FingerRegister/FingerRegister.tsx +6 -5
- package/src/screens/LifeCertificate/LifeCertificate.tsx +6 -4
- package/src/screens/MultiFingerRegister/MultiFingerRegister.tsx +207 -0
- package/src/screens/MultiFingerRegister/styles.ts +49 -0
- package/src/screens/index.ts +2 -1
- package/src/services/services.ts +2 -2
- package/src/services/types.ts +14 -0
- package/src/store/modules/fingerAuth/slice.ts +9 -1
- package/src/store/modules/fingerAuth/type.ts +1 -1
- package/src/store/modules/fingerRegister/slice.ts +56 -5
- package/src/store/modules/fingerRegister/types.ts +18 -1
- package/src/store/modules/lifeCertificate/slice.ts +11 -2
- package/src/store/modules/lifeCertificate/types.ts +1 -0
- package/src/utils/index.ts +2 -1
- package/src/utils/utils.ts +5 -0
- package/lib/commonjs/utils/file.js +0 -38
- package/lib/commonjs/utils/file.js.map +0 -1
- package/lib/module/utils/file.js +0 -29
- package/lib/module/utils/file.js.map +0 -1
- package/lib/typescript/src/utils/file.d.ts +0 -3
- package/lib/typescript/src/utils/file.d.ts.map +0 -1
- package/src/utils/file.ts +0 -30
@@ -0,0 +1,207 @@
|
|
1
|
+
import React, { useCallback, useEffect, useRef, useState } from "react";
|
2
|
+
import { View, Modal, TouchableOpacity } from "react-native";
|
3
|
+
import { Camera, Point, useCameraDevice, useCameraFormat, useCameraPermission } from "react-native-vision-camera";
|
4
|
+
import Orientation from "react-native-orientation-locker";
|
5
|
+
import { Gesture, GestureDetector, GestureHandlerRootView } from "react-native-gesture-handler";
|
6
|
+
import { runOnJS } from "react-native-reanimated";
|
7
|
+
import Picker, { PickerStyle } from "react-native-picker-select";
|
8
|
+
|
9
|
+
import { CameraConfigInfo, CaptureButton, DeviceNotFound, Gabarito, ModalMessage } from "../../components";
|
10
|
+
import { styles } from "./styles";
|
11
|
+
import { useDispatch, useSelector } from "../../store/modules/fingerRegister";
|
12
|
+
import Icon from "../../components/icon/icon";
|
13
|
+
import { useIsForeground } from "../../utils";
|
14
|
+
|
15
|
+
enum Finger {
|
16
|
+
LEFT_THUMB = "LT",
|
17
|
+
LEFT_INDEX = "LI",
|
18
|
+
LEFT_MIDDLE = "LM",
|
19
|
+
LEFT_RING = "LR",
|
20
|
+
LEFT_PINKY = "LP",
|
21
|
+
RIGHT_THUMB = "RT",
|
22
|
+
RIGHT_INDEX = "RI",
|
23
|
+
RIGHT_MIDDLE = "RM",
|
24
|
+
RIGHT_RING = "RR",
|
25
|
+
RIGHT_PINKY = "RP"
|
26
|
+
}
|
27
|
+
|
28
|
+
type Props = {
|
29
|
+
UID: string;
|
30
|
+
onSuccess: (code: number) => void;
|
31
|
+
isFocused?: boolean;
|
32
|
+
mock?: boolean;
|
33
|
+
};
|
34
|
+
|
35
|
+
const MultiFingerRegister = ({ UID, onSuccess, isFocused, mock }: Props) => {
|
36
|
+
const [showModal, setShowModal] = useState(false);
|
37
|
+
const cameraRef = useRef<Camera>(null);
|
38
|
+
const isForeground = useIsForeground();
|
39
|
+
const isActive = isFocused !== undefined ? isForeground && isFocused : isForeground;
|
40
|
+
const { hasPermission, requestPermission } = useCameraPermission();
|
41
|
+
const device = useCameraDevice("back");
|
42
|
+
const state = useSelector();
|
43
|
+
const dispatch = useDispatch();
|
44
|
+
|
45
|
+
const containerCaptureStyled = [styles.containerCapture, { bottom: state.showButtonInfo ? 75 : 20 }];
|
46
|
+
const pickerStyled: PickerStyle = {
|
47
|
+
chevronDown: { display: "none" },
|
48
|
+
chevronUp: { display: "none" },
|
49
|
+
inputIOS: {
|
50
|
+
fontSize: 16,
|
51
|
+
color: "#000",
|
52
|
+
textAlign: "center"
|
53
|
+
},
|
54
|
+
inputAndroid: {
|
55
|
+
fontSize: 14,
|
56
|
+
color: "#000",
|
57
|
+
textAlign: "center"
|
58
|
+
}
|
59
|
+
};
|
60
|
+
|
61
|
+
const itemsPicker = [
|
62
|
+
{ label: "Indicador Direito", value: Finger.RIGHT_INDEX },
|
63
|
+
{ label: "Médio Direito", value: Finger.RIGHT_MIDDLE },
|
64
|
+
{ label: "Anelar Direito", value: Finger.RIGHT_RING },
|
65
|
+
{ label: "Mínimo Direito", value: Finger.RIGHT_PINKY },
|
66
|
+
{ label: "Polegar Direito", value: Finger.RIGHT_THUMB },
|
67
|
+
{ label: "Indicador Esquerdo", value: Finger.LEFT_INDEX },
|
68
|
+
{ label: "Médio Esquerdo", value: Finger.LEFT_MIDDLE },
|
69
|
+
{ label: "Anelar Esquerdo", value: Finger.LEFT_RING },
|
70
|
+
{ label: "Mínimo Esquerdo", value: Finger.LEFT_PINKY },
|
71
|
+
{ label: "Polegar Esquerdo", value: Finger.LEFT_THUMB }
|
72
|
+
];
|
73
|
+
|
74
|
+
useEffect(() => {
|
75
|
+
Orientation.lockToPortrait();
|
76
|
+
return () => {
|
77
|
+
Orientation.unlockAllOrientations();
|
78
|
+
};
|
79
|
+
});
|
80
|
+
|
81
|
+
const cameraPermission = useCallback(async () => {
|
82
|
+
if (!hasPermission) {
|
83
|
+
await requestPermission();
|
84
|
+
}
|
85
|
+
}, [hasPermission, requestPermission]);
|
86
|
+
|
87
|
+
useEffect(() => {
|
88
|
+
cameraPermission();
|
89
|
+
dispatch.getConfig("finger");
|
90
|
+
}, [cameraPermission, dispatch.getConfig]);
|
91
|
+
|
92
|
+
const cameraFormat = useCameraFormat(device, [
|
93
|
+
{
|
94
|
+
photoResolution: {
|
95
|
+
width: 1280,
|
96
|
+
height: 720
|
97
|
+
}
|
98
|
+
}
|
99
|
+
]);
|
100
|
+
|
101
|
+
useEffect(() => {
|
102
|
+
if (state.base64Images !== undefined && state.base64Images.length === 3) {
|
103
|
+
if (!UID) {
|
104
|
+
dispatch.setModal("Ocorreu um erro!", "Erro: UID não encontrado!");
|
105
|
+
}
|
106
|
+
dispatch.handleLoading();
|
107
|
+
dispatch.sendImages(state.base64Images, UID, mock, state.currentFinger);
|
108
|
+
}
|
109
|
+
}, [dispatch.sendImages, dispatch.handleLoading, state.base64Images, state.base64Images.length, mock]);
|
110
|
+
|
111
|
+
useEffect(() => {
|
112
|
+
if (state.code === 0) {
|
113
|
+
dispatch.setModal("Sucesso!", "Cadastro de digital realizado com sucesso!");
|
114
|
+
onSuccess && onSuccess?.(state.code);
|
115
|
+
mock === true ? setTimeout(() => dispatch.handleLoading(), 2000) : dispatch.handleLoading();
|
116
|
+
dispatch.handleFinger();
|
117
|
+
}
|
118
|
+
if (state.code !== 0 && state.code !== null) {
|
119
|
+
dispatch.setModal("Ocorreu um erro!", `Erro: ${state.message}`);
|
120
|
+
dispatch.handleLoading();
|
121
|
+
}
|
122
|
+
dispatch.resetState();
|
123
|
+
}, [state.code, state.message, dispatch.handleLoading, dispatch.resetState, dispatch.setModal, onSuccess, mock]);
|
124
|
+
|
125
|
+
const takePhoto = async () => {
|
126
|
+
const photo = await cameraRef.current?.takePhoto({
|
127
|
+
qualityPrioritization: "balanced"
|
128
|
+
});
|
129
|
+
if (photo != null) {
|
130
|
+
dispatch.setImagePath(photo.path);
|
131
|
+
}
|
132
|
+
};
|
133
|
+
|
134
|
+
const focus = useCallback((point: Point) => {
|
135
|
+
const camera = cameraRef.current;
|
136
|
+
if (camera != null) {
|
137
|
+
camera.focus(point);
|
138
|
+
}
|
139
|
+
}, []);
|
140
|
+
|
141
|
+
const gesture = Gesture.Tap().onBegin(({ x, y }) => {
|
142
|
+
runOnJS(focus)({ x, y });
|
143
|
+
});
|
144
|
+
|
145
|
+
const openModal = () => {
|
146
|
+
setShowModal(true);
|
147
|
+
};
|
148
|
+
|
149
|
+
const closeModel = () => {
|
150
|
+
setShowModal(false);
|
151
|
+
};
|
152
|
+
|
153
|
+
const handleCurrentFinger = (value: string) => {
|
154
|
+
dispatch.setCurrentFinger(value as Finger);
|
155
|
+
};
|
156
|
+
|
157
|
+
if (device == null || hasPermission === false)
|
158
|
+
return <DeviceNotFound hasPermission={hasPermission} cameraPermission={cameraPermission} />;
|
159
|
+
|
160
|
+
return (
|
161
|
+
<GestureHandlerRootView style={styles.root}>
|
162
|
+
<GestureDetector gesture={gesture}>
|
163
|
+
<View style={styles.cameraContainer}>
|
164
|
+
<Camera
|
165
|
+
ref={cameraRef}
|
166
|
+
style={styles.camera}
|
167
|
+
device={device}
|
168
|
+
format={cameraFormat}
|
169
|
+
isActive={isActive}
|
170
|
+
torch={isActive ? "on" : "off"}
|
171
|
+
exposure={state.exposure}
|
172
|
+
zoom={state.zoom}
|
173
|
+
photo
|
174
|
+
/>
|
175
|
+
<Gabarito />
|
176
|
+
</View>
|
177
|
+
</GestureDetector>
|
178
|
+
<View style={styles.containerModalIcon}>
|
179
|
+
<TouchableOpacity onPress={openModal}>
|
180
|
+
<Icon name="cog" size={35} color="#fff" />
|
181
|
+
</TouchableOpacity>
|
182
|
+
</View>
|
183
|
+
<View style={containerCaptureStyled}>
|
184
|
+
<CaptureButton onPress={takePhoto} imagesCount={state.base64Images.length} />
|
185
|
+
</View>
|
186
|
+
{state.showButtonInfo && <CameraConfigInfo exposure={state.exposure} zoom={state.zoom} />}
|
187
|
+
<ModalMessage isLoading={state.loading} modal={state.modal} />
|
188
|
+
<Modal animationType="slide" transparent={true} visible={showModal} onRequestClose={closeModel}>
|
189
|
+
<View style={styles.containerModal}>
|
190
|
+
<View style={styles.modal}>
|
191
|
+
<Picker
|
192
|
+
style={pickerStyled}
|
193
|
+
useNativeAndroidPickerStyle={false}
|
194
|
+
placeholder={{}}
|
195
|
+
onDonePress={closeModel}
|
196
|
+
items={itemsPicker}
|
197
|
+
value={state.currentFinger}
|
198
|
+
onValueChange={handleCurrentFinger}
|
199
|
+
/>
|
200
|
+
</View>
|
201
|
+
</View>
|
202
|
+
</Modal>
|
203
|
+
</GestureHandlerRootView>
|
204
|
+
);
|
205
|
+
};
|
206
|
+
|
207
|
+
export default MultiFingerRegister;
|
@@ -0,0 +1,49 @@
|
|
1
|
+
import { StyleSheet, Dimensions, Platform } from "react-native";
|
2
|
+
|
3
|
+
const { height } = Dimensions.get("window");
|
4
|
+
|
5
|
+
export const styles = StyleSheet.create({
|
6
|
+
container: {
|
7
|
+
flex: 1
|
8
|
+
},
|
9
|
+
root: {
|
10
|
+
flex: 1
|
11
|
+
},
|
12
|
+
cameraContainer: {
|
13
|
+
flex: 1,
|
14
|
+
justifyContent: "center"
|
15
|
+
},
|
16
|
+
camera: {
|
17
|
+
flex: 1,
|
18
|
+
paddingBottom: height * 0.2
|
19
|
+
},
|
20
|
+
containerCapture: {
|
21
|
+
position: "absolute",
|
22
|
+
width: "100%",
|
23
|
+
alignItems: "center"
|
24
|
+
},
|
25
|
+
cameraConfigs: {
|
26
|
+
alignItems: "center"
|
27
|
+
},
|
28
|
+
containerModalIcon: {
|
29
|
+
position: "absolute",
|
30
|
+
top: 10,
|
31
|
+
right: 10,
|
32
|
+
zIndex: 9999
|
33
|
+
},
|
34
|
+
containerModal: { flex: 1, justifyContent: "flex-end", marginBottom: "15%" },
|
35
|
+
modal: {
|
36
|
+
margin: 20,
|
37
|
+
backgroundColor: "white",
|
38
|
+
borderRadius: 20,
|
39
|
+
padding: Platform.OS === "ios" ? 35 : 20,
|
40
|
+
shadowColor: "#000",
|
41
|
+
shadowOffset: {
|
42
|
+
width: 0,
|
43
|
+
height: 2
|
44
|
+
},
|
45
|
+
shadowOpacity: 0.25,
|
46
|
+
shadowRadius: 4,
|
47
|
+
elevation: 5
|
48
|
+
}
|
49
|
+
});
|
package/src/screens/index.ts
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
import FingerRegister from "./FingerRegister/FingerRegister";
|
2
2
|
import LifeCertificate from "./LifeCertificate/LifeCertificate";
|
3
3
|
import FingerAuth from "./FingerAuth/FingerAuth";
|
4
|
+
import MultiFingerRegister from "./MultiFingerRegister/MultiFingerRegister";
|
4
5
|
|
5
|
-
export { FingerRegister, LifeCertificate, FingerAuth };
|
6
|
+
export { FingerRegister, LifeCertificate, FingerAuth, MultiFingerRegister };
|
package/src/services/services.ts
CHANGED
@@ -32,10 +32,10 @@ export const getConfigsApi = async (): Promise<GetConfigApiResponse> => {
|
|
32
32
|
|
33
33
|
export const registerFingerImages = async ({
|
34
34
|
UID,
|
35
|
-
images
|
35
|
+
images,
|
36
|
+
finger
|
36
37
|
}: RegisterFingerImagesType): Promise<RegisterFingerResponse> => {
|
37
38
|
try {
|
38
|
-
const finger = "DI";
|
39
39
|
const { data } = await axiosInstance.post(
|
40
40
|
"/enroll-images",
|
41
41
|
{ UID, finger, images },
|
package/src/services/types.ts
CHANGED
@@ -9,9 +9,23 @@ export type GetConfigApiResponse = {
|
|
9
9
|
showButtonInfo: boolean;
|
10
10
|
}[];
|
11
11
|
|
12
|
+
export enum Finger {
|
13
|
+
LEFT_THUMB = "LT",
|
14
|
+
LEFT_INDEX = "LI",
|
15
|
+
LEFT_MIDDLE = "LM",
|
16
|
+
LEFT_RING = "LR",
|
17
|
+
LEFT_PINKY = "LP",
|
18
|
+
RIGHT_THUMB = "RT",
|
19
|
+
RIGHT_INDEX = "RI",
|
20
|
+
RIGHT_MIDDLE = "RM",
|
21
|
+
RIGHT_RING = "RR",
|
22
|
+
RIGHT_PINKY = "RP"
|
23
|
+
}
|
24
|
+
|
12
25
|
export type RegisterFingerImagesType = {
|
13
26
|
UID: string;
|
14
27
|
images: string[];
|
28
|
+
finger: Finger | undefined;
|
15
29
|
};
|
16
30
|
|
17
31
|
export type RegisterFingerResponse = {
|
@@ -50,9 +50,17 @@ const handleLoading = () => {
|
|
50
50
|
}));
|
51
51
|
};
|
52
52
|
|
53
|
-
const sendImage = async (imagePath: string, UID: string) => {
|
53
|
+
const sendImage = async (imagePath: string, UID: string, mock?: boolean) => {
|
54
54
|
try {
|
55
55
|
handleLoading();
|
56
|
+
if (mock === true) {
|
57
|
+
return slice.setState((state) => ({
|
58
|
+
state: {
|
59
|
+
...state.state,
|
60
|
+
code: 0
|
61
|
+
}
|
62
|
+
}));
|
63
|
+
}
|
56
64
|
const convertedImage = await readFile(imagePath, "base64");
|
57
65
|
const response = await authFinger({ UID, image: convertedImage });
|
58
66
|
slice.setState((state) => ({
|
@@ -14,7 +14,7 @@ type State = {
|
|
14
14
|
type Dispatch = {
|
15
15
|
getConfig: (serviceType: "finger" | "liveness") => void;
|
16
16
|
handleLoading: () => void;
|
17
|
-
sendImage: (imagePath: string, UID: string) => void;
|
17
|
+
sendImage: (imagePath: string, UID: string, mock?: boolean) => void;
|
18
18
|
resetState: () => void;
|
19
19
|
setModal: (title: string, message: string) => void;
|
20
20
|
};
|
@@ -1,9 +1,22 @@
|
|
1
1
|
import { create } from "zustand";
|
2
2
|
import { readFile } from "react-native-fs";
|
3
3
|
import { registerFingerImages } from "../../../services/services";
|
4
|
-
import { FingerRegisterState, InitialState } from "./types";
|
4
|
+
import { Finger, FingerRegisterState, InitialState } from "./types";
|
5
5
|
import { getConfigCamera } from "../../../utils";
|
6
6
|
|
7
|
+
const fingerOrder = [
|
8
|
+
Finger.RIGHT_INDEX,
|
9
|
+
Finger.RIGHT_MIDDLE,
|
10
|
+
Finger.RIGHT_RING,
|
11
|
+
Finger.RIGHT_PINKY,
|
12
|
+
Finger.RIGHT_THUMB,
|
13
|
+
Finger.LEFT_INDEX,
|
14
|
+
Finger.LEFT_MIDDLE,
|
15
|
+
Finger.LEFT_RING,
|
16
|
+
Finger.LEFT_PINKY,
|
17
|
+
Finger.LEFT_THUMB
|
18
|
+
];
|
19
|
+
|
7
20
|
const initialState: InitialState = {
|
8
21
|
state: {
|
9
22
|
exposure: 0,
|
@@ -16,7 +29,9 @@ const initialState: InitialState = {
|
|
16
29
|
modal: {
|
17
30
|
title: "",
|
18
31
|
message: ""
|
19
|
-
}
|
32
|
+
},
|
33
|
+
currentFinger: fingerOrder[0] as Finger,
|
34
|
+
currentFingerIndex: 0
|
20
35
|
}
|
21
36
|
};
|
22
37
|
|
@@ -34,8 +49,21 @@ const setImagePath = async (imagePath: string) => {
|
|
34
49
|
}
|
35
50
|
};
|
36
51
|
|
37
|
-
const sendImages = async (images: string[], UID: string) => {
|
38
|
-
|
52
|
+
const sendImages = async (images: string[], UID: string, mock?: boolean, finger?: Finger) => {
|
53
|
+
if (mock === true) {
|
54
|
+
return slice.setState((state) => ({
|
55
|
+
state: {
|
56
|
+
...state.state,
|
57
|
+
code: 0
|
58
|
+
}
|
59
|
+
}));
|
60
|
+
}
|
61
|
+
|
62
|
+
const response = await registerFingerImages({
|
63
|
+
images,
|
64
|
+
UID,
|
65
|
+
finger: finger === undefined ? Finger.RIGHT_INDEX : finger
|
66
|
+
});
|
39
67
|
slice.setState((state) => ({
|
40
68
|
state: {
|
41
69
|
...state.state,
|
@@ -44,6 +72,27 @@ const sendImages = async (images: string[], UID: string) => {
|
|
44
72
|
}));
|
45
73
|
};
|
46
74
|
|
75
|
+
const setCurrentFinger = (finger: Finger) => {
|
76
|
+
slice.setState((state) => ({
|
77
|
+
state: {
|
78
|
+
...state.state,
|
79
|
+
currentFingerIndex: fingerOrder.indexOf(finger),
|
80
|
+
currentFinger: finger
|
81
|
+
}
|
82
|
+
}));
|
83
|
+
};
|
84
|
+
|
85
|
+
const handleFinger = () => {
|
86
|
+
const nextIndex = (slice.getState().state.currentFingerIndex + 1) % fingerOrder.length;
|
87
|
+
slice.setState((state) => ({
|
88
|
+
state: {
|
89
|
+
...state.state,
|
90
|
+
currentFingerIndex: nextIndex,
|
91
|
+
currentFinger: fingerOrder[nextIndex] as Finger
|
92
|
+
}
|
93
|
+
}));
|
94
|
+
};
|
95
|
+
|
47
96
|
const handleLoading = () => {
|
48
97
|
slice.setState((state) => ({
|
49
98
|
state: {
|
@@ -94,7 +143,9 @@ const slice = create<FingerRegisterState>(() => ({
|
|
94
143
|
setImagePath,
|
95
144
|
sendImages,
|
96
145
|
setModal,
|
97
|
-
resetState
|
146
|
+
resetState,
|
147
|
+
handleFinger,
|
148
|
+
setCurrentFinger
|
98
149
|
}
|
99
150
|
}));
|
100
151
|
|
@@ -1,3 +1,16 @@
|
|
1
|
+
export enum Finger {
|
2
|
+
LEFT_THUMB = "LT",
|
3
|
+
LEFT_INDEX = "LI",
|
4
|
+
LEFT_MIDDLE = "LM",
|
5
|
+
LEFT_RING = "LR",
|
6
|
+
LEFT_PINKY = "LP",
|
7
|
+
RIGHT_THUMB = "RT",
|
8
|
+
RIGHT_INDEX = "RI",
|
9
|
+
RIGHT_MIDDLE = "RM",
|
10
|
+
RIGHT_RING = "RR",
|
11
|
+
RIGHT_PINKY = "RP"
|
12
|
+
}
|
13
|
+
|
1
14
|
type State = {
|
2
15
|
exposure: number;
|
3
16
|
zoom: number;
|
@@ -10,14 +23,18 @@ type State = {
|
|
10
23
|
title: string;
|
11
24
|
message: string;
|
12
25
|
};
|
26
|
+
currentFingerIndex: number;
|
27
|
+
currentFinger: Finger;
|
13
28
|
};
|
14
29
|
type Dispatch = {
|
15
30
|
getConfig: (serviceType: "finger" | "liveness") => void;
|
16
31
|
handleLoading: () => void;
|
17
32
|
setImagePath: (imagePath: string) => void;
|
18
|
-
sendImages: (images: string[], UID: string) => void;
|
33
|
+
sendImages: (images: string[], UID: string, mock?: boolean, finger?: Finger) => void;
|
19
34
|
setModal: (title: string, message: string) => void;
|
20
35
|
resetState: () => void;
|
36
|
+
handleFinger: () => void;
|
37
|
+
setCurrentFinger: (finger: Finger) => void;
|
21
38
|
};
|
22
39
|
|
23
40
|
export type InitialState = {
|
@@ -1,7 +1,7 @@
|
|
1
1
|
import { create } from "zustand";
|
2
2
|
import { InitialState, LifeCertificateState, SendLifeCertificateType } from "./types";
|
3
3
|
import { lifeCertificate } from "../../../services";
|
4
|
-
import { getConfigCamera } from "../../../utils";
|
4
|
+
import { getConfigCamera, randomHeartRate } from "../../../utils";
|
5
5
|
|
6
6
|
const initialState: InitialState = {
|
7
7
|
state: {
|
@@ -38,7 +38,16 @@ const setIsRecording = (recoding: boolean) => {
|
|
38
38
|
}));
|
39
39
|
};
|
40
40
|
|
41
|
-
const sendLifeCertificate = async ({ videoFile, UID, exposure }: SendLifeCertificateType) => {
|
41
|
+
const sendLifeCertificate = async ({ videoFile, UID, exposure, mock }: SendLifeCertificateType) => {
|
42
|
+
if (mock === true) {
|
43
|
+
return slice.setState((state) => ({
|
44
|
+
state: {
|
45
|
+
...state.state,
|
46
|
+
bpm: randomHeartRate(),
|
47
|
+
code: 0
|
48
|
+
}
|
49
|
+
}));
|
50
|
+
}
|
42
51
|
const videoPath = videoFile.path;
|
43
52
|
const response = await lifeCertificate({
|
44
53
|
videoPath,
|
package/src/utils/index.ts
CHANGED
@@ -1,38 +0,0 @@
|
|
1
|
-
"use strict";
|
2
|
-
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
4
|
-
value: true
|
5
|
-
});
|
6
|
-
exports.validarBase64 = exports.encodeImageToBase64 = void 0;
|
7
|
-
var _reactNativeFs = _interopRequireDefault(require("react-native-fs"));
|
8
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
9
|
-
const encodeImageToBase64 = async imagePath => {
|
10
|
-
try {
|
11
|
-
const imageData = await _reactNativeFs.default.readFile(imagePath, "base64");
|
12
|
-
return imageData;
|
13
|
-
} catch (error) {
|
14
|
-
return null;
|
15
|
-
}
|
16
|
-
};
|
17
|
-
exports.encodeImageToBase64 = encodeImageToBase64;
|
18
|
-
const validarBase64 = array => {
|
19
|
-
// Verifica se o argumento é um array e tem exatamente 3 elementos
|
20
|
-
if (!Array.isArray(array) || array.length !== 3) {
|
21
|
-
return false;
|
22
|
-
}
|
23
|
-
|
24
|
-
// Regex para validar base64
|
25
|
-
const base64Regex = /^[a-zA-Z0-9+/]*={0,2}$/;
|
26
|
-
|
27
|
-
// Verifica se cada elemento do array é uma string válida em base64
|
28
|
-
for (let i = 0; i < array.length; i++) {
|
29
|
-
if (typeof array[i] !== "string" || !base64Regex.test(array[i])) {
|
30
|
-
return false;
|
31
|
-
}
|
32
|
-
}
|
33
|
-
|
34
|
-
// Se chegou até aqui, o array é válido
|
35
|
-
return true;
|
36
|
-
};
|
37
|
-
exports.validarBase64 = validarBase64;
|
38
|
-
//# sourceMappingURL=file.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"names":["_reactNativeFs","_interopRequireDefault","require","obj","__esModule","default","encodeImageToBase64","imagePath","imageData","RNFS","readFile","error","exports","validarBase64","array","Array","isArray","length","base64Regex","i","test"],"sourceRoot":"../../../src","sources":["utils/file.ts"],"mappings":";;;;;;AAAA,IAAAA,cAAA,GAAAC,sBAAA,CAAAC,OAAA;AAAmC,SAAAD,uBAAAE,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAE5B,MAAMG,mBAAmB,GAAG,MAAOC,SAAiB,IAAK;EAC9D,IAAI;IACF,MAAMC,SAAS,GAAG,MAAMC,sBAAI,CAACC,QAAQ,CAACH,SAAS,EAAE,QAAQ,CAAC;IAC1D,OAAOC,SAAS;EAClB,CAAC,CAAC,OAAOG,KAAK,EAAE;IACd,OAAO,IAAI;EACb;AACF,CAAC;AAACC,OAAA,CAAAN,mBAAA,GAAAA,mBAAA;AAEK,MAAMO,aAAa,GAAIC,KAAqB,IAAK;EACtD;EACA,IAAI,CAACC,KAAK,CAACC,OAAO,CAACF,KAAK,CAAC,IAAIA,KAAK,CAACG,MAAM,KAAK,CAAC,EAAE;IAC/C,OAAO,KAAK;EACd;;EAEA;EACA,MAAMC,WAAW,GAAG,wBAAwB;;EAE5C;EACA,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGL,KAAK,CAACG,MAAM,EAAEE,CAAC,EAAE,EAAE;IACrC,IAAI,OAAOL,KAAK,CAACK,CAAC,CAAC,KAAK,QAAQ,IAAI,CAACD,WAAW,CAACE,IAAI,CAACN,KAAK,CAACK,CAAC,CAAC,CAAC,EAAE;MAC/D,OAAO,KAAK;IACd;EACF;;EAEA;EACA,OAAO,IAAI;AACb,CAAC;AAACP,OAAA,CAAAC,aAAA,GAAAA,aAAA"}
|
package/lib/module/utils/file.js
DELETED
@@ -1,29 +0,0 @@
|
|
1
|
-
import RNFS from "react-native-fs";
|
2
|
-
export const encodeImageToBase64 = async imagePath => {
|
3
|
-
try {
|
4
|
-
const imageData = await RNFS.readFile(imagePath, "base64");
|
5
|
-
return imageData;
|
6
|
-
} catch (error) {
|
7
|
-
return null;
|
8
|
-
}
|
9
|
-
};
|
10
|
-
export const validarBase64 = array => {
|
11
|
-
// Verifica se o argumento é um array e tem exatamente 3 elementos
|
12
|
-
if (!Array.isArray(array) || array.length !== 3) {
|
13
|
-
return false;
|
14
|
-
}
|
15
|
-
|
16
|
-
// Regex para validar base64
|
17
|
-
const base64Regex = /^[a-zA-Z0-9+/]*={0,2}$/;
|
18
|
-
|
19
|
-
// Verifica se cada elemento do array é uma string válida em base64
|
20
|
-
for (let i = 0; i < array.length; i++) {
|
21
|
-
if (typeof array[i] !== "string" || !base64Regex.test(array[i])) {
|
22
|
-
return false;
|
23
|
-
}
|
24
|
-
}
|
25
|
-
|
26
|
-
// Se chegou até aqui, o array é válido
|
27
|
-
return true;
|
28
|
-
};
|
29
|
-
//# sourceMappingURL=file.js.map
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"names":["RNFS","encodeImageToBase64","imagePath","imageData","readFile","error","validarBase64","array","Array","isArray","length","base64Regex","i","test"],"sourceRoot":"../../../src","sources":["utils/file.ts"],"mappings":"AAAA,OAAOA,IAAI,MAAM,iBAAiB;AAElC,OAAO,MAAMC,mBAAmB,GAAG,MAAOC,SAAiB,IAAK;EAC9D,IAAI;IACF,MAAMC,SAAS,GAAG,MAAMH,IAAI,CAACI,QAAQ,CAACF,SAAS,EAAE,QAAQ,CAAC;IAC1D,OAAOC,SAAS;EAClB,CAAC,CAAC,OAAOE,KAAK,EAAE;IACd,OAAO,IAAI;EACb;AACF,CAAC;AAED,OAAO,MAAMC,aAAa,GAAIC,KAAqB,IAAK;EACtD;EACA,IAAI,CAACC,KAAK,CAACC,OAAO,CAACF,KAAK,CAAC,IAAIA,KAAK,CAACG,MAAM,KAAK,CAAC,EAAE;IAC/C,OAAO,KAAK;EACd;;EAEA;EACA,MAAMC,WAAW,GAAG,wBAAwB;;EAE5C;EACA,KAAK,IAAIC,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGL,KAAK,CAACG,MAAM,EAAEE,CAAC,EAAE,EAAE;IACrC,IAAI,OAAOL,KAAK,CAACK,CAAC,CAAC,KAAK,QAAQ,IAAI,CAACD,WAAW,CAACE,IAAI,CAACN,KAAK,CAACK,CAAC,CAAC,CAAC,EAAE;MAC/D,OAAO,KAAK;IACd;EACF;;EAEA;EACA,OAAO,IAAI;AACb,CAAC"}
|
@@ -1 +0,0 @@
|
|
1
|
-
{"version":3,"file":"file.d.ts","sourceRoot":"","sources":["../../../../src/utils/file.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,mBAAmB,cAAqB,MAAM,2BAO1D,CAAC;AAEF,eAAO,MAAM,aAAa,UAAW,MAAM,GAAG,GAAG,EAAE,YAkBlD,CAAC"}
|
package/src/utils/file.ts
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
import RNFS from "react-native-fs";
|
2
|
-
|
3
|
-
export const encodeImageToBase64 = async (imagePath: string) => {
|
4
|
-
try {
|
5
|
-
const imageData = await RNFS.readFile(imagePath, "base64");
|
6
|
-
return imageData;
|
7
|
-
} catch (error) {
|
8
|
-
return null;
|
9
|
-
}
|
10
|
-
};
|
11
|
-
|
12
|
-
export const validarBase64 = (array: string | any[]) => {
|
13
|
-
// Verifica se o argumento é um array e tem exatamente 3 elementos
|
14
|
-
if (!Array.isArray(array) || array.length !== 3) {
|
15
|
-
return false;
|
16
|
-
}
|
17
|
-
|
18
|
-
// Regex para validar base64
|
19
|
-
const base64Regex = /^[a-zA-Z0-9+/]*={0,2}$/;
|
20
|
-
|
21
|
-
// Verifica se cada elemento do array é uma string válida em base64
|
22
|
-
for (let i = 0; i < array.length; i++) {
|
23
|
-
if (typeof array[i] !== "string" || !base64Regex.test(array[i])) {
|
24
|
-
return false;
|
25
|
-
}
|
26
|
-
}
|
27
|
-
|
28
|
-
// Se chegou até aqui, o array é válido
|
29
|
-
return true;
|
30
|
-
};
|