@ha_tecno/live-id-sdk 1.0.0

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 (217) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +323 -0
  3. package/android/build.gradle +94 -0
  4. package/android/gradle.properties +5 -0
  5. package/android/src/main/AndroidManifest.xml +4 -0
  6. package/android/src/main/AndroidManifestNew.xml +2 -0
  7. package/android/src/main/java/com/liveidsdk/LiveIdSdkModule.kt +25 -0
  8. package/android/src/main/java/com/liveidsdk/LiveIdSdkPackage.kt +17 -0
  9. package/ios/LiveIdSdk-Bridging-Header.h +2 -0
  10. package/ios/LiveIdSdk.mm +14 -0
  11. package/ios/LiveIdSdk.swift +8 -0
  12. package/lib/commonjs/assets/arrow.png +0 -0
  13. package/lib/commonjs/assets/exampleInstructionWithBorder.jpeg +0 -0
  14. package/lib/commonjs/assets/exampleInstructionWithoutFinger.jpeg +0 -0
  15. package/lib/commonjs/assets/ic_redness_capture_tip.png +0 -0
  16. package/lib/commonjs/assets/logo.png +0 -0
  17. package/lib/commonjs/components/CameraConfigInfos/index.js +21 -0
  18. package/lib/commonjs/components/CameraConfigInfos/index.js.map +1 -0
  19. package/lib/commonjs/components/CameraConfigInfos/styles.js +19 -0
  20. package/lib/commonjs/components/CameraConfigInfos/styles.js.map +1 -0
  21. package/lib/commonjs/components/DeviceNullDisplay/index.js +59 -0
  22. package/lib/commonjs/components/DeviceNullDisplay/index.js.map +1 -0
  23. package/lib/commonjs/components/ErrorDisplay/index.js +59 -0
  24. package/lib/commonjs/components/ErrorDisplay/index.js.map +1 -0
  25. package/lib/commonjs/components/Gabarito/index.js +19 -0
  26. package/lib/commonjs/components/Gabarito/index.js.map +1 -0
  27. package/lib/commonjs/components/Gabarito/styles.js +30 -0
  28. package/lib/commonjs/components/Gabarito/styles.js.map +1 -0
  29. package/lib/commonjs/components/Toast/Toast.js +66 -0
  30. package/lib/commonjs/components/Toast/Toast.js.map +1 -0
  31. package/lib/commonjs/components/WaitingForResult/index.js +24 -0
  32. package/lib/commonjs/components/WaitingForResult/index.js.map +1 -0
  33. package/lib/commonjs/components/WaitingForResult/styles.js +32 -0
  34. package/lib/commonjs/components/WaitingForResult/styles.js.map +1 -0
  35. package/lib/commonjs/index.js +34 -0
  36. package/lib/commonjs/index.js.map +1 -0
  37. package/lib/commonjs/screens/CadastroFinger/components/AjudaCadastro/index.js +49 -0
  38. package/lib/commonjs/screens/CadastroFinger/components/AjudaCadastro/index.js.map +1 -0
  39. package/lib/commonjs/screens/CadastroFinger/components/AjudaCadastro/styles.js +62 -0
  40. package/lib/commonjs/screens/CadastroFinger/components/AjudaCadastro/styles.js.map +1 -0
  41. package/lib/commonjs/screens/CadastroFinger/components/CameraCadastro/index.js +298 -0
  42. package/lib/commonjs/screens/CadastroFinger/components/CameraCadastro/index.js.map +1 -0
  43. package/lib/commonjs/screens/CadastroFinger/components/CameraCadastro/styles.js +54 -0
  44. package/lib/commonjs/screens/CadastroFinger/components/CameraCadastro/styles.js.map +1 -0
  45. package/lib/commonjs/screens/CadastroFinger/components/ImageDisplayScreen/index.js +44 -0
  46. package/lib/commonjs/screens/CadastroFinger/components/ImageDisplayScreen/index.js.map +1 -0
  47. package/lib/commonjs/screens/CadastroFinger/components/ImageDisplayScreen/styles.js +65 -0
  48. package/lib/commonjs/screens/CadastroFinger/components/ImageDisplayScreen/styles.js.map +1 -0
  49. package/lib/commonjs/screens/CadastroFinger/index.js +50 -0
  50. package/lib/commonjs/screens/CadastroFinger/index.js.map +1 -0
  51. package/lib/commonjs/screens/CadastroScreen/CadastroScreen.js +186 -0
  52. package/lib/commonjs/screens/CadastroScreen/CadastroScreen.js.map +1 -0
  53. package/lib/commonjs/screens/ProvaVidas/index.js +246 -0
  54. package/lib/commonjs/screens/ProvaVidas/index.js.map +1 -0
  55. package/lib/commonjs/screens/ProvaVidas/styles.js +93 -0
  56. package/lib/commonjs/screens/ProvaVidas/styles.js.map +1 -0
  57. package/lib/commonjs/screens/ValidadeFinger/index.js +216 -0
  58. package/lib/commonjs/screens/ValidadeFinger/index.js.map +1 -0
  59. package/lib/commonjs/screens/ValidadeFinger/styles.js +54 -0
  60. package/lib/commonjs/screens/ValidadeFinger/styles.js.map +1 -0
  61. package/lib/commonjs/services/index.js +145 -0
  62. package/lib/commonjs/services/index.js.map +1 -0
  63. package/lib/commonjs/types/screen.js +2 -0
  64. package/lib/commonjs/types/screen.js.map +1 -0
  65. package/lib/commonjs/utils/file.js +38 -0
  66. package/lib/commonjs/utils/file.js.map +1 -0
  67. package/lib/commonjs/utils/getConfigCamera.js +25 -0
  68. package/lib/commonjs/utils/getConfigCamera.js.map +1 -0
  69. package/lib/commonjs/utils/index.js +14 -0
  70. package/lib/commonjs/utils/index.js.map +1 -0
  71. package/lib/module/assets/arrow.png +0 -0
  72. package/lib/module/assets/exampleInstructionWithBorder.jpeg +0 -0
  73. package/lib/module/assets/exampleInstructionWithoutFinger.jpeg +0 -0
  74. package/lib/module/assets/ic_redness_capture_tip.png +0 -0
  75. package/lib/module/assets/logo.png +0 -0
  76. package/lib/module/components/CameraConfigInfos/index.js +13 -0
  77. package/lib/module/components/CameraConfigInfos/index.js.map +1 -0
  78. package/lib/module/components/CameraConfigInfos/styles.js +13 -0
  79. package/lib/module/components/CameraConfigInfos/styles.js.map +1 -0
  80. package/lib/module/components/DeviceNullDisplay/index.js +51 -0
  81. package/lib/module/components/DeviceNullDisplay/index.js.map +1 -0
  82. package/lib/module/components/ErrorDisplay/index.js +51 -0
  83. package/lib/module/components/ErrorDisplay/index.js.map +1 -0
  84. package/lib/module/components/Gabarito/index.js +11 -0
  85. package/lib/module/components/Gabarito/index.js.map +1 -0
  86. package/lib/module/components/Gabarito/styles.js +24 -0
  87. package/lib/module/components/Gabarito/styles.js.map +1 -0
  88. package/lib/module/components/Toast/Toast.js +58 -0
  89. package/lib/module/components/Toast/Toast.js.map +1 -0
  90. package/lib/module/components/WaitingForResult/index.js +17 -0
  91. package/lib/module/components/WaitingForResult/index.js.map +1 -0
  92. package/lib/module/components/WaitingForResult/styles.js +26 -0
  93. package/lib/module/components/WaitingForResult/styles.js.map +1 -0
  94. package/lib/module/index.js +7 -0
  95. package/lib/module/index.js.map +1 -0
  96. package/lib/module/screens/CadastroFinger/components/AjudaCadastro/index.js +41 -0
  97. package/lib/module/screens/CadastroFinger/components/AjudaCadastro/index.js.map +1 -0
  98. package/lib/module/screens/CadastroFinger/components/AjudaCadastro/styles.js +56 -0
  99. package/lib/module/screens/CadastroFinger/components/AjudaCadastro/styles.js.map +1 -0
  100. package/lib/module/screens/CadastroFinger/components/CameraCadastro/index.js +288 -0
  101. package/lib/module/screens/CadastroFinger/components/CameraCadastro/index.js.map +1 -0
  102. package/lib/module/screens/CadastroFinger/components/CameraCadastro/styles.js +48 -0
  103. package/lib/module/screens/CadastroFinger/components/CameraCadastro/styles.js.map +1 -0
  104. package/lib/module/screens/CadastroFinger/components/ImageDisplayScreen/index.js +36 -0
  105. package/lib/module/screens/CadastroFinger/components/ImageDisplayScreen/index.js.map +1 -0
  106. package/lib/module/screens/CadastroFinger/components/ImageDisplayScreen/styles.js +59 -0
  107. package/lib/module/screens/CadastroFinger/components/ImageDisplayScreen/styles.js.map +1 -0
  108. package/lib/module/screens/CadastroFinger/index.js +42 -0
  109. package/lib/module/screens/CadastroFinger/index.js.map +1 -0
  110. package/lib/module/screens/CadastroScreen/CadastroScreen.js +177 -0
  111. package/lib/module/screens/CadastroScreen/CadastroScreen.js.map +1 -0
  112. package/lib/module/screens/ProvaVidas/index.js +239 -0
  113. package/lib/module/screens/ProvaVidas/index.js.map +1 -0
  114. package/lib/module/screens/ProvaVidas/styles.js +87 -0
  115. package/lib/module/screens/ProvaVidas/styles.js.map +1 -0
  116. package/lib/module/screens/ValidadeFinger/index.js +206 -0
  117. package/lib/module/screens/ValidadeFinger/index.js.map +1 -0
  118. package/lib/module/screens/ValidadeFinger/styles.js +48 -0
  119. package/lib/module/screens/ValidadeFinger/styles.js.map +1 -0
  120. package/lib/module/services/index.js +131 -0
  121. package/lib/module/services/index.js.map +1 -0
  122. package/lib/module/types/screen.js +2 -0
  123. package/lib/module/types/screen.js.map +1 -0
  124. package/lib/module/utils/file.js +29 -0
  125. package/lib/module/utils/file.js.map +1 -0
  126. package/lib/module/utils/getConfigCamera.js +19 -0
  127. package/lib/module/utils/getConfigCamera.js.map +1 -0
  128. package/lib/module/utils/index.js +3 -0
  129. package/lib/module/utils/index.js.map +1 -0
  130. package/lib/typescript/src/components/CameraConfigInfos/index.d.ts +9 -0
  131. package/lib/typescript/src/components/CameraConfigInfos/index.d.ts.map +1 -0
  132. package/lib/typescript/src/components/CameraConfigInfos/styles.d.ts +11 -0
  133. package/lib/typescript/src/components/CameraConfigInfos/styles.d.ts.map +1 -0
  134. package/lib/typescript/src/components/DeviceNullDisplay/index.d.ts +11 -0
  135. package/lib/typescript/src/components/DeviceNullDisplay/index.d.ts.map +1 -0
  136. package/lib/typescript/src/components/ErrorDisplay/index.d.ts +11 -0
  137. package/lib/typescript/src/components/ErrorDisplay/index.d.ts.map +1 -0
  138. package/lib/typescript/src/components/Gabarito/index.d.ts +3 -0
  139. package/lib/typescript/src/components/Gabarito/index.d.ts.map +1 -0
  140. package/lib/typescript/src/components/Gabarito/styles.d.ts +21 -0
  141. package/lib/typescript/src/components/Gabarito/styles.d.ts.map +1 -0
  142. package/lib/typescript/src/components/Toast/Toast.d.ts +42 -0
  143. package/lib/typescript/src/components/Toast/Toast.d.ts.map +1 -0
  144. package/lib/typescript/src/components/WaitingForResult/index.d.ts +7 -0
  145. package/lib/typescript/src/components/WaitingForResult/index.d.ts.map +1 -0
  146. package/lib/typescript/src/components/WaitingForResult/styles.d.ts +24 -0
  147. package/lib/typescript/src/components/WaitingForResult/styles.d.ts.map +1 -0
  148. package/lib/typescript/src/index.d.ts +5 -0
  149. package/lib/typescript/src/index.d.ts.map +1 -0
  150. package/lib/typescript/src/screens/CadastroFinger/components/AjudaCadastro/index.d.ts +7 -0
  151. package/lib/typescript/src/screens/CadastroFinger/components/AjudaCadastro/index.d.ts.map +1 -0
  152. package/lib/typescript/src/screens/CadastroFinger/components/AjudaCadastro/styles.d.ts +55 -0
  153. package/lib/typescript/src/screens/CadastroFinger/components/AjudaCadastro/styles.d.ts.map +1 -0
  154. package/lib/typescript/src/screens/CadastroFinger/components/CameraCadastro/index.d.ts +16 -0
  155. package/lib/typescript/src/screens/CadastroFinger/components/CameraCadastro/index.d.ts.map +1 -0
  156. package/lib/typescript/src/screens/CadastroFinger/components/CameraCadastro/styles.d.ts +44 -0
  157. package/lib/typescript/src/screens/CadastroFinger/components/CameraCadastro/styles.d.ts.map +1 -0
  158. package/lib/typescript/src/screens/CadastroFinger/components/ImageDisplayScreen/index.d.ts +12 -0
  159. package/lib/typescript/src/screens/CadastroFinger/components/ImageDisplayScreen/index.d.ts.map +1 -0
  160. package/lib/typescript/src/screens/CadastroFinger/components/ImageDisplayScreen/styles.d.ts +54 -0
  161. package/lib/typescript/src/screens/CadastroFinger/components/ImageDisplayScreen/styles.d.ts.map +1 -0
  162. package/lib/typescript/src/screens/CadastroFinger/index.d.ts +16 -0
  163. package/lib/typescript/src/screens/CadastroFinger/index.d.ts.map +1 -0
  164. package/lib/typescript/src/screens/CadastroScreen/CadastroScreen.d.ts +14 -0
  165. package/lib/typescript/src/screens/CadastroScreen/CadastroScreen.d.ts.map +1 -0
  166. package/lib/typescript/src/screens/ProvaVidas/index.d.ts +14 -0
  167. package/lib/typescript/src/screens/ProvaVidas/index.d.ts.map +1 -0
  168. package/lib/typescript/src/screens/ProvaVidas/styles.d.ts +85 -0
  169. package/lib/typescript/src/screens/ProvaVidas/styles.d.ts.map +1 -0
  170. package/lib/typescript/src/screens/ValidadeFinger/index.d.ts +14 -0
  171. package/lib/typescript/src/screens/ValidadeFinger/index.d.ts.map +1 -0
  172. package/lib/typescript/src/screens/ValidadeFinger/styles.d.ts +44 -0
  173. package/lib/typescript/src/screens/ValidadeFinger/styles.d.ts.map +1 -0
  174. package/lib/typescript/src/services/index.d.ts +21 -0
  175. package/lib/typescript/src/services/index.d.ts.map +1 -0
  176. package/lib/typescript/src/types/screen.d.ts +6 -0
  177. package/lib/typescript/src/types/screen.d.ts.map +1 -0
  178. package/lib/typescript/src/utils/file.d.ts +3 -0
  179. package/lib/typescript/src/utils/file.d.ts.map +1 -0
  180. package/lib/typescript/src/utils/getConfigCamera.d.ts +14 -0
  181. package/lib/typescript/src/utils/getConfigCamera.d.ts.map +1 -0
  182. package/lib/typescript/src/utils/index.d.ts +3 -0
  183. package/lib/typescript/src/utils/index.d.ts.map +1 -0
  184. package/live-id-sdk.podspec +41 -0
  185. package/package.json +184 -0
  186. package/src/assets/arrow.png +0 -0
  187. package/src/assets/exampleInstructionWithBorder.jpeg +0 -0
  188. package/src/assets/exampleInstructionWithoutFinger.jpeg +0 -0
  189. package/src/assets/ic_redness_capture_tip.png +0 -0
  190. package/src/assets/logo.png +0 -0
  191. package/src/components/CameraConfigInfos/index.tsx +25 -0
  192. package/src/components/CameraConfigInfos/styles.ts +13 -0
  193. package/src/components/DeviceNullDisplay/index.tsx +59 -0
  194. package/src/components/ErrorDisplay/index.tsx +60 -0
  195. package/src/components/Gabarito/index.tsx +11 -0
  196. package/src/components/Gabarito/styles.ts +23 -0
  197. package/src/components/Toast/Toast.tsx +61 -0
  198. package/src/components/WaitingForResult/index.tsx +22 -0
  199. package/src/components/WaitingForResult/styles.ts +27 -0
  200. package/src/index.tsx +6 -0
  201. package/src/screens/CadastroFinger/components/AjudaCadastro/index.tsx +49 -0
  202. package/src/screens/CadastroFinger/components/AjudaCadastro/styles.ts +56 -0
  203. package/src/screens/CadastroFinger/components/CameraCadastro/index.tsx +356 -0
  204. package/src/screens/CadastroFinger/components/CameraCadastro/styles.ts +47 -0
  205. package/src/screens/CadastroFinger/components/ImageDisplayScreen/index.tsx +45 -0
  206. package/src/screens/CadastroFinger/components/ImageDisplayScreen/styles.ts +55 -0
  207. package/src/screens/CadastroFinger/index.tsx +56 -0
  208. package/src/screens/CadastroScreen/CadastroScreen.tsx +212 -0
  209. package/src/screens/ProvaVidas/index.tsx +308 -0
  210. package/src/screens/ProvaVidas/styles.ts +99 -0
  211. package/src/screens/ValidadeFinger/index.tsx +263 -0
  212. package/src/screens/ValidadeFinger/styles.ts +47 -0
  213. package/src/services/index.ts +143 -0
  214. package/src/types/screen.ts +5 -0
  215. package/src/utils/file.ts +30 -0
  216. package/src/utils/getConfigCamera.ts +45 -0
  217. package/src/utils/index.ts +3 -0
@@ -0,0 +1,263 @@
1
+ import React, { useCallback, useEffect, useRef, useState } from 'react';
2
+ import { Button, Text, View, Alert, TouchableOpacity } from 'react-native';
3
+ import {
4
+ Camera,
5
+ useCameraFormat,
6
+ type Point,
7
+ useCameraDevice,
8
+ } from 'react-native-vision-camera';
9
+ import Modal, { type ModalProps } from 'react-native-modal';
10
+ import Orientation from 'react-native-orientation-locker';
11
+ import {
12
+ Gesture,
13
+ GestureDetector,
14
+ GestureHandlerRootView,
15
+ } from 'react-native-gesture-handler';
16
+ import { runOnJS } from 'react-native-reanimated';
17
+
18
+ import { verifyDigital } from '../../services';
19
+ import { encodeImageToBase64 } from '../../utils/file';
20
+ import type { ScreenProps } from '../../types/screen';
21
+ import { DeviceNullDisplay } from '../../components/DeviceNullDisplay';
22
+ import { ErrorDisplay } from '../../components/ErrorDisplay';
23
+ import { Gabarito } from '../../components/Gabarito';
24
+ import { WaitingForResult } from '../../components/WaitingForResult';
25
+ import { styles } from './styles';
26
+ import { CameraConfigInfos } from '../../components/CameraConfigInfos';
27
+ import { getConfigCamera } from '../../utils';
28
+
29
+ interface ValidaFingerProps {
30
+ isVisible: boolean;
31
+ ModalParams?: ModalProps;
32
+ screenProps?: ScreenProps;
33
+ onCloseModal?: () => void;
34
+ onError?: (response?: any) => void;
35
+ onSuccess?: (response?: any) => void;
36
+ }
37
+
38
+ type GetConfigApi = {
39
+ id: number;
40
+ deviceModels: string[];
41
+ deviceType: string;
42
+ fps: number;
43
+ exposure: number;
44
+ zoom: number;
45
+ serviceType: string;
46
+ showButtonInfo: boolean;
47
+ };
48
+
49
+ export const ValidaFinger: React.FC<ValidaFingerProps> = ({
50
+ isVisible = false,
51
+ onCloseModal,
52
+ onError,
53
+ onSuccess,
54
+ ModalParams,
55
+ screenProps,
56
+ }) => {
57
+ const id = screenProps?.id;
58
+
59
+ const camera = useRef<Camera>(null);
60
+ const [showOverlay, setShowOverlay] = useState(false);
61
+ const [load, setLoad] = useState(false);
62
+ const [cameraConfigs, setCameraConfigs] = useState<GetConfigApi>();
63
+
64
+ // mantem a tela em modo portrait
65
+ useEffect(() => {
66
+ Orientation.lockToPortrait();
67
+ return () => {
68
+ Orientation.unlockAllOrientations();
69
+ };
70
+ }, []);
71
+
72
+ // Pega a permissão da camera do dispositivo
73
+ const requestCameraPermission = useCallback(async () => {
74
+ try {
75
+ await Camera.requestCameraPermission();
76
+ } catch (error) {}
77
+ }, []);
78
+
79
+ // pra garantir que a permissão da camera seja solicitada
80
+ useEffect(() => {
81
+ requestCameraPermission();
82
+ }, [requestCameraPermission]);
83
+
84
+ useEffect(() => {
85
+ getConfigCamera('finger')
86
+ .then((config) => {
87
+ setCameraConfigs(config);
88
+ })
89
+ .catch((error) => {
90
+ console.error(error);
91
+ });
92
+ }, []);
93
+
94
+ const device = useCameraDevice('back', {
95
+ physicalDevices: ['wide-angle-camera'],
96
+ });
97
+
98
+ const cameraFormat = useCameraFormat(device, [
99
+ {
100
+ photoResolution: {
101
+ height: 1280,
102
+ width: 720,
103
+ },
104
+ },
105
+ ]);
106
+
107
+ const capturedPhoto = async () => {
108
+ const snapshot = await camera.current?.takePhoto({
109
+ qualityPrioritization: 'speed',
110
+ flash: 'on',
111
+ });
112
+ if (snapshot == null) {
113
+ Alert.alert('Erro ao capturar imagem');
114
+ return false;
115
+ }
116
+ let base64 = await encodeImageToBase64(snapshot.path);
117
+
118
+ setLoad(true);
119
+ setShowOverlay(true);
120
+ sendFile(base64);
121
+ return true;
122
+ };
123
+
124
+ // Fecha o modal
125
+ const onCloseModalHandler = useCallback(() => {
126
+ onCloseModal && onCloseModal();
127
+ }, [onCloseModal]);
128
+
129
+ // Envia a imagem para a validação da digital
130
+ const sendFile = useCallback(
131
+ async (image) => {
132
+ try {
133
+ let UID = id;
134
+ let finger = 'DI';
135
+ let req = await verifyDigital(UID, finger, image);
136
+ if (req.code === 0) {
137
+ Alert.alert('Sucesso identificado !');
138
+ onSuccess && onSuccess(req);
139
+ } else if (req.code === 1) {
140
+ Alert.alert('Não Identificado !');
141
+ onError && onError(req);
142
+ setLoad(false);
143
+ } else {
144
+ Alert.alert('Erro ao tentar validar');
145
+ onError && onError(req);
146
+ setLoad(false);
147
+ }
148
+ setLoad(false);
149
+ onCloseModalHandler();
150
+ setShowOverlay(false);
151
+ } catch (error) {
152
+ onError && onError(error);
153
+ setShowOverlay(false);
154
+ }
155
+ },
156
+ [id, onError, onSuccess, onCloseModalHandler]
157
+ );
158
+
159
+ // Foca a camera na posição do toque
160
+ const focus = useCallback((point: Point) => {
161
+ const c = camera.current;
162
+ if (c == null) return;
163
+ c.focus(point);
164
+ }, []);
165
+
166
+ // Gestos para focar a camera
167
+ const gesture = Gesture.Tap().onBegin(({ x, y }) => {
168
+ runOnJS(focus)({ x, y });
169
+ });
170
+
171
+ if (!screenProps && isVisible) {
172
+ return (
173
+ <ErrorDisplay
174
+ isVisible={isVisible}
175
+ modalParams={ModalParams}
176
+ onCloseModalHandler={onCloseModalHandler}
177
+ requestCameraPermission={requestCameraPermission}
178
+ />
179
+ );
180
+ }
181
+
182
+ if (device == null) {
183
+ return (
184
+ <DeviceNullDisplay
185
+ isVisible={isVisible}
186
+ modalParams={ModalParams}
187
+ onCloseModalHandler={onCloseModalHandler}
188
+ requestCameraPermission={requestCameraPermission}
189
+ />
190
+ );
191
+ }
192
+
193
+ if (screenProps) {
194
+ return (
195
+ <Modal
196
+ style={styles.modal}
197
+ isVisible={isVisible}
198
+ swipeDirection="down"
199
+ propagateSwipe={true}
200
+ onSwipeComplete={onCloseModalHandler}
201
+ {...ModalParams}
202
+ >
203
+ <GestureHandlerRootView style={styles.root}>
204
+ <View style={styles.container}>
205
+ {showOverlay && (
206
+ <WaitingForResult
207
+ onPress={() => {
208
+ setShowOverlay(false);
209
+ }}
210
+ />
211
+ )}
212
+ <GestureDetector gesture={gesture}>
213
+ <View style={styles.cameraContainer}>
214
+ <Camera
215
+ ref={camera}
216
+ format={cameraFormat}
217
+ isActive={true}
218
+ device={device}
219
+ torch={'on'}
220
+ exposure={cameraConfigs?.exposure}
221
+ zoom={cameraConfigs?.zoom}
222
+ photo={true}
223
+ enableHighQualityPhotos={true}
224
+ style={styles.camera}
225
+ />
226
+ {!showOverlay && <Gabarito />}
227
+ </View>
228
+ </GestureDetector>
229
+ <View style={styles.containerCapture}>
230
+ <TouchableOpacity disabled={load} onPress={() => capturedPhoto()}>
231
+ <View style={styles.containerButton}>
232
+ {load ? (
233
+ <Text style={styles.textButton}>
234
+ Verificando Digital...
235
+ </Text>
236
+ ) : (
237
+ <Text style={styles.textButton}>Tirar Foto</Text>
238
+ )}
239
+ </View>
240
+ </TouchableOpacity>
241
+ </View>
242
+ <View style={styles.containerButtonClose}>
243
+ <Button
244
+ disabled={load}
245
+ title="Fechar Camera"
246
+ onPress={onCloseModalHandler}
247
+ />
248
+ <View style={styles.cameraConfigs}>
249
+ <CameraConfigInfos
250
+ exposure={cameraConfigs?.exposure}
251
+ zoom={cameraConfigs?.zoom}
252
+ showButtonInfo={cameraConfigs?.showButtonInfo}
253
+ />
254
+ </View>
255
+ </View>
256
+ </View>
257
+ </GestureHandlerRootView>
258
+ </Modal>
259
+ );
260
+ }
261
+
262
+ return null;
263
+ };
@@ -0,0 +1,47 @@
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
+ },
15
+ camera: {
16
+ flex: 1,
17
+ justifyContent: 'flex-end',
18
+ paddingBottom: height * 0.2,
19
+ },
20
+ containerCapture: {
21
+ height: height * 0.2,
22
+ alignItems: 'center',
23
+ justifyContent: 'center',
24
+ },
25
+ containerButton: {
26
+ width: 350,
27
+ height: 100,
28
+ borderRadius: 80,
29
+ backgroundColor: 'blue',
30
+ alignItems: 'center',
31
+ justifyContent: 'center',
32
+ },
33
+ textButton: {
34
+ fontSize: 18,
35
+ fontWeight: '500',
36
+ color: '#fff',
37
+ },
38
+ modal: {
39
+ margin: 0,
40
+ },
41
+ containerButtonClose: {
42
+ marginBottom: Platform.OS === 'ios' ? 48 : 0,
43
+ },
44
+ cameraConfigs: {
45
+ alignItems: 'center',
46
+ },
47
+ });
@@ -0,0 +1,143 @@
1
+ import { Platform } from 'react-native';
2
+ import axios from 'axios';
3
+
4
+ const BASE_URL = 'https://api.liveid.app.br';
5
+ const TOKEN =
6
+ 'eyJhbGciOiJIUzI1NiJ9.NmU5ZmQ0MzEtOTE0Yy00Njc1LWFkYjAtZjVjNjRlZDUxNDg0.9J8eydQk5fbkH5GKdXkmXpt6wdQWyw8bsbaP5POU6YA';
7
+
8
+ const BASE_HEADER = {
9
+ 'Content-Type': 'application/json',
10
+ 'Authorization': `Bearer ${TOKEN}`,
11
+ };
12
+
13
+ const axiosInstance = axios.create({
14
+ baseURL: BASE_URL,
15
+ });
16
+
17
+ export const login = async (cpf: any, senha: any) => {
18
+ const response = await fetch(`${BASE_URL}/login`, {
19
+ method: 'POST',
20
+ headers: BASE_HEADER,
21
+ body: JSON.stringify({ cpf, senha }),
22
+ });
23
+ const data = await response.json();
24
+ return data;
25
+ };
26
+
27
+ export const cadastro = async (cpf: string, name: string, senha: string) => {
28
+ const response = await fetch(`${BASE_URL}/signup`, {
29
+ method: 'POST',
30
+ headers: BASE_HEADER,
31
+ body: JSON.stringify({ cpf, name, senha }),
32
+ });
33
+ const data = await response.json();
34
+ return data;
35
+ };
36
+
37
+ export const sendImages = async (UID: any, finger: any, images: any) => {
38
+ const response = await fetch(`${BASE_URL}/enroll-images`, {
39
+ method: 'POST',
40
+ headers: BASE_HEADER,
41
+ body: JSON.stringify({ UID, finger, images }),
42
+ });
43
+ const data = await response.json();
44
+ return data;
45
+ };
46
+
47
+ export const verifyDigital = async (UID: any, finger: any, image: any) => {
48
+ const response = await fetch(`${BASE_URL}/verify`, {
49
+ method: 'POST',
50
+ headers: BASE_HEADER,
51
+ body: JSON.stringify({ UID, finger, image }),
52
+ });
53
+ const data = await response.json();
54
+ return data;
55
+ };
56
+
57
+ type GetConfigApi = {
58
+ id: number;
59
+ deviceModels: string[];
60
+ deviceType: string;
61
+ fps: number;
62
+ exposure: number;
63
+ zoom: number;
64
+ serviceType: string;
65
+ showButtonInfo: boolean;
66
+ }[];
67
+
68
+ export const getConfigsApi = async (): Promise<GetConfigApi> => {
69
+ const { data } = await axiosInstance.get('/configs', {
70
+ headers: {
71
+ 'Content-Type': 'application/json',
72
+ 'Authorization': `Bearer ${TOKEN}`,
73
+ },
74
+ });
75
+ return data.deviceParamsConfig;
76
+ };
77
+
78
+ export const verificaCPF = async (cpf: any) => {
79
+ const response = await fetch(`${BASE_URL}/validcpf`, {
80
+ method: 'POST',
81
+ headers: BASE_HEADER,
82
+ body: JSON.stringify({ cpf }),
83
+ });
84
+ const data = await response.json();
85
+ return data;
86
+ };
87
+
88
+ export const provaVida = async (
89
+ video: { path: any },
90
+ UID: string,
91
+ vlexposure: any
92
+ ) => {
93
+ const numeroAleatorio = gerarNumeroAleatorio();
94
+
95
+ const formData = new FormData();
96
+ formData.append('video', {
97
+ uri: Platform.select({
98
+ ios: video.path,
99
+ android: `file://${video.path}`,
100
+ }),
101
+ type: 'video/mp4',
102
+ name: `${UID}_${numeroAleatorio}.mp4`,
103
+ });
104
+
105
+ formData.append('video_key', numeroAleatorio);
106
+ formData.append('person_id', UID);
107
+ formData.append('exposure', vlexposure);
108
+
109
+ const response = await fetch(`${BASE_URL}/liveness`, {
110
+ method: 'POST',
111
+ headers: {
112
+ 'Content-Type': 'multipart/form-data',
113
+ 'Authorization': `Bearer ${TOKEN}`,
114
+ },
115
+ body: formData,
116
+ });
117
+
118
+ if (response.status === 200) {
119
+ const json = await response.json();
120
+ return json;
121
+ } else {
122
+ const errorJson = {
123
+ code: -1,
124
+ message: 'Erro, por favor, verifique e tente novamente!',
125
+ };
126
+ return errorJson;
127
+ }
128
+ };
129
+
130
+ const gerarNumeroAleatorio = () => {
131
+ const min = 10000000; // Menor número de 8 dígitos (10 milhões)
132
+ const max = 99999999; // Maior número de 8 dígitos (99 milhões 999 mil 999)
133
+
134
+ // Gera um número aleatório entre min e max
135
+ const numeroAleatorio = Math.floor(Math.random() * (max - min + 1)) + min;
136
+
137
+ // Converte o número para string
138
+ const numeroString = numeroAleatorio.toString();
139
+
140
+ return numeroString;
141
+ };
142
+
143
+ //https://api.liveid.app.br/change_configs
@@ -0,0 +1,5 @@
1
+ export interface ScreenProps {
2
+ id?: string;
3
+ cpf?: string;
4
+ base64Image?: string;
5
+ }
@@ -0,0 +1,30 @@
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
+ };
@@ -0,0 +1,45 @@
1
+ import { Platform } from 'react-native';
2
+ import { getModel } from 'react-native-device-info';
3
+ import { getConfigsApi } from '../services';
4
+
5
+ type ServiceType = 'finger' | 'liveness';
6
+
7
+ type GetConfigCameraReturn =
8
+ | {
9
+ id: number;
10
+ deviceModels: string[];
11
+ deviceType: string;
12
+ fps: number;
13
+ exposure: number;
14
+ zoom: number;
15
+ serviceType: string;
16
+ showButtonInfo: boolean;
17
+ }
18
+ | undefined;
19
+
20
+ const getConfigCamera = async (
21
+ serviceType: ServiceType
22
+ ): Promise<GetConfigCameraReturn> => {
23
+ const deviceModel = getModel();
24
+ const deviceType = Platform.OS;
25
+ try {
26
+ const configs = await getConfigsApi();
27
+ const configsDeviceType = configs.filter(
28
+ (config) =>
29
+ config.deviceType === deviceType && config.serviceType === serviceType
30
+ );
31
+ const configDeviceModel = configsDeviceType.find(
32
+ (config) =>
33
+ config.deviceModels.includes(deviceModel) ||
34
+ config.deviceModels.includes('default')
35
+ );
36
+
37
+ return configDeviceModel;
38
+ } catch (error) {
39
+ console.error(error);
40
+ // Estudar futuramente a possibilidade de incluir um wrapper para personalização de erro
41
+ return;
42
+ }
43
+ };
44
+
45
+ export default getConfigCamera;
@@ -0,0 +1,3 @@
1
+ import getConfigCamera from './getConfigCamera';
2
+
3
+ export { getConfigCamera };