@trustchex/react-native-sdk 1.381.0 → 1.464.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.
- package/android/src/main/java/com/trustchex/reactnativesdk/TrustchexSDKModule.kt +2 -8
- package/android/src/main/java/com/trustchex/reactnativesdk/camera/TrustchexCameraView.kt +60 -13
- package/android/src/main/java/com/trustchex/reactnativesdk/mlkit/MLKitModule.kt +1 -1
- package/ios/Camera/TrustchexCameraView.swift +10 -13
- package/ios/MLKit/MLKitModule.swift +1 -1
- package/lib/module/Screens/Debug/BarcodeTestScreen.js +308 -0
- package/lib/module/Screens/Debug/MRZTestScreen.js +105 -13
- package/lib/module/Screens/Debug/NFCScanTestScreen.js +635 -0
- package/lib/module/Screens/Dynamic/ContractAcceptanceScreen.js +49 -32
- package/lib/module/Screens/Dynamic/IdentityDocumentEIDScanningScreen.js +22 -4
- package/lib/module/Screens/Dynamic/IdentityDocumentScanningScreen.js +5 -0
- package/lib/module/Screens/Dynamic/LivenessDetectionScreen.js +126 -27
- package/lib/module/Screens/Dynamic/VerbalConsentScreen.js +1079 -0
- package/lib/module/Screens/Dynamic/VideoCallScreen.js +678 -0
- package/lib/module/Screens/Static/OTPVerificationScreen.js +6 -0
- package/lib/module/Screens/Static/QrCodeScanningScreen.js +7 -1
- package/lib/module/Screens/Static/ResultScreen.js +154 -34
- package/lib/module/Screens/Static/VerificationSessionCheckScreen.js +59 -51
- package/lib/module/Shared/Animations/recording.json +1 -0
- package/lib/module/Shared/Animations/video-call.json +1 -0
- package/lib/module/Shared/Components/DebugNavigationPanel.js +231 -67
- package/lib/module/Shared/Components/EIDScanner.js +213 -112
- package/lib/module/Shared/Components/IdentityDocumentCamera.flows.js +5 -3
- package/lib/module/Shared/Components/IdentityDocumentCamera.js +77 -39
- package/lib/module/Shared/Components/IdentityDocumentCamera.utils.js +13 -4
- package/lib/module/Shared/Components/NavigationManager.js +39 -19
- package/lib/module/Shared/Contexts/AppContext.js +1 -0
- package/lib/module/Shared/EIDReader/aesSecureMessagingWrapper.js +51 -0
- package/lib/module/Shared/EIDReader/apduLevelPACECapable.js +3 -0
- package/lib/module/Shared/EIDReader/bacKey.js +16 -2
- package/lib/module/Shared/EIDReader/eidReader.js +354 -13
- package/lib/module/Shared/EIDReader/eidService.js +25 -1
- package/lib/module/Shared/EIDReader/nfcManagerCardService.js +4 -7
- package/lib/module/Shared/EIDReader/paceInfo.js +85 -0
- package/lib/module/Shared/EIDReader/paceKeySpec.js +51 -0
- package/lib/module/Shared/EIDReader/protocol/paceAPDUSender.js +100 -0
- package/lib/module/Shared/EIDReader/protocol/paceProtocol.js +655 -0
- package/lib/module/Shared/EIDReader/protocol/paceResult.js +37 -0
- package/lib/module/Shared/EIDReader/secureMessagingWrapper.js +27 -4
- package/lib/module/Shared/EIDReader/smartcards/commandAPDU.js +2 -1
- package/lib/module/Shared/EIDReader/tlv/tlv.helpers.js +1 -1
- package/lib/module/Shared/EIDReader/tlv/tlv.utils.js +6 -3
- package/lib/module/Shared/EIDReader/utils/aesCrypto.utils.js +189 -0
- package/lib/module/Shared/Libs/SignalingClient.js +128 -0
- package/lib/module/Shared/Libs/analytics.utils.js +8 -0
- package/lib/module/Shared/Libs/contains.js +1 -40
- package/lib/module/Shared/Libs/country-display.utils.js +34 -0
- package/lib/module/Shared/Libs/deeplink.utils.js +9 -1
- package/lib/module/Shared/Libs/demo.utils.js +8 -0
- package/lib/module/Shared/Libs/http-client.js +9 -0
- package/lib/module/Shared/Libs/mrz.utils.js +3 -2
- package/lib/module/Shared/Libs/promise.utils.js +16 -2
- package/lib/module/Shared/Libs/status-bar.utils.js +23 -0
- package/lib/module/Shared/Services/DataUploadService.js +294 -0
- package/lib/module/Shared/Services/VideoSessionService.js +156 -0
- package/lib/module/Shared/Services/WebRTCService.js +510 -0
- package/lib/module/Shared/Types/analytics.types.js +4 -0
- package/lib/module/Translation/Resources/en.js +61 -2
- package/lib/module/Translation/Resources/tr.js +61 -2
- package/lib/module/Trustchex.js +64 -20
- package/lib/module/version.js +1 -1
- package/lib/typescript/src/Screens/Debug/BarcodeTestScreen.d.ts +3 -0
- package/lib/typescript/src/Screens/Debug/BarcodeTestScreen.d.ts.map +1 -0
- package/lib/typescript/src/Screens/Debug/MRZTestScreen.d.ts.map +1 -1
- package/lib/typescript/src/Screens/Debug/NFCScanTestScreen.d.ts +3 -0
- package/lib/typescript/src/Screens/Debug/NFCScanTestScreen.d.ts.map +1 -0
- package/lib/typescript/src/Screens/Dynamic/ContractAcceptanceScreen.d.ts.map +1 -1
- package/lib/typescript/src/Screens/Dynamic/IdentityDocumentEIDScanningScreen.d.ts.map +1 -1
- package/lib/typescript/src/Screens/Dynamic/IdentityDocumentScanningScreen.d.ts.map +1 -1
- package/lib/typescript/src/Screens/Dynamic/LivenessDetectionScreen.d.ts.map +1 -1
- package/lib/typescript/src/Screens/Dynamic/VerbalConsentScreen.d.ts +3 -0
- package/lib/typescript/src/Screens/Dynamic/VerbalConsentScreen.d.ts.map +1 -0
- package/lib/typescript/src/Screens/Dynamic/VideoCallScreen.d.ts +3 -0
- package/lib/typescript/src/Screens/Dynamic/VideoCallScreen.d.ts.map +1 -0
- package/lib/typescript/src/Screens/Static/OTPVerificationScreen.d.ts.map +1 -1
- package/lib/typescript/src/Screens/Static/QrCodeScanningScreen.d.ts.map +1 -1
- package/lib/typescript/src/Screens/Static/ResultScreen.d.ts.map +1 -1
- package/lib/typescript/src/Screens/Static/VerificationSessionCheckScreen.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Components/DebugNavigationPanel.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Components/EIDScanner.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.flows.d.ts +1 -1
- package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.flows.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.utils.d.ts +5 -0
- package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.utils.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Components/NavigationManager.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Contexts/AppContext.d.ts +1 -0
- package/lib/typescript/src/Shared/Contexts/AppContext.d.ts.map +1 -1
- package/lib/typescript/src/Shared/EIDReader/aesSecureMessagingWrapper.d.ts +18 -0
- package/lib/typescript/src/Shared/EIDReader/aesSecureMessagingWrapper.d.ts.map +1 -0
- package/lib/typescript/src/Shared/EIDReader/apduLevelPACECapable.d.ts +23 -0
- package/lib/typescript/src/Shared/EIDReader/apduLevelPACECapable.d.ts.map +1 -0
- package/lib/typescript/src/Shared/EIDReader/bacKey.d.ts +6 -0
- package/lib/typescript/src/Shared/EIDReader/bacKey.d.ts.map +1 -1
- package/lib/typescript/src/Shared/EIDReader/eidReader.d.ts.map +1 -1
- package/lib/typescript/src/Shared/EIDReader/eidService.d.ts +9 -0
- package/lib/typescript/src/Shared/EIDReader/eidService.d.ts.map +1 -1
- package/lib/typescript/src/Shared/EIDReader/nfcManagerCardService.d.ts.map +1 -1
- package/lib/typescript/src/Shared/EIDReader/paceInfo.d.ts +50 -0
- package/lib/typescript/src/Shared/EIDReader/paceInfo.d.ts.map +1 -0
- package/lib/typescript/src/Shared/EIDReader/paceKeySpec.d.ts +30 -0
- package/lib/typescript/src/Shared/EIDReader/paceKeySpec.d.ts.map +1 -0
- package/lib/typescript/src/Shared/EIDReader/protocol/paceAPDUSender.d.ts +17 -0
- package/lib/typescript/src/Shared/EIDReader/protocol/paceAPDUSender.d.ts.map +1 -0
- package/lib/typescript/src/Shared/EIDReader/protocol/paceProtocol.d.ts +105 -0
- package/lib/typescript/src/Shared/EIDReader/protocol/paceProtocol.d.ts.map +1 -0
- package/lib/typescript/src/Shared/EIDReader/protocol/paceResult.d.ts +24 -0
- package/lib/typescript/src/Shared/EIDReader/protocol/paceResult.d.ts.map +1 -0
- package/lib/typescript/src/Shared/EIDReader/secureMessagingWrapper.d.ts +15 -0
- package/lib/typescript/src/Shared/EIDReader/secureMessagingWrapper.d.ts.map +1 -1
- package/lib/typescript/src/Shared/EIDReader/smartcards/commandAPDU.d.ts.map +1 -1
- package/lib/typescript/src/Shared/EIDReader/tlv/tlv.utils.d.ts.map +1 -1
- package/lib/typescript/src/Shared/EIDReader/utils/aesCrypto.utils.d.ts +39 -0
- package/lib/typescript/src/Shared/EIDReader/utils/aesCrypto.utils.d.ts.map +1 -0
- package/lib/typescript/src/Shared/Libs/SignalingClient.d.ts +24 -0
- package/lib/typescript/src/Shared/Libs/SignalingClient.d.ts.map +1 -0
- package/lib/typescript/src/Shared/Libs/analytics.utils.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Libs/contains.d.ts +0 -7
- package/lib/typescript/src/Shared/Libs/contains.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Libs/country-display.utils.d.ts +2 -0
- package/lib/typescript/src/Shared/Libs/country-display.utils.d.ts.map +1 -0
- package/lib/typescript/src/Shared/Libs/deeplink.utils.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Libs/demo.utils.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Libs/http-client.d.ts +1 -1
- package/lib/typescript/src/Shared/Libs/http-client.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Libs/mrz.utils.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Libs/promise.utils.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Libs/status-bar.utils.d.ts +9 -0
- package/lib/typescript/src/Shared/Libs/status-bar.utils.d.ts.map +1 -0
- package/lib/typescript/src/Shared/Services/DataUploadService.d.ts +25 -0
- package/lib/typescript/src/Shared/Services/DataUploadService.d.ts.map +1 -0
- package/lib/typescript/src/Shared/Services/VideoSessionService.d.ts +33 -0
- package/lib/typescript/src/Shared/Services/VideoSessionService.d.ts.map +1 -0
- package/lib/typescript/src/Shared/Services/WebRTCService.d.ts +58 -0
- package/lib/typescript/src/Shared/Services/WebRTCService.d.ts.map +1 -0
- package/lib/typescript/src/Shared/Types/analytics.types.d.ts +4 -0
- package/lib/typescript/src/Shared/Types/analytics.types.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Types/identificationInfo.d.ts +13 -1
- package/lib/typescript/src/Shared/Types/identificationInfo.d.ts.map +1 -1
- package/lib/typescript/src/Translation/Resources/en.d.ts +60 -1
- package/lib/typescript/src/Translation/Resources/en.d.ts.map +1 -1
- package/lib/typescript/src/Translation/Resources/tr.d.ts +60 -1
- package/lib/typescript/src/Translation/Resources/tr.d.ts.map +1 -1
- package/lib/typescript/src/Trustchex.d.ts.map +1 -1
- package/lib/typescript/src/version.d.ts +1 -1
- package/package.json +35 -5
- package/src/Screens/Debug/BarcodeTestScreen.tsx +317 -0
- package/src/Screens/Debug/MRZTestScreen.tsx +107 -13
- package/src/Screens/Debug/NFCScanTestScreen.tsx +692 -0
- package/src/Screens/Dynamic/ContractAcceptanceScreen.tsx +58 -35
- package/src/Screens/Dynamic/IdentityDocumentEIDScanningScreen.tsx +27 -4
- package/src/Screens/Dynamic/IdentityDocumentScanningScreen.tsx +6 -0
- package/src/Screens/Dynamic/LivenessDetectionScreen.tsx +156 -27
- package/src/Screens/Dynamic/VerbalConsentScreen.tsx +1401 -0
- package/src/Screens/Dynamic/VideoCallScreen.tsx +766 -0
- package/src/Screens/Static/OTPVerificationScreen.tsx +6 -0
- package/src/Screens/Static/QrCodeScanningScreen.tsx +7 -1
- package/src/Screens/Static/ResultScreen.tsx +235 -48
- package/src/Screens/Static/VerificationSessionCheckScreen.tsx +67 -72
- package/src/Shared/Animations/recording.json +1 -0
- package/src/Shared/Animations/video-call.json +1 -0
- package/src/Shared/Components/DebugNavigationPanel.tsx +252 -51
- package/src/Shared/Components/EIDScanner.tsx +223 -116
- package/src/Shared/Components/IdentityDocumentCamera.flows.ts +7 -4
- package/src/Shared/Components/IdentityDocumentCamera.tsx +224 -188
- package/src/Shared/Components/IdentityDocumentCamera.utils.ts +13 -4
- package/src/Shared/Components/NavigationManager.tsx +41 -19
- package/src/Shared/Contexts/AppContext.ts +2 -0
- package/src/Shared/EIDReader/aesSecureMessagingWrapper.ts +69 -0
- package/src/Shared/EIDReader/apduLevelPACECapable.ts +34 -0
- package/src/Shared/EIDReader/bacKey.ts +24 -8
- package/src/Shared/EIDReader/eidReader.ts +398 -12
- package/src/Shared/EIDReader/eidService.ts +49 -1
- package/src/Shared/EIDReader/nfcManagerCardService.ts +4 -6
- package/src/Shared/EIDReader/paceInfo.ts +159 -0
- package/src/Shared/EIDReader/paceKeySpec.ts +56 -0
- package/src/Shared/EIDReader/protocol/paceAPDUSender.ts +163 -0
- package/src/Shared/EIDReader/protocol/paceProtocol.ts +946 -0
- package/src/Shared/EIDReader/protocol/paceResult.ts +62 -0
- package/src/Shared/EIDReader/secureMessagingWrapper.ts +28 -10
- package/src/Shared/EIDReader/smartcards/commandAPDU.ts +2 -1
- package/src/Shared/EIDReader/tlv/tlv.helpers.ts +1 -1
- package/src/Shared/EIDReader/tlv/tlv.utils.ts +8 -5
- package/src/Shared/EIDReader/utils/aesCrypto.utils.ts +217 -0
- package/src/Shared/Libs/SignalingClient.ts +189 -0
- package/src/Shared/Libs/analytics.utils.ts +8 -0
- package/src/Shared/Libs/contains.ts +0 -53
- package/src/Shared/Libs/country-display.utils.ts +55 -0
- package/src/Shared/Libs/crypto.utils.ts +2 -2
- package/src/Shared/Libs/deeplink.utils.ts +12 -1
- package/src/Shared/Libs/demo.utils.ts +10 -0
- package/src/Shared/Libs/http-client.ts +19 -1
- package/src/Shared/Libs/mrz.utils.ts +3 -2
- package/src/Shared/Libs/promise.utils.ts +16 -2
- package/src/Shared/Libs/status-bar.utils.ts +21 -0
- package/src/Shared/Services/DataUploadService.ts +395 -0
- package/src/Shared/Services/VideoSessionService.ts +190 -0
- package/src/Shared/Services/WebRTCService.ts +636 -0
- package/src/Shared/Types/analytics.types.ts +4 -0
- package/src/Shared/Types/identificationInfo.ts +16 -1
- package/src/Translation/Resources/en.ts +88 -3
- package/src/Translation/Resources/tr.ts +89 -3
- package/src/Trustchex.tsx +65 -19
- package/src/version.ts +1 -1
|
@@ -6,10 +6,16 @@ import AppContext from "../../Shared/Contexts/AppContext.js";
|
|
|
6
6
|
import QrCodeScannerCamera from "../../Shared/Components/QrCodeScannerCamera.js";
|
|
7
7
|
import { useNavigation } from '@react-navigation/native';
|
|
8
8
|
import { handleDeepLink } from "../../Shared/Libs/deeplink.utils.js";
|
|
9
|
+
import { useKeepAwake } from "../../Shared/Libs/native-keep-awake.utils.js";
|
|
10
|
+
import { useStatusBarWhiteBackground } from "../../Shared/Libs/status-bar.utils.js";
|
|
9
11
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
10
12
|
const QrCodeScanningScreen = () => {
|
|
13
|
+
useKeepAwake();
|
|
11
14
|
const appContext = React.useContext(AppContext);
|
|
12
15
|
const navigation = useNavigation();
|
|
16
|
+
|
|
17
|
+
// Configure status bar for white background
|
|
18
|
+
useStatusBarWhiteBackground();
|
|
13
19
|
const onQrCodeScanned = data => {
|
|
14
20
|
const [bUrl, sId] = handleDeepLink({
|
|
15
21
|
url: data
|
|
@@ -25,7 +31,7 @@ const QrCodeScanningScreen = () => {
|
|
|
25
31
|
} else {
|
|
26
32
|
appContext.identificationInfo.sessionId = sId;
|
|
27
33
|
}
|
|
28
|
-
navigation.
|
|
34
|
+
navigation.goBack();
|
|
29
35
|
}
|
|
30
36
|
};
|
|
31
37
|
const onClose = () => {
|
|
@@ -9,7 +9,9 @@ import RNFS from 'react-native-fs';
|
|
|
9
9
|
import NativeProgressBar from "../../Shared/Components/NativeProgressBar.js";
|
|
10
10
|
import LottieView from 'lottie-react-native';
|
|
11
11
|
import { runWithRetry } from "../../Shared/Libs/promise.utils.js";
|
|
12
|
+
import { useStatusBarWhiteBackground } from "../../Shared/Libs/status-bar.utils.js";
|
|
12
13
|
import NavigationManager from "../../Shared/Components/NavigationManager.js";
|
|
14
|
+
import { getLocalizedCountryName } from "../../Shared/Libs/country-display.utils.js";
|
|
13
15
|
import mrzUtils from "../../Shared/Libs/mrz.utils.js";
|
|
14
16
|
import { useTranslation } from 'react-i18next';
|
|
15
17
|
import { Video as VideoCompressor } from 'react-native-compressor';
|
|
@@ -26,15 +28,20 @@ const ResultScreen = () => {
|
|
|
26
28
|
const [isSubmitting, setIsSubmitting] = useState(false);
|
|
27
29
|
const [progress, setProgress] = useState(0);
|
|
28
30
|
const navigationManagerRef = React.useRef(null);
|
|
31
|
+
const hasSubmittedRef = React.useRef(false);
|
|
29
32
|
const [shouldShowDemoData, setShouldShowDemoData] = useState(false);
|
|
30
33
|
const [deviceIdentifier, setDeviceIdentifier] = useState('');
|
|
31
34
|
const {
|
|
32
|
-
t
|
|
35
|
+
t,
|
|
36
|
+
i18n
|
|
33
37
|
} = useTranslation();
|
|
34
38
|
const insets = useSafeAreaInsets();
|
|
35
39
|
|
|
36
40
|
// Track screen view and exit
|
|
37
41
|
useScreenTracking('result_screen');
|
|
42
|
+
|
|
43
|
+
// Configure status bar for white background
|
|
44
|
+
useStatusBarWhiteBackground();
|
|
38
45
|
const formatDate = useCallback(dateStr => {
|
|
39
46
|
if (!dateStr) return '';
|
|
40
47
|
try {
|
|
@@ -45,7 +52,7 @@ const ResultScreen = () => {
|
|
|
45
52
|
const dd = dateStr.substring(4, 6);
|
|
46
53
|
|
|
47
54
|
// Assume 19xx if YY >= 50, else 20xx
|
|
48
|
-
const year = parseInt(yy) >= 50 ? `19${yy}` : `20${yy}`;
|
|
55
|
+
const year = parseInt(yy, 10) >= 50 ? `19${yy}` : `20${yy}`;
|
|
49
56
|
return `${dd}/${mm}/${year}`;
|
|
50
57
|
}
|
|
51
58
|
|
|
@@ -62,14 +69,36 @@ const ResultScreen = () => {
|
|
|
62
69
|
return dateStr;
|
|
63
70
|
}
|
|
64
71
|
}, []);
|
|
72
|
+
const formatGender = useCallback(code => {
|
|
73
|
+
switch (code?.toUpperCase()) {
|
|
74
|
+
case 'M':
|
|
75
|
+
return t('eidScannerScreen.genderMale');
|
|
76
|
+
case 'F':
|
|
77
|
+
return t('eidScannerScreen.genderFemale');
|
|
78
|
+
default:
|
|
79
|
+
return t('eidScannerScreen.genderUnspecified');
|
|
80
|
+
}
|
|
81
|
+
}, [t]);
|
|
82
|
+
const formatDocumentType = useCallback(code => {
|
|
83
|
+
if (!code) return '';
|
|
84
|
+
const upper = code.toUpperCase();
|
|
85
|
+
if (upper.startsWith('P')) return t('eidScannerScreen.docTypePassport');
|
|
86
|
+
if (upper.startsWith('I')) return t('eidScannerScreen.docTypeID');
|
|
87
|
+
if (upper.startsWith('A')) return t('eidScannerScreen.docTypeResidence');
|
|
88
|
+
if (upper.startsWith('V')) return t('eidScannerScreen.docTypeVisa');
|
|
89
|
+
return code;
|
|
90
|
+
}, [t]);
|
|
91
|
+
const formatNationality = useCallback(code => {
|
|
92
|
+
return getLocalizedCountryName(code, i18n.language);
|
|
93
|
+
}, [i18n.language]);
|
|
65
94
|
const apiUrl = useMemo(() => `${appContext.baseUrl}/api/app/mobile`, [appContext.baseUrl]);
|
|
66
95
|
useEffect(() => {
|
|
67
|
-
if (appContext.isDemoSession) {
|
|
96
|
+
if (appContext.isDemoSession || appContext.isTestVideoSession) {
|
|
68
97
|
setShouldShowDemoData(true);
|
|
69
98
|
// Generate device identifier for demo
|
|
70
99
|
NativeDeviceInfo.generateHumanReadableIdentifier().then(setDeviceIdentifier);
|
|
71
100
|
}
|
|
72
|
-
}, [appContext.identificationInfo.identificationId, appContext.isDemoSession]);
|
|
101
|
+
}, [appContext.identificationInfo.identificationId, appContext.isDemoSession, appContext.isTestVideoSession]);
|
|
73
102
|
const createIdentification = useCallback(async identificationId => {
|
|
74
103
|
await httpClient.post(`${apiUrl}/identifications/${identificationId}`, null);
|
|
75
104
|
}, [apiUrl]);
|
|
@@ -118,17 +147,21 @@ const ResultScreen = () => {
|
|
|
118
147
|
if (!scannedDocument.mrzFields) {
|
|
119
148
|
throw new Error('MRZ fields not found');
|
|
120
149
|
}
|
|
150
|
+
|
|
151
|
+
// Backend payload must contain raw MRZ data only.
|
|
152
|
+
// Human-friendly formatting is strictly for UI rendering paths.
|
|
153
|
+
const rawMrzFields = scannedDocument.mrzFields;
|
|
121
154
|
const identificationDocument = {
|
|
122
|
-
type:
|
|
123
|
-
name:
|
|
124
|
-
surname:
|
|
125
|
-
gender: getGenderEnumType(
|
|
126
|
-
number:
|
|
127
|
-
country:
|
|
155
|
+
type: rawMrzFields.documentCode,
|
|
156
|
+
name: rawMrzFields.firstName,
|
|
157
|
+
surname: rawMrzFields.lastName,
|
|
158
|
+
gender: getGenderEnumType(rawMrzFields.sex),
|
|
159
|
+
number: rawMrzFields.documentNumber,
|
|
160
|
+
country: rawMrzFields.issuingState,
|
|
128
161
|
barcodeValue: scannedDocument.barcodeValue,
|
|
129
|
-
personalNumber:
|
|
130
|
-
birthDate: mrzUtils.convertMRZDateToISODate(
|
|
131
|
-
expiryDate: mrzUtils.convertMRZDateToISODate(
|
|
162
|
+
personalNumber: rawMrzFields.personalNumber || rawMrzFields.optional1,
|
|
163
|
+
birthDate: mrzUtils.convertMRZDateToISODate(rawMrzFields.birthDate),
|
|
164
|
+
expiryDate: mrzUtils.convertMRZDateToISODate(rawMrzFields.expirationDate),
|
|
132
165
|
dataSource: scannedDocument.dataSource,
|
|
133
166
|
mrzText: scannedDocument.mrzText
|
|
134
167
|
};
|
|
@@ -141,7 +174,12 @@ const ResultScreen = () => {
|
|
|
141
174
|
nonce
|
|
142
175
|
});
|
|
143
176
|
}, [apiUrl, getGenderEnumType]);
|
|
144
|
-
const uploadIdentificationMedia = useCallback(async (identificationId, scannedIdentityDocument, livenessDetection) => {
|
|
177
|
+
const uploadIdentificationMedia = useCallback(async (identificationId, scannedIdentityDocument, livenessDetection, skipIfAlreadyUploaded) => {
|
|
178
|
+
// Skip media upload if already uploaded during video call
|
|
179
|
+
if (skipIfAlreadyUploaded) {
|
|
180
|
+
console.log('[ResultScreen] Media already uploaded during video call, skipping');
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
145
183
|
const uploadFileOptions = {
|
|
146
184
|
toUrl: `${apiUrl}/identifications/${identificationId}/media`,
|
|
147
185
|
method: 'POST',
|
|
@@ -176,7 +214,7 @@ const ResultScreen = () => {
|
|
|
176
214
|
const faceImage = scannedIdentityDocument?.faceImage;
|
|
177
215
|
if (faceImage && faceImage !== '') {
|
|
178
216
|
scannedIdentityDocument.faceImageMimeType ||= 'image/jpeg';
|
|
179
|
-
const extension = scannedIdentityDocument.faceImageMimeType === 'image/jp2' ? 'jp2' : 'jpg';
|
|
217
|
+
const extension = scannedIdentityDocument.faceImageMimeType === 'image/jp2' ? 'jp2' : scannedIdentityDocument.faceImageMimeType === 'image/png' ? 'png' : 'jpg';
|
|
180
218
|
await RNFS.writeFile(decodeURIComponent(`${RNFS.TemporaryDirectoryPath}/FACE_IMAGE.${extension}`), faceImage, 'base64');
|
|
181
219
|
uploadFileOptions.files.push({
|
|
182
220
|
name: 'files',
|
|
@@ -229,8 +267,9 @@ const ResultScreen = () => {
|
|
|
229
267
|
if (livenessVideoPath) {
|
|
230
268
|
let videoFilePath;
|
|
231
269
|
if (Platform.OS === 'ios') {
|
|
232
|
-
|
|
233
|
-
|
|
270
|
+
const tmpTimestamp = new Date().getTime();
|
|
271
|
+
await RNFS.mkdir(`${RNFS.TemporaryDirectoryPath}/${tmpTimestamp}`);
|
|
272
|
+
videoFilePath = `${RNFS.TemporaryDirectoryPath}/${tmpTimestamp}/LIVENESS_VIDEO.mp4`;
|
|
234
273
|
} else {
|
|
235
274
|
videoFilePath = `${RNFS.TemporaryDirectoryPath}/LIVENESS_VIDEO.mp4`;
|
|
236
275
|
}
|
|
@@ -259,11 +298,60 @@ const ResultScreen = () => {
|
|
|
259
298
|
});
|
|
260
299
|
}
|
|
261
300
|
}
|
|
301
|
+
if (uploadFileOptions.files.length === 0) {
|
|
302
|
+
return;
|
|
303
|
+
}
|
|
262
304
|
const response = await RNFS.uploadFiles(uploadFileOptions).promise;
|
|
263
305
|
if (![200, 201, 204].includes(response.statusCode)) {
|
|
264
306
|
throw new Error('Media upload failed');
|
|
265
307
|
}
|
|
266
308
|
}, [apiUrl]);
|
|
309
|
+
const uploadVerbalConsentVideos = useCallback(async (identificationId, verbalConsentVideos) => {
|
|
310
|
+
if (!verbalConsentVideos?.length) {
|
|
311
|
+
return;
|
|
312
|
+
}
|
|
313
|
+
for (const consentVideo of verbalConsentVideos) {
|
|
314
|
+
const normalizedPath = consentVideo.videoPath.replace('file://', '');
|
|
315
|
+
let targetPath;
|
|
316
|
+
if (Platform.OS === 'ios') {
|
|
317
|
+
const tmpTimestamp = new Date().getTime();
|
|
318
|
+
await RNFS.mkdir(`${RNFS.TemporaryDirectoryPath}/${tmpTimestamp}`);
|
|
319
|
+
targetPath = `${RNFS.TemporaryDirectoryPath}/${tmpTimestamp}/VERBAL_CONSENT_VIDEO.mp4`;
|
|
320
|
+
} else {
|
|
321
|
+
targetPath = `${RNFS.TemporaryDirectoryPath}/VERBAL_CONSENT_VIDEO.mp4`;
|
|
322
|
+
}
|
|
323
|
+
await RNFS.copyFile(normalizedPath, targetPath);
|
|
324
|
+
const compressedVideoPath = await VideoCompressor.compress(targetPath, {
|
|
325
|
+
compressionMethod: 'manual',
|
|
326
|
+
bitrate: 500000,
|
|
327
|
+
// 500 kbps
|
|
328
|
+
maxSize: 1280,
|
|
329
|
+
// HD 720p
|
|
330
|
+
minimumFileSizeForCompress: 0 // Always compress
|
|
331
|
+
});
|
|
332
|
+
const compressedNormalizedPath = compressedVideoPath.replace('file://', '');
|
|
333
|
+
const response = await RNFS.uploadFiles({
|
|
334
|
+
toUrl: `${apiUrl}/identifications/${identificationId}/media`,
|
|
335
|
+
method: 'POST',
|
|
336
|
+
headers: {
|
|
337
|
+
Accept: 'application/json'
|
|
338
|
+
},
|
|
339
|
+
fields: {
|
|
340
|
+
consentTitle: consentVideo.title,
|
|
341
|
+
consentText: consentVideo.text
|
|
342
|
+
},
|
|
343
|
+
files: [{
|
|
344
|
+
name: 'files',
|
|
345
|
+
filename: 'VERBAL_CONSENT_VIDEO.mp4',
|
|
346
|
+
filepath: compressedNormalizedPath,
|
|
347
|
+
filetype: 'video/mp4'
|
|
348
|
+
}]
|
|
349
|
+
}).promise;
|
|
350
|
+
if (![200, 201, 204].includes(response.statusCode)) {
|
|
351
|
+
throw new Error('Verbal consent video upload failed');
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
}, [apiUrl]);
|
|
267
355
|
const submit = useCallback(async identificationInfo => {
|
|
268
356
|
try {
|
|
269
357
|
setIsSubmitting(true);
|
|
@@ -271,18 +359,24 @@ const ResultScreen = () => {
|
|
|
271
359
|
if (!identificationId) {
|
|
272
360
|
throw new Error('IdentificationId not found');
|
|
273
361
|
}
|
|
362
|
+
const alreadyUploaded = !!identificationInfo.mediaUploadedDuringVideoCall;
|
|
274
363
|
const sessionKey = await runWithRetry(() => getSessionKey(apiUrl, appContext.identificationInfo.sessionId));
|
|
275
|
-
|
|
364
|
+
if (!alreadyUploaded) {
|
|
365
|
+
await runWithRetry(() => createIdentification(identificationId));
|
|
366
|
+
}
|
|
276
367
|
setProgress(20);
|
|
277
368
|
await runWithRetry(() => submitIdentificationConsent(identificationId, sessionKey));
|
|
278
369
|
setProgress(30);
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
370
|
+
if (!alreadyUploaded) {
|
|
371
|
+
const scannedIdentityDocument = identificationInfo.scannedDocument;
|
|
372
|
+
if (scannedIdentityDocument && scannedIdentityDocument.documentType !== 'UNKNOWN') {
|
|
373
|
+
await runWithRetry(() => submitIdentificationDocument(identificationId, scannedIdentityDocument, sessionKey));
|
|
374
|
+
}
|
|
375
|
+
setProgress(40);
|
|
376
|
+
const livenessDetection = identificationInfo.livenessDetection;
|
|
377
|
+
await runWithRetry(() => uploadIdentificationMedia(identificationId, scannedIdentityDocument, livenessDetection, false));
|
|
282
378
|
}
|
|
283
|
-
|
|
284
|
-
const livenessDetection = identificationInfo.livenessDetection;
|
|
285
|
-
await runWithRetry(() => uploadIdentificationMedia(identificationId, scannedIdentityDocument, livenessDetection));
|
|
379
|
+
await runWithRetry(() => uploadVerbalConsentVideos(identificationId, identificationInfo.verbalConsentVideos));
|
|
286
380
|
setProgress(90);
|
|
287
381
|
await runWithRetry(() => finishIdentification(identificationId, sessionKey));
|
|
288
382
|
setProgress(100);
|
|
@@ -311,14 +405,15 @@ const ResultScreen = () => {
|
|
|
311
405
|
appContext.onError?.(t('resultScreen.submissionFailed'));
|
|
312
406
|
navigationManagerRef.current?.reset();
|
|
313
407
|
}
|
|
314
|
-
}, [createIdentification, apiUrl, uploadIdentificationMedia, finishIdentification, submitIdentificationDocument, submitIdentificationConsent, t, appContext]);
|
|
408
|
+
}, [createIdentification, apiUrl, uploadIdentificationMedia, uploadVerbalConsentVideos, finishIdentification, submitIdentificationDocument, submitIdentificationConsent, t, appContext]);
|
|
315
409
|
useEffect(() => {
|
|
316
|
-
if (appContext.identificationInfo && !appContext.isDemoSession) {
|
|
410
|
+
if (appContext.identificationInfo && !appContext.isDemoSession && !appContext.isTestVideoSession && !hasSubmittedRef.current) {
|
|
411
|
+
hasSubmittedRef.current = true;
|
|
317
412
|
submit(appContext.identificationInfo);
|
|
318
413
|
}
|
|
319
|
-
}, [appContext.identificationInfo, appContext.isDemoSession, submit]);
|
|
414
|
+
}, [appContext.identificationInfo, appContext.isDemoSession, appContext.isTestVideoSession, submit]);
|
|
320
415
|
useEffect(() => {
|
|
321
|
-
if (progress === 100 && !appContext.isDemoSession) {
|
|
416
|
+
if (progress === 100 && !appContext.isDemoSession && !appContext.isTestVideoSession) {
|
|
322
417
|
setTimeout(() => {
|
|
323
418
|
appContext.onCompleted?.();
|
|
324
419
|
navigationManagerRef.current?.reset();
|
|
@@ -377,7 +472,7 @@ const ResultScreen = () => {
|
|
|
377
472
|
children: [t('eidScannerScreen.documentCode'), ":"]
|
|
378
473
|
}), /*#__PURE__*/_jsx(Text, {
|
|
379
474
|
style: styles.mrzInfoText,
|
|
380
|
-
children: appContext.identificationInfo.scannedDocument.mrzFields?.documentCode
|
|
475
|
+
children: formatDocumentType(appContext.identificationInfo.scannedDocument.mrzFields?.documentCode)
|
|
381
476
|
})]
|
|
382
477
|
}), /*#__PURE__*/_jsxs(View, {
|
|
383
478
|
style: styles.mrzInfoItem,
|
|
@@ -386,7 +481,7 @@ const ResultScreen = () => {
|
|
|
386
481
|
children: [t('eidScannerScreen.nationality'), ":"]
|
|
387
482
|
}), /*#__PURE__*/_jsx(Text, {
|
|
388
483
|
style: styles.mrzInfoText,
|
|
389
|
-
children: appContext.identificationInfo.scannedDocument.mrzFields?.issuingState
|
|
484
|
+
children: formatNationality(appContext.identificationInfo.scannedDocument.mrzFields?.nationality || appContext.identificationInfo.scannedDocument.mrzFields?.issuingState)
|
|
390
485
|
})]
|
|
391
486
|
}), /*#__PURE__*/_jsxs(View, {
|
|
392
487
|
style: styles.mrzInfoItem,
|
|
@@ -440,7 +535,7 @@ const ResultScreen = () => {
|
|
|
440
535
|
children: [t('eidScannerScreen.gender'), ":"]
|
|
441
536
|
}), /*#__PURE__*/_jsx(Text, {
|
|
442
537
|
style: styles.mrzInfoText,
|
|
443
|
-
children: appContext.identificationInfo.scannedDocument.mrzFields?.sex
|
|
538
|
+
children: formatGender(appContext.identificationInfo.scannedDocument.mrzFields?.sex)
|
|
444
539
|
})]
|
|
445
540
|
}), /*#__PURE__*/_jsxs(View, {
|
|
446
541
|
style: styles.mrzInfoItem,
|
|
@@ -586,6 +681,30 @@ const ResultScreen = () => {
|
|
|
586
681
|
}, index))
|
|
587
682
|
})
|
|
588
683
|
})]
|
|
684
|
+
}), !!appContext.identificationInfo.verbalConsentVideos?.length && /*#__PURE__*/_jsxs(_Fragment, {
|
|
685
|
+
children: [/*#__PURE__*/_jsx(Text, {
|
|
686
|
+
style: styles.sectionHeader,
|
|
687
|
+
children: t('resultScreen.demoVerbalConsent')
|
|
688
|
+
}), appContext.identificationInfo.verbalConsentVideos.map((consentVideo, index) => /*#__PURE__*/_jsxs(View, {
|
|
689
|
+
children: [/*#__PURE__*/_jsxs(Text, {
|
|
690
|
+
style: styles.sectionText,
|
|
691
|
+
children: [t('resultScreen.demoVerbalConsentTitle'), ":", ' ', consentVideo.title]
|
|
692
|
+
}), /*#__PURE__*/_jsxs(Text, {
|
|
693
|
+
style: styles.sectionText,
|
|
694
|
+
children: [t('resultScreen.demoVerbalConsentText'), ":", ' ', consentVideo.text]
|
|
695
|
+
}), /*#__PURE__*/_jsx(Text, {
|
|
696
|
+
style: styles.sectionText,
|
|
697
|
+
children: t('resultScreen.demoVideo')
|
|
698
|
+
}), /*#__PURE__*/_jsx(Video, {
|
|
699
|
+
source: {
|
|
700
|
+
uri: consentVideo.videoPath
|
|
701
|
+
},
|
|
702
|
+
resizeMode: "contain",
|
|
703
|
+
style: styles.video,
|
|
704
|
+
controls: true,
|
|
705
|
+
muted: false
|
|
706
|
+
})]
|
|
707
|
+
}, `${consentVideo.videoPath}-${index}`))]
|
|
589
708
|
})]
|
|
590
709
|
})
|
|
591
710
|
}), /*#__PURE__*/_jsx(View, {
|
|
@@ -674,9 +793,10 @@ const styles = StyleSheet.create({
|
|
|
674
793
|
},
|
|
675
794
|
image: {
|
|
676
795
|
width: 100,
|
|
677
|
-
height:
|
|
678
|
-
objectFit: '
|
|
679
|
-
borderRadius:
|
|
796
|
+
height: 140,
|
|
797
|
+
objectFit: 'cover',
|
|
798
|
+
borderRadius: 12,
|
|
799
|
+
overflow: 'hidden'
|
|
680
800
|
},
|
|
681
801
|
imageItem: {
|
|
682
802
|
display: 'flex',
|
|
@@ -14,27 +14,31 @@ import { analyticsService } from "../../Shared/Services/AnalyticsService.js";
|
|
|
14
14
|
import { useTheme } from "../../Shared/Contexts/ThemeContext.js";
|
|
15
15
|
import LottieView from 'lottie-react-native';
|
|
16
16
|
import { getSimulatedDemoData, isDemoSession } from "../../Shared/Libs/demo.utils.js";
|
|
17
|
-
import { useNavigation
|
|
17
|
+
import { useNavigation } from '@react-navigation/native';
|
|
18
18
|
import { SESSION_CODE_CHARSET_PATTERN, SESSION_CODE_VALIDATION_PATTERN } from "../../Shared/Constants/validation.constants.js";
|
|
19
19
|
import { trackError, trackFunnelStep, useScreenTracking } from "../../Shared/Libs/analytics.utils.js";
|
|
20
|
+
import { useStatusBarWhiteBackground } from "../../Shared/Libs/status-bar.utils.js";
|
|
20
21
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
21
22
|
const VerificationSessionCheckScreen = () => {
|
|
22
23
|
const [sessionCode, setSessionCode] = useState('');
|
|
23
24
|
const [isCheckingSession, setIsCheckingSession] = useState(false);
|
|
24
25
|
const isCheckingSessionRef = useRef(false);
|
|
26
|
+
const checkedSessionIdRef = useRef('');
|
|
25
27
|
const appContext = useContext(AppContext);
|
|
26
28
|
const {
|
|
27
29
|
t
|
|
28
30
|
} = useTranslation();
|
|
29
31
|
const navigationManagerRef = React.useRef(null);
|
|
30
32
|
const navigation = useNavigation();
|
|
31
|
-
const initialized = useRef(false);
|
|
32
33
|
const insets = useSafeAreaInsets();
|
|
33
34
|
const theme = useTheme();
|
|
34
35
|
const primaryColor = theme.colors.primary;
|
|
35
36
|
|
|
36
37
|
// Track screen view and exit
|
|
37
38
|
useScreenTracking('verification_session_check');
|
|
39
|
+
|
|
40
|
+
// Configure status bar for white background
|
|
41
|
+
useStatusBarWhiteBackground();
|
|
38
42
|
const apiUrl = useMemo(() => `${appContext.baseUrl}/api/app/mobile`, [appContext.baseUrl]);
|
|
39
43
|
const validateSessionCode = useCallback(value => {
|
|
40
44
|
return SESSION_CODE_VALIDATION_PATTERN.test(value.toUpperCase());
|
|
@@ -45,17 +49,15 @@ const VerificationSessionCheckScreen = () => {
|
|
|
45
49
|
const response = await httpClient.get(`${apiUrl}/verification-sessions/${id}`, isDemo ? getSimulatedDemoData('GET_SESSION') : undefined);
|
|
46
50
|
return response;
|
|
47
51
|
} catch (error) {
|
|
48
|
-
if (error instanceof NotFoundError) {
|
|
49
|
-
// User entered invalid session ID - expected user behavior, not actionable
|
|
50
|
-
Alert.alert(t('general.error'), t('verificationSessionCheckScreen.noVerificationSessionFound'));
|
|
51
|
-
} else {
|
|
52
|
+
if (!(error instanceof NotFoundError)) {
|
|
52
53
|
trackError('SESSION_CHECK_ERROR', error instanceof Error ? error.message : 'Unknown error', 'verification_session_check', 'high', {
|
|
53
54
|
recoverable: false,
|
|
54
55
|
userAction: 'check_session'
|
|
55
56
|
});
|
|
56
57
|
}
|
|
58
|
+
throw error;
|
|
57
59
|
}
|
|
58
|
-
}, [apiUrl, appContext.isDemoSession
|
|
60
|
+
}, [apiUrl, appContext.isDemoSession]);
|
|
59
61
|
const getSessionByCode = useCallback(async inputCode => {
|
|
60
62
|
try {
|
|
61
63
|
const isDemoMode = isDemoSession(inputCode);
|
|
@@ -86,52 +88,55 @@ const VerificationSessionCheckScreen = () => {
|
|
|
86
88
|
sessionId
|
|
87
89
|
});
|
|
88
90
|
}, [navigation]);
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}
|
|
96
|
-
}, [appContext.identificationInfo.sessionId]));
|
|
91
|
+
const getSessionRef = useRef(getSession);
|
|
92
|
+
getSessionRef.current = getSession;
|
|
93
|
+
const navigateToOTPScreenRef = useRef(navigateToOTPScreen);
|
|
94
|
+
navigateToOTPScreenRef.current = navigateToOTPScreen;
|
|
95
|
+
const appContextRef = useRef(appContext);
|
|
96
|
+
appContextRef.current = appContext;
|
|
97
97
|
useEffect(() => {
|
|
98
|
-
//
|
|
99
|
-
//
|
|
100
|
-
if (
|
|
101
|
-
|
|
102
|
-
isCheckingSessionRef.current = true;
|
|
103
|
-
setIsCheckingSession(true);
|
|
104
|
-
getSession(appContext.identificationInfo.sessionId).then(session => {
|
|
105
|
-
if (!session) {
|
|
106
|
-
// Session not found - clear the sessionId and reset flags to allow retry
|
|
107
|
-
Alert.alert(t('general.error'), t('verificationSessionCheckScreen.noVerificationSessionFound'));
|
|
108
|
-
appContext.identificationInfo.sessionId = '';
|
|
109
|
-
if (appContext.setSessionId) {
|
|
110
|
-
appContext.setSessionId('');
|
|
111
|
-
}
|
|
112
|
-
initialized.current = false;
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
115
|
-
appContext.workflowSteps = session.workflowSteps;
|
|
116
|
-
if (session.branding) {
|
|
117
|
-
appContext.branding = appContext.branding || session.branding;
|
|
118
|
-
}
|
|
119
|
-
if (session.sendOTP) {
|
|
120
|
-
navigateToOTPScreen(session.id);
|
|
121
|
-
} else {
|
|
122
|
-
if (session.identificationId) {
|
|
123
|
-
appContext.identificationInfo.identificationId = session.identificationId;
|
|
124
|
-
}
|
|
125
|
-
navigationManagerRef.current?.navigateToNextStep();
|
|
126
|
-
}
|
|
127
|
-
}).finally(() => {
|
|
128
|
-
setTimeout(() => {
|
|
129
|
-
isCheckingSessionRef.current = false;
|
|
130
|
-
setIsCheckingSession(false);
|
|
131
|
-
}, 1000);
|
|
132
|
-
});
|
|
98
|
+
// Skip session check when navigated from debug panel — the debug panel
|
|
99
|
+
// already set up workflowSteps and currentWorkflowStep directly.
|
|
100
|
+
if (appContext.isDebugNavigated) {
|
|
101
|
+
return;
|
|
133
102
|
}
|
|
134
|
-
|
|
103
|
+
const sid = appContext.identificationInfo.sessionId;
|
|
104
|
+
if (!sid || checkedSessionIdRef.current === sid) {
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
checkedSessionIdRef.current = sid;
|
|
108
|
+
isCheckingSessionRef.current = true;
|
|
109
|
+
setIsCheckingSession(true);
|
|
110
|
+
getSessionRef.current(sid).then(session => {
|
|
111
|
+
const ctx = appContextRef.current;
|
|
112
|
+
ctx.workflowSteps = session.workflowSteps;
|
|
113
|
+
if (session.branding) {
|
|
114
|
+
ctx.branding = ctx.branding || session.branding;
|
|
115
|
+
}
|
|
116
|
+
if (session.sendOTP) {
|
|
117
|
+
navigateToOTPScreenRef.current(session.id);
|
|
118
|
+
} else {
|
|
119
|
+
if (session.identificationId) {
|
|
120
|
+
ctx.identificationInfo.identificationId = session.identificationId;
|
|
121
|
+
}
|
|
122
|
+
navigationManagerRef.current?.navigateToNextStep();
|
|
123
|
+
}
|
|
124
|
+
}).catch(() => {
|
|
125
|
+
Alert.alert(t('general.error'), t('verificationSessionCheckScreen.noVerificationSessionFound'));
|
|
126
|
+
checkedSessionIdRef.current = '';
|
|
127
|
+
const ctx = appContextRef.current;
|
|
128
|
+
if (ctx.setSessionId) {
|
|
129
|
+
ctx.setSessionId('');
|
|
130
|
+
}
|
|
131
|
+
}).finally(() => {
|
|
132
|
+
isCheckingSessionRef.current = false;
|
|
133
|
+
setIsCheckingSession(false);
|
|
134
|
+
});
|
|
135
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
136
|
+
}, [appContext.identificationInfo.sessionId]);
|
|
137
|
+
if (!appContext || !appContext.baseUrl) {
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
135
140
|
return /*#__PURE__*/_jsx(SafeAreaView, {
|
|
136
141
|
style: styles.safeAreaContainer,
|
|
137
142
|
children: /*#__PURE__*/_jsx(KeyboardAvoidingView, {
|
|
@@ -185,6 +190,9 @@ const VerificationSessionCheckScreen = () => {
|
|
|
185
190
|
const isDemoMode = isDemoSession(alphanumericText);
|
|
186
191
|
const sessionResponse = await getSessionByCode(alphanumericText);
|
|
187
192
|
if (sessionResponse?.id) {
|
|
193
|
+
// Mark as checked before setting sessionId to prevent
|
|
194
|
+
// the useEffect from triggering a duplicate navigation.
|
|
195
|
+
checkedSessionIdRef.current = sessionResponse.id;
|
|
188
196
|
if (appContext.setSessionId) {
|
|
189
197
|
appContext.setSessionId(sessionResponse.id);
|
|
190
198
|
} else {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"v":"5.5.2","fr":29.9700012207031,"ip":0,"op":60.0000024438501,"w":488,"h":488,"nm":"recording spectrum_MAIN","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Shape Layer 7","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[360.5,249,0],"ix":2},"a":{"a":0,"k":[-73,8.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":5,"s":[30,163]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":10,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":15,"s":[30,45]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":20,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":25,"s":[30,104]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":30,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":35,"s":[30,42]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":40,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":45,"s":[30,83]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":50,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":55,"s":[30,37]},{"t":60.0000024438501,"s":[30,100]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-73.472,8.472],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Shape Layer 6","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300.5,249,0],"ix":2},"a":{"a":0,"k":[-73,8.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[30,63]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":5,"s":[30,211]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":10,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":15,"s":[30,128]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":20,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":25,"s":[30,160]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":30,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":35,"s":[30,126]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":40,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":45,"s":[30,154]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":50,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":55,"s":[30,83]},{"t":60.0000024438501,"s":[30,63]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-73.472,8.472],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[30,63],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Shape Layer 5","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[240.5,249,0],"ix":2},"a":{"a":0,"k":[-73,8.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[30,63]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":5,"s":[30,155]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":10,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":15,"s":[30,91]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":20,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":25,"s":[30,186]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":30,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":35,"s":[30,256]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":40,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":45,"s":[30,209]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":50,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":55,"s":[30,124]},{"t":60.0000024438501,"s":[30,63]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-73.472,8.472],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[30,63],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Shape Layer 4","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[180.5,249,0],"ix":2},"a":{"a":0,"k":[-73,8.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[30,63]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":5,"s":[30,83]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":10,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":15,"s":[30,154]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":20,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":25,"s":[30,126]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":30,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":35,"s":[30,160]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":40,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":45,"s":[30,128]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":50,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":55,"s":[30,211]},{"t":60.0000024438501,"s":[30,63]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-73.472,8.472],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false},{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":0,"k":[30,63],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":0,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":1,"cix":2,"bm":0,"ix":2,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Shape Layer 3","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[120.5,249,0],"ix":2},"a":{"a":0,"k":[-73,8.5,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ty":"rc","d":1,"s":{"a":1,"k":[{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":0,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":5,"s":[30,37]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":10,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":15,"s":[30,83]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":20,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":25,"s":[30,42]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":30,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":35,"s":[30,104]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":40,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":45,"s":[30,45]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":50,"s":[30,100]},{"i":{"x":[0.833,0.833],"y":[0.833,0.833]},"o":{"x":[0.167,0.167],"y":[0.167,0.167]},"t":55,"s":[30,163]},{"t":60.0000024438501,"s":[30,100]}],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"r":{"a":0,"k":50,"ix":4},"nm":"Rectangle Path 1","mn":"ADBE Vector Shape - Rect","hd":false},{"ty":"st","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":0,"ix":5},"lc":1,"lj":1,"ml":4,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"fl","c":{"a":0,"k":[0.20392156862745098,0.22745098039215686,0.25098039215686274,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[-73.472,8.472],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Rectangle 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":60.0000024438501,"st":0,"bm":0}],"markers":[]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"v":"5.7.3","fr":30,"ip":0,"op":41,"w":600,"h":600,"nm":"Phone Call","ddd":0,"assets":[],"layers":[{"ddd":0,"ind":1,"ty":4,"nm":"Call Icon","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[293.084,310.786,0],"ix":2},"a":{"a":0,"k":[1371.347,-543.458,0],"ix":1},"s":{"a":1,"k":[{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":0,"s":[28,28,100]},{"i":{"x":[0.667,0.667,0.667],"y":[1,1,1]},"o":{"x":[0.333,0.333,0.333],"y":[0,0,0]},"t":20,"s":[25,25,100]},{"t":40,"s":[28,28,100]}],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[-22.59,22.938],[0,0],[23.373,23.448],[0,0],[23.186,-22.195],[0,0],[25.1,60.946],[0,0],[22.137,23.256],[0.601,0.601],[23.496,-22.664],[0,0],[-157.804,5.059]],"o":[[0,0],[23.373,-23.448],[-0.601,-0.601],[-23.249,-22.13],[0,0],[-60.902,-25.206],[0,0],[22.213,-23.184],[0,0],[-23.009,-23.158],[0,0],[-131.678,152.765],[32.193,0.187]],"v":[[1568.371,-346.481],[1586.008,-366.813],[1586.008,-451.645],[1538.775,-488.121],[1455.803,-488.005],[1418.862,-456.878],[1284.51,-591.463],[1315.52,-628.288],[1315.656,-711.279],[1279.141,-758.453],[1195.297,-759.345],[1173.008,-739.964],[1482.685,-310.897]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ind":1,"ty":"sh","ix":2,"ks":{"a":0,"k":{"i":[[0,10.704],[64.224,0],[0,-10.704],[-10.704,0],[0,-42.816],[-10.704,0]],"o":[[0,-64.224],[-10.704,0],[0,10.704],[42.816,0],[0,10.704],[10.704,0]],"v":[[1526.061,-582.237],[1409.772,-698.526],[1390.391,-679.145],[1409.772,-659.763],[1487.298,-582.237],[1506.679,-562.856]],"c":true},"ix":2},"nm":"Path 2","mn":"ADBE Vector Shape - Group","hd":false},{"ind":2,"ty":"sh","ix":3,"ks":{"a":0,"k":{"i":[[10.704,0],[0,10.704],[85.597,0.085],[0,10.704],[-10.704,0],[-0.117,-106.992]],"o":[[-10.704,0],[-0.085,-85.597],[-10.704,0],[0,-10.704],[106.992,0.117],[0,10.704]],"v":[[1584.205,-562.856],[1564.824,-582.237],[1409.772,-737.289],[1390.391,-756.67],[1409.772,-776.052],[1603.587,-582.237]],"c":true},"ix":2},"nm":"Path 3","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[1,1,1,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 1","np":4,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":45,"st":-8,"bm":0},{"ddd":0,"ind":2,"ty":4,"nm":"Background Circle","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[300,300,0],"ix":2},"a":{"a":0,"k":[1397.949,-584.944,0],"ix":1},"s":{"a":0,"k":[27,27,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"ind":0,"ty":"sh","ix":1,"ks":{"a":0,"k":{"i":[[0,-262.123],[262.123,0],[0,262.123],[-262.123,0]],"o":[[0,262.123],[-262.123,0],[0,-262.123],[262.123,0]],"v":[[1872.564,-584.944],[1397.949,-110.329],[923.334,-584.944],[1397.949,-1059.559]],"c":true},"ix":2},"nm":"Path 1","mn":"ADBE Vector Shape - Group","hd":false},{"ty":"fl","c":{"a":0,"k":[0.117700554343,0.127342568192,0.138823505476,1],"ix":4},"o":{"a":0,"k":100,"ix":5},"r":1,"bm":0,"nm":"Fill 1","mn":"ADBE Vector Graphic - Fill","hd":false},{"ty":"tr","p":{"a":0,"k":[0,0],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Group 2","np":2,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0,"op":45,"st":-8,"bm":0},{"ddd":0,"ind":3,"ty":4,"nm":"Small Circle","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":210,"ix":10},"p":{"a":0,"k":[301,301,0],"ix":2},"a":{"a":0,"k":[-7,-71,0],"ix":1},"s":{"a":0,"k":[70,70,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[426,426],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":22.03,"s":[0]},{"t":39.5470890812688,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":10.769,"s":[0]},{"t":35.7941593937688,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.117647066303,0.125490196078,0.137254901961,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":8,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-7,-71],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":10.7687687687688,"op":45,"st":10.7687687687688,"bm":0},{"ddd":0,"ind":4,"ty":4,"nm":"Medium Circle","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":119,"ix":10},"p":{"a":0,"k":[301,301,0],"ix":2},"a":{"a":0,"k":[-7,-71,0],"ix":1},"s":{"a":0,"k":[85,85,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[426,426],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":12.02,"s":[0]},{"t":29.5370790712588,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":0.759,"s":[0]},{"t":25.7841493837588,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.117647066303,0.125490196078,0.137254901961,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":7,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-7,-71],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":0.75875875875876,"op":45,"st":0.75875875875876,"bm":0},{"ddd":0,"ind":5,"ty":4,"nm":"Large Circle","sr":1,"ks":{"o":{"a":0,"k":100,"ix":11},"r":{"a":0,"k":0,"ix":10},"p":{"a":0,"k":[301,301,0],"ix":2},"a":{"a":0,"k":[-7,-71,0],"ix":1},"s":{"a":0,"k":[100,100,100],"ix":6}},"ao":0,"shapes":[{"ty":"gr","it":[{"d":1,"ty":"el","s":{"a":0,"k":[426,426],"ix":2},"p":{"a":0,"k":[0,0],"ix":3},"nm":"Ellipse Path 1","mn":"ADBE Vector Shape - Ellipse","hd":false},{"ty":"tm","s":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":15.774,"s":[0]},{"t":33.2908328250125,"s":[100]}],"ix":1},"e":{"a":1,"k":[{"i":{"x":[0.667],"y":[1]},"o":{"x":[0.333],"y":[0]},"t":4.513,"s":[0]},{"t":29.5379031375125,"s":[100]}],"ix":2},"o":{"a":0,"k":0,"ix":3},"m":1,"ix":2,"nm":"Trim Paths 1","mn":"ADBE Vector Filter - Trim","hd":false},{"ty":"st","c":{"a":0,"k":[0.117647066303,0.125490196078,0.137254901961,1],"ix":3},"o":{"a":0,"k":100,"ix":4},"w":{"a":0,"k":6,"ix":5},"lc":2,"lj":2,"bm":0,"nm":"Stroke 1","mn":"ADBE Vector Graphic - Stroke","hd":false},{"ty":"tr","p":{"a":0,"k":[-7,-71],"ix":2},"a":{"a":0,"k":[0,0],"ix":1},"s":{"a":0,"k":[100,100],"ix":3},"r":{"a":0,"k":0,"ix":6},"o":{"a":0,"k":100,"ix":7},"sk":{"a":0,"k":0,"ix":4},"sa":{"a":0,"k":0,"ix":5},"nm":"Transform"}],"nm":"Ellipse 1","np":3,"cix":2,"bm":0,"ix":1,"mn":"ADBE Vector Group","hd":false}],"ip":4.51251251251251,"op":45,"st":4.51251251251251,"bm":0}],"markers":[]}
|