import type { GetIdSdk } from '@get-id/react-native-sdk'; import type { UploadDocumentResponse, VerifyApplicationPayload, } from '../../types/apiTypes'; import type { DocumentConclusion, DocumentType, RequiredField, ScannedDocument, } from '../../types/sdkTypes'; import { NativeModules } from 'react-native'; import { Platform } from 'react-native'; const mapResultToScannedDocument = ( result: UploadDocumentResponse ): ScannedDocument => { return { issuingCountry: result.issuingCountry, documentType: result.documentType as DocumentType, conclusion: result.conclusion as DocumentConclusion, missingRequiredFields: result.missingRequiredFields as RequiredField[], }; }; function getLocale() { return Platform.OS === 'ios' ? NativeModules.SettingsManager.settings.AppleLocale || NativeModules.SettingsManager.settings.AppleLanguages[0] || 'en' : NativeModules.I18nManager.localeIdentifier; } const getImageRotate = Platform.OS === 'ios' ? () => 0 : (orientation: string) => { switch (orientation) { case 'portrait': return 0; case 'landscape-left': return 270; case 'landscape-right': return 90; case 'portrait-upside-down': return 180; default: return 0; } }; function mapSdkForVerify(sdk: GetIdSdk): VerifyApplicationPayload { const { docFiles: files, selfieResult, livenessResult: livenessResults, passiveLivenessResult, } = sdk; const documents = files.reduce( (acc, file) => { const existingDoc = acc.find( (doc) => doc.images[file.type] === undefined ); if (existingDoc) { existingDoc.images[file.type] = file.fileId; } else { acc.push({ images: { [file.type]: file.fileId }, fromGallery: false, }); } return acc; }, [] as Array<{ images: { front?: string; back?: string }; fromGallery: boolean; }> ); const faces: Array<{ kind: | 'selfie' | 'video' | 'liveness-video' | 'liveness-full-face' | 'liveness-passive'; fileId: string; signature?: string; }> = []; if (selfieResult) { faces.push({ kind: 'selfie', fileId: selfieResult.fileId }); } if (passiveLivenessResult) { faces.push({ kind: 'liveness-passive', fileId: passiveLivenessResult.fileId, signature: passiveLivenessResult.signature, }); } else if (livenessResults) { faces.push({ kind: 'liveness-video', ...livenessResults.artifacts.video, }); faces.push({ kind: 'liveness-full-face', ...livenessResults.artifacts.fullFace, }); } const metadata = { clientTimestamp: new Date().toISOString(), locale: getLocale(), flowName: sdk.config.flow, externalId: sdk.config.externalId, createdBy: 'web-mobile' as const, platform: Platform.OS, }; const fields = sdk.config.profile?.map((field) => ({ category: field.category, content: field.value, contentType: field.contentType, fieldType: field.fieldType, })) || []; return { application: { metadata, faces, fields, documents, }, }; } export { mapResultToScannedDocument, mapSdkForVerify, getImageRotate };