datakeen-session-react 1.1.195-dev.6 → 1.1.195-dev.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (39) hide show
  1. package/LICENSE +218 -0
  2. package/dist/cjs/components/document-collection/DocumentError.js +5 -1
  3. package/dist/cjs/components/document-collection/DocumentError.js.map +1 -1
  4. package/dist/cjs/components/document-collection/DocumentProcessing.js +13 -11
  5. package/dist/cjs/components/document-collection/DocumentProcessing.js.map +1 -1
  6. package/dist/cjs/components/document-video/document-video-flow/DocumentVideoProcessing.js +9 -5
  7. package/dist/cjs/components/document-video/document-video-flow/DocumentVideoProcessing.js.map +1 -1
  8. package/dist/cjs/components/jdi/JDIError.js +5 -1
  9. package/dist/cjs/components/jdi/JDIError.js.map +1 -1
  10. package/dist/cjs/components/jdi/JDIProcessing.js +12 -11
  11. package/dist/cjs/components/jdi/JDIProcessing.js.map +1 -1
  12. package/dist/cjs/i18n/en.json.js +3 -1
  13. package/dist/cjs/i18n/en.json.js.map +1 -1
  14. package/dist/cjs/i18n/es.json.js +3 -1
  15. package/dist/cjs/i18n/es.json.js.map +1 -1
  16. package/dist/cjs/i18n/fr.json.js +3 -1
  17. package/dist/cjs/i18n/fr.json.js.map +1 -1
  18. package/dist/cjs/utils/analysisErrors.js +33 -12
  19. package/dist/cjs/utils/analysisErrors.js.map +1 -1
  20. package/dist/esm/components/document-collection/DocumentError.js +5 -1
  21. package/dist/esm/components/document-collection/DocumentError.js.map +1 -1
  22. package/dist/esm/components/document-collection/DocumentProcessing.js +14 -12
  23. package/dist/esm/components/document-collection/DocumentProcessing.js.map +1 -1
  24. package/dist/esm/components/document-video/document-video-flow/DocumentVideoProcessing.js +9 -5
  25. package/dist/esm/components/document-video/document-video-flow/DocumentVideoProcessing.js.map +1 -1
  26. package/dist/esm/components/jdi/JDIError.js +5 -1
  27. package/dist/esm/components/jdi/JDIError.js.map +1 -1
  28. package/dist/esm/components/jdi/JDIProcessing.js +13 -12
  29. package/dist/esm/components/jdi/JDIProcessing.js.map +1 -1
  30. package/dist/esm/i18n/en.json.js +3 -1
  31. package/dist/esm/i18n/en.json.js.map +1 -1
  32. package/dist/esm/i18n/es.json.js +3 -1
  33. package/dist/esm/i18n/es.json.js.map +1 -1
  34. package/dist/esm/i18n/fr.json.js +3 -1
  35. package/dist/esm/i18n/fr.json.js.map +1 -1
  36. package/dist/esm/utils/analysisErrors.js +30 -12
  37. package/dist/esm/utils/analysisErrors.js.map +1 -1
  38. package/docs/POLLING_SYSTEM.md +4 -0
  39. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"file":"JDIError.js","sources":["../../../../../src/components/jdi/JDIError.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport Button from \"../ui/Button\";\nimport ButtonDesktop from \"../ui/ButtonDesktop\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport { Prediction } from \"../../utils/apiAnalysis\";\nimport { getValidationPoints } from \"../../utils/validationUtils\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\n\ninterface JDIErrorProps {\n documentType: string;\n onRetry: () => void;\n /** Absent quand node.allowContinueOnFailure est à false : le bouton \"Continuer\n * quand même\" n'est alors jamais rendu, quel que soit isRetryAllowed. */\n onContinueAnyway?: () => void;\n onBackToUserInput?: () => void;\n retryCount?: number;\n predictions?: Prediction[]; // Nouvelles données de l'API\n errorCode?: string; // Error code from API response (e.g., \"2.1\", \"4.0\")\n allowResubmission?: boolean;\n maxResubmissionAttempts?: number;\n isRetryAllowed?: boolean;\n blockContinue?: boolean;\n}\n\nconst DEFAULT_PREDICTIONS: Prediction[] = [];\n\nconst JDIError = ({\n documentType,\n onRetry,\n onContinueAnyway,\n onBackToUserInput,\n retryCount = 0,\n predictions = DEFAULT_PREDICTIONS,\n errorCode,\n allowResubmission,\n maxResubmissionAttempts,\n isRetryAllowed = true,\n blockContinue = false,\n}: JDIErrorProps) => {\n const { t } = useI18n();\n const [validationPoints, setValidationPoints] = useState<string[]>([]);\n\n // Détail de mismatch d'identité (code 7.0), calculé côté backend et porté\n // par la première prédiction. Absent pour tous les autres codes.\n const mismatchDetails = predictions?.[0]?.mismatchDetails;\n\n useEffect(() => {\n // Use shared utility to get validation points\n setValidationPoints(\n getValidationPoints(errorCode, predictions, t, \"error\", mismatchDetails),\n );\n }, [predictions, errorCode, t, mismatchDetails]);\n\n // Get user guidance message if available\n const getUserGuidance = (): string | null => {\n if (!errorCode) return null;\n const guidance = t(`user_guidance.${errorCode}`, \"\");\n return guidance || null;\n };\n\n return (\n <MobilePageLayout\n footer={\n <div className=\"w-full max-w-md mx-auto\">\n <div className=\"flex flex-col space-y-3 md:hidden\">\n {blockContinue ? (\n <Button onClick={onRetry} className=\"w-full py-3\">\n {t(\"errors.retry_verification\")}\n </Button>\n ) : (\n <>\n {onBackToUserInput && (\n <ButtonDesktop\n onClick={onBackToUserInput}\n type=\"back\"\n className=\"w-full text-black text-center font-poppins text-sm font-medium py-2\"\n >\n {t(\"errors.back_to_user_input\")}\n </ButtonDesktop>\n )}\n {retryCount >= 1 && isRetryAllowed && onContinueAnyway && (\n <ButtonDesktop\n onClick={onContinueAnyway}\n type=\"back\"\n className=\"w-full text-black text-center font-poppins text-sm font-medium py-2\"\n >\n {t(\"errors.continue_anyway\")}\n </ButtonDesktop>\n )}\n {isRetryAllowed && (\n <Button onClick={onRetry} className=\"w-full py-3\">\n {t(\"errors.retry_verification\")}\n </Button>\n )}\n {!isRetryAllowed && onContinueAnyway && (\n <Button onClick={onContinueAnyway} className=\"w-full py-3\">\n {t(\"errors.continue_anyway\")}\n </Button>\n )}\n </>\n )}\n </div>\n <div className=\"hidden md:flex flex-col space-y-3\">\n <div className=\"flex justify-center space-x-3\">\n {blockContinue ? (\n <ButtonDesktop onClick={onRetry} type=\"continue\">\n {t(\"errors.retry_verification\")}\n </ButtonDesktop>\n ) : (\n <>\n {onBackToUserInput && (\n <ButtonDesktop\n onClick={onBackToUserInput}\n type=\"back\"\n className=\"text-black text-center font-poppins text-sm font-medium py-2\"\n >\n {t(\"errors.back_to_user_input\")}\n </ButtonDesktop>\n )}\n {retryCount >= 1 && isRetryAllowed && onContinueAnyway && (\n <ButtonDesktop\n onClick={onContinueAnyway}\n type=\"back\"\n className=\"text-black text-center font-poppins text-sm font-medium py-2\"\n >\n {t(\"errors.continue_anyway\")}\n </ButtonDesktop>\n )}\n {isRetryAllowed && (\n <ButtonDesktop onClick={onRetry} type=\"continue\">\n {t(\"errors.retry_verification\")}\n </ButtonDesktop>\n )}\n {!isRetryAllowed && onContinueAnyway && (\n <ButtonDesktop\n onClick={onContinueAnyway}\n type=\"continue\"\n >\n {t(\"errors.continue_anyway\")}\n </ButtonDesktop>\n )}\n </>\n )}\n </div>\n </div>\n </div>\n }\n >\n <div className=\"px-4 py-6 pt-11 md:px-8 md:py-8\">\n <div className=\"w-full max-w-md mx-auto space-y-6\">\n {/* Error icon */}\n <div className=\"text-center\">\n <div className=\"mx-auto w-16 h-16 bg-red-100 rounded-full flex items-center justify-center mb-4\">\n <div className=\"w-8 h-8 bg-red-500 rounded-full flex items-center justify-center\">\n <span className=\"text-white text-lg\">✕</span>\n </div>\n </div>\n </div>\n\n {/* Header */}\n <div className=\"text-center space-y-4\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl text-red-600\">\n {blockContinue\n ? t(\"errors.upload_not_confirmed.title\")\n : t(\"errors.verification_failed\")}\n </Title>\n <Subtitle className=\"text-sm text-gray-600 leading-relaxed\">\n {blockContinue\n ? t(\"errors.upload_not_confirmed.subtitle\")\n : isRetryAllowed\n ? t(\"errors.verification_failed_subtitle\", {\n documentType: \"document\",\n })\n : t(\"errors.verification_failed_subtitle_no_retry\", {\n documentType: \"document\",\n })}\n </Subtitle>\n </div>\n\n {/* Specimen warning */}\n {!blockContinue && errorCode?.startsWith(\"8\") && (\n <div className=\"bg-orange-50 border border-orange-200 rounded-lg p-4\">\n <p className=\"text-sm text-orange-800\">\n {t(\"errors.specimen_detected\")}\n </p>\n </div>\n )}\n\n {/* Error details - Validation Points */}\n {!blockContinue && (\n <div className=\"bg-red-50 border border-red-200 rounded-lg p-4\">\n <h3 className=\"font-medium text-red-900 mb-2\">\n {t(\"errors.problems_detected\")}\n </h3>\n <div className=\"text-sm text-red-800 space-y-1\">\n {validationPoints.map((point, index) => (\n <p key={index}>{point}</p>\n ))}\n </div>\n </div>\n )}\n\n {/* Resubmission limit message */}\n {!blockContinue && !isRetryAllowed && (\n <div className=\"bg-orange-50 border border-orange-200 rounded-lg p-4\">\n <h3 className=\"font-medium text-orange-900 mb-2\">\n {t(\"errors.resubmission.max_attempts_reached\")}\n </h3>\n <p className=\"text-sm text-orange-800\">\n {maxResubmissionAttempts !== undefined\n ? t(\"errors.resubmission.max_attempts_reached_description\")\n : t(\"errors.resubmission.no_resubmission_allowed\")}\n </p>\n </div>\n )}\n\n {/* User guidance - specific advice based on error code */}\n {!blockContinue && getUserGuidance() && (\n <div className=\"bg-yellow-50 border border-yellow-200 rounded-lg p-4\">\n <h3 className=\"font-medium text-yellow-900 mb-2\">\n 💡 {t(\"errors.improvement_tips\")}\n </h3>\n <p className=\"text-sm text-yellow-800\">{getUserGuidance()}</p>\n </div>\n )}\n\n {/* Next steps */}\n {!blockContinue && isRetryAllowed && (\n <div className=\"bg-blue-50 border border-blue-200 rounded-lg p-4\">\n <h3 className=\"font-medium text-blue-900 mb-2\">\n {t(\"errors.next_steps\")}\n </h3>\n <p className=\"text-sm text-blue-800\">\n {t(\"errors.next_steps_description\")}\n </p>\n </div>\n )}\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default JDIError;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"JDIError.js","sources":["../../../../../src/components/jdi/JDIError.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport Button from \"../ui/Button\";\nimport ButtonDesktop from \"../ui/ButtonDesktop\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport { Prediction } from \"../../utils/apiAnalysis\";\nimport { getValidationPoints } from \"../../utils/validationUtils\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport { isServiceErrorCode } from \"../../utils/analysisErrors\";\n\ninterface JDIErrorProps {\n documentType: string;\n onRetry: () => void;\n /** Absent quand node.allowContinueOnFailure est à false : le bouton \"Continuer\n * quand même\" n'est alors jamais rendu, quel que soit isRetryAllowed. */\n onContinueAnyway?: () => void;\n onBackToUserInput?: () => void;\n retryCount?: number;\n predictions?: Prediction[]; // Nouvelles données de l'API\n errorCode?: string; // Error code from API response (e.g., \"2.1\", \"4.0\")\n allowResubmission?: boolean;\n maxResubmissionAttempts?: number;\n isRetryAllowed?: boolean;\n blockContinue?: boolean;\n}\n\nconst DEFAULT_PREDICTIONS: Prediction[] = [];\n\nconst JDIError = ({\n documentType,\n onRetry,\n onContinueAnyway,\n onBackToUserInput,\n retryCount = 0,\n predictions = DEFAULT_PREDICTIONS,\n errorCode,\n allowResubmission,\n maxResubmissionAttempts,\n isRetryAllowed = true,\n blockContinue = false,\n}: JDIErrorProps) => {\n const { t } = useI18n();\n const [validationPoints, setValidationPoints] = useState<string[]>([]);\n\n // Détail de mismatch d'identité (code 7.0), calculé côté backend et porté\n // par la première prédiction. Absent pour tous les autres codes.\n const mismatchDetails = predictions?.[0]?.mismatchDetails;\n\n useEffect(() => {\n // Use shared utility to get validation points\n setValidationPoints(\n getValidationPoints(errorCode, predictions, t, \"error\", mismatchDetails),\n );\n }, [predictions, errorCode, t, mismatchDetails]);\n\n // Get user guidance message if available\n const getUserGuidance = (): string | null => {\n if (!errorCode) return null;\n const guidance = t(`user_guidance.${errorCode}`, \"\");\n return guidance || null;\n };\n\n return (\n <MobilePageLayout\n footer={\n <div className=\"w-full max-w-md mx-auto\">\n <div className=\"flex flex-col space-y-3 md:hidden\">\n {blockContinue ? (\n <Button onClick={onRetry} className=\"w-full py-3\">\n {t(\"errors.retry_verification\")}\n </Button>\n ) : (\n <>\n {onBackToUserInput && (\n <ButtonDesktop\n onClick={onBackToUserInput}\n type=\"back\"\n className=\"w-full text-black text-center font-poppins text-sm font-medium py-2\"\n >\n {t(\"errors.back_to_user_input\")}\n </ButtonDesktop>\n )}\n {retryCount >= 1 && isRetryAllowed && onContinueAnyway && (\n <ButtonDesktop\n onClick={onContinueAnyway}\n type=\"back\"\n className=\"w-full text-black text-center font-poppins text-sm font-medium py-2\"\n >\n {t(\"errors.continue_anyway\")}\n </ButtonDesktop>\n )}\n {isRetryAllowed && (\n <Button onClick={onRetry} className=\"w-full py-3\">\n {t(\"errors.retry_verification\")}\n </Button>\n )}\n {!isRetryAllowed && onContinueAnyway && (\n <Button onClick={onContinueAnyway} className=\"w-full py-3\">\n {t(\"errors.continue_anyway\")}\n </Button>\n )}\n </>\n )}\n </div>\n <div className=\"hidden md:flex flex-col space-y-3\">\n <div className=\"flex justify-center space-x-3\">\n {blockContinue ? (\n <ButtonDesktop onClick={onRetry} type=\"continue\">\n {t(\"errors.retry_verification\")}\n </ButtonDesktop>\n ) : (\n <>\n {onBackToUserInput && (\n <ButtonDesktop\n onClick={onBackToUserInput}\n type=\"back\"\n className=\"text-black text-center font-poppins text-sm font-medium py-2\"\n >\n {t(\"errors.back_to_user_input\")}\n </ButtonDesktop>\n )}\n {retryCount >= 1 && isRetryAllowed && onContinueAnyway && (\n <ButtonDesktop\n onClick={onContinueAnyway}\n type=\"back\"\n className=\"text-black text-center font-poppins text-sm font-medium py-2\"\n >\n {t(\"errors.continue_anyway\")}\n </ButtonDesktop>\n )}\n {isRetryAllowed && (\n <ButtonDesktop onClick={onRetry} type=\"continue\">\n {t(\"errors.retry_verification\")}\n </ButtonDesktop>\n )}\n {!isRetryAllowed && onContinueAnyway && (\n <ButtonDesktop\n onClick={onContinueAnyway}\n type=\"continue\"\n >\n {t(\"errors.continue_anyway\")}\n </ButtonDesktop>\n )}\n </>\n )}\n </div>\n </div>\n </div>\n }\n >\n <div className=\"px-4 py-6 pt-11 md:px-8 md:py-8\">\n <div className=\"w-full max-w-md mx-auto space-y-6\">\n {/* Error icon */}\n <div className=\"text-center\">\n <div className=\"mx-auto w-16 h-16 bg-red-100 rounded-full flex items-center justify-center mb-4\">\n <div className=\"w-8 h-8 bg-red-500 rounded-full flex items-center justify-center\">\n <span className=\"text-white text-lg\">✕</span>\n </div>\n </div>\n </div>\n\n {/* Header */}\n <div className=\"text-center space-y-4\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl text-red-600\">\n {blockContinue\n ? t(\"errors.upload_not_confirmed.title\")\n : t(\"errors.verification_failed\")}\n </Title>\n <Subtitle className=\"text-sm text-gray-600 leading-relaxed\">\n {blockContinue\n ? t(\"errors.upload_not_confirmed.subtitle\")\n : isRetryAllowed\n ? t(\"errors.verification_failed_subtitle\", {\n documentType: \"document\",\n })\n : t(\"errors.verification_failed_subtitle_no_retry\", {\n documentType: \"document\",\n })}\n </Subtitle>\n </div>\n\n {/* Specimen warning */}\n {!blockContinue && errorCode?.startsWith(\"8\") && (\n <div className=\"bg-orange-50 border border-orange-200 rounded-lg p-4\">\n <p className=\"text-sm text-orange-800\">\n {t(\"errors.specimen_detected\")}\n </p>\n </div>\n )}\n\n {/* Error details - Validation Points */}\n {!blockContinue && (\n <div className=\"bg-red-50 border border-red-200 rounded-lg p-4\">\n <h3 className=\"font-medium text-red-900 mb-2\">\n {t(\"errors.problems_detected\")}\n </h3>\n <div className=\"text-sm text-red-800 space-y-1\">\n {validationPoints.map((point, index) => (\n <p key={index}>{point}</p>\n ))}\n </div>\n </div>\n )}\n\n {/* Resubmission limit message */}\n {!blockContinue && !isRetryAllowed && (\n <div className=\"bg-orange-50 border border-orange-200 rounded-lg p-4\">\n <h3 className=\"font-medium text-orange-900 mb-2\">\n {t(\"errors.resubmission.max_attempts_reached\")}\n </h3>\n <p className=\"text-sm text-orange-800\">\n {maxResubmissionAttempts !== undefined\n ? t(\"errors.resubmission.max_attempts_reached_description\")\n : t(\"errors.resubmission.no_resubmission_allowed\")}\n </p>\n </div>\n )}\n\n {/* User guidance - specific advice based on error code */}\n {!blockContinue && getUserGuidance() && (\n <div className=\"bg-yellow-50 border border-yellow-200 rounded-lg p-4\">\n <h3 className=\"font-medium text-yellow-900 mb-2\">\n {isServiceErrorCode(errorCode)\n ? // Quota / out of credits: nothing for the end user to improve.\n t(\"errors.service_refusal_title\")\n : `💡 ${t(\"errors.improvement_tips\", \"Conseils d'amélioration\")}`}\n </h3>\n <p className=\"text-sm text-yellow-800\">{getUserGuidance()}</p>\n </div>\n )}\n\n {/* Next steps */}\n {!blockContinue && isRetryAllowed && (\n <div className=\"bg-blue-50 border border-blue-200 rounded-lg p-4\">\n <h3 className=\"font-medium text-blue-900 mb-2\">\n {t(\"errors.next_steps\")}\n </h3>\n <p className=\"text-sm text-blue-800\">\n {t(\"errors.next_steps_description\")}\n </p>\n </div>\n )}\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default JDIError;\n"],"names":["_jsx","_jsxs"],"mappings":";;;;;;;;;;;AA2BA,IAAM,mBAAmB,GAAiB,EAAE;AAE5C,IAAM,QAAQ,GAAG,UAAC,EAYF,EAAA;;IAXF,EAAA,CAAA,YAAA,MACZ,OAAO,GAAA,EAAA,CAAA,OAAA,EACP,gBAAgB,GAAA,EAAA,CAAA,gBAAA,EAChB,iBAAiB,GAAA,EAAA,CAAA,iBAAA,EACjB,EAAA,GAAA,EAAA,CAAA,UAAc,CAAA,CAAd,UAAU,GAAA,EAAA,KAAA,MAAA,GAAG,CAAC,KAAA,CAAA,CACd,EAAA,GAAA,EAAA,CAAA,WAAiC,CAAA,CAAjC,WAAW,GAAA,EAAA,KAAA,MAAA,GAAG,mBAAmB,KAAA,CAAA,CACjC,SAAS,eAAA,CAAA,qBACQ,CAAA,KACjB,uBAAuB,6BAAA,CAAA,CACvB,EAAA,GAAA,EAAA,CAAA,cAAqB,EAArB,cAAc,GAAA,EAAA,KAAA,MAAA,GAAG,IAAI,GAAA,EAAA,CAAA,CACrB,qBAAqB,CAAA,CAArB,aAAa,GAAA,EAAA,KAAA,MAAA,GAAG,KAAK,GAAA;AAEb,IAAA,IAAA,CAAC,GAAK,OAAO,EAAE,EAAd;IACH,IAAA,EAAA,GAA0C,QAAQ,CAAW,EAAE,CAAC,EAA/D,gBAAgB,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,mBAAmB,GAAA,EAAA,CAAA,CAAA,CAA0B;;;AAItE,IAAA,IAAM,eAAe,GAAG,CAAA,EAAA,GAAA,WAAW,KAAA,IAAA,IAAX,WAAW,KAAA,MAAA,GAAA,MAAA,GAAX,WAAW,CAAG,CAAC,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,eAAe;AAEzD,IAAA,SAAS,CAAC,YAAA;;AAER,QAAA,mBAAmB,CACjB,mBAAmB,CAAC,SAAS,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,eAAe,CAAC,CACzE;IACH,CAAC,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC,EAAE,eAAe,CAAC,CAAC;;AAGhD,IAAA,IAAM,eAAe,GAAG,YAAA;AACtB,QAAA,IAAI,CAAC,SAAS;AAAE,YAAA,OAAO,IAAI;QAC3B,IAAM,QAAQ,GAAG,CAAC,CAAC,gBAAA,CAAA,MAAA,CAAiB,SAAS,CAAE,EAAE,EAAE,CAAC;QACpD,OAAO,QAAQ,IAAI,IAAI;AACzB,IAAA,CAAC;AAED,IAAA,QACEA,GAAA,CAAC,gBAAgB,EAAA,EACf,MAAM,EACJC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,yBAAyB,aACtCD,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mCAAmC,EAAA,QAAA,EAC/C,aAAa,IACZA,IAAC,MAAM,EAAA,EAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAC,aAAa,YAC9C,CAAC,CAAC,2BAA2B,CAAC,EAAA,CACxB,KAETC,4BACG,iBAAiB,KAChBD,GAAA,CAAC,aAAa,EAAA,EACZ,OAAO,EAAE,iBAAiB,EAC1B,IAAI,EAAC,MAAM,EACX,SAAS,EAAC,qEAAqE,EAAA,QAAA,EAE9E,CAAC,CAAC,2BAA2B,CAAC,EAAA,CACjB,CACjB,EACA,UAAU,IAAI,CAAC,IAAI,cAAc,IAAI,gBAAgB,KACpDA,IAAC,aAAa,EAAA,EACZ,OAAO,EAAE,gBAAgB,EACzB,IAAI,EAAC,MAAM,EACX,SAAS,EAAC,qEAAqE,EAAA,QAAA,EAE9E,CAAC,CAAC,wBAAwB,CAAC,EAAA,CACd,CACjB,EACA,cAAc,KACbA,GAAA,CAAC,MAAM,EAAA,EAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAC,aAAa,EAAA,QAAA,EAC9C,CAAC,CAAC,2BAA2B,CAAC,EAAA,CACxB,CACV,EACA,CAAC,cAAc,IAAI,gBAAgB,KAClCA,GAAA,CAAC,MAAM,EAAA,EAAC,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAC,aAAa,EAAA,QAAA,EACvD,CAAC,CAAC,wBAAwB,CAAC,EAAA,CACrB,CACV,IACA,CACJ,EAAA,CACG,EACNA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mCAAmC,YAChDA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,+BAA+B,EAAA,QAAA,EAC3C,aAAa,IACZA,IAAC,aAAa,EAAA,EAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAC,UAAU,EAAA,QAAA,EAC7C,CAAC,CAAC,2BAA2B,CAAC,EAAA,CACjB,KAEhBC,4BACG,iBAAiB,KAChBD,GAAA,CAAC,aAAa,EAAA,EACZ,OAAO,EAAE,iBAAiB,EAC1B,IAAI,EAAC,MAAM,EACX,SAAS,EAAC,8DAA8D,YAEvE,CAAC,CAAC,2BAA2B,CAAC,EAAA,CACjB,CACjB,EACA,UAAU,IAAI,CAAC,IAAI,cAAc,IAAI,gBAAgB,KACpDA,GAAA,CAAC,aAAa,EAAA,EACZ,OAAO,EAAE,gBAAgB,EACzB,IAAI,EAAC,MAAM,EACX,SAAS,EAAC,8DAA8D,EAAA,QAAA,EAEvE,CAAC,CAAC,wBAAwB,CAAC,EAAA,CACd,CACjB,EACA,cAAc,KACbA,GAAA,CAAC,aAAa,EAAA,EAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAC,UAAU,EAAA,QAAA,EAC7C,CAAC,CAAC,2BAA2B,CAAC,EAAA,CACjB,CACjB,EACA,CAAC,cAAc,IAAI,gBAAgB,KAClCA,GAAA,CAAC,aAAa,EAAA,EACZ,OAAO,EAAE,gBAAgB,EACzB,IAAI,EAAC,UAAU,EAAA,QAAA,EAEd,CAAC,CAAC,wBAAwB,CAAC,EAAA,CACd,CACjB,CAAA,EAAA,CACA,CACJ,GACG,EAAA,CACF,CAAA,EAAA,CACF,YAGRA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,iCAAiC,EAAA,QAAA,EAC9CC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mCAAmC,EAAA,QAAA,EAAA,CAEhDD,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,aAAa,EAAA,QAAA,EAC1BA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,iFAAiF,EAAA,QAAA,EAC9FA,aAAK,SAAS,EAAC,kEAAkE,EAAA,QAAA,EAC/EA,GAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,oBAAoB,EAAA,QAAA,EAAA,QAAA,EAAA,CAAS,EAAA,CACzC,GACF,EAAA,CACF,EAGNC,cAAK,SAAS,EAAC,uBAAuB,EAAA,QAAA,EAAA,CACpCD,IAAC,KAAK,EAAA,EAAC,SAAS,EAAC,8CAA8C,YAC5D;AACC,sCAAE,CAAC,CAAC,mCAAmC;AACvC,sCAAE,CAAC,CAAC,4BAA4B,CAAC,EAAA,CAC7B,EACRA,GAAA,CAAC,QAAQ,EAAA,EAAC,SAAS,EAAC,uCAAuC,YACxD;AACC,sCAAE,CAAC,CAAC,sCAAsC;AAC1C,sCAAE;AACA,0CAAE,CAAC,CAAC,qCAAqC,EAAE;AACvC,4CAAA,YAAY,EAAE,UAAU;yCACzB;AACH,0CAAE,CAAC,CAAC,8CAA8C,EAAE;AAChD,4CAAA,YAAY,EAAE,UAAU;yCACzB,CAAC,EAAA,CACC,CAAA,EAAA,CACP,EAGL,CAAC,aAAa,KAAI,SAAS,KAAA,IAAA,IAAT,SAAS,KAAA,MAAA,GAAA,MAAA,GAAT,SAAS,CAAE,UAAU,CAAC,GAAG,CAAC,CAAA,KAC3CA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,sDAAsD,EAAA,QAAA,EACnEA,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,yBAAyB,YACnC,CAAC,CAAC,0BAA0B,CAAC,EAAA,CAC5B,EAAA,CACA,CACP,EAGA,CAAC,aAAa,KACbC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,gDAAgD,EAAA,QAAA,EAAA,CAC7DD,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,+BAA+B,EAAA,QAAA,EAC1C,CAAC,CAAC,0BAA0B,CAAC,EAAA,CAC3B,EACLA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,gCAAgC,EAAA,QAAA,EAC5C,gBAAgB,CAAC,GAAG,CAAC,UAAC,KAAK,EAAE,KAAK,EAAA,EAAK,QACtCA,qBAAgB,KAAK,EAAA,EAAb,KAAK,CAAa,EAC3B,CAFuC,CAEvC,CAAC,EAAA,CACE,CAAA,EAAA,CACF,CACP,EAGA,CAAC,aAAa,IAAI,CAAC,cAAc,KAChCC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,sDAAsD,EAAA,QAAA,EAAA,CACnED,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,kCAAkC,EAAA,QAAA,EAC7C,CAAC,CAAC,0CAA0C,CAAC,EAAA,CAC3C,EACLA,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,yBAAyB,EAAA,QAAA,EACnC,uBAAuB,KAAK;AAC3B,sCAAE,CAAC,CAAC,sDAAsD;AAC1D,sCAAE,CAAC,CAAC,6CAA6C,CAAC,EAAA,CAClD,CAAA,EAAA,CACA,CACP,EAGA,CAAC,aAAa,IAAI,eAAe,EAAE,KAClCC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,sDAAsD,EAAA,QAAA,EAAA,CACnED,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,kCAAkC,EAAA,QAAA,EAC7C,kBAAkB,CAAC,SAAS;AAC3B;wCACE,CAAC,CAAC,8BAA8B;AAClC,sCAAE,eAAA,CAAA,MAAA,CAAM,CAAC,CAAC,yBAAyB,EAAE,yBAAyB,CAAC,CAAE,EAAA,CAChE,EACLA,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,yBAAyB,EAAA,QAAA,EAAE,eAAe,EAAE,EAAA,CAAK,CAAA,EAAA,CAC1D,CACP,EAGA,CAAC,aAAa,IAAI,cAAc,KAC/BC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,kDAAkD,EAAA,QAAA,EAAA,CAC/DD,GAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,gCAAgC,EAAA,QAAA,EAC3C,CAAC,CAAC,mBAAmB,CAAC,EAAA,CACpB,EACLA,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,uBAAuB,EAAA,QAAA,EACjC,CAAC,CAAC,+BAA+B,CAAC,EAAA,CACjC,CAAA,EAAA,CACA,CACP,CAAA,EAAA,CACG,EAAA,CACF,EAAA,CACW;AAEvB;;;;"}
@@ -8,7 +8,7 @@ import { getActiveSessionId } from '../../services/sessionMemoryStore.js';
8
8
  import { isPng, dataUrlToFile, isJpeg, convertJpegToPng, isPdf, convertPdfToPng } from '../../utils/imageConverter.js';
9
9
  import { useI18n } from '../../hooks/useI18n.js';
10
10
  import { requiresTwoSides } from '../../utils/documentLabels.js';
11
- import { isS3UploadNotConfirmedError, isQuotaExceededError, QUOTA_EXCEEDED_CODE } from '../../utils/analysisErrors.js';
11
+ import { isS3UploadNotConfirmedError, getServiceErrorCode, getServiceErrorCodeFromCodeName } from '../../utils/analysisErrors.js';
12
12
  import { isBlockingCode } from '../../utils/jdiCodes.js';
13
13
 
14
14
  // Fonction pour obtenir les étapes de traitement traduites
@@ -128,7 +128,7 @@ var JDIProcessing = memo(function (_a) {
128
128
  });
129
129
  }); };
130
130
  var processFiles = function () { return __awaiter(void 0, void 0, void 0, function () {
131
- var i, response, extractedCode, codeName, codeDescription, mismatchDetails, predictions, isSuccess, canRetry, error_2, failedStepIndex_1, errorMessage, isNetworkError, isUploadNotConfirmed, isQuotaExceeded, apiError;
131
+ var i, response, serviceErrorCode, extractedCode, codeName, codeDescription, mismatchDetails, predictions, isSuccess, canRetry, error_2, failedStepIndex_1, errorMessage, isNetworkError, isUploadNotConfirmed, serviceErrorCode, apiError;
132
132
  return __generator(this, function (_a) {
133
133
  switch (_a.label) {
134
134
  case 0:
@@ -237,7 +237,8 @@ var JDIProcessing = memo(function (_a) {
237
237
  })];
238
238
  case 5:
239
239
  response = _a.sent();
240
- extractedCode = String(response.code);
240
+ serviceErrorCode = getServiceErrorCodeFromCodeName(response === null || response === void 0 ? void 0 : response.codeName);
241
+ extractedCode = serviceErrorCode || String(response.code);
241
242
  codeName = response === null || response === void 0 ? void 0 : response.codeName;
242
243
  codeDescription = response === null || response === void 0 ? void 0 : response.codeDescription;
243
244
  mismatchDetails = response === null || response === void 0 ? void 0 : response.mismatchDetails;
@@ -245,7 +246,7 @@ var JDIProcessing = memo(function (_a) {
245
246
  if (extractedCode && codeName) {
246
247
  predictions.push(__assign({ code: extractedCode, codeName: codeName, codeDescription: codeDescription || "", type: "document" }, (mismatchDetails ? { mismatchDetails: mismatchDetails } : {})));
247
248
  }
248
- isSuccess = !isBlockingCode(extractedCode, blockingCodes);
249
+ isSuccess = !serviceErrorCode && !isBlockingCode(extractedCode, blockingCodes);
249
250
  canRetry = isSuccess === false;
250
251
  setAnalysisResult({
251
252
  success: isSuccess,
@@ -297,25 +298,25 @@ var JDIProcessing = memo(function (_a) {
297
298
  errorMessage.includes("CORS") ||
298
299
  errorMessage.includes("timeout");
299
300
  isUploadNotConfirmed = isS3UploadNotConfirmedError(error_2);
300
- isQuotaExceeded = isQuotaExceededError(error_2);
301
+ serviceErrorCode = getServiceErrorCode(error_2);
301
302
  apiError = error_2;
302
303
  setAnalysisResult({
303
304
  success: false,
304
305
  data: null,
305
- // Propage le code/message QUOTA_EXCEEDED pour que l'écran
306
- // d'erreur puisse afficher un message dédié (limité au cas
307
- // quota : les autres erreurs gardent leur comportement existant).
308
- predictions: isQuotaExceeded
306
+ // Propage le code QUOTA_EXCEEDED / INSUFFICIENT_CREDITS pour que
307
+ // l'écran d'erreur affiche un message dédié (les autres erreurs
308
+ // gardent leur comportement existant).
309
+ predictions: serviceErrorCode
309
310
  ? [
310
311
  {
311
- code: QUOTA_EXCEEDED_CODE,
312
- codeName: QUOTA_EXCEEDED_CODE,
312
+ code: serviceErrorCode,
313
+ codeName: serviceErrorCode,
313
314
  codeDescription: (apiError === null || apiError === void 0 ? void 0 : apiError.message) || "",
314
315
  type: "document",
315
316
  },
316
317
  ]
317
318
  : undefined,
318
- canRetry: isNetworkError || isUploadNotConfirmed || isQuotaExceeded,
319
+ canRetry: isNetworkError || isUploadNotConfirmed || !!serviceErrorCode,
319
320
  blockContinue: isUploadNotConfirmed,
320
321
  });
321
322
  setIsComplete(true);
@@ -1 +1 @@
1
- {"version":3,"file":"JDIProcessing.js","sources":["../../../../../src/components/jdi/JDIProcessing.tsx"],"sourcesContent":["import { useEffect, useRef, useState, useMemo, useCallback, memo } from \"react\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport type { onUploadFiles } from \"../../types/uploadFiles\";\nimport type { ProcessingStep } from \"../../types/session\";\nimport type { Prediction } from \"../../utils/apiAnalysis\";\nimport type { JDIProcessingResult } from \"./types\";\nimport {\n analyzeFiles,\n uploadConvertedIdCardImage,\n} from \"../../services/analysis\";\nimport { getActiveSessionId } from \"../../services/sessionMemoryStore\";\nimport {\n convertPdfToPng,\n convertJpegToPng,\n dataUrlToFile,\n isPdf,\n isJpeg,\n isPng,\n} from \"../../utils/imageConverter\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport { requiresTwoSides } from \"../../utils/documentLabels\";\nimport {\n isS3UploadNotConfirmedError,\n isQuotaExceededError,\n QUOTA_EXCEEDED_CODE,\n} from \"../../utils/analysisErrors\";\nimport { isBlockingCode } from \"../../utils/jdiCodes\";\n\ninterface JDIProcessingProps {\n onProcessingComplete: (\n success: boolean,\n retryCount?: number,\n analysisData?: Prediction[] | null,\n blockContinue?: boolean,\n ) => void;\n documentType: string;\n fileUploaded: onUploadFiles | null; // Fichiers uploadés\n documentTypeId: string; // ID du type de document (jdd, income-proof, etc.)\n retryCount?: number; // Nombre de tentatives de retry déjà effectuées\n documentTemplateId?: string; // ID du modèle de document associé\n nodeId: string; // ID du nœud associé\n /** Codes JDI exacts considérés comme bloquants pour ce nœud (cf. node.blockingCodes). Absent = liste par défaut. */\n blockingCodes?: string[];\n}\n\ninterface AnalysisProgress {\n progress: number;\n currentStep: string;\n message: string;\n}\n\n// Fonction pour obtenir les étapes de traitement traduites\nconst getProcessingSteps = (t: (key: string) => string): ProcessingStep[] => [\n {\n title: t(\"jdi.processing.steps.document_reception.title\"),\n subtitle: t(\"jdi.processing.steps.document_reception.subtitle\"),\n hasError: false,\n },\n {\n title: t(\"jdi.processing.steps.quality_analysis.title\"),\n subtitle: t(\"jdi.processing.steps.quality_analysis.subtitle\"),\n hasError: false,\n },\n {\n title: t(\"jdi.processing.steps.data_extraction.title\"),\n subtitle: t(\"jdi.processing.steps.data_extraction.subtitle\"),\n hasError: false,\n },\n {\n title: t(\"jdi.processing.steps.final_verification.title\"),\n subtitle: t(\"jdi.processing.steps.final_verification.subtitle\"),\n hasError: false,\n },\n];\n\nconst JDIProcessing = memo(\n ({\n onProcessingComplete,\n documentType,\n fileUploaded,\n documentTypeId,\n retryCount = 0,\n documentTemplateId,\n nodeId,\n blockingCodes,\n }: JDIProcessingProps) => {\n const { t } = useI18n();\n const [isProcessing, setIsProcessing] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [processingSteps, setProcessingSteps] = useState<ProcessingStep[]>(\n () => getProcessingSteps(t),\n );\n const [isComplete, setIsComplete] = useState(false);\n const [analysisResult, setAnalysisResult] =\n useState<JDIProcessingResult | null>(null);\n const [analysisProgress, setAnalysisProgress] = useState<AnalysisProgress>({\n progress: 0,\n currentStep: \"\",\n message: \"\",\n });\n\n const processingStartedRef = useRef(false);\n const processedFilesRef = useRef<string | null>(null);\n\n // Créer une clé stable pour les fichiers uploadés\n const filesKey = useMemo(() => {\n if (!fileUploaded) return null;\n return `${fileUploaded.front?.substring(0, 50) || \"no-front\"}-${\n fileUploaded.back?.substring(0, 50) || \"no-back\"\n }`;\n }, [fileUploaded]);\n\n // Callback stable pour onProcessingComplete\n const stableOnProcessingComplete = useCallback(\n (\n success: boolean,\n retryCount?: number,\n analysisData?: Prediction[] | null,\n blockContinue?: boolean,\n ) => {\n if (blockContinue === true) {\n onProcessingComplete(success, retryCount, analysisData, true);\n } else {\n onProcessingComplete(success, retryCount, analysisData);\n }\n },\n [onProcessingComplete],\n );\n\n useEffect(() => {\n // Empêcher les appels multiples\n if (\n !fileUploaded ||\n !filesKey ||\n isProcessing ||\n processingStartedRef.current\n ) {\n return;\n }\n\n const sessionId = getActiveSessionId();\n if (!sessionId) {\n stableOnProcessingComplete(false);\n return;\n }\n\n // Vérifier si on a déjà traité ces mêmes fichiers\n if (processedFilesRef.current === filesKey) {\n return;\n }\n\n // Fonction pour gérer la conversion et l'upload des fichiers\n const handleFileConversionAndUpload = async (\n sessionId: string,\n fileUploaded: onUploadFiles,\n ) => {\n const frontImage = fileUploaded.front;\n if (!frontImage) return;\n\n try {\n if (isPdf(frontImage)) {\n const convertedFile = await convertPdfToPng(frontImage);\n await uploadConvertedIdCardImage(sessionId, convertedFile, nodeId);\n } else if (isJpeg(frontImage)) {\n const convertedFile = await convertJpegToPng(frontImage);\n await uploadConvertedIdCardImage(sessionId, convertedFile, nodeId);\n } else if (isPng(frontImage)) {\n const file = dataUrlToFile(frontImage, \"converted_id_card.png\");\n await uploadConvertedIdCardImage(sessionId, file, nodeId);\n }\n } catch (error) {\n console.error(\"Erreur lors de la conversion/upload:\", error);\n // Ne pas bloquer le processus, continuer avec l'analyse normale\n }\n };\n\n const processFiles = async () => {\n try {\n // Marquer le début du traitement\n setIsProcessing(true);\n processingStartedRef.current = true;\n processedFilesRef.current = filesKey;\n\n // Animation des étapes avec appel API réel à la fin\n for (let i = 0; i < processingSteps.length; i++) {\n setCurrentStep(i);\n\n if (i < processingSteps.length - 1) {\n // Délai entre les étapes (sauf la dernière)\n await new Promise((resolve) => setTimeout(resolve, 800));\n } else {\n // Dernière étape : conversion et upload si nécessaire, puis appel API réel\n await handleFileConversionAndUpload(sessionId, fileUploaded);\n\n const response = await analyzeFiles(\n sessionId,\n nodeId,\n fileUploaded,\n documentTemplateId || \"\",\n {\n save: false, // don't save to session yet\n incrementAnalysis: false, // don't auto-progress session\n documentTypeKey: documentType,\n requiresTwoSides: requiresTwoSides(documentType),\n enablePolling: true, // Enable polling for progress\n pollingOptions: {\n interval: 2000, // Poll every 2 seconds (backend optimized timing)\n maxAttempts: 30, // 30 * 2s = max 60s polling duration\n timeout: 600000,\n onProgress: (status) => {\n // Update analysis progress state for display\n setAnalysisProgress({\n progress: status.progress,\n currentStep: status.currentStep,\n message: status.message,\n });\n\n // Update UI based on progress percentage\n // 50% = Analyzing (steps 0-2)\n // 100% = Completed (step 3)\n if (status.progress === 50) {\n // Analysis in progress - show steps 0-2 progressively\n const elapsed =\n Date.now() -\n (Date.parse(status.startedAt || \"\") || Date.now());\n const elapsedSeconds = elapsed / 1000;\n\n // Progress through first 3 steps based on elapsed time\n if (elapsedSeconds < 3) {\n setCurrentStep((prev) => Math.max(prev, 0));\n } else if (elapsedSeconds < 6) {\n setCurrentStep((prev) => Math.max(prev, 1));\n } else {\n setCurrentStep((prev) => Math.max(prev, 2));\n }\n } else if (status.progress === 100) {\n // Analysis complete - move to final step\n setCurrentStep(processingSteps.length - 1);\n }\n },\n onComplete: (status) => {\n // Update final progress state\n setAnalysisProgress({\n progress: status.progress,\n currentStep: status.currentStep,\n message: status.message,\n });\n\n // Ensure we're at the final step\n setCurrentStep(processingSteps.length - 1);\n\n // Mark the final step based on analysis result\n const isFailed =\n status.currentStep === \"failed\" ||\n status.currentStep === \"error\";\n\n if (isFailed) {\n setProcessingSteps((prev) =>\n prev.map((step, index) =>\n index === processingSteps.length - 1\n ? { ...step, hasError: true }\n : step,\n ),\n );\n }\n },\n onFailed: (status, error) => {\n console.error(\n \"❌ [JDIProcessing] Analysis polling failed:\",\n error,\n );\n\n // Update error state\n setAnalysisProgress({\n progress: 100,\n currentStep: \"failed\",\n message: `Analysis failed: ${error}`,\n });\n\n // Mark current step as error\n setProcessingSteps((prev) =>\n prev.map((step, index) =>\n index === currentStep\n ? { ...step, hasError: true }\n : step,\n ),\n );\n },\n },\n },\n );\n\n const extractedCode = String(response.code);\n const codeName = response?.codeName;\n const codeDescription = response?.codeDescription;\n const mismatchDetails = response?.mismatchDetails;\n\n // Construct predictions array from the response\n const predictions: Prediction[] = [];\n if (extractedCode && codeName) {\n predictions.push({\n code: extractedCode,\n codeName: codeName,\n codeDescription: codeDescription || \"\",\n type: \"document\",\n ...(mismatchDetails ? { mismatchDetails } : {}),\n });\n }\n\n // Determine success based on the node's configured blocking codes\n // (blockingCodes absent → DEFAULT_BLOCKING_CODES, legacy behavior\n // unchanged). Code 8.x (specimen) is always blocking.\n const isSuccess = !isBlockingCode(extractedCode, blockingCodes);\n const canRetry = isSuccess === false;\n\n setAnalysisResult({\n success: isSuccess,\n code: extractedCode,\n canRetry,\n data: response,\n predictions: predictions,\n });\n\n // Mark the final step based on analysis result\n if (!isSuccess) {\n setProcessingSteps((prev) =>\n prev.map((step, index) =>\n index === processingSteps.length - 1\n ? { ...step, hasError: true }\n : step,\n ),\n );\n }\n\n // délai pour voir le résultat\n await new Promise((resolve) => setTimeout(resolve, 500));\n }\n }\n\n setCurrentStep(processingSteps.length);\n setIsComplete(true);\n } catch (error) {\n console.error(\"❌ Erreur lors de l'analyse des fichiers:\", error);\n\n // Determine which step failed\n let failedStepIndex = currentStep;\n\n // If error occurred during analysis, mark the final verification step as failed\n if (currentStep >= processingSteps.length - 1) {\n failedStepIndex = processingSteps.length - 1;\n }\n\n // Mark the failed step as error\n setProcessingSteps((prev) =>\n prev.map((step, index) =>\n index === failedStepIndex ? { ...step, hasError: true } : step,\n ),\n );\n\n // Move to the failed step to show error\n setCurrentStep(failedStepIndex);\n\n // Determine if retry is allowed based on error type\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n const isNetworkError =\n errorMessage.includes(\"network\") ||\n errorMessage.includes(\"CORS\") ||\n errorMessage.includes(\"timeout\");\n const isUploadNotConfirmed = isS3UploadNotConfirmedError(error);\n const isQuotaExceeded = isQuotaExceededError(error);\n const apiError = error as { code?: string; message?: string };\n\n setAnalysisResult({\n success: false,\n data: null,\n // Propage le code/message QUOTA_EXCEEDED pour que l'écran\n // d'erreur puisse afficher un message dédié (limité au cas\n // quota : les autres erreurs gardent leur comportement existant).\n predictions: isQuotaExceeded\n ? [\n {\n code: QUOTA_EXCEEDED_CODE,\n codeName: QUOTA_EXCEEDED_CODE,\n codeDescription: apiError?.message || \"\",\n type: \"document\",\n },\n ]\n : undefined,\n canRetry: isNetworkError || isUploadNotConfirmed || isQuotaExceeded,\n blockContinue: isUploadNotConfirmed,\n });\n setIsComplete(true);\n } finally {\n setIsProcessing(false);\n }\n };\n\n processFiles();\n }, [\n fileUploaded,\n filesKey,\n documentTypeId,\n documentTemplateId,\n documentType,\n isProcessing,\n stableOnProcessingComplete,\n processingSteps.length,\n currentStep,\n blockingCodes,\n ]);\n\n // Auto-complete when analysis is done\n useEffect(() => {\n if (isComplete && analysisResult) {\n setTimeout(() => {\n const allowRetry =\n analysisResult.success || analysisResult.canRetry === true;\n // Pass predictions array instead of raw data\n stableOnProcessingComplete(\n analysisResult.success,\n allowRetry ? retryCount : undefined,\n analysisResult.predictions || null,\n analysisResult.blockContinue,\n );\n }, 1000);\n }\n }, [isComplete, analysisResult, stableOnProcessingComplete, retryCount]);\n\n return (\n <div className=\"flex flex-col justify-between h-full w-full\">\n {/* Main content area */}\n <div className=\"flex-1 px-4 py-6 pt-11 md:px-8 md:py-8\">\n <div className=\"w-full max-w-md mx-auto space-y-6\">\n {/* Header */}\n <div className=\"text-center space-y-4\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl\">\n {t(\"jdi.processing.title\")}\n </Title>\n <Subtitle className=\"text-sm text-gray-600 leading-relaxed\">\n {t(\"jdi.processing.subtitle\", {\n document: t(\"documentTypes.\" + documentType),\n })}\n </Subtitle>\n </div>\n\n {/* Processing steps with status indicators */}\n <div className=\"w-full flex justify-center\">\n <div className=\"space-y-5\">\n {processingSteps.map((step, index: number) => (\n <div key={index} className=\"flex items-start\">\n {/* Status indicator */}\n <div className=\"mr-4 mt-1 flex-shrink-0\">\n {index < currentStep ? (\n step.hasError ? (\n // Error indicator - Red X\n <div className=\"flex items-center justify-center w-6 h-6 rounded-full bg-red-500 text-white text-xs\">\n ✕\n </div>\n ) : (\n // Success indicator - Green checkmark\n <div className=\"flex items-center justify-center w-6 h-6 rounded-full bg-[#11E5C5] text-white text-xs\">\n ✓\n </div>\n )\n ) : index === currentStep ? (\n // Loading spinner only for the current step\n <div className=\"w-6 h-6 rounded-full border-2 border-t-[#11E5C5] border-r-[#11E5C5] border-b-[#11E5C5] border-l-transparent animate-spin\"></div>\n ) : (\n // Empty circle for future steps\n <div className=\"w-6 h-6 rounded-full border-2 border-gray-300\"></div>\n )}\n </div>\n\n {/* Step content */}\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-medium text-[#3C3C40] text-sm\">\n {step.title}\n </p>\n <p className=\"text-xs text-gray-500 mt-1\">\n {step.subtitle}\n </p>\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n },\n);\n\nJDIProcessing.displayName = \"JDIProcessing\";\n\nexport default JDIProcessing;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
1
+ {"version":3,"file":"JDIProcessing.js","sources":["../../../../../src/components/jdi/JDIProcessing.tsx"],"sourcesContent":["import { useEffect, useRef, useState, useMemo, useCallback, memo } from \"react\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport type { onUploadFiles } from \"../../types/uploadFiles\";\nimport type { ProcessingStep } from \"../../types/session\";\nimport type { Prediction } from \"../../utils/apiAnalysis\";\nimport type { JDIProcessingResult } from \"./types\";\nimport {\n analyzeFiles,\n uploadConvertedIdCardImage,\n} from \"../../services/analysis\";\nimport { getActiveSessionId } from \"../../services/sessionMemoryStore\";\nimport {\n convertPdfToPng,\n convertJpegToPng,\n dataUrlToFile,\n isPdf,\n isJpeg,\n isPng,\n} from \"../../utils/imageConverter\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport { requiresTwoSides } from \"../../utils/documentLabels\";\nimport {\n isS3UploadNotConfirmedError,\n getServiceErrorCode,\n getServiceErrorCodeFromCodeName,\n} from \"../../utils/analysisErrors\";\nimport { isBlockingCode } from \"../../utils/jdiCodes\";\n\ninterface JDIProcessingProps {\n onProcessingComplete: (\n success: boolean,\n retryCount?: number,\n analysisData?: Prediction[] | null,\n blockContinue?: boolean,\n ) => void;\n documentType: string;\n fileUploaded: onUploadFiles | null; // Fichiers uploadés\n documentTypeId: string; // ID du type de document (jdd, income-proof, etc.)\n retryCount?: number; // Nombre de tentatives de retry déjà effectuées\n documentTemplateId?: string; // ID du modèle de document associé\n nodeId: string; // ID du nœud associé\n /** Codes JDI exacts considérés comme bloquants pour ce nœud (cf. node.blockingCodes). Absent = liste par défaut. */\n blockingCodes?: string[];\n}\n\ninterface AnalysisProgress {\n progress: number;\n currentStep: string;\n message: string;\n}\n\n// Fonction pour obtenir les étapes de traitement traduites\nconst getProcessingSteps = (t: (key: string) => string): ProcessingStep[] => [\n {\n title: t(\"jdi.processing.steps.document_reception.title\"),\n subtitle: t(\"jdi.processing.steps.document_reception.subtitle\"),\n hasError: false,\n },\n {\n title: t(\"jdi.processing.steps.quality_analysis.title\"),\n subtitle: t(\"jdi.processing.steps.quality_analysis.subtitle\"),\n hasError: false,\n },\n {\n title: t(\"jdi.processing.steps.data_extraction.title\"),\n subtitle: t(\"jdi.processing.steps.data_extraction.subtitle\"),\n hasError: false,\n },\n {\n title: t(\"jdi.processing.steps.final_verification.title\"),\n subtitle: t(\"jdi.processing.steps.final_verification.subtitle\"),\n hasError: false,\n },\n];\n\nconst JDIProcessing = memo(\n ({\n onProcessingComplete,\n documentType,\n fileUploaded,\n documentTypeId,\n retryCount = 0,\n documentTemplateId,\n nodeId,\n blockingCodes,\n }: JDIProcessingProps) => {\n const { t } = useI18n();\n const [isProcessing, setIsProcessing] = useState(false);\n const [currentStep, setCurrentStep] = useState(0);\n const [processingSteps, setProcessingSteps] = useState<ProcessingStep[]>(\n () => getProcessingSteps(t),\n );\n const [isComplete, setIsComplete] = useState(false);\n const [analysisResult, setAnalysisResult] =\n useState<JDIProcessingResult | null>(null);\n const [analysisProgress, setAnalysisProgress] = useState<AnalysisProgress>({\n progress: 0,\n currentStep: \"\",\n message: \"\",\n });\n\n const processingStartedRef = useRef(false);\n const processedFilesRef = useRef<string | null>(null);\n\n // Créer une clé stable pour les fichiers uploadés\n const filesKey = useMemo(() => {\n if (!fileUploaded) return null;\n return `${fileUploaded.front?.substring(0, 50) || \"no-front\"}-${\n fileUploaded.back?.substring(0, 50) || \"no-back\"\n }`;\n }, [fileUploaded]);\n\n // Callback stable pour onProcessingComplete\n const stableOnProcessingComplete = useCallback(\n (\n success: boolean,\n retryCount?: number,\n analysisData?: Prediction[] | null,\n blockContinue?: boolean,\n ) => {\n if (blockContinue === true) {\n onProcessingComplete(success, retryCount, analysisData, true);\n } else {\n onProcessingComplete(success, retryCount, analysisData);\n }\n },\n [onProcessingComplete],\n );\n\n useEffect(() => {\n // Empêcher les appels multiples\n if (\n !fileUploaded ||\n !filesKey ||\n isProcessing ||\n processingStartedRef.current\n ) {\n return;\n }\n\n const sessionId = getActiveSessionId();\n if (!sessionId) {\n stableOnProcessingComplete(false);\n return;\n }\n\n // Vérifier si on a déjà traité ces mêmes fichiers\n if (processedFilesRef.current === filesKey) {\n return;\n }\n\n // Fonction pour gérer la conversion et l'upload des fichiers\n const handleFileConversionAndUpload = async (\n sessionId: string,\n fileUploaded: onUploadFiles,\n ) => {\n const frontImage = fileUploaded.front;\n if (!frontImage) return;\n\n try {\n if (isPdf(frontImage)) {\n const convertedFile = await convertPdfToPng(frontImage);\n await uploadConvertedIdCardImage(sessionId, convertedFile, nodeId);\n } else if (isJpeg(frontImage)) {\n const convertedFile = await convertJpegToPng(frontImage);\n await uploadConvertedIdCardImage(sessionId, convertedFile, nodeId);\n } else if (isPng(frontImage)) {\n const file = dataUrlToFile(frontImage, \"converted_id_card.png\");\n await uploadConvertedIdCardImage(sessionId, file, nodeId);\n }\n } catch (error) {\n console.error(\"Erreur lors de la conversion/upload:\", error);\n // Ne pas bloquer le processus, continuer avec l'analyse normale\n }\n };\n\n const processFiles = async () => {\n try {\n // Marquer le début du traitement\n setIsProcessing(true);\n processingStartedRef.current = true;\n processedFilesRef.current = filesKey;\n\n // Animation des étapes avec appel API réel à la fin\n for (let i = 0; i < processingSteps.length; i++) {\n setCurrentStep(i);\n\n if (i < processingSteps.length - 1) {\n // Délai entre les étapes (sauf la dernière)\n await new Promise((resolve) => setTimeout(resolve, 800));\n } else {\n // Dernière étape : conversion et upload si nécessaire, puis appel API réel\n await handleFileConversionAndUpload(sessionId, fileUploaded);\n\n const response = await analyzeFiles(\n sessionId,\n nodeId,\n fileUploaded,\n documentTemplateId || \"\",\n {\n save: false, // don't save to session yet\n incrementAnalysis: false, // don't auto-progress session\n documentTypeKey: documentType,\n requiresTwoSides: requiresTwoSides(documentType),\n enablePolling: true, // Enable polling for progress\n pollingOptions: {\n interval: 2000, // Poll every 2 seconds (backend optimized timing)\n maxAttempts: 30, // 30 * 2s = max 60s polling duration\n timeout: 600000,\n onProgress: (status) => {\n // Update analysis progress state for display\n setAnalysisProgress({\n progress: status.progress,\n currentStep: status.currentStep,\n message: status.message,\n });\n\n // Update UI based on progress percentage\n // 50% = Analyzing (steps 0-2)\n // 100% = Completed (step 3)\n if (status.progress === 50) {\n // Analysis in progress - show steps 0-2 progressively\n const elapsed =\n Date.now() -\n (Date.parse(status.startedAt || \"\") || Date.now());\n const elapsedSeconds = elapsed / 1000;\n\n // Progress through first 3 steps based on elapsed time\n if (elapsedSeconds < 3) {\n setCurrentStep((prev) => Math.max(prev, 0));\n } else if (elapsedSeconds < 6) {\n setCurrentStep((prev) => Math.max(prev, 1));\n } else {\n setCurrentStep((prev) => Math.max(prev, 2));\n }\n } else if (status.progress === 100) {\n // Analysis complete - move to final step\n setCurrentStep(processingSteps.length - 1);\n }\n },\n onComplete: (status) => {\n // Update final progress state\n setAnalysisProgress({\n progress: status.progress,\n currentStep: status.currentStep,\n message: status.message,\n });\n\n // Ensure we're at the final step\n setCurrentStep(processingSteps.length - 1);\n\n // Mark the final step based on analysis result\n const isFailed =\n status.currentStep === \"failed\" ||\n status.currentStep === \"error\";\n\n if (isFailed) {\n setProcessingSteps((prev) =>\n prev.map((step, index) =>\n index === processingSteps.length - 1\n ? { ...step, hasError: true }\n : step,\n ),\n );\n }\n },\n onFailed: (status, error) => {\n console.error(\n \"❌ [JDIProcessing] Analysis polling failed:\",\n error,\n );\n\n // Update error state\n setAnalysisProgress({\n progress: 100,\n currentStep: \"failed\",\n message: `Analysis failed: ${error}`,\n });\n\n // Mark current step as error\n setProcessingSteps((prev) =>\n prev.map((step, index) =>\n index === currentStep\n ? { ...step, hasError: true }\n : step,\n ),\n );\n },\n },\n },\n );\n\n // Refused async analysis (quota / no credits): show its SDK code.\n const serviceErrorCode = getServiceErrorCodeFromCodeName(\n response?.codeName,\n );\n const extractedCode = serviceErrorCode || String(response.code);\n const codeName = response?.codeName;\n const codeDescription = response?.codeDescription;\n const mismatchDetails = response?.mismatchDetails;\n\n // Construct predictions array from the response\n const predictions: Prediction[] = [];\n if (extractedCode && codeName) {\n predictions.push({\n code: extractedCode,\n codeName: codeName,\n codeDescription: codeDescription || \"\",\n type: \"document\",\n ...(mismatchDetails ? { mismatchDetails } : {}),\n });\n }\n\n // Determine success based on the node's configured blocking codes\n // (blockingCodes absent → DEFAULT_BLOCKING_CODES, legacy behavior\n // unchanged). Code 8.x (specimen) is always blocking.\n const isSuccess =\n !serviceErrorCode && !isBlockingCode(extractedCode, blockingCodes);\n const canRetry = isSuccess === false;\n\n setAnalysisResult({\n success: isSuccess,\n code: extractedCode,\n canRetry,\n data: response,\n predictions: predictions,\n });\n\n // Mark the final step based on analysis result\n if (!isSuccess) {\n setProcessingSteps((prev) =>\n prev.map((step, index) =>\n index === processingSteps.length - 1\n ? { ...step, hasError: true }\n : step,\n ),\n );\n }\n\n // délai pour voir le résultat\n await new Promise((resolve) => setTimeout(resolve, 500));\n }\n }\n\n setCurrentStep(processingSteps.length);\n setIsComplete(true);\n } catch (error) {\n console.error(\"❌ Erreur lors de l'analyse des fichiers:\", error);\n\n // Determine which step failed\n let failedStepIndex = currentStep;\n\n // If error occurred during analysis, mark the final verification step as failed\n if (currentStep >= processingSteps.length - 1) {\n failedStepIndex = processingSteps.length - 1;\n }\n\n // Mark the failed step as error\n setProcessingSteps((prev) =>\n prev.map((step, index) =>\n index === failedStepIndex ? { ...step, hasError: true } : step,\n ),\n );\n\n // Move to the failed step to show error\n setCurrentStep(failedStepIndex);\n\n // Determine if retry is allowed based on error type\n const errorMessage =\n error instanceof Error ? error.message : String(error);\n const isNetworkError =\n errorMessage.includes(\"network\") ||\n errorMessage.includes(\"CORS\") ||\n errorMessage.includes(\"timeout\");\n const isUploadNotConfirmed = isS3UploadNotConfirmedError(error);\n const serviceErrorCode = getServiceErrorCode(error);\n const apiError = error as { code?: string; message?: string };\n\n setAnalysisResult({\n success: false,\n data: null,\n // Propage le code QUOTA_EXCEEDED / INSUFFICIENT_CREDITS pour que\n // l'écran d'erreur affiche un message dédié (les autres erreurs\n // gardent leur comportement existant).\n predictions: serviceErrorCode\n ? [\n {\n code: serviceErrorCode,\n codeName: serviceErrorCode,\n codeDescription: apiError?.message || \"\",\n type: \"document\",\n },\n ]\n : undefined,\n canRetry: isNetworkError || isUploadNotConfirmed || !!serviceErrorCode,\n blockContinue: isUploadNotConfirmed,\n });\n setIsComplete(true);\n } finally {\n setIsProcessing(false);\n }\n };\n\n processFiles();\n }, [\n fileUploaded,\n filesKey,\n documentTypeId,\n documentTemplateId,\n documentType,\n isProcessing,\n stableOnProcessingComplete,\n processingSteps.length,\n currentStep,\n blockingCodes,\n ]);\n\n // Auto-complete when analysis is done\n useEffect(() => {\n if (isComplete && analysisResult) {\n setTimeout(() => {\n const allowRetry =\n analysisResult.success || analysisResult.canRetry === true;\n // Pass predictions array instead of raw data\n stableOnProcessingComplete(\n analysisResult.success,\n allowRetry ? retryCount : undefined,\n analysisResult.predictions || null,\n analysisResult.blockContinue,\n );\n }, 1000);\n }\n }, [isComplete, analysisResult, stableOnProcessingComplete, retryCount]);\n\n return (\n <div className=\"flex flex-col justify-between h-full w-full\">\n {/* Main content area */}\n <div className=\"flex-1 px-4 py-6 pt-11 md:px-8 md:py-8\">\n <div className=\"w-full max-w-md mx-auto space-y-6\">\n {/* Header */}\n <div className=\"text-center space-y-4\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl\">\n {t(\"jdi.processing.title\")}\n </Title>\n <Subtitle className=\"text-sm text-gray-600 leading-relaxed\">\n {t(\"jdi.processing.subtitle\", {\n document: t(\"documentTypes.\" + documentType),\n })}\n </Subtitle>\n </div>\n\n {/* Processing steps with status indicators */}\n <div className=\"w-full flex justify-center\">\n <div className=\"space-y-5\">\n {processingSteps.map((step, index: number) => (\n <div key={index} className=\"flex items-start\">\n {/* Status indicator */}\n <div className=\"mr-4 mt-1 flex-shrink-0\">\n {index < currentStep ? (\n step.hasError ? (\n // Error indicator - Red X\n <div className=\"flex items-center justify-center w-6 h-6 rounded-full bg-red-500 text-white text-xs\">\n ✕\n </div>\n ) : (\n // Success indicator - Green checkmark\n <div className=\"flex items-center justify-center w-6 h-6 rounded-full bg-[#11E5C5] text-white text-xs\">\n ✓\n </div>\n )\n ) : index === currentStep ? (\n // Loading spinner only for the current step\n <div className=\"w-6 h-6 rounded-full border-2 border-t-[#11E5C5] border-r-[#11E5C5] border-b-[#11E5C5] border-l-transparent animate-spin\"></div>\n ) : (\n // Empty circle for future steps\n <div className=\"w-6 h-6 rounded-full border-2 border-gray-300\"></div>\n )}\n </div>\n\n {/* Step content */}\n <div className=\"flex-1 min-w-0\">\n <p className=\"font-medium text-[#3C3C40] text-sm\">\n {step.title}\n </p>\n <p className=\"text-xs text-gray-500 mt-1\">\n {step.subtitle}\n </p>\n </div>\n </div>\n ))}\n </div>\n </div>\n </div>\n </div>\n </div>\n );\n },\n);\n\nJDIProcessing.displayName = \"JDIProcessing\";\n\nexport default JDIProcessing;\n"],"names":["_jsx","_jsxs"],"mappings":";;;;;;;;;;;;;AAoDA;AACA,IAAM,kBAAkB,GAAG,UAAC,CAA0B,IAAuB,OAAA;AAC3E,IAAA;AACE,QAAA,KAAK,EAAE,CAAC,CAAC,+CAA+C,CAAC;AACzD,QAAA,QAAQ,EAAE,CAAC,CAAC,kDAAkD,CAAC;AAC/D,QAAA,QAAQ,EAAE,KAAK;AAChB,KAAA;AACD,IAAA;AACE,QAAA,KAAK,EAAE,CAAC,CAAC,6CAA6C,CAAC;AACvD,QAAA,QAAQ,EAAE,CAAC,CAAC,gDAAgD,CAAC;AAC7D,QAAA,QAAQ,EAAE,KAAK;AAChB,KAAA;AACD,IAAA;AACE,QAAA,KAAK,EAAE,CAAC,CAAC,4CAA4C,CAAC;AACtD,QAAA,QAAQ,EAAE,CAAC,CAAC,+CAA+C,CAAC;AAC5D,QAAA,QAAQ,EAAE,KAAK;AAChB,KAAA;AACD,IAAA;AACE,QAAA,KAAK,EAAE,CAAC,CAAC,+CAA+C,CAAC;AACzD,QAAA,QAAQ,EAAE,CAAC,CAAC,kDAAkD,CAAC;AAC/D,QAAA,QAAQ,EAAE,KAAK;AAChB,KAAA;AACF,CAAA,CAAA,CArB4E,CAqB5E;AAED,IAAM,aAAa,GAAG,IAAI,CACxB,UAAC,EASoB,EAAA;QARnB,oBAAoB,GAAA,EAAA,CAAA,oBAAA,EACpB,YAAY,GAAA,EAAA,CAAA,YAAA,EACZ,YAAY,GAAA,EAAA,CAAA,YAAA,EACZ,cAAc,GAAA,EAAA,CAAA,cAAA,EACd,EAAA,GAAA,EAAA,CAAA,UAAc,EAAd,UAAU,GAAA,EAAA,KAAA,MAAA,GAAG,CAAC,GAAA,EAAA,EACd,kBAAkB,GAAA,EAAA,CAAA,kBAAA,EAClB,MAAM,GAAA,EAAA,CAAA,MAAA,EACN,aAAa,GAAA,EAAA,CAAA,aAAA;AAEL,IAAA,IAAA,CAAC,GAAK,OAAO,EAAE,EAAd;IACH,IAAA,EAAA,GAAkC,QAAQ,CAAC,KAAK,CAAC,EAAhD,YAAY,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,eAAe,GAAA,EAAA,CAAA,CAAA,CAAmB;IACjD,IAAA,EAAA,GAAgC,QAAQ,CAAC,CAAC,CAAC,EAA1C,WAAW,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,cAAc,GAAA,EAAA,CAAA,CAAA,CAAe;AAC3C,IAAA,IAAA,KAAwC,QAAQ,CACpD,cAAM,OAAA,kBAAkB,CAAC,CAAC,CAAC,CAAA,CAArB,CAAqB,CAC5B,EAFM,eAAe,QAAA,EAAE,kBAAkB,QAEzC;IACK,IAAA,EAAA,GAA8B,QAAQ,CAAC,KAAK,CAAC,EAA5C,UAAU,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,aAAa,GAAA,EAAA,CAAA,CAAA,CAAmB;IAC7C,IAAA,EAAA,GACJ,QAAQ,CAA6B,IAAI,CAAC,EADrC,cAAc,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,iBAAiB,GAAA,EAAA,CAAA,CAAA,CACI;IACtC,IAAA,EAAA,GAA0C,QAAQ,CAAmB;AACzE,QAAA,QAAQ,EAAE,CAAC;AACX,QAAA,WAAW,EAAE,EAAE;AACf,QAAA,OAAO,EAAE,EAAE;AACZ,KAAA,CAAC,EAJqB,EAAA,CAAA,CAAA,CAAA,CAAA,KAAE,mBAAmB;AAM5C,IAAA,IAAM,oBAAoB,GAAG,MAAM,CAAC,KAAK,CAAC;AAC1C,IAAA,IAAM,iBAAiB,GAAG,MAAM,CAAgB,IAAI,CAAC;;IAGrD,IAAM,QAAQ,GAAG,OAAO,CAAC,YAAA;;AACvB,QAAA,IAAI,CAAC,YAAY;AAAE,YAAA,OAAO,IAAI;AAC9B,QAAA,OAAO,EAAA,CAAA,MAAA,CAAG,CAAA,CAAA,EAAA,GAAA,YAAY,CAAC,KAAK,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAI,UAAU,EAAA,GAAA,CAAA,CAAA,MAAA,CAC1D,CAAA,CAAA,EAAA,GAAA,YAAY,CAAC,IAAI,0CAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,KAAI,SAAS,CAChD;AACJ,IAAA,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC;;IAGlB,IAAM,0BAA0B,GAAG,WAAW,CAC5C,UACE,OAAgB,EAChB,UAAmB,EACnB,YAAkC,EAClC,aAAuB,EAAA;AAEvB,QAAA,IAAI,aAAa,KAAK,IAAI,EAAE;YAC1B,oBAAoB,CAAC,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,IAAI,CAAC;QAC/D;aAAO;AACL,YAAA,oBAAoB,CAAC,OAAO,EAAE,UAAU,EAAE,YAAY,CAAC;QACzD;AACF,IAAA,CAAC,EACD,CAAC,oBAAoB,CAAC,CACvB;AAED,IAAA,SAAS,CAAC,YAAA;;AAER,QAAA,IACE,CAAC,YAAY;AACb,YAAA,CAAC,QAAQ;YACT,YAAY;YACZ,oBAAoB,CAAC,OAAO,EAC5B;YACA;QACF;AAEA,QAAA,IAAM,SAAS,GAAG,kBAAkB,EAAE;QACtC,IAAI,CAAC,SAAS,EAAE;YACd,0BAA0B,CAAC,KAAK,CAAC;YACjC;QACF;;AAGA,QAAA,IAAI,iBAAiB,CAAC,OAAO,KAAK,QAAQ,EAAE;YAC1C;QACF;;AAGA,QAAA,IAAM,6BAA6B,GAAG,UACpC,SAAiB,EACjB,YAA2B,EAAA,EAAA,OAAA,SAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,YAAA;;;;;AAErB,wBAAA,UAAU,GAAG,YAAY,CAAC,KAAK;AACrC,wBAAA,IAAI,CAAC,UAAU;4BAAE,OAAA,CAAA,CAAA,YAAA;;;;AAGX,wBAAA,IAAA,CAAA,KAAK,CAAC,UAAU,CAAC,EAAjB,OAAA,CAAA,CAAA,YAAA,CAAA,CAAA;AACoB,wBAAA,OAAA,CAAA,CAAA,YAAM,eAAe,CAAC,UAAU,CAAC,CAAA;;AAAjD,wBAAA,aAAa,GAAG,EAAA,CAAA,IAAA,EAAiC;wBACvD,OAAA,CAAA,CAAA,YAAM,0BAA0B,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,CAAC,CAAA;;AAAlE,wBAAA,EAAA,CAAA,IAAA,EAAkE;;;AACzD,wBAAA,IAAA,CAAA,MAAM,CAAC,UAAU,CAAC,EAAlB,OAAA,CAAA,CAAA,YAAA,CAAA,CAAA;AACa,wBAAA,OAAA,CAAA,CAAA,YAAM,gBAAgB,CAAC,UAAU,CAAC,CAAA;;AAAlD,wBAAA,aAAa,GAAG,EAAA,CAAA,IAAA,EAAkC;wBACxD,OAAA,CAAA,CAAA,YAAM,0BAA0B,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,CAAC,CAAA;;AAAlE,wBAAA,EAAA,CAAA,IAAA,EAAkE;;;AACzD,wBAAA,IAAA,CAAA,KAAK,CAAC,UAAU,CAAC,EAAjB,OAAA,CAAA,CAAA,YAAA,CAAA,CAAA;AACH,wBAAA,IAAI,GAAG,aAAa,CAAC,UAAU,EAAE,uBAAuB,CAAC;wBAC/D,OAAA,CAAA,CAAA,YAAM,0BAA0B,CAAC,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;;AAAzD,wBAAA,EAAA,CAAA,IAAA,EAAyD;;;;;AAG3D,wBAAA,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,OAAK,CAAC;;;;;aAG/D;AAED,QAAA,IAAM,YAAY,GAAG,YAAA,EAAA,OAAA,SAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,YAAA;;;;;;;wBAGjB,eAAe,CAAC,IAAI,CAAC;AACrB,wBAAA,oBAAoB,CAAC,OAAO,GAAG,IAAI;AACnC,wBAAA,iBAAiB,CAAC,OAAO,GAAG,QAAQ;AAG3B,wBAAA,CAAC,GAAG,CAAC;;;AAAE,wBAAA,IAAA,EAAA,CAAC,GAAG,eAAe,CAAC,MAAM,CAAA,EAAA,OAAA,CAAA,CAAA,YAAA,CAAA,CAAA;wBACxC,cAAc,CAAC,CAAC,CAAC;8BAEb,CAAC,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC,CAAA,EAA9B,OAAA,CAAA,CAAA,YAAA,CAAA,CAAA;;AAEF,wBAAA,OAAA,CAAA,CAAA,YAAM,IAAI,OAAO,CAAC,UAAC,OAAO,IAAK,OAAA,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA,CAAxB,CAAwB,CAAC,CAAA;;;AAAxD,wBAAA,EAAA,CAAA,IAAA,EAAwD;;;;AAGxD,oBAAA,OAAA,CAAA,CAAA,YAAM,6BAA6B,CAAC,SAAS,EAAE,YAAY,CAAC,CAAA;;;AAA5D,wBAAA,EAAA,CAAA,IAAA,EAA4D;wBAE3C,OAAA,CAAA,CAAA,YAAM,YAAY,CACjC,SAAS,EACT,MAAM,EACN,YAAY,EACZ,kBAAkB,IAAI,EAAE,EACxB;gCACE,IAAI,EAAE,KAAK;gCACX,iBAAiB,EAAE,KAAK;AACxB,gCAAA,eAAe,EAAE,YAAY;AAC7B,gCAAA,gBAAgB,EAAE,gBAAgB,CAAC,YAAY,CAAC;gCAChD,aAAa,EAAE,IAAI;AACnB,gCAAA,cAAc,EAAE;oCACd,QAAQ,EAAE,IAAI;oCACd,WAAW,EAAE,EAAE;AACf,oCAAA,OAAO,EAAE,MAAM;oCACf,UAAU,EAAE,UAAC,MAAM,EAAA;;AAEjB,wCAAA,mBAAmB,CAAC;4CAClB,QAAQ,EAAE,MAAM,CAAC,QAAQ;4CACzB,WAAW,EAAE,MAAM,CAAC,WAAW;4CAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;AACxB,yCAAA,CAAC;;;;AAKF,wCAAA,IAAI,MAAM,CAAC,QAAQ,KAAK,EAAE,EAAE;;AAE1B,4CAAA,IAAM,OAAO,GACX,IAAI,CAAC,GAAG,EAAE;AACV,iDAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,IAAI,EAAE,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;AACpD,4CAAA,IAAM,cAAc,GAAG,OAAO,GAAG,IAAI;;AAGrC,4CAAA,IAAI,cAAc,GAAG,CAAC,EAAE;AACtB,gDAAA,cAAc,CAAC,UAAC,IAAI,EAAA,EAAK,OAAA,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA,CAAjB,CAAiB,CAAC;4CAC7C;AAAO,iDAAA,IAAI,cAAc,GAAG,CAAC,EAAE;AAC7B,gDAAA,cAAc,CAAC,UAAC,IAAI,EAAA,EAAK,OAAA,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA,CAAjB,CAAiB,CAAC;4CAC7C;iDAAO;AACL,gDAAA,cAAc,CAAC,UAAC,IAAI,EAAA,EAAK,OAAA,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA,CAAjB,CAAiB,CAAC;4CAC7C;wCACF;AAAO,6CAAA,IAAI,MAAM,CAAC,QAAQ,KAAK,GAAG,EAAE;;AAElC,4CAAA,cAAc,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;wCAC5C;oCACF,CAAC;oCACD,UAAU,EAAE,UAAC,MAAM,EAAA;;AAEjB,wCAAA,mBAAmB,CAAC;4CAClB,QAAQ,EAAE,MAAM,CAAC,QAAQ;4CACzB,WAAW,EAAE,MAAM,CAAC,WAAW;4CAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;AACxB,yCAAA,CAAC;;AAGF,wCAAA,cAAc,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC,CAAC;;AAG1C,wCAAA,IAAM,QAAQ,GACZ,MAAM,CAAC,WAAW,KAAK,QAAQ;AAC/B,4CAAA,MAAM,CAAC,WAAW,KAAK,OAAO;wCAEhC,IAAI,QAAQ,EAAE;4CACZ,kBAAkB,CAAC,UAAC,IAAI,EAAA;AACtB,gDAAA,OAAA,IAAI,CAAC,GAAG,CAAC,UAAC,IAAI,EAAE,KAAK,EAAA;AACnB,oDAAA,OAAA,KAAK,KAAK,eAAe,CAAC,MAAM,GAAG;0DAChC,QAAA,CAAA,QAAA,CAAA,EAAA,EAAM,IAAI,CAAA,EAAA,EAAE,QAAQ,EAAE,IAAI,EAAA,CAAA,GACzB,IAAI;AAFR,gDAAA,CAEQ,CACT;AAJD,4CAAA,CAIC,CACF;wCACH;oCACF,CAAC;AACD,oCAAA,QAAQ,EAAE,UAAC,MAAM,EAAE,KAAK,EAAA;AACtB,wCAAA,OAAO,CAAC,KAAK,CACX,4CAA4C,EAC5C,KAAK,CACN;;AAGD,wCAAA,mBAAmB,CAAC;AAClB,4CAAA,QAAQ,EAAE,GAAG;AACb,4CAAA,WAAW,EAAE,QAAQ;4CACrB,OAAO,EAAE,mBAAA,CAAA,MAAA,CAAoB,KAAK,CAAE;AACrC,yCAAA,CAAC;;wCAGF,kBAAkB,CAAC,UAAC,IAAI,EAAA;AACtB,4CAAA,OAAA,IAAI,CAAC,GAAG,CAAC,UAAC,IAAI,EAAE,KAAK,EAAA;gDACnB,OAAA,KAAK,KAAK;sDACP,QAAA,CAAA,QAAA,CAAA,EAAA,EAAM,IAAI,CAAA,EAAA,EAAE,QAAQ,EAAE,IAAI,EAAA,CAAA,GACzB,IAAI;AAFR,4CAAA,CAEQ,CACT;AAJD,wCAAA,CAIC,CACF;oCACH,CAAC;AACF,iCAAA;AACF,6BAAA,CACF,CAAA;;AAhGK,wBAAA,QAAQ,GAAG,EAAA,CAAA,IAAA,EAgGhB;wBAGK,gBAAgB,GAAG,+BAA+B,CACtD,QAAQ,KAAA,IAAA,IAAR,QAAQ,KAAA,MAAA,GAAA,MAAA,GAAR,QAAQ,CAAE,QAAQ,CACnB;wBACK,aAAa,GAAG,gBAAgB,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC;wBACzD,QAAQ,GAAG,QAAQ,KAAA,IAAA,IAAR,QAAQ,uBAAR,QAAQ,CAAE,QAAQ;wBAC7B,eAAe,GAAG,QAAQ,KAAA,IAAA,IAAR,QAAQ,uBAAR,QAAQ,CAAE,eAAe;wBAC3C,eAAe,GAAG,QAAQ,KAAA,IAAA,IAAR,QAAQ,uBAAR,QAAQ,CAAE,eAAe;wBAG3C,WAAW,GAAiB,EAAE;AACpC,wBAAA,IAAI,aAAa,IAAI,QAAQ,EAAE;AAC7B,4BAAA,WAAW,CAAC,IAAI,CAAA,QAAA,CAAA,EACd,IAAI,EAAE,aAAa,EACnB,QAAQ,EAAE,QAAQ,EAClB,eAAe,EAAE,eAAe,IAAI,EAAE,EACtC,IAAI,EAAE,UAAU,KACZ,eAAe,GAAG,EAAE,eAAe,EAAA,eAAA,EAAE,GAAG,EAAE,GAC9C;wBACJ;wBAKM,SAAS,GACb,CAAC,gBAAgB,IAAI,CAAC,cAAc,CAAC,aAAa,EAAE,aAAa,CAAC;AAC9D,wBAAA,QAAQ,GAAG,SAAS,KAAK,KAAK;AAEpC,wBAAA,iBAAiB,CAAC;AAChB,4BAAA,OAAO,EAAE,SAAS;AAClB,4BAAA,IAAI,EAAE,aAAa;AACnB,4BAAA,QAAQ,EAAA,QAAA;AACR,4BAAA,IAAI,EAAE,QAAQ;AACd,4BAAA,WAAW,EAAE,WAAW;AACzB,yBAAA,CAAC;;wBAGF,IAAI,CAAC,SAAS,EAAE;4BACd,kBAAkB,CAAC,UAAC,IAAI,EAAA;AACtB,gCAAA,OAAA,IAAI,CAAC,GAAG,CAAC,UAAC,IAAI,EAAE,KAAK,EAAA;AACnB,oCAAA,OAAA,KAAK,KAAK,eAAe,CAAC,MAAM,GAAG;0CAChC,QAAA,CAAA,QAAA,CAAA,EAAA,EAAM,IAAI,CAAA,EAAA,EAAE,QAAQ,EAAE,IAAI,EAAA,CAAA,GACzB,IAAI;AAFR,gCAAA,CAEQ,CACT;AAJD,4BAAA,CAIC,CACF;wBACH;;AAGA,wBAAA,OAAA,CAAA,CAAA,YAAM,IAAI,OAAO,CAAC,UAAC,OAAO,IAAK,OAAA,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAA,CAAxB,CAAwB,CAAC,CAAA;;;AAAxD,wBAAA,EAAA,CAAA,IAAA,EAAwD;;;AA5JhB,wBAAA,CAAC,EAAE;;;AAgK/C,wBAAA,cAAc,CAAC,eAAe,CAAC,MAAM,CAAC;wBACtC,aAAa,CAAC,IAAI,CAAC;;;;AAEnB,wBAAA,OAAO,CAAC,KAAK,CAAC,0CAA0C,EAAE,OAAK,CAAC;AAG5D,wBAAA,iBAAA,GAAkB,WAAW;;wBAGjC,IAAI,WAAW,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE;AAC7C,4BAAA,iBAAe,GAAG,eAAe,CAAC,MAAM,GAAG,CAAC;wBAC9C;;wBAGA,kBAAkB,CAAC,UAAC,IAAI,EAAA;AACtB,4BAAA,OAAA,IAAI,CAAC,GAAG,CAAC,UAAC,IAAI,EAAE,KAAK,EAAA;AACnB,gCAAA,OAAA,KAAK,KAAK,iBAAe,GAAE,QAAA,CAAA,QAAA,CAAA,EAAA,EAAM,IAAI,CAAA,EAAA,EAAE,QAAQ,EAAE,IAAI,EAAA,CAAA,GAAK,IAAI;AAA9D,4BAAA,CAA8D,CAC/D;AAFD,wBAAA,CAEC,CACF;;wBAGD,cAAc,CAAC,iBAAe,CAAC;AAGzB,wBAAA,YAAY,GAChB,OAAK,YAAY,KAAK,GAAG,OAAK,CAAC,OAAO,GAAG,MAAM,CAAC,OAAK,CAAC;AAClD,wBAAA,cAAc,GAClB,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC;AAChC,4BAAA,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC;AAC7B,4BAAA,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC;AAC5B,wBAAA,oBAAoB,GAAG,2BAA2B,CAAC,OAAK,CAAC;AACzD,wBAAA,gBAAgB,GAAG,mBAAmB,CAAC,OAAK,CAAC;wBAC7C,QAAQ,GAAG,OAA4C;AAE7D,wBAAA,iBAAiB,CAAC;AAChB,4BAAA,OAAO,EAAE,KAAK;AACd,4BAAA,IAAI,EAAE,IAAI;;;;AAIV,4BAAA,WAAW,EAAE;AACX,kCAAE;AACE,oCAAA;AACE,wCAAA,IAAI,EAAE,gBAAgB;AACtB,wCAAA,QAAQ,EAAE,gBAAgB;wCAC1B,eAAe,EAAE,CAAA,QAAQ,KAAA,IAAA,IAAR,QAAQ,uBAAR,QAAQ,CAAE,OAAO,KAAI,EAAE;AACxC,wCAAA,IAAI,EAAE,UAAU;AACjB,qCAAA;AACF;AACH,kCAAE,SAAS;AACb,4BAAA,QAAQ,EAAE,cAAc,IAAI,oBAAoB,IAAI,CAAC,CAAC,gBAAgB;AACtE,4BAAA,aAAa,EAAE,oBAAoB;AACpC,yBAAA,CAAC;wBACF,aAAa,CAAC,IAAI,CAAC;;;wBAEnB,eAAe,CAAC,KAAK,CAAC;;;;;aAEzB;AAED,QAAA,YAAY,EAAE;AAChB,IAAA,CAAC,EAAE;QACD,YAAY;QACZ,QAAQ;QACR,cAAc;QACd,kBAAkB;QAClB,YAAY;QACZ,YAAY;QACZ,0BAA0B;AAC1B,QAAA,eAAe,CAAC,MAAM;QACtB,WAAW;QACX,aAAa;AACd,KAAA,CAAC;;AAGF,IAAA,SAAS,CAAC,YAAA;AACR,QAAA,IAAI,UAAU,IAAI,cAAc,EAAE;AAChC,YAAA,UAAU,CAAC,YAAA;gBACT,IAAM,UAAU,GACd,cAAc,CAAC,OAAO,IAAI,cAAc,CAAC,QAAQ,KAAK,IAAI;;gBAE5D,0BAA0B,CACxB,cAAc,CAAC,OAAO,EACtB,UAAU,GAAG,UAAU,GAAG,SAAS,EACnC,cAAc,CAAC,WAAW,IAAI,IAAI,EAClC,cAAc,CAAC,aAAa,CAC7B;YACH,CAAC,EAAE,IAAI,CAAC;QACV;IACF,CAAC,EAAE,CAAC,UAAU,EAAE,cAAc,EAAE,0BAA0B,EAAE,UAAU,CAAC,CAAC;IAExE,QACEA,aAAK,SAAS,EAAC,6CAA6C,EAAA,QAAA,EAE1DA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,wCAAwC,YACrDC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mCAAmC,EAAA,QAAA,EAAA,CAEhDA,cAAK,SAAS,EAAC,uBAAuB,EAAA,QAAA,EAAA,CACpCD,GAAA,CAAC,KAAK,EAAA,EAAC,SAAS,EAAC,iCAAiC,EAAA,QAAA,EAC/C,CAAC,CAAC,sBAAsB,CAAC,EAAA,CACpB,EACRA,IAAC,QAAQ,EAAA,EAAC,SAAS,EAAC,uCAAuC,YACxD,CAAC,CAAC,yBAAyB,EAAE;AAC5B,oCAAA,QAAQ,EAAE,CAAC,CAAC,gBAAgB,GAAG,YAAY,CAAC;iCAC7C,CAAC,EAAA,CACO,IACP,EAGNA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,4BAA4B,YACzCA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,WAAW,EAAA,QAAA,EACvB,eAAe,CAAC,GAAG,CAAC,UAAC,IAAI,EAAE,KAAa,EAAA,EAAK,QAC5CC,IAAA,CAAA,KAAA,EAAA,EAAiB,SAAS,EAAC,kBAAkB,EAAA,QAAA,EAAA,CAE3CD,aAAK,SAAS,EAAC,yBAAyB,EAAA,QAAA,EACrC,KAAK,GAAG,WAAW,IAClB,IAAI,CAAC,QAAQ;;AAEX,wCAAAA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,qFAAqF,uBAE9F;;AAGN,wCAAAA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,uFAAuF,EAAA,QAAA,EAAA,QAAA,EAAA,CAEhG,CACP,IACC,KAAK,KAAK,WAAW;;AAEvB,wCAAAA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,0HAA0H,GAAO;;wCAGhJA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,+CAA+C,EAAA,CAAO,CACtE,EAAA,CACG,EAGNC,cAAK,SAAS,EAAC,gBAAgB,EAAA,QAAA,EAAA,CAC7BD,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,oCAAoC,YAC9C,IAAI,CAAC,KAAK,EAAA,CACT,EACJA,WAAG,SAAS,EAAC,4BAA4B,EAAA,QAAA,EACtC,IAAI,CAAC,QAAQ,EAAA,CACZ,IACA,CAAA,EAAA,EAhCE,KAAK,CAiCT,EACP,CAnC6C,CAmC7C,CAAC,EAAA,CACE,GACF,CAAA,EAAA,CACF,EAAA,CACF,EAAA,CACF;AAEV,CAAC;AAGH,aAAa,CAAC,WAAW,GAAG,eAAe;;;;"}
@@ -129,7 +129,8 @@ var user_guidance = {
129
129
  "2.2": "The photo is not clear. Avoid any blur or reflection",
130
130
  "2.4": "The photo is not clear. Avoid any blur or reflection",
131
131
  "2.6": "The document submitted is not the expected one",
132
- QUOTA_EXCEEDED: "Your organisation has reached its verification quota. Please try again later or contact the organisation that sent you this link."
132
+ QUOTA_EXCEEDED: "Your organisation has reached its verification quota. Please try again later or contact the organisation that sent you this link.",
133
+ INSUFFICIENT_CREDITS: "The organisation that sent you this link has run out of verification credits. Please contact them to complete your verification."
133
134
  };
134
135
  var validation_points = {
135
136
  "1.0": {
@@ -267,6 +268,7 @@ var errors = {
267
268
  verification_failed_subtitle_no_retry: "We could not validate your {{documentType}}. Please check the points below.",
268
269
  problems_detected: "Problems Detected",
269
270
  improvement_tips: "Improvement Tips",
271
+ service_refusal_title: "Verification temporarily unavailable",
270
272
  image_quality_insufficient: "• Image quality: Insufficient",
271
273
  readability_problematic: "• Information readability: Problematic",
272
274
  authenticity_not_verified: "• Authenticity: Not verified",
@@ -1 +1 @@
1
- {"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"en.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -129,7 +129,8 @@ var user_guidance = {
129
129
  "2.2": "La foto no es clara. Evita desenfoques y reflejos",
130
130
  "2.4": "La foto no es clara. Evita desenfoques y reflejos",
131
131
  "2.6": "El documento enviado no es el esperado",
132
- QUOTA_EXCEEDED: "Su organización ha alcanzado su cuota de verificaciones. Inténtelo de nuevo más tarde o póngase en contacto con la organización que le envió este enlace."
132
+ QUOTA_EXCEEDED: "Su organización ha alcanzado su cuota de verificaciones. Inténtelo de nuevo más tarde o póngase en contacto con la organización que le envió este enlace.",
133
+ INSUFFICIENT_CREDITS: "La organización que le envió este enlace no tiene más créditos de verificación. Póngase en contacto con ella para completar su trámite."
133
134
  };
134
135
  var validation_points = {
135
136
  "1.0": {
@@ -267,6 +268,7 @@ var errors = {
267
268
  verification_failed_subtitle_no_retry: "No hemos podido validar tu {{documentType}}. Revisa los puntos siguientes.",
268
269
  problems_detected: "Problemas detectados",
269
270
  improvement_tips: "Consejos de mejora",
271
+ service_refusal_title: "Verificación temporalmente no disponible",
270
272
  image_quality_insufficient: "• Calidad de imagen: insuficiente",
271
273
  readability_problematic: "• Legibilidad de la información: problemática",
272
274
  authenticity_not_verified: "• Autenticidad: no verificada",
@@ -1 +1 @@
1
- {"version":3,"file":"es.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"es.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -129,7 +129,8 @@ var user_guidance = {
129
129
  "2.2": "La photo n'est pas nette. Évitez tout flou ou reflet",
130
130
  "2.4": "La photo n'est pas nette. Évitez tout flou ou reflet",
131
131
  "2.6": "Le document déposé n'est pas celui attendu",
132
- QUOTA_EXCEEDED: "Le quota de vérifications de votre organisation est atteint. Veuillez réessayer plus tard ou contacter l'organisation qui vous a envoyé ce lien."
132
+ QUOTA_EXCEEDED: "Le quota de vérifications de votre organisation est atteint. Veuillez réessayer plus tard ou contacter l'organisation qui vous a envoyé ce lien.",
133
+ INSUFFICIENT_CREDITS: "L'organisation qui vous a envoyé ce lien n'a plus de crédits de vérification. Veuillez la contacter pour finaliser votre démarche."
133
134
  };
134
135
  var validation_points = {
135
136
  "1.0": {
@@ -267,6 +268,7 @@ var errors = {
267
268
  verification_failed_subtitle_no_retry: "Nous n'avons pas pu valider votre {{documentType}}. Veuillez vérifier les points ci-dessous.",
268
269
  problems_detected: "Problèmes détectés",
269
270
  improvement_tips: "Conseils d'amélioration",
271
+ service_refusal_title: "Vérification momentanément impossible",
270
272
  image_quality_insufficient: "• Qualité des images : Insuffisante",
271
273
  readability_problematic: "• Lisibilité des informations : Problématique",
272
274
  authenticity_not_verified: "• Authenticité : Non vérifiée",
@@ -1 +1 @@
1
- {"version":3,"file":"fr.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"fr.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -17,19 +17,37 @@ var isS3UploadNotConfirmedError = function (error) {
17
17
  // Must stay aligned with QUOTA_EXCEEDED_CODE in the backend
18
18
  // (src/common/constants/quota-exceeded.constant.ts).
19
19
  var QUOTA_EXCEEDED_CODE = "QUOTA_EXCEEDED";
20
- var isQuotaExceededError = function (error) {
21
- if (typeof error !== "object" || error === null) {
22
- return false;
23
- }
20
+ // Must stay aligned with INSUFFICIENT_CREDITS_CODE in the backend
21
+ // (src/common/constants/quota-exceeded.constant.ts): overdraft cap reached.
22
+ var INSUFFICIENT_CREDITS_CODE = "INSUFFICIENT_CREDITS";
23
+ var SERVICE_ERROR_CODES = [QUOTA_EXCEEDED_CODE, INSUFFICIENT_CREDITS_CODE];
24
+ // codeName of the backend fallback document (origin api_failure) returned by
25
+ // analysis-status polling when the async analysis was refused.
26
+ var SERVICE_ERROR_CODE_NAMES = {
27
+ quota_exceeded: QUOTA_EXCEEDED_CODE,
28
+ insufficient_credits: INSUFFICIENT_CREDITS_CODE,
29
+ };
30
+ /**
31
+ * Code of a service refusal (engine quota / organisation out of credits) carried
32
+ * by an ApiError (`code` or `details.code`), else null. Screens show it through
33
+ * `user_guidance.<code>`.
34
+ */
35
+ var getServiceErrorCode = function (error) {
36
+ if (typeof error !== "object" || error === null)
37
+ return null;
24
38
  var apiError = error;
25
- if (apiError.code === QUOTA_EXCEEDED_CODE) {
26
- return true;
27
- }
28
- if (typeof apiError.details !== "object" || apiError.details === null) {
29
- return false;
30
- }
31
- return (apiError.details.code === QUOTA_EXCEEDED_CODE);
39
+ var details = typeof apiError.details === "object" && apiError.details !== null
40
+ ? apiError.details
41
+ : undefined;
42
+ if (isServiceErrorCode(apiError.code))
43
+ return apiError.code;
44
+ return isServiceErrorCode(details === null || details === void 0 ? void 0 : details.code) ? details.code : null;
45
+ };
46
+ var isServiceErrorCode = function (code) {
47
+ return SERVICE_ERROR_CODES.includes(code);
32
48
  };
49
+ /** Same as getServiceErrorCode, from the polled fallback document codeName. */
50
+ var getServiceErrorCodeFromCodeName = function (codeName) { var _a; return typeof codeName === "string" ? (_a = SERVICE_ERROR_CODE_NAMES[codeName]) !== null && _a !== void 0 ? _a : null : null; };
33
51
 
34
- export { QUOTA_EXCEEDED_CODE, S3_UPLOAD_NOT_CONFIRMED_CODE, isQuotaExceededError, isS3UploadNotConfirmedError };
52
+ export { INSUFFICIENT_CREDITS_CODE, QUOTA_EXCEEDED_CODE, S3_UPLOAD_NOT_CONFIRMED_CODE, getServiceErrorCode, getServiceErrorCodeFromCodeName, isS3UploadNotConfirmedError, isServiceErrorCode };
35
53
  //# sourceMappingURL=analysisErrors.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"analysisErrors.js","sources":["../../../../src/utils/analysisErrors.ts"],"sourcesContent":["// Must stay aligned with the public error code returned by the backend AnalysisService.\nexport const S3_UPLOAD_NOT_CONFIRMED_CODE = \"S3_UPLOAD_NOT_CONFIRMED\";\n\nexport const isS3UploadNotConfirmedError = (error: unknown): boolean => {\n if (typeof error !== \"object\" || error === null) {\n return false;\n }\n\n const apiError = error as { code?: unknown; details?: unknown };\n if (apiError.code === S3_UPLOAD_NOT_CONFIRMED_CODE) {\n return true;\n }\n\n if (typeof apiError.details !== \"object\" || apiError.details === null) {\n return false;\n }\n\n return (\n (apiError.details as { code?: unknown }).code ===\n S3_UPLOAD_NOT_CONFIRMED_CODE\n );\n};\n\n// Must stay aligned with QUOTA_EXCEEDED_CODE in the backend\n// (src/common/constants/quota-exceeded.constant.ts).\nexport const QUOTA_EXCEEDED_CODE = \"QUOTA_EXCEEDED\";\n\nexport const isQuotaExceededError = (error: unknown): boolean => {\n if (typeof error !== \"object\" || error === null) {\n return false;\n }\n\n const apiError = error as { code?: unknown; details?: unknown };\n if (apiError.code === QUOTA_EXCEEDED_CODE) {\n return true;\n }\n\n if (typeof apiError.details !== \"object\" || apiError.details === null) {\n return false;\n }\n\n return (\n (apiError.details as { code?: unknown }).code === QUOTA_EXCEEDED_CODE\n );\n};\n"],"names":[],"mappings":"AAAA;AACO,IAAM,4BAA4B,GAAG;AAErC,IAAM,2BAA2B,GAAG,UAAC,KAAc,EAAA;IACxD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE;AAC/C,QAAA,OAAO,KAAK;IACd;IAEA,IAAM,QAAQ,GAAG,KAA8C;AAC/D,IAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,4BAA4B,EAAE;AAClD,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,IAAI,QAAQ,CAAC,OAAO,KAAK,IAAI,EAAE;AACrE,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,QACG,QAAQ,CAAC,OAA8B,CAAC,IAAI;AAC7C,QAAA,4BAA4B;AAEhC;AAEA;AACA;AACO,IAAM,mBAAmB,GAAG;AAE5B,IAAM,oBAAoB,GAAG,UAAC,KAAc,EAAA;IACjD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE;AAC/C,QAAA,OAAO,KAAK;IACd;IAEA,IAAM,QAAQ,GAAG,KAA8C;AAC/D,IAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,mBAAmB,EAAE;AACzC,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,IAAI,QAAQ,CAAC,OAAO,KAAK,IAAI,EAAE;AACrE,QAAA,OAAO,KAAK;IACd;IAEA,QACG,QAAQ,CAAC,OAA8B,CAAC,IAAI,KAAK,mBAAmB;AAEzE;;;;"}
1
+ {"version":3,"file":"analysisErrors.js","sources":["../../../../src/utils/analysisErrors.ts"],"sourcesContent":["// Must stay aligned with the public error code returned by the backend AnalysisService.\nexport const S3_UPLOAD_NOT_CONFIRMED_CODE = \"S3_UPLOAD_NOT_CONFIRMED\";\n\nexport const isS3UploadNotConfirmedError = (error: unknown): boolean => {\n if (typeof error !== \"object\" || error === null) {\n return false;\n }\n\n const apiError = error as { code?: unknown; details?: unknown };\n if (apiError.code === S3_UPLOAD_NOT_CONFIRMED_CODE) {\n return true;\n }\n\n if (typeof apiError.details !== \"object\" || apiError.details === null) {\n return false;\n }\n\n return (\n (apiError.details as { code?: unknown }).code ===\n S3_UPLOAD_NOT_CONFIRMED_CODE\n );\n};\n\n// Must stay aligned with QUOTA_EXCEEDED_CODE in the backend\n// (src/common/constants/quota-exceeded.constant.ts).\nexport const QUOTA_EXCEEDED_CODE = \"QUOTA_EXCEEDED\";\n\nexport const isQuotaExceededError = (error: unknown): boolean => {\n if (typeof error !== \"object\" || error === null) {\n return false;\n }\n\n const apiError = error as { code?: unknown; details?: unknown };\n if (apiError.code === QUOTA_EXCEEDED_CODE) {\n return true;\n }\n\n if (typeof apiError.details !== \"object\" || apiError.details === null) {\n return false;\n }\n\n return (\n (apiError.details as { code?: unknown }).code === QUOTA_EXCEEDED_CODE\n );\n};\n\n// Must stay aligned with INSUFFICIENT_CREDITS_CODE in the backend\n// (src/common/constants/quota-exceeded.constant.ts): overdraft cap reached.\nexport const INSUFFICIENT_CREDITS_CODE = \"INSUFFICIENT_CREDITS\";\n\nconst SERVICE_ERROR_CODES = [QUOTA_EXCEEDED_CODE, INSUFFICIENT_CREDITS_CODE];\n\n// codeName of the backend fallback document (origin api_failure) returned by\n// analysis-status polling when the async analysis was refused.\nconst SERVICE_ERROR_CODE_NAMES: Record<string, string> = {\n quota_exceeded: QUOTA_EXCEEDED_CODE,\n insufficient_credits: INSUFFICIENT_CREDITS_CODE,\n};\n\n/**\n * Code of a service refusal (engine quota / organisation out of credits) carried\n * by an ApiError (`code` or `details.code`), else null. Screens show it through\n * `user_guidance.<code>`.\n */\nexport const getServiceErrorCode = (error: unknown): string | null => {\n if (typeof error !== \"object\" || error === null) return null;\n const apiError = error as { code?: unknown; details?: unknown };\n const details =\n typeof apiError.details === \"object\" && apiError.details !== null\n ? (apiError.details as { code?: unknown })\n : undefined;\n if (isServiceErrorCode(apiError.code)) return apiError.code;\n return isServiceErrorCode(details?.code) ? details.code : null;\n};\n\nexport const isServiceErrorCode = (code: unknown): code is string =>\n SERVICE_ERROR_CODES.includes(code as string);\n\n/** Same as getServiceErrorCode, from the polled fallback document codeName. */\nexport const getServiceErrorCodeFromCodeName = (\n codeName: unknown,\n): string | null =>\n typeof codeName === \"string\" ? SERVICE_ERROR_CODE_NAMES[codeName] ?? null : null;\n"],"names":[],"mappings":"AAAA;AACO,IAAM,4BAA4B,GAAG;AAErC,IAAM,2BAA2B,GAAG,UAAC,KAAc,EAAA;IACxD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE;AAC/C,QAAA,OAAO,KAAK;IACd;IAEA,IAAM,QAAQ,GAAG,KAA8C;AAC/D,IAAA,IAAI,QAAQ,CAAC,IAAI,KAAK,4BAA4B,EAAE;AAClD,QAAA,OAAO,IAAI;IACb;AAEA,IAAA,IAAI,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,IAAI,QAAQ,CAAC,OAAO,KAAK,IAAI,EAAE;AACrE,QAAA,OAAO,KAAK;IACd;AAEA,IAAA,QACG,QAAQ,CAAC,OAA8B,CAAC,IAAI;AAC7C,QAAA,4BAA4B;AAEhC;AAEA;AACA;AACO,IAAM,mBAAmB,GAAG;AAqBnC;AACA;AACO,IAAM,yBAAyB,GAAG;AAEzC,IAAM,mBAAmB,GAAG,CAAC,mBAAmB,EAAE,yBAAyB,CAAC;AAE5E;AACA;AACA,IAAM,wBAAwB,GAA2B;AACvD,IAAA,cAAc,EAAE,mBAAmB;AACnC,IAAA,oBAAoB,EAAE,yBAAyB;CAChD;AAED;;;;AAIG;AACI,IAAM,mBAAmB,GAAG,UAAC,KAAc,EAAA;AAChD,IAAA,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;AAAE,QAAA,OAAO,IAAI;IAC5D,IAAM,QAAQ,GAAG,KAA8C;AAC/D,IAAA,IAAM,OAAO,GACX,OAAO,QAAQ,CAAC,OAAO,KAAK,QAAQ,IAAI,QAAQ,CAAC,OAAO,KAAK;UACxD,QAAQ,CAAC;UACV,SAAS;AACf,IAAA,IAAI,kBAAkB,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAO,QAAQ,CAAC,IAAI;IAC3D,OAAO,kBAAkB,CAAC,OAAO,KAAA,IAAA,IAAP,OAAO,KAAA,MAAA,GAAA,MAAA,GAAP,OAAO,CAAE,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,GAAG,IAAI;AAChE;AAEO,IAAM,kBAAkB,GAAG,UAAC,IAAa,EAAA;AAC9C,IAAA,OAAA,mBAAmB,CAAC,QAAQ,CAAC,IAAc,CAAC;AAA5C;AAEF;AACO,IAAM,+BAA+B,GAAG,UAC7C,QAAiB,EAAA,EAAA,IAAA,EAAA,CAAA,CAEjB,OAAA,OAAO,QAAQ,KAAK,QAAQ,GAAG,CAAA,EAAA,GAAA,wBAAwB,CAAC,QAAQ,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,IAAI,GAAG,IAAI,CAAA,CAAA;;;;"}
@@ -189,6 +189,10 @@ The enhanced polling system now supports multiple analyses per session by tracki
189
189
  }
190
190
  ```
191
191
 
192
+ ### Analysis Refused by the Service (quota / out of credits)
193
+
194
+ When the backend refuses the analysis itself (engine quota reached, or the organisation's overdraft cap reached), it stores a fallback document (`code: "api_failure"`) whose `codeName` tells the cause: `quota_exceeded` or `insufficient_credits`. The SDK maps it to `QUOTA_EXCEEDED` / `INSUFFICIENT_CREDITS` (`getServiceErrorCodeFromCodeName`, `src/utils/analysisErrors.ts`), fails the step and shows `user_guidance.<code>` on the error screen (document, JDI, document video). The same codes returned synchronously by an HTTP error (`429 QUOTA_EXCEEDED`, `403 INSUFFICIENT_CREDITS`) are read by `getServiceErrorCode`.
195
+
192
196
  ---
193
197
 
194
198
  ## Frontend Usage
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "datakeen-session-react",
3
- "version": "1.1.195-dev.6",
3
+ "version": "1.1.195-dev.8",
4
4
  "description": "React SDK component to manage and render Datakeen session experiences easily.",
5
5
  "publishConfig": {
6
6
  "access": "public",