@sanctum-key/react-native-sdk 1.0.21 → 1.0.22

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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sanctum-key/react-native-sdk",
3
- "version": "1.0.21",
3
+ "version": "1.0.22",
4
4
  "description": "Sanctum Key React Native SDK",
5
5
  "main": "build/src/index.js",
6
6
  "types": "build/src/index.d.ts",
@@ -1 +1 @@
1
- {"version":3,"file":"IDCardCapture.d.ts","sourceRoot":"","sources":["../../../../src/components/KYCElements/IDCardCapture.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAI5D,OAAO,EAAE,iBAAiB,EAAoI,MAAM,uBAAuB,CAAC;AAe5L,UAAU,cAAc;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAAE;AAC3F,UAAU,kBAAkB;IAC1B,SAAS,EAAE,iBAAiB,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACvC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAijBtD,CAAC"}
1
+ {"version":3,"file":"IDCardCapture.d.ts","sourceRoot":"","sources":["../../../../src/components/KYCElements/IDCardCapture.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAuC,MAAM,OAAO,CAAC;AAI5D,OAAO,EAAE,iBAAiB,EAAoI,MAAM,uBAAuB,CAAC;AAe5L,UAAU,cAAc;IAAG,GAAG,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAAE;AAC3F,UAAU,kBAAkB;IAC1B,SAAS,EAAE,iBAAiB,CAAC;IAC7B,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACvC,aAAa,EAAE,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,GAAG,MAAM,CAAC,KAAK,IAAI,CAAC;IACxE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,EAAE,CAAC,kBAAkB,CAyjBtD,CAAC"}
@@ -156,24 +156,24 @@ export const IDCardCapture = ({ component, value = {}, onValueChange, error, lan
156
156
  }
157
157
  return { authMethod: removeDuplicates(authMethod), mrzTypes: removeDuplicates(mrzTypes), regionMapping, key };
158
158
  };
159
- const getCorrespondingMrzType = (templatePath, mapping, selectedDocumentType = "root") => {
160
- if (!mapping || !mapping[selectedDocumentType])
159
+ const getCorrespondingMrzType = (templatePath, mapping, regionKey = "root") => {
160
+ if (!mapping || !mapping[regionKey])
161
161
  return null;
162
- const fileName = templatePath.split("/").pop()?.replace(".jpg", "").replace(".png", "");
162
+ const fileName = templatePath.split("/").pop()?.replace(/\.(jpg|jpeg|png|py)$/i, "");
163
163
  if (!fileName)
164
164
  return null;
165
165
  const pyName = `${fileName}.py`;
166
- const found = mapping[selectedDocumentType].find((item) => item.py_file === pyName);
166
+ const found = mapping[regionKey].find((item) => item.py_file === pyName);
167
167
  return found?.mrz_type || null;
168
168
  };
169
- const getCorrespondingAuthMethod = (templatePath, mapping, selectedDocumentType = "root", side) => {
170
- if (!mapping || !mapping[selectedDocumentType])
169
+ const getCorrespondingAuthMethod = (templatePath, mapping, regionKey = "root", side) => {
170
+ if (!mapping || !mapping[regionKey])
171
171
  return null;
172
- const fileName = templatePath.split("/").pop()?.replace(".jpg", "").replace(".png", "");
172
+ const fileName = templatePath.split("/").pop()?.replace(/\.(jpg|jpeg|png|py)$/i, "");
173
173
  if (!fileName)
174
174
  return null;
175
175
  const pyName = `${fileName}.py`;
176
- const found = mapping[selectedDocumentType].find((item) => item.py_file === pyName);
176
+ const found = mapping[regionKey].find((item) => item.py_file === pyName);
177
177
  return found?.[side] || null;
178
178
  };
179
179
  const autoCapture = async (capturePath, verified) => {
@@ -274,7 +274,10 @@ export const IDCardCapture = ({ component, value = {}, onValueChange, error, lan
274
274
  const mrzType = getCorrespondingMrzType(templatePath, regionMappings.regionMapping, regionMappings.key || '') || 'TD1';
275
275
  verificationRes = await frontVerification({
276
276
  path: result.path,
277
- regionMapping: { authMethod: matchedAuthMethod ? [matchedAuthMethod] : regionMappings.authMethod, mrzTypes: regionMappings.mrzTypes },
277
+ regionMapping: {
278
+ authMethod: matchedAuthMethod ? [matchedAuthMethod] : [],
279
+ mrzTypes: mrzType ? [mrzType] : []
280
+ },
278
281
  selectedDocumentType: GovernmentDocumentTypeShorted[selectedDocumentType?.type] || '',
279
282
  code: countryData?.code || '',
280
283
  currentSide,
@@ -284,16 +287,15 @@ export const IDCardCapture = ({ component, value = {}, onValueChange, error, lan
284
287
  }, env);
285
288
  }
286
289
  else {
287
- let matchedBackAuthMethod = getCorrespondingAuthMethod(templatePath, regionMappings.regionMapping, regionMappings.key || '', 'back');
288
- if (!matchedBackAuthMethod && currentSide === 'back') {
289
- matchedBackAuthMethod = 'MRZ';
290
- }
290
+ const matchedBackAuthMethod = getCorrespondingAuthMethod(templatePath, regionMappings.regionMapping, regionMappings.key || '', 'back');
291
291
  const backMrzType = getCorrespondingMrzType(templatePath, regionMappings.regionMapping, regionMappings.key || '') || '';
292
- // 🚨 EXTRACT FRONT TEMPLATE TO VALIDATE AGAINST BACK TEMPLATE
293
292
  const frontTemplatePath = capturedImages['front']?.templatePath || '';
294
293
  verificationRes = await backVerification({
295
294
  path: result.path,
296
- regionMapping: { authMethod: matchedBackAuthMethod ? [matchedBackAuthMethod] : regionMappings.authMethod, mrzTypes: regionMappings.mrzTypes },
295
+ regionMapping: {
296
+ authMethod: matchedBackAuthMethod ? [matchedBackAuthMethod] : [],
297
+ mrzTypes: backMrzType ? [backMrzType] : []
298
+ },
297
299
  selectedDocumentType: GovernmentDocumentTypeShorted[selectedDocumentType.type] || '',
298
300
  code: countryData?.code || '',
299
301
  currentSide,
@@ -301,7 +303,7 @@ export const IDCardCapture = ({ component, value = {}, onValueChange, error, lan
301
303
  mrzType: backMrzType,
302
304
  templateResponse,
303
305
  issuingSubdivision: issuingSubdivision,
304
- frontTemplatePath: frontTemplatePath // 🚨 PASSED DOWN TO TRIGGER VALIDATION
306
+ frontTemplatePath: frontTemplatePath
305
307
  }, env);
306
308
  }
307
309
  const bbox = verificationRes?.bbox || templateBbox;
@@ -335,7 +337,7 @@ export const IDCardCapture = ({ component, value = {}, onValueChange, error, lan
335
337
  else if (rawMessage.includes('card_not_fully_in_frame')) {
336
338
  userFriendlyMessage = 'Move closer to the document and ensure all corners are visible.';
337
339
  }
338
- else if (rawMessage.includes('ne correspond pas au recto')) { // 🚨 New Security Error Handler
340
+ else if (rawMessage.includes('ne correspond pas au recto')) {
339
341
  userFriendlyMessage = 'The back of the document does not match the front. You must scan the same ID.';
340
342
  }
341
343
  setSilentCaptureResult(prev => ({ ...prev, isAnalyzing: false, success: false, error: userFriendlyMessage }));
@@ -1 +1 @@
1
- {"version":3,"file":"IDCardCapture.js","sourceRoot":"","sources":["../../../../src/components/KYCElements/IDCardCapture.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useMemo, useState } from 'react';\nimport { View, Text, StyleSheet, Image, ScrollView, Platform, ActivityIndicator, TouchableOpacity, useWindowDimensions } from 'react-native';\nimport { showAlert } from '../../utils/platformAlert';\nimport { EnhancedCameraView } from '../EnhancedCameraView';\nimport { TemplateComponent, LocalizedText, GovernmentDocumentType, ISilentCaptureResult, IBbox, GovernmentDocumentTypeShorted, GovernmentDocumentTypeBackend } from '../../types/KYC.types';\nimport IdCardOverlay from '../OverLay/IdCard';\nimport { useTemplateKYCFlowContext } from '../../hooks/useTemplateKYCFlow';\nimport { useI18n } from '../../hooks/useI18n';\nimport { Button } from '../ui/Button';\nimport { removeDuplicates } from '../../utils/remove-duplicate';\nimport { backVerification, checkTemplateType, frontVerification } from '../../modules/api/CardAuthentification';\nimport { getDocumentTypeInfo } from '../../utils/get-document-type-info';\nimport pathToBase64 from '../../utils/pathToBase64';\nimport { cropByObb, cropImageWithBBoxWithTolerance, getObbConfidence, OBB_CONFIDENCE_THRESHOLD } from '../../utils/cropByObb';\nimport REGION_MAPPING from '../../config/region_mapping.json';\nimport QRCode from 'react-native-qrcode-svg';\n\nconst ISO_TO_COUNTRY_NAME: Record<string, string> = { 'KE': 'Kenya', 'CM': 'Cameroon', 'NG': 'Nigeria', 'CA': 'Canada', 'FR': 'France', 'GH': 'Ghana', 'ZA': 'South Africa', 'GB': 'Britain', 'CI': 'Ivory Coast', 'SN': 'Senegal', 'TG': 'Togo', 'ML': 'Mali' };\n\ninterface IIDCardPayload { dir: string; file: string; mrz: string; templatePath?: string; }\ninterface IDCardCaptureProps {\n component: TemplateComponent;\n value?: Record<string, IIDCardPayload>;\n onValueChange: (value: Record<string, IIDCardPayload | string>) => void;\n error?: string;\n language?: string;\n currentSide?: string;\n}\n\nexport const IDCardCapture: React.FC<IDCardCaptureProps> = ({ component, value = {}, onValueChange, error, language = 'en' }) => {\n const { t, locale } = useI18n();\n const [showCamera, setShowCamera] = useState(false);\n const [capturedImages, setCapturedImages] = useState<Record<string, IIDCardPayload>>(value || {});\n const [currentSide, setCurrentSide] = useState<'front' | 'back'>('front');\n const [bboxBySide, setBboxBySide] = useState<Record<string, IBbox>>({});\n const [silentCaptureResult, setSilentCaptureResult] = useState<ISilentCaptureResult>({ success: false, isAnalyzing: false });\n const [isProcessingCapture, setIsProcessingCapture] = useState(false);\n const [processingImagePath, setProcessingImagePath] = useState<string | null>(null);\n const [cameraKey, setCameraKey] = useState(0);\n const [isRebootingCamera, setIsRebootingCamera] = useState(false);\n const [cameraType, setCameraType] = useState<'back' | 'front'>('back');\n const [showQRModal, setShowQRModal] = useState(false);\n const [currentUrl, setCurrentUrl] = useState('');\n\n useEffect(() => {\n if (typeof window !== 'undefined' && window.location) {\n setCurrentUrl(window.location.href);\n }\n }, []);\n\n const documentTypeMapping: Record<string, GovernmentDocumentType> = { 'nationalId': 'national_id', 'passport': 'passport', 'driversLicense': 'drivers_licence', 'residencePermit': 'permanent_residence', 'healthInsuranceCard': 'health_insurance_card', };\n\n const { actions, state, env } = useTemplateKYCFlowContext();\n const { width: screenWidth, height: screenHeight } = useWindowDimensions();\n\n const getLocalizedText = (text: LocalizedText | Record<string, LocalizedText>): string => {\n if (text && typeof text[currentSide] === 'object' && text[currentSide][locale]) return text[currentSide][locale] || '';\n return \"\";\n };\n\n const countrySelectionData = useMemo(() => {\n const countrySelectionComponent = state.template.components.find(c => c.type === 'country_selection');\n return countrySelectionComponent ? state.componentData[countrySelectionComponent.id] : null;\n }, [state.template.components, state.componentData]);\n\n const selectedDocumentType = useMemo<{ type: GovernmentDocumentType; region: string } | null>(() => {\n if (!countrySelectionData?.documentType) return null;\n const backendDocType = countrySelectionData.documentType;\n const mappedType = documentTypeMapping[backendDocType] || backendDocType as GovernmentDocumentType;\n return { type: mappedType, region: countrySelectionData.region || 'root' };\n }, [countrySelectionData, documentTypeMapping]);\n\n const countryData = useMemo(() => countrySelectionData, [countrySelectionData]);\n\n const refreshCamera = () => {\n setIsRebootingCamera(true);\n setTimeout(() => {\n setCameraKey(prev => prev + 1);\n setIsRebootingCamera(false);\n }, 500);\n };\n\n const toggleCameraLens = () => {\n setCameraType(prev => prev === 'back' ? 'front' : 'back');\n refreshCamera();\n };\n\n useEffect(() => {\n if (value && Object.keys(value).length > 0) {\n if (JSON.stringify(value) !== JSON.stringify(capturedImages)) {\n const updatedImages = value as Record<string, IIDCardPayload>;\n setCapturedImages(updatedImages);\n const currentImageData = updatedImages[currentSide];\n if (currentImageData?.dir) {\n setSilentCaptureResult(prev => ({\n ...prev, path: currentImageData.dir, success: true, isAnalyzing: false, mrz: currentImageData.mrz || '', templatePath: currentImageData.templatePath || '',\n }));\n }\n }\n }\n }, [value, currentSide]);\n\n const cameraConfig = useMemo(() => {\n const instructions = selectedDocumentType ? (locale === 'en' ? getDocumentTypeInfo(selectedDocumentType.type).instructions.en : getDocumentTypeInfo(selectedDocumentType.type).instructions.fr) : getLocalizedText(component.instructions as Record<string, LocalizedText>);\n const isLandscape = screenWidth > screenHeight;\n let xMin, xMax, yMin, yMax;\n\n if (Platform.OS === 'web') {\n const boxWidthPercent = isLandscape ? 0.40 : 0.85;\n xMin = isLandscape ? 30 : 7.5;\n xMax = xMin + (boxWidthPercent * 100);\n const containerWidth = Math.min(screenWidth * 0.95, 1000);\n const containerHeight = isLandscape ? screenHeight * 0.80 : screenHeight * 0.90;\n const boxPixelWidth = containerWidth * boxWidthPercent;\n const boxPixelHeight = boxPixelWidth / 1.59;\n const heightPercent = (boxPixelHeight / containerHeight) * 100;\n yMin = (100 - heightPercent) / 2.5;\n yMax = yMin + heightPercent;\n } else {\n xMin = 5; xMax = 95; yMin = 34; yMax = 66;\n }\n const platformBbox = { xMin, yMin, xMax, yMax, borderColor: '#2DBD60', borderWidth: Platform.OS === 'web' ? 2 : 3, cornerRadius: 8 };\n return {\n cameraType: Platform.OS === 'web' ? cameraType : 'back',\n flashMode: 'auto' as const,\n overlay: { guideText: instructions, bbox: platformBbox }\n };\n }, [selectedDocumentType, locale, component.instructions, cameraType, screenWidth, screenHeight]);\n\n const retakePicture = (sideToRetake: 'front' | 'back') => {\n setIsProcessingCapture(false);\n setProcessingImagePath(null);\n setSilentCaptureResult({ path: '', success: false, isAnalyzing: false, error: '', templatePath: '', mrz: '', bbox: undefined });\n setShowCamera(true);\n refreshCamera();\n actions.showCustomStepper(false);\n setCapturedImages((prev) => { const newState = { ...prev }; delete newState[sideToRetake]; return newState; });\n if (value) { const newValue = { ...value }; delete newValue[sideToRetake]; onValueChange(newValue); }\n };\n\n const getCurrentSideVerification = (currentSide: string, countryKey: string) => {\n const rawDocType = countrySelectionData?.documentType;\n if (!rawDocType || !countryKey) { return { authMethod: [], mrzTypes: [], regionMapping: null, key: 'root' }; }\n const rawCountryName = ISO_TO_COUNTRY_NAME[countryData?.code || ''] || countryData?.code || countryKey;\n const baseMapping = (REGION_MAPPING as any).regionMapping || REGION_MAPPING;\n let countryMapping = baseMapping[rawCountryName];\n if (!countryMapping) {\n const foundKey = Object.keys(baseMapping).find(k => k.toLowerCase() === rawCountryName.toLowerCase() || k.toLowerCase() === countryKey.toLowerCase());\n if (foundKey) countryMapping = baseMapping[foundKey];\n }\n if (!countryMapping) { return { authMethod: [], mrzTypes: [], regionMapping: null, key: 'root' }; }\n const regionMapping = countryMapping[rawDocType];\n if (!regionMapping) { return { authMethod: [], mrzTypes: [], regionMapping: null, key: 'root' }; }\n const authMethod: string[] = [];\n const mrzTypes: string[] = [];\n const key = countrySelectionData.region?.trim()?.length > 0 ? countrySelectionData.region.trim() : 'root';\n if (regionMapping?.[key] && Array.isArray(regionMapping[key])) {\n regionMapping[key].forEach((item: any) => {\n if (item[currentSide]) {\n authMethod.push(item[currentSide]);\n if (item?.mrz_type) mrzTypes.push(item?.mrz_type);\n }\n });\n }\n return { authMethod: removeDuplicates(authMethod), mrzTypes: removeDuplicates(mrzTypes), regionMapping, key };\n }\n\n const getCorrespondingMrzType = (templatePath: string, mapping: any, selectedDocumentType: string = \"root\") => {\n if (!mapping || !mapping[selectedDocumentType]) return null;\n const fileName = templatePath.split(\"/\").pop()?.replace(\".jpg\", \"\").replace(\".png\", \"\");\n if (!fileName) return null;\n const pyName = `${fileName}.py`;\n const found = mapping[selectedDocumentType].find((item: any) => item.py_file === pyName);\n return found?.mrz_type || null;\n }\n\n const getCorrespondingAuthMethod = (templatePath: string, mapping: any, selectedDocumentType: string = \"root\", side: 'front' | 'back') => {\n if (!mapping || !mapping[selectedDocumentType]) return null;\n const fileName = templatePath.split(\"/\").pop()?.replace(\".jpg\", \"\").replace(\".png\", \"\");\n if (!fileName) return null;\n const pyName = `${fileName}.py`;\n const found = mapping[selectedDocumentType].find((item: any) => item.py_file === pyName);\n return found?.[side] || null;\n }\n\n const autoCapture = async (capturePath: string, verified: ISilentCaptureResult & { region?: string }) => {\n if (isProcessingCapture) return;\n setIsProcessingCapture(true);\n setProcessingImagePath(capturePath);\n try {\n let imagePathForUpload = capturePath;\n const overlayBbox = cameraConfig.overlay.bbox;\n const uiCropBbox = {\n minX: overlayBbox.xMin / 100,\n minY: overlayBbox.yMin / 100,\n width: (overlayBbox.xMax - overlayBbox.xMin) / 100,\n height: (overlayBbox.yMax - overlayBbox.yMin) / 100,\n };\n try {\n imagePathForUpload = await cropImageWithBBoxWithTolerance(capturePath, uiCropBbox, 0.06);\n } catch (e) {\n console.warn(\"Crop failed, falling back to original image\", e);\n imagePathForUpload = capturePath;\n }\n const base64 = await pathToBase64(imagePathForUpload);\n const newImages = {\n ...capturedImages,\n [currentSide]: { dir: imagePathForUpload, file: base64, mrz: verified.mrz || \"\", templatePath: verified.templatePath },\n };\n setCapturedImages(newImages);\n\n if (verified.country && verified.documentType) {\n onValueChange({\n ...newImages,\n country: verified.country,\n documentType: GovernmentDocumentTypeBackend[verified.documentType as keyof typeof GovernmentDocumentTypeBackend] || '',\n ...(verified.region ? { region: verified.region } : {}) \n });\n }\n\n setTimeout(() => {\n setShowCamera(false);\n actions.showCustomStepper(true);\n setSilentCaptureResult(prev => ({ ...prev, isAnalyzing: false }));\n setIsProcessingCapture(false);\n setProcessingImagePath(null);\n }, 600);\n } catch (e: any) {\n console.error(\"Backend Error:\", e);\n const friendlyError = state.currentLanguage === 'en' ? 'Unable to process document. Please try again.' : 'Impossible de traiter le document. Veuillez réessayer.';\n showAlert('Error', friendlyError);\n setSilentCaptureResult(prev => ({ ...prev, isAnalyzing: false, success: false }));\n setIsProcessingCapture(false);\n setProcessingImagePath(null);\n }\n };\n\n const handleSilentCapture = async (result: { success: boolean; path?: string; error?: string }) => {\n if (silentCaptureResult.isAnalyzing || isProcessingCapture) return;\n \n if (result.success && result.path) {\n setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: true, success: false, error: '' }));\n let templatePath = capturedImages[currentSide]?.templatePath || '';\n let templateBbox: IBbox | undefined;\n let templateResponse: any;\n \n if (!selectedDocumentType) {\n setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: false, success: false, error: 'Document type not selected' }));\n return;\n }\n\n const issuingSubdivision = selectedDocumentType.region !== 'root' ? selectedDocumentType.region : undefined;\n\n try {\n if (!templatePath) {\n const templateType = await checkTemplateType({ \n path: result.path || '', \n docType: selectedDocumentType?.type as GovernmentDocumentType, \n docRegion: countryData?.code || \"\", \n postfix: currentSide,\n issuingSubdivision: issuingSubdivision \n }, env);\n\n templateResponse = templateType;\n if (templateType.template_path) templatePath = templateType.template_path;\n \n if (templateType.card_obb) {\n const obbConfidence = getObbConfidence((templateType as any).card_obb);\n if (obbConfidence !== null && obbConfidence < OBB_CONFIDENCE_THRESHOLD) {\n setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: false, success: false, error: t('kyc.idCardCapture.cardNotFullyInFrame') }));\n return;\n }\n try {\n const crop = await cropByObb(result.path, (templateType as any).card_obb);\n templateBbox = crop.bbox;\n } catch { }\n }\n }\n\n const extractedCountryKey = templatePath ? templatePath.split('/')[0] : (ISO_TO_COUNTRY_NAME[countryData?.code || ''] || 'root');\n const regionMappings = getCurrentSideVerification(currentSide, extractedCountryKey);\n let verificationRes: any;\n\n if (currentSide === 'front') {\n const matchedAuthMethod = getCorrespondingAuthMethod(templatePath, regionMappings.regionMapping, regionMappings.key || '', 'front');\n const mrzType = getCorrespondingMrzType(templatePath, regionMappings.regionMapping, regionMappings.key || '') || 'TD1';\n \n verificationRes = await frontVerification({ \n path: result.path, \n regionMapping: { authMethod: matchedAuthMethod ? [matchedAuthMethod] : regionMappings.authMethod, mrzTypes: regionMappings.mrzTypes }, \n selectedDocumentType: GovernmentDocumentTypeShorted[selectedDocumentType?.type as keyof typeof GovernmentDocumentTypeShorted] || '', \n code: countryData?.code || '', \n currentSide, \n templatePath, \n mrzType,\n issuingSubdivision: issuingSubdivision \n }, env);\n } else {\n let matchedBackAuthMethod = getCorrespondingAuthMethod(templatePath, regionMappings.regionMapping, regionMappings.key || '', 'back');\n if (!matchedBackAuthMethod && currentSide === 'back') { matchedBackAuthMethod = 'MRZ'; }\n const backMrzType = getCorrespondingMrzType(templatePath, regionMappings.regionMapping, regionMappings.key || '') || '';\n \n // 🚨 EXTRACT FRONT TEMPLATE TO VALIDATE AGAINST BACK TEMPLATE\n const frontTemplatePath = capturedImages['front']?.templatePath || '';\n\n verificationRes = await backVerification({ \n path: result.path, \n regionMapping: { authMethod: matchedBackAuthMethod ? [matchedBackAuthMethod] : regionMappings.authMethod, mrzTypes: regionMappings.mrzTypes }, \n selectedDocumentType: GovernmentDocumentTypeShorted[selectedDocumentType.type as keyof typeof GovernmentDocumentTypeShorted] || '', \n code: countryData?.code || '', \n currentSide, \n templatePath, \n mrzType: backMrzType, \n templateResponse,\n issuingSubdivision: issuingSubdivision,\n frontTemplatePath: frontTemplatePath // 🚨 PASSED DOWN TO TRIGGER VALIDATION\n }, env);\n }\n\n const bbox = verificationRes?.bbox || templateBbox;\n const mrz = verificationRes?.mrz ? JSON.stringify(verificationRes.mrz) : \"\";\n \n const verifiedResult: ISilentCaptureResult & { region?: string } = { \n path: result.path, \n templatePath, \n bbox, \n success: true, \n mrz, \n isAnalyzing: false, \n country: countryData?.code, \n documentType: selectedDocumentType.type,\n region: issuingSubdivision \n };\n \n setSilentCaptureResult(verifiedResult);\n if (bbox) setBboxBySide(prev => ({ ...prev, [currentSide]: bbox }));\n \n await autoCapture(result.path, verifiedResult);\n\n } catch (error: any) {\n console.log(\"Backend Verification Error:\", error);\n const rawMessage = (error?.message || '').toLowerCase();\n let userFriendlyMessage ='Verification failed. Please try again.';\n \n if (rawMessage.includes('impossible') || rawMessage.includes('unreadable')) {\n userFriendlyMessage = 'Document unreadable. Please hold the camera steady in good light.';\n } else if (rawMessage.includes('country mismatch') || rawMessage.includes('pays sélectionné')) {\n userFriendlyMessage = 'The document does not match your selected country.';\n } else if (rawMessage.includes('card_not_fully_in_frame')) {\n userFriendlyMessage = 'Move closer to the document and ensure all corners are visible.';\n } else if (rawMessage.includes('ne correspond pas au recto')) { // 🚨 New Security Error Handler\n userFriendlyMessage = 'The back of the document does not match the front. You must scan the same ID.';\n }\n \n setSilentCaptureResult(prev => ({ ...prev, isAnalyzing: false, success: false, error: userFriendlyMessage }));\n }\n }\n };\n\n const handleError = (event: { message: string }) => {\n showAlert('Erreur', event.message);\n setShowCamera(false);\n setIsProcessingCapture(false);\n };\n\n useEffect(() => {\n actions.showCustomStepper(!showCamera);\n }, [showCamera]);\n\n if (!countrySelectionData || !selectedDocumentType) {\n return (\n <View style={styles.root}>\n <View style={styles.previewContainer}>\n <Text style={styles.title}>{getLocalizedText(component.labels)}</Text>\n <Text style={styles.description}>\n {state.currentLanguage === \"en\" ? \"Please complete the country and document selection first.\" : \"Veuillez d'abord compléter la sélection du pays et du document.\"}\n </Text>\n </View>\n </View>\n );\n }\n\n if (showCamera) {\n const isBusy = isProcessingCapture;\n if (isRebootingCamera) {\n return (\n <View style={[styles.root, { justifyContent: 'center', alignItems: 'center', backgroundColor: '#000' }]}>\n <ActivityIndicator size=\"large\" color=\"#2DBD60\" />\n <Text style={{ color: 'white', marginTop: 20, fontSize: 16 }}>Initializing Camera...</Text>\n </View>\n );\n }\n return (\n <View style={styles.root}>\n <View style={[styles.cameraWrapper, { flex: 1 }]}>\n <View style={styles.headerContainer}>\n <Text style={styles.headerTitle}>\n {selectedDocumentType ? (locale === 'en' ? getDocumentTypeInfo(selectedDocumentType.type).name.en : getDocumentTypeInfo(selectedDocumentType.type).name.fr) : ''}\n </Text>\n <View style={styles.stepBadge}>\n <Text style={styles.stepText}>\n {t('kyc.idCardCapture.captureTitle', { side: currentSide === 'front' ? locale === 'en' ? 'Front' : 'Recto' : locale === 'en' ? 'Back' : 'Verso' })}\n </Text>\n </View>\n </View>\n \n <View style={[styles.cameraFeedContainer, { flex: 1, backgroundColor: '#000' }]}>\n {Platform.OS === 'web' && (\n <View style={styles.webTopControls}>\n <TouchableOpacity style={styles.webFlipButton} onPress={toggleCameraLens}>\n <Text style={styles.webFlipText}>🔄 Flip Lens</Text>\n </TouchableOpacity>\n </View>\n )}\n \n <EnhancedCameraView\n key={`${currentSide}-${cameraKey}`}\n showCamera={true}\n isProcessing={isBusy}\n cameraType={cameraConfig.cameraType}\n style={{ ...StyleSheet.absoluteFillObject, ...(Platform.OS === 'web' ? { width: '100%', height: '100%', left: 0, top: 0 } as any : {}) }}\n onError={handleError}\n onSilentCapture={handleSilentCapture}\n silentCaptureResult={silentCaptureResult}\n overlayComponent={\n <>\n <IdCardOverlay\n xMin={cameraConfig.overlay.bbox.xMin} yMin={cameraConfig.overlay.bbox.yMin} xMax={cameraConfig.overlay.bbox.xMax} yMax={cameraConfig.overlay.bbox.yMax}\n instructions={cameraConfig.overlay.guideText}\n cornerOpacity={cameraConfig.overlay.bbox.cornerRadius || 0 as number}\n isSuccess={silentCaptureResult.success}\n language={state.currentLanguage}\n stepperProps={{\n back: () => {\n if (currentSide === 'back') {\n setCurrentSide('front'); setShowCamera(false); setIsProcessingCapture(false); setProcessingImagePath(null);\n if (capturedImages['front']?.dir) {\n const frontImage = capturedImages['front'];\n setSilentCaptureResult((prev) => ({ ...prev, path: frontImage.dir, success: true, isAnalyzing: false, error: '', mrz: frontImage.mrz || '', templatePath: frontImage.templatePath || '', bbox: bboxBySide['front'] }));\n } else { setSilentCaptureResult((prev) => ({ ...prev, path: '', success: false, isAnalyzing: false, error: '', templatePath: '' })); }\n } else { actions.previousComponent(); }\n },\n selectedDocumentType: selectedDocumentType ? (locale === 'en' ? getDocumentTypeInfo(selectedDocumentType.type).name.en : getDocumentTypeInfo(selectedDocumentType.type).name.fr) : '',\n step: state.currentComponentIndex + 1, totalSteps: state.template.components.length, side: currentSide,\n }}\n />\n </>\n }\n />\n \n {!isBusy && silentCaptureResult.isAnalyzing && (\n <View style={styles.topAnalyzingPillContainer}>\n <View style={styles.topAnalyzingPill}>\n <ActivityIndicator size=\"small\" color=\"white\" />\n <Text style={styles.analyzingPillText}>\n {state.currentLanguage === 'en' ? 'Scanning...' : 'Analyse...'}\n </Text>\n </View>\n </View>\n )}\n \n {isBusy && (\n <View style={[StyleSheet.absoluteFillObject, { zIndex: 9999 }]}>\n {processingImagePath && (\n <Image\n source={{ uri: processingImagePath.startsWith('file://') ? processingImagePath : `file://${processingImagePath}` }}\n style={StyleSheet.absoluteFillObject}\n resizeMode=\"cover\"\n />\n )}\n <View style={styles.processingOverlay}>\n <ActivityIndicator size=\"large\" color=\"#2DBD60\" />\n <Text style={styles.processingText}>\n {state.currentLanguage === 'en' ? 'Perfect!\\nProcessing Document...' : 'Parfait!\\nTraitement du document...'}\n </Text>\n </View>\n </View>\n )}\n \n {!isBusy && Platform.OS === 'web' ? (\n <View style={styles.webBottomControlBar}>\n {silentCaptureResult.error && (\n <View style={styles.floatingErrorBanner}>\n <Text style={styles.floatingErrorText}>⚠️ {silentCaptureResult.error}</Text>\n </View>\n )}\n <View style={styles.webActionButtonsRow}>\n <TouchableOpacity style={styles.webSecondaryButton} onPress={() => setShowCamera(false)}>\n <Text style={styles.webSecondaryButtonText}>Cancel</Text>\n </TouchableOpacity>\n <TouchableOpacity style={styles.webPrimaryButton} onPress={refreshCamera}>\n <Text style={styles.webPrimaryButtonText}>↻ Refresh Camera</Text>\n </TouchableOpacity>\n </View>\n </View>\n ) : !isBusy ? (\n <View style={styles.escapeHatchContainer}>\n <TouchableOpacity style={styles.fallbackRefreshButton} onPress={refreshCamera}>\n <Text style={styles.fallbackRefreshText}>↻ Refresh Camera</Text>\n </TouchableOpacity>\n <TouchableOpacity\n style={[styles.fallbackRefreshButton, { marginTop: 15, backgroundColor: 'rgba(220, 38, 38, 0.8)', borderColor: '#DC2626' }]}\n onPress={() => setShowCamera(false)}\n >\n <Text style={styles.fallbackRefreshText}>Cancel / Go Back</Text>\n </TouchableOpacity>\n </View>\n ) : null}\n \n {silentCaptureResult.error && !isBusy && Platform.OS !== 'web' ? (\n <View style={[styles.floatingErrorBanner, { zIndex: 10000 }]}>\n <Text style={styles.floatingErrorText}>⚠️ {silentCaptureResult.error}</Text>\n </View>\n ) : null}\n </View>\n </View>\n </View>\n );\n }\n\n return (\n <View style={styles.root}>\n <View style={styles.previewContainer}>\n <ScrollView style={styles.previewItemContainer} showsVerticalScrollIndicator={false}>\n <View key={currentSide} style={styles.sideContainer}>\n <Text style={styles.sideTitle}>\n {t('kyc.idCardCapture.captureTitle', { side: currentSide === 'front' ? locale === 'en' ? 'Front' : 'Recto' : locale === 'en' ? 'Back' : 'Verso' })}\n </Text>\n <Text style={{ fontSize: 14, color: '#666', textAlign: 'center', marginBottom: 16, lineHeight: 22 }}>\n {getLocalizedText(component.instructions)}\n </Text>\n <View style={{ alignItems: 'center', justifyContent: 'center', flexDirection: \"column\", gap: 16 }}>\n <View style={styles.imagePreviewWrapper}>\n {capturedImages[currentSide]?.dir ? (\n <Image source={{ uri: capturedImages[currentSide].dir }} style={styles.previewImage} />\n ) : silentCaptureResult.path ? (\n <Image source={{ uri: silentCaptureResult.path }} style={styles.previewImage} />\n ) : null}\n </View>\n {!capturedImages[currentSide]?.dir && (\n <View style={{ width: '100%', gap: 12 }}>\n <Button\n title={state.currentLanguage === \"en\" ? \"Start Scanning\" : \"Commencer la numérisation\"}\n onPress={() => { setShowCamera(true); refreshCamera(); actions.showCustomStepper(false); }}\n variant=\"primary\" size=\"large\" fullWidth\n />\n {Platform.OS === 'web' && (\n <Button\n title={state.currentLanguage === \"en\" ? \"Continue on Phone\" : \"Continuer sur le téléphone\"}\n onPress={() => setShowQRModal(true)}\n variant=\"outline\" size=\"large\" fullWidth\n />\n )}\n </View>\n )}\n {capturedImages[currentSide]?.dir && (\n <>\n <Button title={t('kyc.idCardCapture.retakeButton')} onPress={() => retakePicture(currentSide)} variant=\"outline\" size=\"medium\" fullWidth />\n <Button title={t('common.next')} onPress={() => {\n if (!selectedDocumentType) { showAlert('Error', 'Document type not selected'); return; }\n if (currentSide === 'back' || selectedDocumentType.type === 'passport') {\n actions.nextComponent();\n } else {\n setShowCamera(true); refreshCamera(); setCurrentSide('back'); setSilentCaptureResult({ success: false, isAnalyzing: false, path: '', error: '', templatePath: undefined }); setIsProcessingCapture(false); setProcessingImagePath(null);\n }\n }} variant=\"primary\" size=\"large\" fullWidth />\n </>\n )}\n </View>\n </View>\n </ScrollView>\n </View>\n {showQRModal && Platform.OS === 'web' && (\n <View style={styles.qrModalOverlay}>\n <View style={styles.qrModalContainer}>\n <Text style={styles.qrModalTitle}>\n {state.currentLanguage === 'en' ? 'Scan to continue' : 'Scannez pour continuer'}\n </Text>\n <Text style={styles.qrModalText}>\n {state.currentLanguage === 'en' ? \"Point your phone's camera at this QR code to seamlessly continue the process on your mobile device.\" : \"Pointez l'appareil photo de votre téléphone vers ce code QR pour continuer le processus en toute fluidité sur votre appareil mobile.\"}\n </Text>\n <View style={styles.qrCodeWrapper}>\n <QRCode value={currentUrl} size={220} backgroundColor=\"transparent\" />\n </View>\n <Button title={state.currentLanguage === 'en' ? \"Close\" : \"Fermer\"} onPress={() => setShowQRModal(false)} variant=\"outline\" fullWidth />\n </View>\n </View>\n )}\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n root: { flex: 1, width: '100%', backgroundColor: 'transparent', alignSelf: 'center', ...Platform.select({ web: { minHeight: '85vh', justifyContent: 'center', alignItems: 'center' } as any, }) },\n cameraWrapper: { width: '100%', backgroundColor: '#000000', overflow: 'hidden', ...Platform.select({ web: { maxWidth: 1000, width: '95%', height: '80vh', minHeight: 600, borderRadius: 24, shadowColor: '#000', shadowOffset: { width: 0, height: 10 }, shadowOpacity: 0.15, shadowRadius: 30, elevation: 24 } as any, default: { flex: 1 } }) },\n headerContainer: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', flexWrap: 'wrap', gap: 10, paddingHorizontal: 20, paddingVertical: 18, backgroundColor: '#FFFFFF', borderBottomWidth: 1, borderBottomColor: '#F1F5F9', zIndex: 10, ...Platform.select({ web: { display: 'flex' }, default: { display: 'none' } }) },\n headerTitle: { fontSize: 18, fontWeight: '700', color: '#0F172A', flexShrink: 1 },\n stepBadge: { backgroundColor: '#F1F5F9', paddingHorizontal: 12, paddingVertical: 6, borderRadius: 20, },\n stepText: { fontSize: 13, fontWeight: '600', color: '#64748B', },\n cameraFeedContainer: { flex: 1, position: 'relative', backgroundColor: '#000', },\n escapeHatchContainer: { position: 'absolute', bottom: 40, left: 0, right: 0, alignItems: 'center', justifyContent: 'center', zIndex: 99999 },\n fallbackRefreshButton: { backgroundColor: 'rgba(0, 0, 0, 0.8)', borderWidth: 1, borderColor: 'rgba(255, 255, 255, 0.5)', paddingVertical: 12, paddingHorizontal: 24, borderRadius: 24, shadowColor: '#000', shadowOffset: { width: 0, height: 4 }, shadowOpacity: 0.3, shadowRadius: 5, elevation: 8 },\n fallbackRefreshText: { color: '#FFFFFF', fontWeight: 'bold', fontSize: 16 },\n webBottomControlBar: { position: 'absolute', bottom: 0, left: 0, right: 0, paddingHorizontal: 24, paddingBottom: 24, paddingTop: 30, backgroundColor: 'rgba(0,0,0,0.6)', zIndex: 99999 },\n webActionButtonsRow: { flexDirection: 'row', justifyContent: 'center', gap: 16, marginTop: 12, maxWidth: 500, alignSelf: 'center', width: '100%' },\n webPrimaryButton: { flex: 1, backgroundColor: '#2DBD60', paddingVertical: 14, borderRadius: 12, alignItems: 'center' },\n webPrimaryButtonText: { color: 'white', fontWeight: 'bold', fontSize: 16 },\n webSecondaryButton: { flex: 1, backgroundColor: 'rgba(255,255,255,0.15)', borderWidth: 1, borderColor: 'rgba(255,255,255,0.3)', paddingVertical: 14, borderRadius: 12, alignItems: 'center' },\n webSecondaryButtonText: { color: 'white', fontWeight: 'bold', fontSize: 16 },\n webTopControls: { position: 'absolute', top: Platform.OS === 'ios' ? 70 : 20, right: 20, zIndex: 9999 },\n webFlipButton: { backgroundColor: 'rgba(0,0,0,0.6)', paddingHorizontal: 16, paddingVertical: 10, borderRadius: 20, borderWidth: 1, borderColor: 'rgba(255,255,255,0.4)', ...Platform.select({ web: { backdropFilter: 'blur(4px)' } as any }) },\n webFlipText: { color: 'white', fontWeight: 'bold', fontSize: 14 },\n previewContainer: { width: '100%', backgroundColor: 'white', borderRadius: 12, paddingVertical: 30, paddingHorizontal: 24, shadowColor: '#000', shadowOffset: { width: 0, height: 4 }, shadowOpacity: 0.08, shadowRadius: 16, elevation: 8, ...Platform.select({ web: { alignSelf: 'center', maxWidth: 650 }, default: { margin: 10, width: '95%' }}) },\n previewItemContainer: { flexGrow: 1, },\n title: { fontSize: 24, fontWeight: 'bold', color: '#333', marginBottom: 8, textAlign: 'center' },\n description: { fontSize: 16, color: '#666', textAlign: 'center', marginBottom: 24, lineHeight: 22 },\n sideContainer: { marginBottom: 24 },\n sideTitle: { fontSize: 22, fontWeight: 'bold', color: '#000', marginBottom: 12, textAlign: 'center' },\n imagePreviewWrapper: { width: '100%', borderRadius: 12, padding: 1, overflow: 'hidden', shadowColor: '#000', shadowOffset: { width: 0, height: 4 }, shadowOpacity: 0.12, shadowRadius: 8, elevation: 8, backgroundColor: '#f0f0f0', ...Platform.select({ web: { aspectRatio: 1.59, height: 'auto', maxWidth: 450, alignSelf: 'center' } as any, default: { height: 220 } }) },\n previewImage: { width: '100%', height: '100%', borderRadius: 12, resizeMode: 'cover' },\n floatingErrorBanner: { backgroundColor: '#FEF2F2', borderWidth: 1, borderColor: '#FCA5A5', paddingVertical: 12, paddingHorizontal: 16, borderRadius: 12, alignItems: 'center', justifyContent: 'center', width: '100%', ...Platform.select({ web: { position: 'absolute', bottom: '100%', marginBottom: 16, maxWidth: 500, alignSelf: 'center', zIndex: 100000, boxShadow: '0 4px 12px rgba(0,0,0,0.15)' } as any, default: { position: 'absolute', top: Platform.OS === 'ios' ? 90 : 70, left: 24, right: 24, zIndex: 10000 } }) },\n floatingErrorText: { color: '#991B1B', fontSize: 14, fontWeight: '700', textAlign: 'center' },\n processingOverlay: { flex: 1, backgroundColor: 'rgba(0, 0, 0, 0.7)', justifyContent: 'center', alignItems: 'center', zIndex: 9999, ...Platform.select({ web: { backdropFilter: 'blur(4px)' } as any }) },\n processingText: { color: '#FFF', fontSize: 18, fontWeight: 'bold', marginTop: 16, textAlign: 'center' },\n errorText: { color: '#dc2626', fontSize: 14, marginTop: 8, textAlign: 'center' },\n topAnalyzingPillContainer: { position: 'absolute', top: Platform.OS === 'android' ? 60 : 75, left: 0, right: 0, alignItems: 'center', zIndex: 100 },\n topAnalyzingPill: { flexDirection: 'row', alignItems: 'center', backgroundColor: 'rgba(0,0,0,0.7)', paddingVertical: 10, paddingHorizontal: 20, borderRadius: 30, gap: 10, shadowColor: '#000', shadowOffset: {width: 0, height: 4}, shadowOpacity: 0.3, shadowRadius: 8 },\n analyzingPillText: { color: 'white', fontSize: 14, fontWeight: 'bold' },\n qrModalOverlay: { ...StyleSheet.absoluteFillObject, backgroundColor: 'rgba(0,0,0,0.6)', justifyContent: 'center', alignItems: 'center', zIndex: 999999, ...Platform.select({ web: { backdropFilter: 'blur(5px)' } as any }) },\n qrModalContainer: { backgroundColor: '#FFFFFF', borderRadius: 24, padding: 32, width: '90%', maxWidth: 400, alignItems: 'center', shadowColor: '#000', shadowOffset: { width: 0, height: 10 }, shadowOpacity: 0.15, shadowRadius: 30, elevation: 24, },\n qrModalTitle: { fontSize: 22, fontWeight: 'bold', color: '#0F172A', marginBottom: 12, textAlign: 'center' },\n qrModalText: { fontSize: 15, color: '#64748B', textAlign: 'center', marginBottom: 24, lineHeight: 22, },\n qrCodeWrapper: { padding: 16, backgroundColor: '#FFFFFF', borderRadius: 16, borderWidth: 1, borderColor: '#E2E8F0', marginBottom: 24, }\n});"]}
1
+ {"version":3,"file":"IDCardCapture.js","sourceRoot":"","sources":["../../../../src/components/KYCElements/IDCardCapture.tsx"],"names":[],"mappings":"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","sourcesContent":["import React, { useEffect, useMemo, useState } from 'react';\nimport { View, Text, StyleSheet, Image, ScrollView, Platform, ActivityIndicator, TouchableOpacity, useWindowDimensions } from 'react-native';\nimport { showAlert } from '../../utils/platformAlert';\nimport { EnhancedCameraView } from '../EnhancedCameraView';\nimport { TemplateComponent, LocalizedText, GovernmentDocumentType, ISilentCaptureResult, IBbox, GovernmentDocumentTypeShorted, GovernmentDocumentTypeBackend } from '../../types/KYC.types';\nimport IdCardOverlay from '../OverLay/IdCard';\nimport { useTemplateKYCFlowContext } from '../../hooks/useTemplateKYCFlow';\nimport { useI18n } from '../../hooks/useI18n';\nimport { Button } from '../ui/Button';\nimport { removeDuplicates } from '../../utils/remove-duplicate';\nimport { backVerification, checkTemplateType, frontVerification } from '../../modules/api/CardAuthentification';\nimport { getDocumentTypeInfo } from '../../utils/get-document-type-info';\nimport pathToBase64 from '../../utils/pathToBase64';\nimport { cropByObb, cropImageWithBBoxWithTolerance, getObbConfidence, OBB_CONFIDENCE_THRESHOLD } from '../../utils/cropByObb';\nimport REGION_MAPPING from '../../config/region_mapping.json';\nimport QRCode from 'react-native-qrcode-svg';\n\nconst ISO_TO_COUNTRY_NAME: Record<string, string> = { 'KE': 'Kenya', 'CM': 'Cameroon', 'NG': 'Nigeria', 'CA': 'Canada', 'FR': 'France', 'GH': 'Ghana', 'ZA': 'South Africa', 'GB': 'Britain', 'CI': 'Ivory Coast', 'SN': 'Senegal', 'TG': 'Togo', 'ML': 'Mali' };\n\ninterface IIDCardPayload { dir: string; file: string; mrz: string; templatePath?: string; }\ninterface IDCardCaptureProps {\n component: TemplateComponent;\n value?: Record<string, IIDCardPayload>;\n onValueChange: (value: Record<string, IIDCardPayload | string>) => void;\n error?: string;\n language?: string;\n currentSide?: string;\n}\n\nexport const IDCardCapture: React.FC<IDCardCaptureProps> = ({ component, value = {}, onValueChange, error, language = 'en' }) => {\n const { t, locale } = useI18n();\n const [showCamera, setShowCamera] = useState(false);\n const [capturedImages, setCapturedImages] = useState<Record<string, IIDCardPayload>>(value || {});\n const [currentSide, setCurrentSide] = useState<'front' | 'back'>('front');\n const [bboxBySide, setBboxBySide] = useState<Record<string, IBbox>>({});\n const [silentCaptureResult, setSilentCaptureResult] = useState<ISilentCaptureResult>({ success: false, isAnalyzing: false });\n const [isProcessingCapture, setIsProcessingCapture] = useState(false);\n const [processingImagePath, setProcessingImagePath] = useState<string | null>(null);\n const [cameraKey, setCameraKey] = useState(0);\n const [isRebootingCamera, setIsRebootingCamera] = useState(false);\n const [cameraType, setCameraType] = useState<'back' | 'front'>('back');\n const [showQRModal, setShowQRModal] = useState(false);\n const [currentUrl, setCurrentUrl] = useState('');\n\n useEffect(() => {\n if (typeof window !== 'undefined' && window.location) {\n setCurrentUrl(window.location.href);\n }\n }, []);\n\n const documentTypeMapping: Record<string, GovernmentDocumentType> = { 'nationalId': 'national_id', 'passport': 'passport', 'driversLicense': 'drivers_licence', 'residencePermit': 'permanent_residence', 'healthInsuranceCard': 'health_insurance_card', };\n\n const { actions, state, env } = useTemplateKYCFlowContext();\n const { width: screenWidth, height: screenHeight } = useWindowDimensions();\n\n const getLocalizedText = (text: LocalizedText | Record<string, LocalizedText>): string => {\n if (text && typeof text[currentSide] === 'object' && text[currentSide][locale]) return text[currentSide][locale] || '';\n return \"\";\n };\n\n const countrySelectionData = useMemo(() => {\n const countrySelectionComponent = state.template.components.find(c => c.type === 'country_selection');\n return countrySelectionComponent ? state.componentData[countrySelectionComponent.id] : null;\n }, [state.template.components, state.componentData]);\n\n const selectedDocumentType = useMemo<{ type: GovernmentDocumentType; region: string } | null>(() => {\n if (!countrySelectionData?.documentType) return null;\n const backendDocType = countrySelectionData.documentType;\n const mappedType = documentTypeMapping[backendDocType] || backendDocType as GovernmentDocumentType;\n return { type: mappedType, region: countrySelectionData.region || 'root' };\n }, [countrySelectionData, documentTypeMapping]);\n\n const countryData = useMemo(() => countrySelectionData, [countrySelectionData]);\n\n const refreshCamera = () => {\n setIsRebootingCamera(true);\n setTimeout(() => {\n setCameraKey(prev => prev + 1);\n setIsRebootingCamera(false);\n }, 500);\n };\n\n const toggleCameraLens = () => {\n setCameraType(prev => prev === 'back' ? 'front' : 'back');\n refreshCamera();\n };\n\n useEffect(() => {\n if (value && Object.keys(value).length > 0) {\n if (JSON.stringify(value) !== JSON.stringify(capturedImages)) {\n const updatedImages = value as Record<string, IIDCardPayload>;\n setCapturedImages(updatedImages);\n const currentImageData = updatedImages[currentSide];\n if (currentImageData?.dir) {\n setSilentCaptureResult(prev => ({\n ...prev, path: currentImageData.dir, success: true, isAnalyzing: false, mrz: currentImageData.mrz || '', templatePath: currentImageData.templatePath || '',\n }));\n }\n }\n }\n }, [value, currentSide]);\n\n const cameraConfig = useMemo(() => {\n const instructions = selectedDocumentType ? (locale === 'en' ? getDocumentTypeInfo(selectedDocumentType.type).instructions.en : getDocumentTypeInfo(selectedDocumentType.type).instructions.fr) : getLocalizedText(component.instructions as Record<string, LocalizedText>);\n const isLandscape = screenWidth > screenHeight;\n let xMin, xMax, yMin, yMax;\n\n if (Platform.OS === 'web') {\n const boxWidthPercent = isLandscape ? 0.40 : 0.85;\n xMin = isLandscape ? 30 : 7.5;\n xMax = xMin + (boxWidthPercent * 100);\n const containerWidth = Math.min(screenWidth * 0.95, 1000);\n const containerHeight = isLandscape ? screenHeight * 0.80 : screenHeight * 0.90;\n const boxPixelWidth = containerWidth * boxWidthPercent;\n const boxPixelHeight = boxPixelWidth / 1.59;\n const heightPercent = (boxPixelHeight / containerHeight) * 100;\n yMin = (100 - heightPercent) / 2.5;\n yMax = yMin + heightPercent;\n } else {\n xMin = 5; xMax = 95; yMin = 34; yMax = 66;\n }\n const platformBbox = { xMin, yMin, xMax, yMax, borderColor: '#2DBD60', borderWidth: Platform.OS === 'web' ? 2 : 3, cornerRadius: 8 };\n return {\n cameraType: Platform.OS === 'web' ? cameraType : 'back',\n flashMode: 'auto' as const,\n overlay: { guideText: instructions, bbox: platformBbox }\n };\n }, [selectedDocumentType, locale, component.instructions, cameraType, screenWidth, screenHeight]);\n\n const retakePicture = (sideToRetake: 'front' | 'back') => {\n setIsProcessingCapture(false);\n setProcessingImagePath(null);\n setSilentCaptureResult({ path: '', success: false, isAnalyzing: false, error: '', templatePath: '', mrz: '', bbox: undefined });\n setShowCamera(true);\n refreshCamera();\n actions.showCustomStepper(false);\n setCapturedImages((prev) => { const newState = { ...prev }; delete newState[sideToRetake]; return newState; });\n if (value) { const newValue = { ...value }; delete newValue[sideToRetake]; onValueChange(newValue); }\n };\n\n const getCurrentSideVerification = (currentSide: string, countryKey: string) => {\n const rawDocType = countrySelectionData?.documentType;\n if (!rawDocType || !countryKey) { return { authMethod: [], mrzTypes: [], regionMapping: null, key: 'root' }; }\n \n const rawCountryName = ISO_TO_COUNTRY_NAME[countryData?.code || ''] || countryData?.code || countryKey;\n const baseMapping = (REGION_MAPPING as any).regionMapping || REGION_MAPPING;\n \n let countryMapping = baseMapping[rawCountryName];\n if (!countryMapping) {\n const foundKey = Object.keys(baseMapping).find(k => k.toLowerCase() === rawCountryName.toLowerCase() || k.toLowerCase() === countryKey.toLowerCase());\n if (foundKey) countryMapping = baseMapping[foundKey];\n }\n if (!countryMapping) { return { authMethod: [], mrzTypes: [], regionMapping: null, key: 'root' }; }\n \n const regionMapping = countryMapping[rawDocType];\n if (!regionMapping) { return { authMethod: [], mrzTypes: [], regionMapping: null, key: 'root' }; }\n \n const authMethod: string[] = [];\n const mrzTypes: string[] = [];\n const key = countrySelectionData.region?.trim()?.length > 0 ? countrySelectionData.region.trim() : 'root';\n \n if (regionMapping?.[key] && Array.isArray(regionMapping[key])) {\n regionMapping[key].forEach((item: any) => {\n if (item[currentSide]) {\n authMethod.push(item[currentSide]);\n if (item?.mrz_type) mrzTypes.push(item?.mrz_type);\n }\n });\n }\n return { authMethod: removeDuplicates(authMethod), mrzTypes: removeDuplicates(mrzTypes), regionMapping, key };\n };\n\n const getCorrespondingMrzType = (templatePath: string, mapping: any, regionKey: string = \"root\") => {\n if (!mapping || !mapping[regionKey]) return null;\n const fileName = templatePath.split(\"/\").pop()?.replace(/\\.(jpg|jpeg|png|py)$/i, \"\");\n if (!fileName) return null;\n const pyName = `${fileName}.py`;\n const found = mapping[regionKey].find((item: any) => item.py_file === pyName);\n return found?.mrz_type || null;\n };\n\n const getCorrespondingAuthMethod = (templatePath: string, mapping: any, regionKey: string = \"root\", side: 'front' | 'back') => {\n if (!mapping || !mapping[regionKey]) return null;\n const fileName = templatePath.split(\"/\").pop()?.replace(/\\.(jpg|jpeg|png|py)$/i, \"\");\n if (!fileName) return null;\n const pyName = `${fileName}.py`;\n const found = mapping[regionKey].find((item: any) => item.py_file === pyName);\n return found?.[side] || null;\n };\n\n const autoCapture = async (capturePath: string, verified: ISilentCaptureResult & { region?: string }) => {\n if (isProcessingCapture) return;\n setIsProcessingCapture(true);\n setProcessingImagePath(capturePath);\n try {\n let imagePathForUpload = capturePath;\n const overlayBbox = cameraConfig.overlay.bbox;\n const uiCropBbox = {\n minX: overlayBbox.xMin / 100,\n minY: overlayBbox.yMin / 100,\n width: (overlayBbox.xMax - overlayBbox.xMin) / 100,\n height: (overlayBbox.yMax - overlayBbox.yMin) / 100,\n };\n try {\n imagePathForUpload = await cropImageWithBBoxWithTolerance(capturePath, uiCropBbox, 0.06);\n } catch (e) {\n console.warn(\"Crop failed, falling back to original image\", e);\n imagePathForUpload = capturePath;\n }\n const base64 = await pathToBase64(imagePathForUpload);\n const newImages = {\n ...capturedImages,\n [currentSide]: { dir: imagePathForUpload, file: base64, mrz: verified.mrz || \"\", templatePath: verified.templatePath },\n };\n setCapturedImages(newImages);\n\n if (verified.country && verified.documentType) {\n onValueChange({\n ...newImages,\n country: verified.country,\n documentType: GovernmentDocumentTypeBackend[verified.documentType as keyof typeof GovernmentDocumentTypeBackend] || '',\n ...(verified.region ? { region: verified.region } : {})\n });\n }\n\n setTimeout(() => {\n setShowCamera(false);\n actions.showCustomStepper(true);\n setSilentCaptureResult(prev => ({ ...prev, isAnalyzing: false }));\n setIsProcessingCapture(false);\n setProcessingImagePath(null);\n }, 600);\n } catch (e: any) {\n console.error(\"Backend Error:\", e);\n const friendlyError = state.currentLanguage === 'en' ? 'Unable to process document. Please try again.' : 'Impossible de traiter le document. Veuillez réessayer.';\n showAlert('Error', friendlyError);\n setSilentCaptureResult(prev => ({ ...prev, isAnalyzing: false, success: false }));\n setIsProcessingCapture(false);\n setProcessingImagePath(null);\n }\n };\n\n const handleSilentCapture = async (result: { success: boolean; path?: string; error?: string }) => {\n if (silentCaptureResult.isAnalyzing || isProcessingCapture) return;\n \n if (result.success && result.path) {\n setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: true, success: false, error: '' }));\n let templatePath = capturedImages[currentSide]?.templatePath || '';\n let templateBbox: IBbox | undefined;\n let templateResponse: any;\n \n if (!selectedDocumentType) {\n setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: false, success: false, error: 'Document type not selected' }));\n return;\n }\n\n const issuingSubdivision = selectedDocumentType.region !== 'root' ? selectedDocumentType.region : undefined;\n\n try {\n if (!templatePath) {\n const templateType = await checkTemplateType({ \n path: result.path || '', \n docType: selectedDocumentType?.type as GovernmentDocumentType, \n docRegion: countryData?.code || \"\", \n postfix: currentSide,\n issuingSubdivision: issuingSubdivision \n }, env);\n\n templateResponse = templateType;\n if (templateType.template_path) templatePath = templateType.template_path;\n \n if (templateType.card_obb) {\n const obbConfidence = getObbConfidence((templateType as any).card_obb);\n if (obbConfidence !== null && obbConfidence < OBB_CONFIDENCE_THRESHOLD) {\n setSilentCaptureResult((prev) => ({ ...prev, isAnalyzing: false, success: false, error: t('kyc.idCardCapture.cardNotFullyInFrame') }));\n return;\n }\n try {\n const crop = await cropByObb(result.path, (templateType as any).card_obb);\n templateBbox = crop.bbox;\n } catch { }\n }\n }\n\n const extractedCountryKey = templatePath ? templatePath.split('/')[0] : (ISO_TO_COUNTRY_NAME[countryData?.code || ''] || 'root');\n const regionMappings = getCurrentSideVerification(currentSide, extractedCountryKey);\n let verificationRes: any;\n\n if (currentSide === 'front') {\n const matchedAuthMethod = getCorrespondingAuthMethod(templatePath, regionMappings.regionMapping, regionMappings.key || '', 'front');\n const mrzType = getCorrespondingMrzType(templatePath, regionMappings.regionMapping, regionMappings.key || '') || 'TD1';\n \n verificationRes = await frontVerification({ \n path: result.path, \n regionMapping: { \n authMethod: matchedAuthMethod ? [matchedAuthMethod] : [], \n mrzTypes: mrzType ? [mrzType] : [] \n }, \n selectedDocumentType: GovernmentDocumentTypeShorted[selectedDocumentType?.type as keyof typeof GovernmentDocumentTypeShorted] || '', \n code: countryData?.code || '', \n currentSide, \n templatePath, \n mrzType,\n issuingSubdivision: issuingSubdivision \n }, env);\n } else {\n const matchedBackAuthMethod = getCorrespondingAuthMethod(templatePath, regionMappings.regionMapping, regionMappings.key || '', 'back');\n const backMrzType = getCorrespondingMrzType(templatePath, regionMappings.regionMapping, regionMappings.key || '') || '';\n const frontTemplatePath = capturedImages['front']?.templatePath || '';\n\n verificationRes = await backVerification({ \n path: result.path, \n regionMapping: { \n authMethod: matchedBackAuthMethod ? [matchedBackAuthMethod] : [], \n mrzTypes: backMrzType ? [backMrzType] : [] \n }, \n selectedDocumentType: GovernmentDocumentTypeShorted[selectedDocumentType.type as keyof typeof GovernmentDocumentTypeShorted] || '', \n code: countryData?.code || '', \n currentSide, \n templatePath, \n mrzType: backMrzType, \n templateResponse,\n issuingSubdivision: issuingSubdivision,\n frontTemplatePath: frontTemplatePath \n }, env);\n }\n\n const bbox = verificationRes?.bbox || templateBbox;\n const mrz = verificationRes?.mrz ? JSON.stringify(verificationRes.mrz) : \"\";\n \n const verifiedResult: ISilentCaptureResult & { region?: string } = { \n path: result.path, \n templatePath, \n bbox, \n success: true, \n mrz, \n isAnalyzing: false, \n country: countryData?.code, \n documentType: selectedDocumentType.type,\n region: issuingSubdivision \n };\n \n setSilentCaptureResult(verifiedResult);\n if (bbox) setBboxBySide(prev => ({ ...prev, [currentSide]: bbox }));\n \n await autoCapture(result.path, verifiedResult);\n\n } catch (error: any) {\n console.log(\"Backend Verification Error:\", error);\n const rawMessage = (error?.message || '').toLowerCase();\n let userFriendlyMessage ='Verification failed. Please try again.';\n \n if (rawMessage.includes('impossible') || rawMessage.includes('unreadable')) {\n userFriendlyMessage = 'Document unreadable. Please hold the camera steady in good light.';\n } else if (rawMessage.includes('country mismatch') || rawMessage.includes('pays sélectionné')) {\n userFriendlyMessage = 'The document does not match your selected country.';\n } else if (rawMessage.includes('card_not_fully_in_frame')) {\n userFriendlyMessage = 'Move closer to the document and ensure all corners are visible.';\n } else if (rawMessage.includes('ne correspond pas au recto')) { \n userFriendlyMessage = 'The back of the document does not match the front. You must scan the same ID.';\n }\n \n setSilentCaptureResult(prev => ({ ...prev, isAnalyzing: false, success: false, error: userFriendlyMessage }));\n }\n }\n };\n\n const handleError = (event: { message: string }) => {\n showAlert('Erreur', event.message);\n setShowCamera(false);\n setIsProcessingCapture(false);\n };\n\n useEffect(() => {\n actions.showCustomStepper(!showCamera);\n }, [showCamera]);\n\n if (!countrySelectionData || !selectedDocumentType) {\n return (\n <View style={styles.root}>\n <View style={styles.previewContainer}>\n <Text style={styles.title}>{getLocalizedText(component.labels)}</Text>\n <Text style={styles.description}>\n {state.currentLanguage === \"en\" ? \"Please complete the country and document selection first.\" : \"Veuillez d'abord compléter la sélection du pays et du document.\"}\n </Text>\n </View>\n </View>\n );\n }\n\n if (showCamera) {\n const isBusy = isProcessingCapture;\n if (isRebootingCamera) {\n return (\n <View style={[styles.root, { justifyContent: 'center', alignItems: 'center', backgroundColor: '#000' }]}>\n <ActivityIndicator size=\"large\" color=\"#2DBD60\" />\n <Text style={{ color: 'white', marginTop: 20, fontSize: 16 }}>Initializing Camera...</Text>\n </View>\n );\n }\n return (\n <View style={styles.root}>\n <View style={[styles.cameraWrapper, { flex: 1 }]}>\n <View style={styles.headerContainer}>\n <Text style={styles.headerTitle}>\n {selectedDocumentType ? (locale === 'en' ? getDocumentTypeInfo(selectedDocumentType.type).name.en : getDocumentTypeInfo(selectedDocumentType.type).name.fr) : ''}\n </Text>\n <View style={styles.stepBadge}>\n <Text style={styles.stepText}>\n {t('kyc.idCardCapture.captureTitle', { side: currentSide === 'front' ? locale === 'en' ? 'Front' : 'Recto' : locale === 'en' ? 'Back' : 'Verso' })}\n </Text>\n </View>\n </View>\n \n <View style={[styles.cameraFeedContainer, { flex: 1, backgroundColor: '#000' }]}>\n {Platform.OS === 'web' && (\n <View style={styles.webTopControls}>\n <TouchableOpacity style={styles.webFlipButton} onPress={toggleCameraLens}>\n <Text style={styles.webFlipText}>🔄 Flip Lens</Text>\n </TouchableOpacity>\n </View>\n )}\n \n <EnhancedCameraView\n key={`${currentSide}-${cameraKey}`}\n showCamera={true}\n isProcessing={isBusy}\n cameraType={cameraConfig.cameraType}\n style={{ ...StyleSheet.absoluteFillObject, ...(Platform.OS === 'web' ? { width: '100%', height: '100%', left: 0, top: 0 } as any : {}) }}\n onError={handleError}\n onSilentCapture={handleSilentCapture}\n silentCaptureResult={silentCaptureResult}\n overlayComponent={\n <>\n <IdCardOverlay\n xMin={cameraConfig.overlay.bbox.xMin} yMin={cameraConfig.overlay.bbox.yMin} xMax={cameraConfig.overlay.bbox.xMax} yMax={cameraConfig.overlay.bbox.yMax}\n instructions={cameraConfig.overlay.guideText}\n cornerOpacity={cameraConfig.overlay.bbox.cornerRadius || 0 as number}\n isSuccess={silentCaptureResult.success}\n language={state.currentLanguage}\n stepperProps={{\n back: () => {\n if (currentSide === 'back') {\n setCurrentSide('front'); setShowCamera(false); setIsProcessingCapture(false); setProcessingImagePath(null);\n if (capturedImages['front']?.dir) {\n const frontImage = capturedImages['front'];\n setSilentCaptureResult((prev) => ({ ...prev, path: frontImage.dir, success: true, isAnalyzing: false, error: '', mrz: frontImage.mrz || '', templatePath: frontImage.templatePath || '', bbox: bboxBySide['front'] }));\n } else { setSilentCaptureResult((prev) => ({ ...prev, path: '', success: false, isAnalyzing: false, error: '', templatePath: '' })); }\n } else { actions.previousComponent(); }\n },\n selectedDocumentType: selectedDocumentType ? (locale === 'en' ? getDocumentTypeInfo(selectedDocumentType.type).name.en : getDocumentTypeInfo(selectedDocumentType.type).name.fr) : '',\n step: state.currentComponentIndex + 1, totalSteps: state.template.components.length, side: currentSide,\n }}\n />\n </>\n }\n />\n \n {!isBusy && silentCaptureResult.isAnalyzing && (\n <View style={styles.topAnalyzingPillContainer}>\n <View style={styles.topAnalyzingPill}>\n <ActivityIndicator size=\"small\" color=\"white\" />\n <Text style={styles.analyzingPillText}>\n {state.currentLanguage === 'en' ? 'Scanning...' : 'Analyse...'}\n </Text>\n </View>\n </View>\n )}\n \n {isBusy && (\n <View style={[StyleSheet.absoluteFillObject, { zIndex: 9999 }]}>\n {processingImagePath && (\n <Image\n source={{ uri: processingImagePath.startsWith('file://') ? processingImagePath : `file://${processingImagePath}` }}\n style={StyleSheet.absoluteFillObject}\n resizeMode=\"cover\"\n />\n )}\n <View style={styles.processingOverlay}>\n <ActivityIndicator size=\"large\" color=\"#2DBD60\" />\n <Text style={styles.processingText}>\n {state.currentLanguage === 'en' ? 'Perfect!\\nProcessing Document...' : 'Parfait!\\nTraitement du document...'}\n </Text>\n </View>\n </View>\n )}\n \n {!isBusy && Platform.OS === 'web' ? (\n <View style={styles.webBottomControlBar}>\n {silentCaptureResult.error && (\n <View style={styles.floatingErrorBanner}>\n <Text style={styles.floatingErrorText}>⚠️ {silentCaptureResult.error}</Text>\n </View>\n )}\n <View style={styles.webActionButtonsRow}>\n <TouchableOpacity style={styles.webSecondaryButton} onPress={() => setShowCamera(false)}>\n <Text style={styles.webSecondaryButtonText}>Cancel</Text>\n </TouchableOpacity>\n <TouchableOpacity style={styles.webPrimaryButton} onPress={refreshCamera}>\n <Text style={styles.webPrimaryButtonText}>↻ Refresh Camera</Text>\n </TouchableOpacity>\n </View>\n </View>\n ) : !isBusy ? (\n <View style={styles.escapeHatchContainer}>\n <TouchableOpacity style={styles.fallbackRefreshButton} onPress={refreshCamera}>\n <Text style={styles.fallbackRefreshText}>↻ Refresh Camera</Text>\n </TouchableOpacity>\n <TouchableOpacity\n style={[styles.fallbackRefreshButton, { marginTop: 15, backgroundColor: 'rgba(220, 38, 38, 0.8)', borderColor: '#DC2626' }]}\n onPress={() => setShowCamera(false)}\n >\n <Text style={styles.fallbackRefreshText}>Cancel / Go Back</Text>\n </TouchableOpacity>\n </View>\n ) : null}\n \n {silentCaptureResult.error && !isBusy && Platform.OS !== 'web' ? (\n <View style={[styles.floatingErrorBanner, { zIndex: 10000 }]}>\n <Text style={styles.floatingErrorText}>⚠️ {silentCaptureResult.error}</Text>\n </View>\n ) : null}\n </View>\n </View>\n </View>\n );\n }\n\n return (\n <View style={styles.root}>\n <View style={styles.previewContainer}>\n <ScrollView style={styles.previewItemContainer} showsVerticalScrollIndicator={false}>\n <View key={currentSide} style={styles.sideContainer}>\n <Text style={styles.sideTitle}>\n {t('kyc.idCardCapture.captureTitle', { side: currentSide === 'front' ? locale === 'en' ? 'Front' : 'Recto' : locale === 'en' ? 'Back' : 'Verso' })}\n </Text>\n <Text style={{ fontSize: 14, color: '#666', textAlign: 'center', marginBottom: 16, lineHeight: 22 }}>\n {getLocalizedText(component.instructions)}\n </Text>\n <View style={{ alignItems: 'center', justifyContent: 'center', flexDirection: \"column\", gap: 16 }}>\n <View style={styles.imagePreviewWrapper}>\n {capturedImages[currentSide]?.dir ? (\n <Image source={{ uri: capturedImages[currentSide].dir }} style={styles.previewImage} />\n ) : silentCaptureResult.path ? (\n <Image source={{ uri: silentCaptureResult.path }} style={styles.previewImage} />\n ) : null}\n </View>\n {!capturedImages[currentSide]?.dir && (\n <View style={{ width: '100%', gap: 12 }}>\n <Button\n title={state.currentLanguage === \"en\" ? \"Start Scanning\" : \"Commencer la numérisation\"}\n onPress={() => { setShowCamera(true); refreshCamera(); actions.showCustomStepper(false); }}\n variant=\"primary\" size=\"large\" fullWidth\n />\n {Platform.OS === 'web' && (\n <Button\n title={state.currentLanguage === \"en\" ? \"Continue on Phone\" : \"Continuer sur le téléphone\"}\n onPress={() => setShowQRModal(true)}\n variant=\"outline\" size=\"large\" fullWidth\n />\n )}\n </View>\n )}\n {capturedImages[currentSide]?.dir && (\n <>\n <Button title={t('kyc.idCardCapture.retakeButton')} onPress={() => retakePicture(currentSide)} variant=\"outline\" size=\"medium\" fullWidth />\n <Button title={t('common.next')} onPress={() => {\n if (!selectedDocumentType) { showAlert('Error', 'Document type not selected'); return; }\n if (currentSide === 'back' || selectedDocumentType.type === 'passport') {\n actions.nextComponent();\n } else {\n setShowCamera(true); refreshCamera(); setCurrentSide('back'); setSilentCaptureResult({ success: false, isAnalyzing: false, path: '', error: '', templatePath: undefined }); setIsProcessingCapture(false); setProcessingImagePath(null);\n }\n }} variant=\"primary\" size=\"large\" fullWidth />\n </>\n )}\n </View>\n </View>\n </ScrollView>\n </View>\n {showQRModal && Platform.OS === 'web' && (\n <View style={styles.qrModalOverlay}>\n <View style={styles.qrModalContainer}>\n <Text style={styles.qrModalTitle}>\n {state.currentLanguage === 'en' ? 'Scan to continue' : 'Scannez pour continuer'}\n </Text>\n <Text style={styles.qrModalText}>\n {state.currentLanguage === 'en' ? \"Point your phone's camera at this QR code to seamlessly continue the process on your mobile device.\" : \"Pointez l'appareil photo de votre téléphone vers ce code QR pour continuer le processus en toute fluidité sur votre appareil mobile.\"}\n </Text>\n <View style={styles.qrCodeWrapper}>\n <QRCode value={currentUrl} size={220} backgroundColor=\"transparent\" />\n </View>\n <Button title={state.currentLanguage === 'en' ? \"Close\" : \"Fermer\"} onPress={() => setShowQRModal(false)} variant=\"outline\" fullWidth />\n </View>\n </View>\n )}\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n root: { flex: 1, width: '100%', backgroundColor: 'transparent', alignSelf: 'center', ...Platform.select({ web: { minHeight: '85vh', justifyContent: 'center', alignItems: 'center' } as any, }) },\n cameraWrapper: { width: '100%', backgroundColor: '#000000', overflow: 'hidden', ...Platform.select({ web: { maxWidth: 1000, width: '95%', height: '80vh', minHeight: 600, borderRadius: 24, shadowColor: '#000', shadowOffset: { width: 0, height: 10 }, shadowOpacity: 0.15, shadowRadius: 30, elevation: 24 } as any, default: { flex: 1 } }) },\n headerContainer: { flexDirection: 'row', alignItems: 'center', justifyContent: 'space-between', flexWrap: 'wrap', gap: 10, paddingHorizontal: 20, paddingVertical: 18, backgroundColor: '#FFFFFF', borderBottomWidth: 1, borderBottomColor: '#F1F5F9', zIndex: 10, ...Platform.select({ web: { display: 'flex' }, default: { display: 'none' } }) },\n headerTitle: { fontSize: 18, fontWeight: '700', color: '#0F172A', flexShrink: 1 },\n stepBadge: { backgroundColor: '#F1F5F9', paddingHorizontal: 12, paddingVertical: 6, borderRadius: 20, },\n stepText: { fontSize: 13, fontWeight: '600', color: '#64748B', },\n cameraFeedContainer: { flex: 1, position: 'relative', backgroundColor: '#000', },\n escapeHatchContainer: { position: 'absolute', bottom: 40, left: 0, right: 0, alignItems: 'center', justifyContent: 'center', zIndex: 99999 },\n fallbackRefreshButton: { backgroundColor: 'rgba(0, 0, 0, 0.8)', borderWidth: 1, borderColor: 'rgba(255, 255, 255, 0.5)', paddingVertical: 12, paddingHorizontal: 24, borderRadius: 24, shadowColor: '#000', shadowOffset: { width: 0, height: 4 }, shadowOpacity: 0.3, shadowRadius: 5, elevation: 8 },\n fallbackRefreshText: { color: '#FFFFFF', fontWeight: 'bold', fontSize: 16 },\n webBottomControlBar: { position: 'absolute', bottom: 0, left: 0, right: 0, paddingHorizontal: 24, paddingBottom: 24, paddingTop: 30, backgroundColor: 'rgba(0,0,0,0.6)', zIndex: 99999 },\n webActionButtonsRow: { flexDirection: 'row', justifyContent: 'center', gap: 16, marginTop: 12, maxWidth: 500, alignSelf: 'center', width: '100%' },\n webPrimaryButton: { flex: 1, backgroundColor: '#2DBD60', paddingVertical: 14, borderRadius: 12, alignItems: 'center' },\n webPrimaryButtonText: { color: 'white', fontWeight: 'bold', fontSize: 16 },\n webSecondaryButton: { flex: 1, backgroundColor: 'rgba(255,255,255,0.15)', borderWidth: 1, borderColor: 'rgba(255,255,255,0.3)', paddingVertical: 14, borderRadius: 12, alignItems: 'center' },\n webSecondaryButtonText: { color: 'white', fontWeight: 'bold', fontSize: 16 },\n webTopControls: { position: 'absolute', top: Platform.OS === 'ios' ? 70 : 20, right: 20, zIndex: 9999 },\n webFlipButton: { backgroundColor: 'rgba(0,0,0,0.6)', paddingHorizontal: 16, paddingVertical: 10, borderRadius: 20, borderWidth: 1, borderColor: 'rgba(255,255,255,0.4)', ...Platform.select({ web: { backdropFilter: 'blur(4px)' } as any }) },\n webFlipText: { color: 'white', fontWeight: 'bold', fontSize: 14 },\n previewContainer: { width: '100%', backgroundColor: 'white', borderRadius: 12, paddingVertical: 30, paddingHorizontal: 24, shadowColor: '#000', shadowOffset: { width: 0, height: 4 }, shadowOpacity: 0.08, shadowRadius: 16, elevation: 8, ...Platform.select({ web: { alignSelf: 'center', maxWidth: 650 }, default: { margin: 10, width: '95%' }}) },\n previewItemContainer: { flexGrow: 1, },\n title: { fontSize: 24, fontWeight: 'bold', color: '#333', marginBottom: 8, textAlign: 'center' },\n description: { fontSize: 16, color: '#666', textAlign: 'center', marginBottom: 24, lineHeight: 22 },\n sideContainer: { marginBottom: 24 },\n sideTitle: { fontSize: 22, fontWeight: 'bold', color: '#000', marginBottom: 12, textAlign: 'center' },\n imagePreviewWrapper: { width: '100%', borderRadius: 12, padding: 1, overflow: 'hidden', shadowColor: '#000', shadowOffset: { width: 0, height: 4 }, shadowOpacity: 0.12, shadowRadius: 8, elevation: 8, backgroundColor: '#f0f0f0', ...Platform.select({ web: { aspectRatio: 1.59, height: 'auto', maxWidth: 450, alignSelf: 'center' } as any, default: { height: 220 } }) },\n previewImage: { width: '100%', height: '100%', borderRadius: 12, resizeMode: 'cover' },\n floatingErrorBanner: { backgroundColor: '#FEF2F2', borderWidth: 1, borderColor: '#FCA5A5', paddingVertical: 12, paddingHorizontal: 16, borderRadius: 12, alignItems: 'center', justifyContent: 'center', width: '100%', ...Platform.select({ web: { position: 'absolute', bottom: '100%', marginBottom: 16, maxWidth: 500, alignSelf: 'center', zIndex: 100000, boxShadow: '0 4px 12px rgba(0,0,0,0.15)' } as any, default: { position: 'absolute', top: Platform.OS === 'ios' ? 90 : 70, left: 24, right: 24, zIndex: 10000 } }) },\n floatingErrorText: { color: '#991B1B', fontSize: 14, fontWeight: '700', textAlign: 'center' },\n processingOverlay: { flex: 1, backgroundColor: 'rgba(0, 0, 0, 0.7)', justifyContent: 'center', alignItems: 'center', zIndex: 9999, ...Platform.select({ web: { backdropFilter: 'blur(4px)' } as any }) },\n processingText: { color: '#FFF', fontSize: 18, fontWeight: 'bold', marginTop: 16, textAlign: 'center' },\n errorText: { color: '#dc2626', fontSize: 14, marginTop: 8, textAlign: 'center' },\n topAnalyzingPillContainer: { position: 'absolute', top: Platform.OS === 'android' ? 60 : 75, left: 0, right: 0, alignItems: 'center', zIndex: 100 },\n topAnalyzingPill: { flexDirection: 'row', alignItems: 'center', backgroundColor: 'rgba(0,0,0,0.7)', paddingVertical: 10, paddingHorizontal: 20, borderRadius: 30, gap: 10, shadowColor: '#000', shadowOffset: {width: 0, height: 4}, shadowOpacity: 0.3, shadowRadius: 8 },\n analyzingPillText: { color: 'white', fontSize: 14, fontWeight: 'bold' },\n qrModalOverlay: { ...StyleSheet.absoluteFillObject, backgroundColor: 'rgba(0,0,0,0.6)', justifyContent: 'center', alignItems: 'center', zIndex: 999999, ...Platform.select({ web: { backdropFilter: 'blur(5px)' } as any }) },\n qrModalContainer: { backgroundColor: '#FFFFFF', borderRadius: 24, padding: 32, width: '90%', maxWidth: 400, alignItems: 'center', shadowColor: '#000', shadowOffset: { width: 0, height: 10 }, shadowOpacity: 0.15, shadowRadius: 30, elevation: 24, },\n qrModalTitle: { fontSize: 22, fontWeight: 'bold', color: '#0F172A', marginBottom: 12, textAlign: 'center' },\n qrModalText: { fontSize: 15, color: '#64748B', textAlign: 'center', marginBottom: 24, lineHeight: 22, },\n qrCodeWrapper: { padding: 16, backgroundColor: '#FFFFFF', borderRadius: 16, borderWidth: 1, borderColor: '#E2E8F0', marginBottom: 24, }\n});"]}
@@ -28,6 +28,9 @@ export declare function frontVerification(result: {
28
28
  mrzType?: string;
29
29
  issuingSubdivision?: string;
30
30
  }, env?: KycEnvironment): Promise<{
31
+ barcode?: {
32
+ barcode_data: string;
33
+ } | undefined;
31
34
  mrz?: {
32
35
  success: boolean;
33
36
  parsed_data: {
@@ -49,6 +52,7 @@ export declare function frontVerification(result: {
49
52
  bbox: IBbox;
50
53
  } | {
51
54
  documentData?: any;
55
+ barcode?: any;
52
56
  mrz?: any;
53
57
  croppedBase64: string | undefined;
54
58
  bbox: IBbox | undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"CardAuthentification.d.ts","sourceRoot":"","sources":["../../../../src/modules/api/CardAuthentification.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0B,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAIvD,UAAU,WAAW;IACjB,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,UAAU,uBAAuB;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,QAAQ,CAAC,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AAED,wBAAsB,iBAAiB,CACnC,MAAM,EAAE;IACJ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,EAAE;QAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC5D,oBAAoB,EAAE,MAAM,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC9B,EACD,GAAG,GAAE,cAA6B;;;;;;;;;;;;;;;;;;;;;;;;;aApBzB,OAAO;cACN,OAAO;aACR,GAAG,EAAE;eACH,WAAW,EAAE,GAAG,GAAG;oBACd,MAAM;YACd,GAAG;GAwJd;AAED,wBAAsB,gBAAgB,CAClC,MAAM,EAAE;IACJ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,EAAE;QAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC5D,oBAAoB,EAAE,MAAM,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,uBAAuB,CAAC;IAC3C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC7B,EACD,GAAG,GAAE,cAA6B,gBA+NrC;AAED,wBAAsB,iBAAiB,CACnC,MAAM,EAAE;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC/B,EACD,GAAG,GAAE,cAA6B,gBA2ErC"}
1
+ {"version":3,"file":"CardAuthentification.d.ts","sourceRoot":"","sources":["../../../../src/modules/api/CardAuthentification.ts"],"names":[],"mappings":"AAEA,OAAO,EAA0B,KAAK,EAAE,MAAM,uBAAuB,CAAC;AACtE,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAIvD,UAAU,WAAW;IACjB,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,MAAM,EAAE,CAAC;CAC5B;AAED,UAAU,uBAAuB;IAC7B,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,QAAQ,CAAC,EAAE,WAAW,EAAE,GAAG,GAAG,CAAC;IAC/B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,KAAK,CAAC,EAAE,GAAG,CAAC;IACZ,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AAED,wBAAsB,iBAAiB,CACnC,MAAM,EAAE;IACJ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,EAAE;QAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC5D,oBAAoB,EAAE,MAAM,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC9B,EACD,GAAG,GAAE,cAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;aApBzB,OAAO;cACN,OAAO;aACR,GAAG,EAAE;eACH,WAAW,EAAE,GAAG,GAAG;oBACd,MAAM;YACd,GAAG;GA6Kd;AAED,wBAAsB,gBAAgB,CAClC,MAAM,EAAE;IACJ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,aAAa,EAAE;QAAE,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC5D,oBAAoB,EAAE,MAAM,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,gBAAgB,CAAC,EAAE,uBAAuB,CAAC;IAC3C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,CAAA;CAC7B,EACD,GAAG,GAAE,cAA6B,gBAwNrC;AAED,wBAAsB,iBAAiB,CACnC,MAAM,EAAE;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,MAAM,CAAA;CAC/B,EACD,GAAG,GAAE,cAA6B,gBA0ErC"}
@@ -10,6 +10,7 @@ export async function frontVerification(result, env = 'PRODUCTION') {
10
10
  ? result.regionMapping.authMethod.map(m => String(m).toUpperCase())
11
11
  : [];
12
12
  const hasMrz = authMethods.some(m => m.includes('MRZ'));
13
+ const hasBarcode = authMethods.some(m => m.includes('BARCODE') || m.includes('2D'));
13
14
  if (env === 'SANDBOX') {
14
15
  console.log("SANDBOX mode: Skipping AI verification for front document");
15
16
  const mockBbox = { minX: 400, minY: 800, width: 2200, height: 1400 };
@@ -26,12 +27,11 @@ export async function frontVerification(result, env = 'PRODUCTION') {
26
27
  ...(hasMrz ? {
27
28
  mrz: {
28
29
  success: true,
29
- parsed_data: {
30
- status: 'SUCCESS',
31
- document_type: result.selectedDocumentType,
32
- mrz_type: result.mrzType || 'TD1'
33
- }
30
+ parsed_data: { status: 'SUCCESS', document_type: result.selectedDocumentType, mrz_type: result.mrzType || 'TD1' }
34
31
  }
32
+ } : {}),
33
+ ...(hasBarcode ? {
34
+ barcode: { barcode_data: 'SANDBOX_MOCK_BARCODE' }
35
35
  } : {})
36
36
  };
37
37
  return mockResponse;
@@ -66,6 +66,7 @@ export async function frontVerification(result, env = 'PRODUCTION') {
66
66
  let croppedBase64;
67
67
  let bbox;
68
68
  let mrz;
69
+ let barcode;
69
70
  let documentData;
70
71
  try {
71
72
  const crop = await cropByObb(result?.path || '', detected.card_obb);
@@ -113,8 +114,27 @@ export async function frontVerification(result, env = 'PRODUCTION') {
113
114
  throw new Error(err?.message || "Erreur lors de l'extraction MRZ. Veuillez reprendre la photo.");
114
115
  }
115
116
  }
116
- // Return detected frame, crop, MRZ, AND the new extracted OCR documentData
117
- return { ...detected, croppedBase64, bbox, ...(mrz ? { mrz } : {}), ...(documentData ? { documentData } : {}) };
117
+ if (hasBarcode) {
118
+ try {
119
+ logger.log("Tentative d'extraction barcode (Front)");
120
+ barcode = await kycService.extractBarcode({ fileUri: result.path || '', token: token }, env);
121
+ }
122
+ catch (e) {
123
+ logger.log("Front Barcode Extraction Error:", e?.message);
124
+ // If it exclusively has a barcode (no MRZ) and barcode fails, throw.
125
+ if (!mrz) {
126
+ throw new Error(`Lecture Barcode échouée: ${e?.message || 'Veuillez réessayer'}`);
127
+ }
128
+ }
129
+ }
130
+ return {
131
+ ...detected,
132
+ croppedBase64,
133
+ bbox,
134
+ ...(mrz ? { mrz } : {}),
135
+ ...(barcode ? { barcode } : {}),
136
+ ...(documentData ? { documentData } : {})
137
+ };
118
138
  }
119
139
  catch (e) {
120
140
  logger.log('Error front verification:', e?.message);
@@ -145,11 +165,7 @@ export async function backVerification(result, env = 'PRODUCTION') {
145
165
  success: true,
146
166
  mrz: {
147
167
  success: true,
148
- parsed_data: {
149
- status: 'SUCCESS',
150
- document_type: result.selectedDocumentType,
151
- mrz_type: result.mrzType || 'TD1'
152
- }
168
+ parsed_data: { status: 'SUCCESS', document_type: result.selectedDocumentType, mrz_type: result.mrzType || 'TD1' }
153
169
  },
154
170
  bbox: mockBbox,
155
171
  card_obb: mockCardObb
@@ -217,16 +233,14 @@ export async function backVerification(result, env = 'PRODUCTION') {
217
233
  throw new Error(`Le document ne correspond pas au pays sélectionné (${result.code}).`);
218
234
  }
219
235
  }
220
- // 🚨 FRONT VS BACK TEMPLATE VALIDATION 🚨
221
236
  if (result.frontTemplatePath && activeTemplatePath) {
222
237
  try {
223
238
  const frontPy = result.frontTemplatePath.split("/").pop()?.replace(/\.(jpg|png)$/i, ".py");
224
239
  const backPy = activeTemplatePath.split("/").pop()?.replace(/\.(jpg|png)$/i, ".py");
225
240
  if (frontPy && backPy) {
226
241
  logger.log(`Validating Front (${frontPy}) vs Back (${backPy}) for region ${result.code}`);
227
- // 🚨 THE FIX: Only populate subRegion for Canadian 'hic' documents. Empty for all others.
228
- const isCanadianHic = result.code === 'CA' && result.selectedDocumentType === 'hic';
229
- const safeSubRegion = isCanadianHic ? (result.issuingSubdivision || "") : "";
242
+ const isCanadianSubRegionDoc = result.code === 'CA' && ['hic'].includes(result.selectedDocumentType);
243
+ const safeSubRegion = isCanadianSubRegionDoc ? (result.issuingSubdivision || "") : "";
230
244
  const matchValidation = await kycService.validateBackTemplate({
231
245
  region: result.code,
232
246
  docType: result.selectedDocumentType,
@@ -235,7 +249,6 @@ export async function backVerification(result, env = 'PRODUCTION') {
235
249
  subRegion: safeSubRegion,
236
250
  token: token
237
251
  }, env);
238
- // If the API succeeds but explicitly returns false, stop immediately.
239
252
  if (!matchValidation || matchValidation.is_match === false) {
240
253
  logger.log(`Front/Back Mismatch: ${matchValidation?.status_message}`);
241
254
  throw new Error(`Le verso ne correspond pas au recto fourni. Vous avez scanné un document différent.`);
@@ -243,7 +256,6 @@ export async function backVerification(result, env = 'PRODUCTION') {
243
256
  }
244
257
  }
245
258
  catch (err) {
246
- // Throw hard errors (like the mismatch). Ignore harmless 400s if a template mapping doesn't exist yet
247
259
  if (err?.message?.includes('ne correspond pas'))
248
260
  throw err;
249
261
  logger.log("Template matching validation skipped/failed internally:", err?.message);
@@ -294,11 +306,12 @@ export async function backVerification(result, env = 'PRODUCTION') {
294
306
  }
295
307
  if (hasBarcode) {
296
308
  try {
297
- logger.log("Tentative d'extraction barcode");
309
+ logger.log("Tentative d'extraction barcode (Back)");
298
310
  const barcode = await kycService.extractBarcode({ fileUri: result.path, token: token }, env);
299
311
  extractionResult.barcode = barcode;
300
312
  }
301
313
  catch (e) {
314
+ // If it explicitly expects a barcode (and not an MRZ) and fails, throw to user
302
315
  if (!extractionResult.mrz) {
303
316
  throw new Error(`Lecture Barcode échouée: ${e?.message}`);
304
317
  }
@@ -347,7 +360,6 @@ export async function checkTemplateType(result, env = 'PRODUCTION') {
347
360
  docRegion: result?.docRegion || "",
348
361
  postfix: result?.postfix,
349
362
  token: token,
350
- // 🚨 Pass the subdivision strictly if the region is Canada
351
363
  issuingSubdivision: isCanada ? result.issuingSubdivision : undefined
352
364
  }, env);
353
365
  if (templateType.success === false || templateType.Error) {
@@ -381,7 +393,7 @@ export async function checkTemplateType(result, env = 'PRODUCTION') {
381
393
  }
382
394
  const LPIPS_THRESHOLD = 0.75;
383
395
  if (templateType.lpips_score !== undefined && templateType.lpips_score > LPIPS_THRESHOLD) {
384
- logger.log(`🛑 Country Mismatch! LPIPS: ${templateType.lpips_score}`);
396
+ logger.log(`Country Mismatch! LPIPS: ${templateType.lpips_score}`);
385
397
  throw new Error(`Le document présenté ne correspond pas au pays sélectionné (${result.docRegion}).`);
386
398
  }
387
399
  logger.log("templateType result", JSON.stringify(truncateFields(templateType), null, 2));
@@ -1 +1 @@
1
- {"version":3,"file":"CardAuthentification.js","sourceRoot":"","sources":["../../../../src/modules/api/CardAuthentification.ts"],"names":[],"mappings":"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","sourcesContent":["import kycService, { authentification, errorMessage, truncateFields } from \"./KYCService\";\nimport { cropByObb, getObbConfidence, OBB_CONFIDENCE_THRESHOLD } from \"../../utils/cropByObb\";\nimport { GovernmentDocumentType, IBbox } from \"../../types/KYC.types\";\nimport { KycEnvironment } from \"../../types/env.types\";\nimport { logger } from \"../../utils/logger\";\nimport { countryData } from \"../../config/countriesData\";\n\ninterface CardObbData {\n obb: number[][];\n confidence: number;\n card_in_frame?: boolean;\n cropped_sides?: string[];\n}\n\ninterface ApiVerificationResponse {\n result?: boolean;\n success?: boolean;\n detail?: any[];\n card_obb?: CardObbData[] | any;\n template_path?: string;\n Error?: any;\n [key: string]: any;\n}\n\nexport async function frontVerification(\n result: {\n path?: string,\n regionMapping: { authMethod: string[], mrzTypes: string[] },\n selectedDocumentType: string,\n code: string,\n currentSide: string,\n templatePath?: string,\n mrzType?: string,\n issuingSubdivision?: string \n },\n env: KycEnvironment = 'PRODUCTION'\n) {\n try {\n console.log(\"Front verification START\", JSON.stringify({ result }, null, 2));\n logger.log(\"Front verification\", JSON.stringify({ result }, null, 2));\n \n const authMethods = Array.isArray(result.regionMapping?.authMethod)\n ? result.regionMapping.authMethod.map(m => String(m).toUpperCase())\n : [];\n const hasMrz = authMethods.some(m => m.includes('MRZ'));\n \n if (env === 'SANDBOX') {\n console.log(\"SANDBOX mode: Skipping AI verification for front document\");\n const mockBbox: IBbox = { minX: 400, minY: 800, width: 2200, height: 1400 };\n const mockResponse = {\n result: true,\n detail: [{ confidence: 0.95 }],\n card_obb: [{\n obb: [[400, 800], [2600, 800], [2600, 2200], [400, 2200]],\n confidence: 0.95,\n card_in_frame: true,\n cropped_sides: []\n }],\n bbox: mockBbox,\n ...(hasMrz ? {\n mrz: {\n success: true,\n parsed_data: {\n status: 'SUCCESS',\n document_type: result.selectedDocumentType,\n mrz_type: result.mrzType || 'TD1'\n }\n }\n } : {})\n };\n return mockResponse;\n }\n \n const token = await authentification();\n const detected = await kycService.detectFaceOnId(\n result?.path || '', token, result?.selectedDocumentType || '', env\n ) as ApiVerificationResponse;\n \n if (!detected.result) {\n throw new Error('Aucun visage détecté sur la carte. Veuillez reprendre.');\n }\n \n const cardData = detected.card_obb && Array.isArray(detected.card_obb) && detected.card_obb.length > 0\n ? detected.card_obb[0]\n : null;\n \n let points: number[][] | null = null;\n console.log(points)\n let isCardInFrame = true;\n let hasCroppedSides = false;\n \n if (cardData) {\n points = cardData.obb;\n if (typeof cardData.card_in_frame !== 'undefined') {\n isCardInFrame = cardData.card_in_frame === true;\n hasCroppedSides = Array.isArray(cardData.cropped_sides) && cardData.cropped_sides.length > 0;\n }\n }\n \n if (!isCardInFrame || hasCroppedSides) {\n logger.log(`Front Framing failed. Cropped sides detected by backend.`);\n throw new Error('CARD_NOT_FULLY_IN_FRAME');\n }\n \n const obbConfidence = getObbConfidence(detected.card_obb);\n if (obbConfidence !== null && obbConfidence < OBB_CONFIDENCE_THRESHOLD) {\n throw new Error('Carte non entièrement visible. Positionnez toute la carte dans le cadre.');\n }\n \n let croppedBase64: string | undefined;\n let bbox: IBbox | undefined;\n let mrz: any | undefined;\n let documentData: any | undefined;\n \n try {\n const crop = await cropByObb(result?.path || '', detected.card_obb);\n croppedBase64 = crop.base64;\n bbox = crop.bbox;\n } catch { }\n\n if (result.code === 'CA') {\n try {\n logger.log(\"Tentative d'extraction OCR (Front) - Canada Only\");\n documentData = await kycService.extractDocumentInformation({\n fileUri: result.path || '',\n docType: result.selectedDocumentType,\n docRegion: result.code,\n templatePath: result.templatePath || '',\n issuingSubdivision: result.issuingSubdivision, \n token: token,\n postfix: result.currentSide || 'front'\n });\n } catch (err: any) {\n logger.log(\"Front OCR Extraction Error:\", err?.message || err);\n }\n }\n \n if (hasMrz) {\n try {\n logger.log(\"Tentative d'extraction MRZ (Front)\");\n const mrzResponse = await kycService.extractMrzText(\n {\n fileUri: result.path || '',\n docType: result?.selectedDocumentType || '',\n docRegion: result?.code || \"\",\n postfix: result?.currentSide || 'front',\n token: token,\n template_path: result?.templatePath || '',\n mrz_type: result?.mrzType || 'TD1'\n },\n env\n );\n \n mrz = typeof mrzResponse === 'string' ? JSON.parse(mrzResponse) : mrzResponse;\n \n if (mrz?.parsed_data?.status === 'FAILURE' || mrz?.success === false) {\n logger.log(\"Front MRZ Extraction Failed:\", mrz?.parsed_data?.status_message);\n throw new Error(`MRZ illisible: ${mrz?.parsed_data?.status_message || 'Veuillez nettoyer l\\'objectif et réessayer'}`);\n }\n } catch (err: any) {\n logger.log(\"MRZ Extraction Error:\", err);\n throw new Error(err?.message || \"Erreur lors de l'extraction MRZ. Veuillez reprendre la photo.\");\n }\n }\n \n // Return detected frame, crop, MRZ, AND the new extracted OCR documentData\n return { ...detected, croppedBase64, bbox, ...(mrz ? { mrz } : {}), ...(documentData ? { documentData } : {}) };\n \n } catch (e: any) {\n logger.log('Error front verification:', e?.message);\n throw new Error(e?.message || 'Erreur de détection du visage');\n }\n}\n\nexport async function backVerification(\n result: {\n path?: string,\n regionMapping: { authMethod: string[], mrzTypes: string[] },\n selectedDocumentType: string,\n code: string,\n currentSide: string,\n templatePath?: string,\n mrzType?: string,\n templateResponse?: ApiVerificationResponse,\n issuingSubdivision?: string, // Capture province/state\n frontTemplatePath?: string // Capture the front template to compare against\n },\n env: KycEnvironment = 'PRODUCTION'\n) {\n try {\n if (!result.path) throw new Error('No path provided');\n logger.log(\"result.regionMapping\", result.regionMapping, result.currentSide, result.code);\n \n const authMethods = Array.isArray(result.regionMapping?.authMethod)\n ? result.regionMapping.authMethod.map(m => String(m).toUpperCase())\n : [];\n \n const hasMrz = authMethods.some(m => m.includes('MRZ'));\n const hasBarcode = authMethods.some(m => m.includes('BARCODE') || m.includes('2D'));\n \n if (env === 'SANDBOX') {\n console.log(\"SANDBOX mode: Skipping AI verification for back document\");\n const mockBbox: IBbox = { minX: 400, minY: 800, width: 2200, height: 1400 };\n const mockCardObb = [{\n obb: [[400, 800], [2600, 800], [2600, 2200], [400, 2200]],\n confidence: 0.95,\n card_in_frame: true,\n cropped_sides: []\n }];\n\n if (hasMrz) {\n return {\n success: true,\n mrz: {\n success: true,\n parsed_data: {\n status: 'SUCCESS',\n document_type: result.selectedDocumentType,\n mrz_type: result.mrzType || 'TD1'\n }\n },\n bbox: mockBbox,\n card_obb: mockCardObb\n };\n } else if (hasBarcode) {\n return {\n success: true,\n barcode: { barcode_data: 'SANDBOX_MOCK_BARCODE' },\n bbox: mockBbox,\n card_obb: mockCardObb\n };\n }\n return { success: true, bbox: mockBbox, card_obb: mockCardObb };\n }\n \n const token = await authentification();\n logger.log(\"1. Checking template and framing for back document...\");\n \n const templateResponse: ApiVerificationResponse = result.templateResponse ||\n await kycService.checkTemplateType({\n fileUri: result.path,\n docType: result.selectedDocumentType as any,\n docRegion: result.code,\n postfix: 'back',\n token: token,\n }, env);\n \n if (templateResponse.success === false || templateResponse.Error) {\n throw new Error('Impossible de lire le document. Veuillez vous rapprocher et stabiliser la caméra.');\n }\n \n const cardData = templateResponse?.card_obb && Array.isArray(templateResponse.card_obb) && templateResponse.card_obb.length > 0\n ? templateResponse.card_obb[0]\n : null;\n \n if (!cardData) throw new Error('CARD_NOT_FULLY_IN_FRAME');\n \n let points: number[][] | null = null;\n console.log(points)\n let isCardInFrame = false;\n let hasCroppedSides = true;\n \n if (cardData.obb) {\n points = cardData.obb;\n if (typeof cardData.card_in_frame !== 'undefined') {\n isCardInFrame = cardData.card_in_frame === true;\n hasCroppedSides = Array.isArray(cardData.cropped_sides) && cardData.cropped_sides.length > 0;\n }\n } else if (Array.isArray(cardData) && Array.isArray(cardData[0])) {\n points = cardData[0];\n isCardInFrame = true;\n hasCroppedSides = false;\n }\n \n if (!isCardInFrame || hasCroppedSides) {\n logger.log(`Back Framing failed. Backend reported document out of bounds.`);\n throw new Error('CARD_NOT_FULLY_IN_FRAME');\n }\n \n const obbConf = getObbConfidence(templateResponse?.card_obb);\n if (obbConf !== null && obbConf < OBB_CONFIDENCE_THRESHOLD) {\n throw new Error('Carte non entièrement visible. Positionnez toute la carte dans le cadre.');\n }\n \n const activeTemplatePath = templateResponse.template_path || result.templatePath || '';\n \n if (activeTemplatePath) {\n const expectedCountryName = countryData[result.code]?.name_en || '';\n const hasCodeMatch = activeTemplatePath.includes(`_${result.code}_`);\n const hasNameMatch = expectedCountryName && activeTemplatePath.toLowerCase().includes(expectedCountryName.toLowerCase());\n \n if (!hasCodeMatch && !hasNameMatch) {\n logger.log(`Template mismatch! Expected: ${result.code} (${expectedCountryName}), Detected: ${activeTemplatePath}`);\n throw new Error(`Le document ne correspond pas au pays sélectionné (${result.code}).`);\n }\n }\n\n // 🚨 FRONT VS BACK TEMPLATE VALIDATION 🚨\n if (result.frontTemplatePath && activeTemplatePath) {\n try {\n const frontPy = result.frontTemplatePath.split(\"/\").pop()?.replace(/\\.(jpg|png)$/i, \".py\");\n const backPy = activeTemplatePath.split(\"/\").pop()?.replace(/\\.(jpg|png)$/i, \".py\");\n \n if (frontPy && backPy) {\n logger.log(`Validating Front (${frontPy}) vs Back (${backPy}) for region ${result.code}`);\n \n // 🚨 THE FIX: Only populate subRegion for Canadian 'hic' documents. Empty for all others.\n const isCanadianHic = result.code === 'CA' && result.selectedDocumentType === 'hic';\n const safeSubRegion = isCanadianHic ? (result.issuingSubdivision || \"\") : \"\";\n\n const matchValidation = await kycService.validateBackTemplate({\n region: result.code,\n docType: result.selectedDocumentType,\n frontTemplateName: frontPy,\n backTemplateName: backPy,\n subRegion: safeSubRegion,\n token: token\n }, env);\n \n // If the API succeeds but explicitly returns false, stop immediately.\n if (!matchValidation || matchValidation.is_match === false) {\n logger.log(`Front/Back Mismatch: ${matchValidation?.status_message}`);\n throw new Error(`Le verso ne correspond pas au recto fourni. Vous avez scanné un document différent.`);\n }\n }\n } catch (err: any) {\n // Throw hard errors (like the mismatch). Ignore harmless 400s if a template mapping doesn't exist yet\n if (err?.message?.includes('ne correspond pas')) throw err;\n logger.log(\"Template matching validation skipped/failed internally:\", err?.message);\n }\n }\n \n logger.log(\"Framing, Country, and Match verified successfully. Proceeding to Data Extraction.\");\n let extractionResult: any = {};\n\n if (result.code === 'CA') {\n try {\n logger.log(\"Tentative d'extraction OCR (Back) - Canada Only\");\n const documentData = await kycService.extractDocumentInformation({\n fileUri: result.path!,\n docType: result.selectedDocumentType,\n docRegion: result.code,\n templatePath: activeTemplatePath,\n issuingSubdivision: result.issuingSubdivision,\n token: token,\n postfix: result.currentSide || 'back'\n });\n extractionResult.documentData = documentData;\n } catch (err: any) {\n logger.log(\"Back OCR Extraction Error:\", err?.message || err);\n }\n }\n \n if (hasMrz) {\n try {\n logger.log(\"Tentative d'extraction MRZ (Back)\");\n const mrzResponse = await kycService.extractMrzText({\n fileUri: result.path!,\n docType: result?.selectedDocumentType || '',\n docRegion: result?.code || '',\n postfix: result?.currentSide || 'back',\n token: token,\n template_path: activeTemplatePath,\n mrz_type: result?.mrzType || 'TD1'\n }, env);\n \n const mrz = typeof mrzResponse === 'string' ? JSON.parse(mrzResponse) : mrzResponse;\n \n if (mrz?.parsed_data?.status === 'FAILURE' || mrz?.success === false) {\n throw new Error(mrz?.parsed_data?.status_message || 'Lecture MRZ échouée');\n }\n extractionResult.mrz = mrz; \n } catch (mrzError: any) {\n logger.log(`MRZ échoué: ${mrzError?.message}`);\n throw new Error(`Lecture MRZ invalide: ${mrzError?.message || 'Veuillez nettoyer l\\'objectif et réessayer'}`);\n }\n }\n \n if (hasBarcode) {\n try {\n logger.log(\"Tentative d'extraction barcode\");\n const barcode = await kycService.extractBarcode({ fileUri: result.path!, token: token }, env);\n extractionResult.barcode = barcode;\n } catch (e: any) {\n if (!extractionResult.mrz) {\n throw new Error(`Lecture Barcode échouée: ${e?.message}`);\n }\n }\n }\n \n let bbox: IBbox | undefined;\n let croppedBase64: string | undefined;\n try {\n const crop = await cropByObb(result?.path || '', templateResponse.card_obb);\n bbox = crop.bbox;\n croppedBase64 = crop.base64;\n } catch { }\n \n return {\n success: true,\n ...extractionResult,\n bbox,\n croppedBase64,\n card_obb: templateResponse.card_obb\n };\n \n } catch (e: any) {\n if (e?.message === 'CARD_NOT_FULLY_IN_FRAME') throw e;\n throw new Error(e?.message || 'Erreur de détection des données');\n }\n}\n\nexport async function checkTemplateType(\n result: { \n path?: string, \n docType: string, \n docRegion: string, \n postfix: string,\n issuingSubdivision?: string \n },\n env: KycEnvironment = 'PRODUCTION'\n) {\n try {\n if (env === 'SANDBOX') {\n return {\n template_path: `templates/${result.docType}_${result.docRegion}_${result.postfix}.jpg`,\n card_obb: [{\n obb: [[400, 800], [2600, 800], [2600, 2200], [400, 2200]],\n confidence: 0.95,\n card_in_frame: true,\n cropped_sides: []\n }]\n };\n }\n \n const token = await authentification();\n const isCanada = result.docRegion?.toUpperCase() === 'CA';\n \n const templateType = await kycService.checkTemplateType({\n fileUri: result.path || '',\n docType: result?.docType as GovernmentDocumentType,\n docRegion: result?.docRegion || \"\",\n postfix: result?.postfix,\n token: token,\n // 🚨 Pass the subdivision strictly if the region is Canada\n issuingSubdivision: isCanada ? result.issuingSubdivision : undefined\n }, env);\n \n if (templateType.success === false || templateType.Error) {\n logger.log(\"Backend returned an error:\", templateType.Error);\n throw new Error('Impossible de lire le document. Veuillez vous rapprocher et stabiliser la caméra.');\n }\n \n const cardData = templateType.card_obb && Array.isArray(templateType.card_obb) && templateType.card_obb.length > 0\n ? templateType.card_obb[0]\n : null;\n \n if (!cardData) throw new Error('CARD_NOT_FULLY_IN_FRAME');\n \n let points: number[][] | null = null;\n console.log(points);\n let isCardInFrame = false;\n let hasCroppedSides = true;\n \n if (cardData.obb) {\n points = cardData.obb;\n if (typeof cardData.card_in_frame !== 'undefined') {\n isCardInFrame = cardData.card_in_frame === true;\n hasCroppedSides = Array.isArray(cardData.cropped_sides) && cardData.cropped_sides.length > 0;\n }\n } else if (Array.isArray(cardData) && Array.isArray(cardData[0])) {\n points = cardData[0];\n isCardInFrame = true;\n hasCroppedSides = false;\n }\n \n if (!isCardInFrame || hasCroppedSides) {\n logger.log(`Template Framing failed by backend check.`);\n throw new Error('CARD_NOT_FULLY_IN_FRAME');\n }\n \n const LPIPS_THRESHOLD = 0.75;\n if (templateType.lpips_score !== undefined && templateType.lpips_score > LPIPS_THRESHOLD) {\n logger.log(`🛑 Country Mismatch! LPIPS: ${templateType.lpips_score}`);\n throw new Error(`Le document présenté ne correspond pas au pays sélectionné (${result.docRegion}).`);\n }\n \n logger.log(\"templateType result\", JSON.stringify(truncateFields(templateType), null, 2));\n return templateType;\n \n } catch (e: any) {\n logger.log('Error checking template type:', JSON.stringify(errorMessage(e), null, 2));\n if (e?.message === 'CARD_NOT_FULLY_IN_FRAME' || e?.message?.includes('ne correspond pas')) throw e;\n throw new Error(e?.message || 'Erreur de vérification du template');\n }\n}"]}
1
+ {"version":3,"file":"CardAuthentification.js","sourceRoot":"","sources":["../../../../src/modules/api/CardAuthentification.ts"],"names":[],"mappings":"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","sourcesContent":["import kycService, { authentification, errorMessage, truncateFields } from \"./KYCService\";\nimport { cropByObb, getObbConfidence, OBB_CONFIDENCE_THRESHOLD } from \"../../utils/cropByObb\";\nimport { GovernmentDocumentType, IBbox } from \"../../types/KYC.types\";\nimport { KycEnvironment } from \"../../types/env.types\";\nimport { logger } from \"../../utils/logger\";\nimport { countryData } from \"../../config/countriesData\";\n\ninterface CardObbData {\n obb: number[][];\n confidence: number;\n card_in_frame?: boolean;\n cropped_sides?: string[];\n}\n\ninterface ApiVerificationResponse {\n result?: boolean;\n success?: boolean;\n detail?: any[];\n card_obb?: CardObbData[] | any;\n template_path?: string;\n Error?: any;\n [key: string]: any;\n}\n\nexport async function frontVerification(\n result: {\n path?: string,\n regionMapping: { authMethod: string[], mrzTypes: string[] },\n selectedDocumentType: string,\n code: string,\n currentSide: string,\n templatePath?: string,\n mrzType?: string,\n issuingSubdivision?: string\n },\n env: KycEnvironment = 'PRODUCTION'\n) {\n try {\n console.log(\"Front verification START\", JSON.stringify({ result }, null, 2));\n logger.log(\"Front verification\", JSON.stringify({ result }, null, 2));\n \n const authMethods = Array.isArray(result.regionMapping?.authMethod)\n ? result.regionMapping.authMethod.map(m => String(m).toUpperCase())\n : [];\n \n const hasMrz = authMethods.some(m => m.includes('MRZ'));\n const hasBarcode = authMethods.some(m => m.includes('BARCODE') || m.includes('2D'));\n \n if (env === 'SANDBOX') {\n console.log(\"SANDBOX mode: Skipping AI verification for front document\");\n const mockBbox: IBbox = { minX: 400, minY: 800, width: 2200, height: 1400 };\n const mockResponse = {\n result: true,\n detail: [{ confidence: 0.95 }],\n card_obb: [{\n obb: [[400, 800], [2600, 800], [2600, 2200], [400, 2200]],\n confidence: 0.95,\n card_in_frame: true,\n cropped_sides: []\n }],\n bbox: mockBbox,\n ...(hasMrz ? {\n mrz: {\n success: true,\n parsed_data: { status: 'SUCCESS', document_type: result.selectedDocumentType, mrz_type: result.mrzType || 'TD1' }\n }\n } : {}),\n ...(hasBarcode ? {\n barcode: { barcode_data: 'SANDBOX_MOCK_BARCODE' }\n } : {})\n };\n return mockResponse;\n }\n \n const token = await authentification();\n const detected = await kycService.detectFaceOnId(\n result?.path || '', token, result?.selectedDocumentType || '', env\n ) as ApiVerificationResponse;\n \n if (!detected.result) {\n throw new Error('Aucun visage détecté sur la carte. Veuillez reprendre.');\n }\n \n const cardData = detected.card_obb && Array.isArray(detected.card_obb) && detected.card_obb.length > 0\n ? detected.card_obb[0]\n : null;\n \n let points: number[][] | null = null;\n console.log(points)\n let isCardInFrame = true;\n let hasCroppedSides = false;\n \n if (cardData) {\n points = cardData.obb;\n if (typeof cardData.card_in_frame !== 'undefined') {\n isCardInFrame = cardData.card_in_frame === true;\n hasCroppedSides = Array.isArray(cardData.cropped_sides) && cardData.cropped_sides.length > 0;\n }\n }\n \n if (!isCardInFrame || hasCroppedSides) {\n logger.log(`Front Framing failed. Cropped sides detected by backend.`);\n throw new Error('CARD_NOT_FULLY_IN_FRAME');\n }\n \n const obbConfidence = getObbConfidence(detected.card_obb);\n if (obbConfidence !== null && obbConfidence < OBB_CONFIDENCE_THRESHOLD) {\n throw new Error('Carte non entièrement visible. Positionnez toute la carte dans le cadre.');\n }\n \n let croppedBase64: string | undefined;\n let bbox: IBbox | undefined;\n let mrz: any | undefined;\n let barcode: any | undefined;\n let documentData: any | undefined;\n \n try {\n const crop = await cropByObb(result?.path || '', detected.card_obb);\n croppedBase64 = crop.base64;\n bbox = crop.bbox;\n } catch { }\n\n if (result.code === 'CA') {\n try {\n logger.log(\"Tentative d'extraction OCR (Front) - Canada Only\");\n documentData = await kycService.extractDocumentInformation({\n fileUri: result.path || '',\n docType: result.selectedDocumentType,\n docRegion: result.code,\n templatePath: result.templatePath || '',\n issuingSubdivision: result.issuingSubdivision,\n token: token,\n postfix: result.currentSide || 'front'\n });\n } catch (err: any) {\n logger.log(\"Front OCR Extraction Error:\", err?.message || err);\n }\n }\n \n if (hasMrz) {\n try {\n logger.log(\"Tentative d'extraction MRZ (Front)\");\n const mrzResponse = await kycService.extractMrzText(\n {\n fileUri: result.path || '',\n docType: result?.selectedDocumentType || '',\n docRegion: result?.code || \"\",\n postfix: result?.currentSide || 'front',\n token: token,\n template_path: result?.templatePath || '',\n mrz_type: result?.mrzType || 'TD1'\n },\n env\n );\n \n mrz = typeof mrzResponse === 'string' ? JSON.parse(mrzResponse) : mrzResponse;\n \n if (mrz?.parsed_data?.status === 'FAILURE' || mrz?.success === false) {\n logger.log(\"Front MRZ Extraction Failed:\", mrz?.parsed_data?.status_message);\n throw new Error(`MRZ illisible: ${mrz?.parsed_data?.status_message || 'Veuillez nettoyer l\\'objectif et réessayer'}`);\n }\n } catch (err: any) {\n logger.log(\"MRZ Extraction Error:\", err);\n throw new Error(err?.message || \"Erreur lors de l'extraction MRZ. Veuillez reprendre la photo.\");\n }\n }\n\n if (hasBarcode) {\n try {\n logger.log(\"Tentative d'extraction barcode (Front)\");\n barcode = await kycService.extractBarcode({ fileUri: result.path || '', token: token }, env);\n } catch (e: any) {\n logger.log(\"Front Barcode Extraction Error:\", e?.message);\n // If it exclusively has a barcode (no MRZ) and barcode fails, throw.\n if (!mrz) {\n throw new Error(`Lecture Barcode échouée: ${e?.message || 'Veuillez réessayer'}`);\n }\n }\n }\n \n return { \n ...detected, \n croppedBase64, \n bbox, \n ...(mrz ? { mrz } : {}), \n ...(barcode ? { barcode } : {}),\n ...(documentData ? { documentData } : {}) \n };\n \n } catch (e: any) {\n logger.log('Error front verification:', e?.message);\n throw new Error(e?.message || 'Erreur de détection du visage');\n }\n}\n\nexport async function backVerification(\n result: {\n path?: string,\n regionMapping: { authMethod: string[], mrzTypes: string[] },\n selectedDocumentType: string,\n code: string,\n currentSide: string,\n templatePath?: string,\n mrzType?: string,\n templateResponse?: ApiVerificationResponse,\n issuingSubdivision?: string, \n frontTemplatePath?: string\n },\n env: KycEnvironment = 'PRODUCTION'\n) {\n try {\n if (!result.path) throw new Error('No path provided');\n logger.log(\"result.regionMapping\", result.regionMapping, result.currentSide, result.code);\n \n const authMethods = Array.isArray(result.regionMapping?.authMethod)\n ? result.regionMapping.authMethod.map(m => String(m).toUpperCase())\n : [];\n \n const hasMrz = authMethods.some(m => m.includes('MRZ'));\n const hasBarcode = authMethods.some(m => m.includes('BARCODE') || m.includes('2D'));\n \n if (env === 'SANDBOX') {\n console.log(\"SANDBOX mode: Skipping AI verification for back document\");\n const mockBbox: IBbox = { minX: 400, minY: 800, width: 2200, height: 1400 };\n const mockCardObb = [{\n obb: [[400, 800], [2600, 800], [2600, 2200], [400, 2200]],\n confidence: 0.95,\n card_in_frame: true,\n cropped_sides: []\n }];\n\n if (hasMrz) {\n return {\n success: true,\n mrz: {\n success: true,\n parsed_data: { status: 'SUCCESS', document_type: result.selectedDocumentType, mrz_type: result.mrzType || 'TD1' }\n },\n bbox: mockBbox,\n card_obb: mockCardObb\n };\n } else if (hasBarcode) {\n return {\n success: true,\n barcode: { barcode_data: 'SANDBOX_MOCK_BARCODE' },\n bbox: mockBbox,\n card_obb: mockCardObb\n };\n }\n return { success: true, bbox: mockBbox, card_obb: mockCardObb };\n }\n \n const token = await authentification();\n logger.log(\"1. Checking template and framing for back document...\");\n \n const templateResponse: ApiVerificationResponse = result.templateResponse ||\n await kycService.checkTemplateType({\n fileUri: result.path,\n docType: result.selectedDocumentType as any,\n docRegion: result.code,\n postfix: 'back',\n token: token,\n }, env);\n \n if (templateResponse.success === false || templateResponse.Error) {\n throw new Error('Impossible de lire le document. Veuillez vous rapprocher et stabiliser la caméra.');\n }\n \n const cardData = templateResponse?.card_obb && Array.isArray(templateResponse.card_obb) && templateResponse.card_obb.length > 0\n ? templateResponse.card_obb[0]\n : null;\n \n if (!cardData) throw new Error('CARD_NOT_FULLY_IN_FRAME');\n \n let points: number[][] | null = null;\n console.log(points)\n let isCardInFrame = false;\n let hasCroppedSides = true;\n \n if (cardData.obb) {\n points = cardData.obb;\n if (typeof cardData.card_in_frame !== 'undefined') {\n isCardInFrame = cardData.card_in_frame === true;\n hasCroppedSides = Array.isArray(cardData.cropped_sides) && cardData.cropped_sides.length > 0;\n }\n } else if (Array.isArray(cardData) && Array.isArray(cardData[0])) {\n points = cardData[0];\n isCardInFrame = true;\n hasCroppedSides = false;\n }\n \n if (!isCardInFrame || hasCroppedSides) {\n logger.log(`Back Framing failed. Backend reported document out of bounds.`);\n throw new Error('CARD_NOT_FULLY_IN_FRAME');\n }\n \n const obbConf = getObbConfidence(templateResponse?.card_obb);\n if (obbConf !== null && obbConf < OBB_CONFIDENCE_THRESHOLD) {\n throw new Error('Carte non entièrement visible. Positionnez toute la carte dans le cadre.');\n }\n \n const activeTemplatePath = templateResponse.template_path || result.templatePath || '';\n \n if (activeTemplatePath) {\n const expectedCountryName = countryData[result.code]?.name_en || '';\n const hasCodeMatch = activeTemplatePath.includes(`_${result.code}_`);\n const hasNameMatch = expectedCountryName && activeTemplatePath.toLowerCase().includes(expectedCountryName.toLowerCase());\n \n if (!hasCodeMatch && !hasNameMatch) {\n logger.log(`Template mismatch! Expected: ${result.code} (${expectedCountryName}), Detected: ${activeTemplatePath}`);\n throw new Error(`Le document ne correspond pas au pays sélectionné (${result.code}).`);\n }\n }\n\n if (result.frontTemplatePath && activeTemplatePath) {\n try {\n const frontPy = result.frontTemplatePath.split(\"/\").pop()?.replace(/\\.(jpg|png)$/i, \".py\");\n const backPy = activeTemplatePath.split(\"/\").pop()?.replace(/\\.(jpg|png)$/i, \".py\");\n \n if (frontPy && backPy) {\n logger.log(`Validating Front (${frontPy}) vs Back (${backPy}) for region ${result.code}`);\n \n const isCanadianSubRegionDoc = result.code === 'CA' && ['hic'].includes(result.selectedDocumentType);\n const safeSubRegion = isCanadianSubRegionDoc ? (result.issuingSubdivision || \"\") : \"\";\n\n const matchValidation = await kycService.validateBackTemplate({\n region: result.code,\n docType: result.selectedDocumentType,\n frontTemplateName: frontPy,\n backTemplateName: backPy,\n subRegion: safeSubRegion,\n token: token\n }, env);\n \n if (!matchValidation || matchValidation.is_match === false) {\n logger.log(`Front/Back Mismatch: ${matchValidation?.status_message}`);\n throw new Error(`Le verso ne correspond pas au recto fourni. Vous avez scanné un document différent.`);\n }\n }\n } catch (err: any) {\n if (err?.message?.includes('ne correspond pas')) throw err;\n logger.log(\"Template matching validation skipped/failed internally:\", err?.message);\n }\n }\n \n logger.log(\"Framing, Country, and Match verified successfully. Proceeding to Data Extraction.\");\n let extractionResult: any = {};\n\n if (result.code === 'CA') {\n try {\n logger.log(\"Tentative d'extraction OCR (Back) - Canada Only\");\n const documentData = await kycService.extractDocumentInformation({\n fileUri: result.path!,\n docType: result.selectedDocumentType,\n docRegion: result.code,\n templatePath: activeTemplatePath,\n issuingSubdivision: result.issuingSubdivision,\n token: token,\n postfix: result.currentSide || 'back'\n });\n extractionResult.documentData = documentData;\n } catch (err: any) {\n logger.log(\"Back OCR Extraction Error:\", err?.message || err);\n }\n }\n \n if (hasMrz) {\n try {\n logger.log(\"Tentative d'extraction MRZ (Back)\");\n const mrzResponse = await kycService.extractMrzText({\n fileUri: result.path!,\n docType: result?.selectedDocumentType || '',\n docRegion: result?.code || '',\n postfix: result?.currentSide || 'back',\n token: token,\n template_path: activeTemplatePath,\n mrz_type: result?.mrzType || 'TD1'\n }, env);\n \n const mrz = typeof mrzResponse === 'string' ? JSON.parse(mrzResponse) : mrzResponse;\n \n if (mrz?.parsed_data?.status === 'FAILURE' || mrz?.success === false) {\n throw new Error(mrz?.parsed_data?.status_message || 'Lecture MRZ échouée');\n }\n extractionResult.mrz = mrz; \n } catch (mrzError: any) {\n logger.log(`MRZ échoué: ${mrzError?.message}`);\n throw new Error(`Lecture MRZ invalide: ${mrzError?.message || 'Veuillez nettoyer l\\'objectif et réessayer'}`);\n }\n }\n \n if (hasBarcode) {\n try {\n logger.log(\"Tentative d'extraction barcode (Back)\");\n const barcode = await kycService.extractBarcode({ fileUri: result.path!, token: token }, env);\n extractionResult.barcode = barcode;\n } catch (e: any) {\n // If it explicitly expects a barcode (and not an MRZ) and fails, throw to user\n if (!extractionResult.mrz) {\n throw new Error(`Lecture Barcode échouée: ${e?.message}`);\n }\n }\n }\n \n let bbox: IBbox | undefined;\n let croppedBase64: string | undefined;\n try {\n const crop = await cropByObb(result?.path || '', templateResponse.card_obb);\n bbox = crop.bbox;\n croppedBase64 = crop.base64;\n } catch { }\n \n return {\n success: true,\n ...extractionResult,\n bbox,\n croppedBase64,\n card_obb: templateResponse.card_obb\n };\n \n } catch (e: any) {\n if (e?.message === 'CARD_NOT_FULLY_IN_FRAME') throw e;\n throw new Error(e?.message || 'Erreur de détection des données');\n }\n}\n\nexport async function checkTemplateType(\n result: { \n path?: string, \n docType: string, \n docRegion: string, \n postfix: string,\n issuingSubdivision?: string \n },\n env: KycEnvironment = 'PRODUCTION'\n) {\n try {\n if (env === 'SANDBOX') {\n return {\n template_path: `templates/${result.docType}_${result.docRegion}_${result.postfix}.jpg`,\n card_obb: [{\n obb: [[400, 800], [2600, 800], [2600, 2200], [400, 2200]],\n confidence: 0.95,\n card_in_frame: true,\n cropped_sides: []\n }]\n };\n }\n \n const token = await authentification();\n const isCanada = result.docRegion?.toUpperCase() === 'CA';\n \n const templateType = await kycService.checkTemplateType({\n fileUri: result.path || '',\n docType: result?.docType as GovernmentDocumentType,\n docRegion: result?.docRegion || \"\",\n postfix: result?.postfix,\n token: token,\n issuingSubdivision: isCanada ? result.issuingSubdivision : undefined\n }, env);\n \n if (templateType.success === false || templateType.Error) {\n logger.log(\"Backend returned an error:\", templateType.Error);\n throw new Error('Impossible de lire le document. Veuillez vous rapprocher et stabiliser la caméra.');\n }\n \n const cardData = templateType.card_obb && Array.isArray(templateType.card_obb) && templateType.card_obb.length > 0\n ? templateType.card_obb[0]\n : null;\n \n if (!cardData) throw new Error('CARD_NOT_FULLY_IN_FRAME');\n \n let points: number[][] | null = null;\n console.log(points)\n let isCardInFrame = false;\n let hasCroppedSides = true;\n \n if (cardData.obb) {\n points = cardData.obb;\n if (typeof cardData.card_in_frame !== 'undefined') {\n isCardInFrame = cardData.card_in_frame === true;\n hasCroppedSides = Array.isArray(cardData.cropped_sides) && cardData.cropped_sides.length > 0;\n }\n } else if (Array.isArray(cardData) && Array.isArray(cardData[0])) {\n points = cardData[0];\n isCardInFrame = true;\n hasCroppedSides = false;\n }\n \n if (!isCardInFrame || hasCroppedSides) {\n logger.log(`Template Framing failed by backend check.`);\n throw new Error('CARD_NOT_FULLY_IN_FRAME');\n }\n \n const LPIPS_THRESHOLD = 0.75;\n if (templateType.lpips_score !== undefined && templateType.lpips_score > LPIPS_THRESHOLD) {\n logger.log(`Country Mismatch! LPIPS: ${templateType.lpips_score}`);\n throw new Error(`Le document présenté ne correspond pas au pays sélectionné (${result.docRegion}).`);\n }\n \n logger.log(\"templateType result\", JSON.stringify(truncateFields(templateType), null, 2));\n return templateType;\n \n } catch (e: any) {\n logger.log('Error checking template type:', JSON.stringify(errorMessage(e), null, 2));\n if (e?.message === 'CARD_NOT_FULLY_IN_FRAME' || e?.message?.includes('ne correspond pas')) throw e;\n throw new Error(e?.message || 'Erreur de vérification du template');\n }\n}"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sanctum-key/react-native-sdk",
3
- "version": "1.0.21",
3
+ "version": "1.0.22",
4
4
  "description": "Sanctum Key React Native SDK",
5
5
  "main": "build/src/index.js",
6
6
  "types": "build/src/index.d.ts",
@@ -141,19 +141,24 @@ export const IDCardCapture: React.FC<IDCardCaptureProps> = ({ component, value =
141
141
  const getCurrentSideVerification = (currentSide: string, countryKey: string) => {
142
142
  const rawDocType = countrySelectionData?.documentType;
143
143
  if (!rawDocType || !countryKey) { return { authMethod: [], mrzTypes: [], regionMapping: null, key: 'root' }; }
144
+
144
145
  const rawCountryName = ISO_TO_COUNTRY_NAME[countryData?.code || ''] || countryData?.code || countryKey;
145
146
  const baseMapping = (REGION_MAPPING as any).regionMapping || REGION_MAPPING;
147
+
146
148
  let countryMapping = baseMapping[rawCountryName];
147
149
  if (!countryMapping) {
148
150
  const foundKey = Object.keys(baseMapping).find(k => k.toLowerCase() === rawCountryName.toLowerCase() || k.toLowerCase() === countryKey.toLowerCase());
149
151
  if (foundKey) countryMapping = baseMapping[foundKey];
150
152
  }
151
153
  if (!countryMapping) { return { authMethod: [], mrzTypes: [], regionMapping: null, key: 'root' }; }
154
+
152
155
  const regionMapping = countryMapping[rawDocType];
153
156
  if (!regionMapping) { return { authMethod: [], mrzTypes: [], regionMapping: null, key: 'root' }; }
157
+
154
158
  const authMethod: string[] = [];
155
159
  const mrzTypes: string[] = [];
156
160
  const key = countrySelectionData.region?.trim()?.length > 0 ? countrySelectionData.region.trim() : 'root';
161
+
157
162
  if (regionMapping?.[key] && Array.isArray(regionMapping[key])) {
158
163
  regionMapping[key].forEach((item: any) => {
159
164
  if (item[currentSide]) {
@@ -163,25 +168,25 @@ export const IDCardCapture: React.FC<IDCardCaptureProps> = ({ component, value =
163
168
  });
164
169
  }
165
170
  return { authMethod: removeDuplicates(authMethod), mrzTypes: removeDuplicates(mrzTypes), regionMapping, key };
166
- }
171
+ };
167
172
 
168
- const getCorrespondingMrzType = (templatePath: string, mapping: any, selectedDocumentType: string = "root") => {
169
- if (!mapping || !mapping[selectedDocumentType]) return null;
170
- const fileName = templatePath.split("/").pop()?.replace(".jpg", "").replace(".png", "");
173
+ const getCorrespondingMrzType = (templatePath: string, mapping: any, regionKey: string = "root") => {
174
+ if (!mapping || !mapping[regionKey]) return null;
175
+ const fileName = templatePath.split("/").pop()?.replace(/\.(jpg|jpeg|png|py)$/i, "");
171
176
  if (!fileName) return null;
172
177
  const pyName = `${fileName}.py`;
173
- const found = mapping[selectedDocumentType].find((item: any) => item.py_file === pyName);
178
+ const found = mapping[regionKey].find((item: any) => item.py_file === pyName);
174
179
  return found?.mrz_type || null;
175
- }
180
+ };
176
181
 
177
- const getCorrespondingAuthMethod = (templatePath: string, mapping: any, selectedDocumentType: string = "root", side: 'front' | 'back') => {
178
- if (!mapping || !mapping[selectedDocumentType]) return null;
179
- const fileName = templatePath.split("/").pop()?.replace(".jpg", "").replace(".png", "");
182
+ const getCorrespondingAuthMethod = (templatePath: string, mapping: any, regionKey: string = "root", side: 'front' | 'back') => {
183
+ if (!mapping || !mapping[regionKey]) return null;
184
+ const fileName = templatePath.split("/").pop()?.replace(/\.(jpg|jpeg|png|py)$/i, "");
180
185
  if (!fileName) return null;
181
186
  const pyName = `${fileName}.py`;
182
- const found = mapping[selectedDocumentType].find((item: any) => item.py_file === pyName);
187
+ const found = mapping[regionKey].find((item: any) => item.py_file === pyName);
183
188
  return found?.[side] || null;
184
- }
189
+ };
185
190
 
186
191
  const autoCapture = async (capturePath: string, verified: ISilentCaptureResult & { region?: string }) => {
187
192
  if (isProcessingCapture) return;
@@ -214,7 +219,7 @@ export const IDCardCapture: React.FC<IDCardCaptureProps> = ({ component, value =
214
219
  ...newImages,
215
220
  country: verified.country,
216
221
  documentType: GovernmentDocumentTypeBackend[verified.documentType as keyof typeof GovernmentDocumentTypeBackend] || '',
217
- ...(verified.region ? { region: verified.region } : {})
222
+ ...(verified.region ? { region: verified.region } : {})
218
223
  });
219
224
  }
220
225
 
@@ -287,7 +292,10 @@ export const IDCardCapture: React.FC<IDCardCaptureProps> = ({ component, value =
287
292
 
288
293
  verificationRes = await frontVerification({
289
294
  path: result.path,
290
- regionMapping: { authMethod: matchedAuthMethod ? [matchedAuthMethod] : regionMappings.authMethod, mrzTypes: regionMappings.mrzTypes },
295
+ regionMapping: {
296
+ authMethod: matchedAuthMethod ? [matchedAuthMethod] : [],
297
+ mrzTypes: mrzType ? [mrzType] : []
298
+ },
291
299
  selectedDocumentType: GovernmentDocumentTypeShorted[selectedDocumentType?.type as keyof typeof GovernmentDocumentTypeShorted] || '',
292
300
  code: countryData?.code || '',
293
301
  currentSide,
@@ -296,16 +304,16 @@ export const IDCardCapture: React.FC<IDCardCaptureProps> = ({ component, value =
296
304
  issuingSubdivision: issuingSubdivision
297
305
  }, env);
298
306
  } else {
299
- let matchedBackAuthMethod = getCorrespondingAuthMethod(templatePath, regionMappings.regionMapping, regionMappings.key || '', 'back');
300
- if (!matchedBackAuthMethod && currentSide === 'back') { matchedBackAuthMethod = 'MRZ'; }
307
+ const matchedBackAuthMethod = getCorrespondingAuthMethod(templatePath, regionMappings.regionMapping, regionMappings.key || '', 'back');
301
308
  const backMrzType = getCorrespondingMrzType(templatePath, regionMappings.regionMapping, regionMappings.key || '') || '';
302
-
303
- // 🚨 EXTRACT FRONT TEMPLATE TO VALIDATE AGAINST BACK TEMPLATE
304
309
  const frontTemplatePath = capturedImages['front']?.templatePath || '';
305
310
 
306
311
  verificationRes = await backVerification({
307
312
  path: result.path,
308
- regionMapping: { authMethod: matchedBackAuthMethod ? [matchedBackAuthMethod] : regionMappings.authMethod, mrzTypes: regionMappings.mrzTypes },
313
+ regionMapping: {
314
+ authMethod: matchedBackAuthMethod ? [matchedBackAuthMethod] : [],
315
+ mrzTypes: backMrzType ? [backMrzType] : []
316
+ },
309
317
  selectedDocumentType: GovernmentDocumentTypeShorted[selectedDocumentType.type as keyof typeof GovernmentDocumentTypeShorted] || '',
310
318
  code: countryData?.code || '',
311
319
  currentSide,
@@ -313,7 +321,7 @@ export const IDCardCapture: React.FC<IDCardCaptureProps> = ({ component, value =
313
321
  mrzType: backMrzType,
314
322
  templateResponse,
315
323
  issuingSubdivision: issuingSubdivision,
316
- frontTemplatePath: frontTemplatePath // 🚨 PASSED DOWN TO TRIGGER VALIDATION
324
+ frontTemplatePath: frontTemplatePath
317
325
  }, env);
318
326
  }
319
327
 
@@ -348,7 +356,7 @@ export const IDCardCapture: React.FC<IDCardCaptureProps> = ({ component, value =
348
356
  userFriendlyMessage = 'The document does not match your selected country.';
349
357
  } else if (rawMessage.includes('card_not_fully_in_frame')) {
350
358
  userFriendlyMessage = 'Move closer to the document and ensure all corners are visible.';
351
- } else if (rawMessage.includes('ne correspond pas au recto')) { // 🚨 New Security Error Handler
359
+ } else if (rawMessage.includes('ne correspond pas au recto')) {
352
360
  userFriendlyMessage = 'The back of the document does not match the front. You must scan the same ID.';
353
361
  }
354
362
 
@@ -31,7 +31,7 @@ export async function frontVerification(
31
31
  currentSide: string,
32
32
  templatePath?: string,
33
33
  mrzType?: string,
34
- issuingSubdivision?: string
34
+ issuingSubdivision?: string
35
35
  },
36
36
  env: KycEnvironment = 'PRODUCTION'
37
37
  ) {
@@ -42,7 +42,9 @@ export async function frontVerification(
42
42
  const authMethods = Array.isArray(result.regionMapping?.authMethod)
43
43
  ? result.regionMapping.authMethod.map(m => String(m).toUpperCase())
44
44
  : [];
45
+
45
46
  const hasMrz = authMethods.some(m => m.includes('MRZ'));
47
+ const hasBarcode = authMethods.some(m => m.includes('BARCODE') || m.includes('2D'));
46
48
 
47
49
  if (env === 'SANDBOX') {
48
50
  console.log("SANDBOX mode: Skipping AI verification for front document");
@@ -60,12 +62,11 @@ export async function frontVerification(
60
62
  ...(hasMrz ? {
61
63
  mrz: {
62
64
  success: true,
63
- parsed_data: {
64
- status: 'SUCCESS',
65
- document_type: result.selectedDocumentType,
66
- mrz_type: result.mrzType || 'TD1'
67
- }
65
+ parsed_data: { status: 'SUCCESS', document_type: result.selectedDocumentType, mrz_type: result.mrzType || 'TD1' }
68
66
  }
67
+ } : {}),
68
+ ...(hasBarcode ? {
69
+ barcode: { barcode_data: 'SANDBOX_MOCK_BARCODE' }
69
70
  } : {})
70
71
  };
71
72
  return mockResponse;
@@ -110,6 +111,7 @@ export async function frontVerification(
110
111
  let croppedBase64: string | undefined;
111
112
  let bbox: IBbox | undefined;
112
113
  let mrz: any | undefined;
114
+ let barcode: any | undefined;
113
115
  let documentData: any | undefined;
114
116
 
115
117
  try {
@@ -126,7 +128,7 @@ export async function frontVerification(
126
128
  docType: result.selectedDocumentType,
127
129
  docRegion: result.code,
128
130
  templatePath: result.templatePath || '',
129
- issuingSubdivision: result.issuingSubdivision,
131
+ issuingSubdivision: result.issuingSubdivision,
130
132
  token: token,
131
133
  postfix: result.currentSide || 'front'
132
134
  });
@@ -162,9 +164,28 @@ export async function frontVerification(
162
164
  throw new Error(err?.message || "Erreur lors de l'extraction MRZ. Veuillez reprendre la photo.");
163
165
  }
164
166
  }
167
+
168
+ if (hasBarcode) {
169
+ try {
170
+ logger.log("Tentative d'extraction barcode (Front)");
171
+ barcode = await kycService.extractBarcode({ fileUri: result.path || '', token: token }, env);
172
+ } catch (e: any) {
173
+ logger.log("Front Barcode Extraction Error:", e?.message);
174
+ // If it exclusively has a barcode (no MRZ) and barcode fails, throw.
175
+ if (!mrz) {
176
+ throw new Error(`Lecture Barcode échouée: ${e?.message || 'Veuillez réessayer'}`);
177
+ }
178
+ }
179
+ }
165
180
 
166
- // Return detected frame, crop, MRZ, AND the new extracted OCR documentData
167
- return { ...detected, croppedBase64, bbox, ...(mrz ? { mrz } : {}), ...(documentData ? { documentData } : {}) };
181
+ return {
182
+ ...detected,
183
+ croppedBase64,
184
+ bbox,
185
+ ...(mrz ? { mrz } : {}),
186
+ ...(barcode ? { barcode } : {}),
187
+ ...(documentData ? { documentData } : {})
188
+ };
168
189
 
169
190
  } catch (e: any) {
170
191
  logger.log('Error front verification:', e?.message);
@@ -182,8 +203,8 @@ export async function backVerification(
182
203
  templatePath?: string,
183
204
  mrzType?: string,
184
205
  templateResponse?: ApiVerificationResponse,
185
- issuingSubdivision?: string, // Capture province/state
186
- frontTemplatePath?: string // Capture the front template to compare against
206
+ issuingSubdivision?: string,
207
+ frontTemplatePath?: string
187
208
  },
188
209
  env: KycEnvironment = 'PRODUCTION'
189
210
  ) {
@@ -213,11 +234,7 @@ export async function backVerification(
213
234
  success: true,
214
235
  mrz: {
215
236
  success: true,
216
- parsed_data: {
217
- status: 'SUCCESS',
218
- document_type: result.selectedDocumentType,
219
- mrz_type: result.mrzType || 'TD1'
220
- }
237
+ parsed_data: { status: 'SUCCESS', document_type: result.selectedDocumentType, mrz_type: result.mrzType || 'TD1' }
221
238
  },
222
239
  bbox: mockBbox,
223
240
  card_obb: mockCardObb
@@ -295,7 +312,6 @@ export async function backVerification(
295
312
  }
296
313
  }
297
314
 
298
- // 🚨 FRONT VS BACK TEMPLATE VALIDATION 🚨
299
315
  if (result.frontTemplatePath && activeTemplatePath) {
300
316
  try {
301
317
  const frontPy = result.frontTemplatePath.split("/").pop()?.replace(/\.(jpg|png)$/i, ".py");
@@ -304,9 +320,8 @@ export async function backVerification(
304
320
  if (frontPy && backPy) {
305
321
  logger.log(`Validating Front (${frontPy}) vs Back (${backPy}) for region ${result.code}`);
306
322
 
307
- // 🚨 THE FIX: Only populate subRegion for Canadian 'hic' documents. Empty for all others.
308
- const isCanadianHic = result.code === 'CA' && result.selectedDocumentType === 'hic';
309
- const safeSubRegion = isCanadianHic ? (result.issuingSubdivision || "") : "";
323
+ const isCanadianSubRegionDoc = result.code === 'CA' && ['hic'].includes(result.selectedDocumentType);
324
+ const safeSubRegion = isCanadianSubRegionDoc ? (result.issuingSubdivision || "") : "";
310
325
 
311
326
  const matchValidation = await kycService.validateBackTemplate({
312
327
  region: result.code,
@@ -317,14 +332,12 @@ export async function backVerification(
317
332
  token: token
318
333
  }, env);
319
334
 
320
- // If the API succeeds but explicitly returns false, stop immediately.
321
335
  if (!matchValidation || matchValidation.is_match === false) {
322
336
  logger.log(`Front/Back Mismatch: ${matchValidation?.status_message}`);
323
337
  throw new Error(`Le verso ne correspond pas au recto fourni. Vous avez scanné un document différent.`);
324
338
  }
325
339
  }
326
340
  } catch (err: any) {
327
- // Throw hard errors (like the mismatch). Ignore harmless 400s if a template mapping doesn't exist yet
328
341
  if (err?.message?.includes('ne correspond pas')) throw err;
329
342
  logger.log("Template matching validation skipped/failed internally:", err?.message);
330
343
  }
@@ -378,10 +391,11 @@ export async function backVerification(
378
391
 
379
392
  if (hasBarcode) {
380
393
  try {
381
- logger.log("Tentative d'extraction barcode");
394
+ logger.log("Tentative d'extraction barcode (Back)");
382
395
  const barcode = await kycService.extractBarcode({ fileUri: result.path!, token: token }, env);
383
396
  extractionResult.barcode = barcode;
384
397
  } catch (e: any) {
398
+ // If it explicitly expects a barcode (and not an MRZ) and fails, throw to user
385
399
  if (!extractionResult.mrz) {
386
400
  throw new Error(`Lecture Barcode échouée: ${e?.message}`);
387
401
  }
@@ -442,7 +456,6 @@ export async function checkTemplateType(
442
456
  docRegion: result?.docRegion || "",
443
457
  postfix: result?.postfix,
444
458
  token: token,
445
- // 🚨 Pass the subdivision strictly if the region is Canada
446
459
  issuingSubdivision: isCanada ? result.issuingSubdivision : undefined
447
460
  }, env);
448
461
 
@@ -458,7 +471,7 @@ export async function checkTemplateType(
458
471
  if (!cardData) throw new Error('CARD_NOT_FULLY_IN_FRAME');
459
472
 
460
473
  let points: number[][] | null = null;
461
- console.log(points);
474
+ console.log(points)
462
475
  let isCardInFrame = false;
463
476
  let hasCroppedSides = true;
464
477
 
@@ -481,7 +494,7 @@ export async function checkTemplateType(
481
494
 
482
495
  const LPIPS_THRESHOLD = 0.75;
483
496
  if (templateType.lpips_score !== undefined && templateType.lpips_score > LPIPS_THRESHOLD) {
484
- logger.log(`🛑 Country Mismatch! LPIPS: ${templateType.lpips_score}`);
497
+ logger.log(`Country Mismatch! LPIPS: ${templateType.lpips_score}`);
485
498
  throw new Error(`Le document présenté ne correspond pas au pays sélectionné (${result.docRegion}).`);
486
499
  }
487
500