import Logger from '../utils/logger'; import { API_ENDPOINTS } from './apiEndpoints'; import type { SelfieConclusion, UploadSelfieResponse } from '../types/apiTypes'; import type { GetIdSdk } from '@get-id/react-native-sdk'; import { SelfieError, SelfieErrorCode } from '../types/sdkTypes'; type UploadSelfieProps = { imageUri: string; docType: 'selfie'; sdk: GetIdSdk; }; type UploadSelfieResult = Promise; const uploadSelfie = async ({ imageUri, docType, sdk, }: UploadSelfieProps): UploadSelfieResult => { Logger.log(`Uploading ${docType}...`); try { const formData = new FormData(); formData.append(docType, { uri: imageUri, type: 'image/jpeg', name: 'image.jpg', }); const headers = { Authorization: 'Bearer ' + sdk.config.token, }; const response = await fetch(sdk.config.apiUrl + API_ENDPOINTS.SELFIE, { method: 'POST', headers: headers, body: formData, }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } Logger.log(`${docType} successfully uploaded!`); const responseData = await response.json(); if (responseData.passiveLiveness) { sdk.tracking.trySendEvent('passive-liveness', 'started'); const isPassiveLivenessFailed = !responseData.passiveLiveness.isAlive || !responseData.passiveLiveness.success; if (isPassiveLivenessFailed) { throw new SelfieError( 'Passive liveness failed', SelfieErrorCode.SELFIE_PASSIVE_LIVENESS_FAILED ); } if (responseData.passiveLiveness.success) { sdk.tracking.trySendEvent('passive-liveness', 'completed'); } } sdk.addSelfieFile({ type: 'selfie', uri: imageUri, fileId: responseData.fileId, }); if (responseData.passiveLiveness) { sdk.addPassiveLivenessInfo(responseData.passiveLiveness); } const conclusion = `selfie-${responseData.conclusion}` as SelfieConclusion; return { result: responseData.conclusion === 'ok', conclusion, }; } catch (error: any) { Logger.error(error.message); if (error instanceof SelfieError) { return { result: false, conclusion: error.code as SelfieErrorCode }; } const response = error.response?.data || {}; if (response && response.conclusion) { const conclusion = `selfie-${response.conclusion}` as SelfieErrorCode; return { result: false, conclusion, }; } Logger.error(`Error while upload ${docType}`, sdk.tracking.trySendEvent); if (error.response?.data) { Logger.error(error.response.data); } throw new Error('Error while uploading selfie'); } }; export default uploadSelfie;