datakeen-session-react 1.1.140-dev.96 → 1.1.140-oid4vp-demo.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gitlab-ci.yml +37 -0
- package/dist/cjs/components/document-collection/DocumentCollection.js +132 -22
- package/dist/cjs/components/document-collection/DocumentCollection.js.map +1 -1
- package/dist/cjs/components/session/DocumentCheck.js +112 -15
- package/dist/cjs/components/session/DocumentCheck.js.map +1 -1
- package/dist/cjs/components/session/UserInputForm/LegalRepFields.js +45 -0
- package/dist/cjs/components/session/UserInputForm/LegalRepFields.js.map +1 -0
- package/dist/cjs/components/session/UserInputForm.js +2 -1
- package/dist/cjs/components/session/UserInputForm.js.map +1 -1
- package/dist/cjs/components/template/TemplateNodeRenderer.js +5 -1
- package/dist/cjs/components/template/TemplateNodeRenderer.js.map +1 -1
- package/dist/cjs/components/wallet/AgeControl.js +75 -0
- package/dist/cjs/components/wallet/AgeControl.js.map +1 -0
- package/dist/cjs/components/wallet/WalletProposal.js +27 -0
- package/dist/cjs/components/wallet/WalletProposal.js.map +1 -0
- package/dist/cjs/components/wallet/WalletSuccessAnimation.js +37 -0
- package/dist/cjs/components/wallet/WalletSuccessAnimation.js.map +1 -0
- package/dist/cjs/components/wallet/WalletVerificationStep.js +132 -0
- package/dist/cjs/components/wallet/WalletVerificationStep.js.map +1 -0
- package/dist/cjs/constants/userInputForm.js +2 -2
- package/dist/cjs/constants/userInputForm.js.map +1 -1
- package/dist/cjs/hooks/useUserInputForm.js +17 -1
- package/dist/cjs/hooks/useUserInputForm.js.map +1 -1
- package/dist/cjs/hooks/useWalletSseStatus.js +67 -0
- package/dist/cjs/hooks/useWalletSseStatus.js.map +1 -0
- package/dist/cjs/i18n/documents/documents.en.json.js +3 -0
- package/dist/cjs/i18n/documents/documents.en.json.js.map +1 -1
- package/dist/cjs/i18n/documents/documents.fr.json.js +3 -0
- package/dist/cjs/i18n/documents/documents.fr.json.js.map +1 -1
- package/dist/cjs/i18n/en.json.js +36 -2
- package/dist/cjs/i18n/en.json.js.map +1 -1
- package/dist/cjs/i18n/fr.json.js +36 -2
- package/dist/cjs/i18n/fr.json.js.map +1 -1
- package/dist/cjs/services/sessionService.js +57 -0
- package/dist/cjs/services/sessionService.js.map +1 -1
- package/dist/cjs/types/session.js.map +1 -1
- package/dist/cjs/utils/userInputForm.js +1 -0
- package/dist/cjs/utils/userInputForm.js.map +1 -1
- package/dist/esm/components/document-collection/DocumentCollection.js +132 -22
- package/dist/esm/components/document-collection/DocumentCollection.js.map +1 -1
- package/dist/esm/components/session/DocumentCheck.js +113 -16
- package/dist/esm/components/session/DocumentCheck.js.map +1 -1
- package/dist/esm/components/session/UserInputForm/LegalRepFields.js +22 -0
- package/dist/esm/components/session/UserInputForm/LegalRepFields.js.map +1 -0
- package/dist/esm/components/session/UserInputForm.js +2 -1
- package/dist/esm/components/session/UserInputForm.js.map +1 -1
- package/dist/esm/components/template/TemplateNodeRenderer.js +5 -1
- package/dist/esm/components/template/TemplateNodeRenderer.js.map +1 -1
- package/dist/esm/components/wallet/AgeControl.js +71 -0
- package/dist/esm/components/wallet/AgeControl.js.map +1 -0
- package/dist/esm/components/wallet/WalletProposal.js +23 -0
- package/dist/esm/components/wallet/WalletProposal.js.map +1 -0
- package/dist/esm/components/wallet/WalletSuccessAnimation.js +33 -0
- package/dist/esm/components/wallet/WalletSuccessAnimation.js.map +1 -0
- package/dist/esm/components/wallet/WalletVerificationStep.js +128 -0
- package/dist/esm/components/wallet/WalletVerificationStep.js.map +1 -0
- package/dist/esm/constants/userInputForm.js +2 -2
- package/dist/esm/constants/userInputForm.js.map +1 -1
- package/dist/esm/hooks/useUserInputForm.js +17 -1
- package/dist/esm/hooks/useUserInputForm.js.map +1 -1
- package/dist/esm/hooks/useWalletSseStatus.js +65 -0
- package/dist/esm/hooks/useWalletSseStatus.js.map +1 -0
- package/dist/esm/i18n/documents/documents.en.json.js +3 -1
- package/dist/esm/i18n/documents/documents.en.json.js.map +1 -1
- package/dist/esm/i18n/documents/documents.fr.json.js +3 -1
- package/dist/esm/i18n/documents/documents.fr.json.js.map +1 -1
- package/dist/esm/i18n/en.json.js +35 -3
- package/dist/esm/i18n/en.json.js.map +1 -1
- package/dist/esm/i18n/fr.json.js +35 -3
- package/dist/esm/i18n/fr.json.js.map +1 -1
- package/dist/esm/services/sessionService.js +55 -1
- package/dist/esm/services/sessionService.js.map +1 -1
- package/dist/esm/types/session.js.map +1 -1
- package/dist/esm/utils/userInputForm.js +1 -0
- package/dist/esm/utils/userInputForm.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TemplateNodeRenderer.js","sources":["../../../../../src/components/template/TemplateNodeRenderer.tsx"],"sourcesContent":["import React, { useMemo } from \"react\";\nimport Selfie from \"../session/Selfie\";\nimport VideoWorkInProgress from \"../session/VideoWorkInProgress\";\nimport DocumentCheck, { NodeIdentityControl } from \"../session/DocumentCheck\";\nimport DocumentCollection, {\n DocumentTypeSide,\n NodeDocumentCollection,\n} from \"../document-collection/DocumentCollection\";\nimport EndFlow from \"../session/EndFlow\";\nimport LoadingState from \"../states/LoadingState\";\nimport JDDWorkInProgress from \"../jdi/JDDWorkInProgress\";\nimport { getOrderedJourneySteps, getRunPrefillData } from \"../../services/sessionService\";\nimport type { SessionData, stepObject } from \"../../types/session\";\nimport type { UserInput } from \"../../types/userInput\";\nimport type { ContactInfo } from \"../../types/contactInfo\";\nimport UserInputForm from \"../session/UserInputForm\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport ConditionNodeHandler from \"./ConditionNodeHandler\";\nimport SignatureElectronic from \"../signature-electronic/SignatureElectronic\";\nimport ExternalVerificationNodeHandler from \"./ExternalVerificationNodeHandler\";\nimport PdfGeneration from \"../session/PdfGeneration\";\nimport LegalConsentNode from \"../legal-consent/LegalConsentNode\";\n\ninterface TemplateNodeRendererProps {\n session: SessionData;\n sessionId: string;\n stepObject: stepObject;\n stepHistory: number[];\n templateIndex: number;\n onContinueOnPC: () => void;\n userInput: UserInput;\n setUserInput: React.Dispatch<React.SetStateAction<UserInput>>;\n contactInfo: ContactInfo;\n setContactInfo: React.Dispatch<React.SetStateAction<ContactInfo>>;\n isMobileTemplate: boolean;\n}\n\nconst TemplateNodeRenderer: React.FC<TemplateNodeRendererProps> = ({\n session,\n sessionId,\n stepObject,\n stepHistory,\n templateIndex,\n onContinueOnPC,\n userInput,\n setUserInput,\n contactInfo,\n setContactInfo,\n isMobileTemplate,\n}) => {\n const { t } = useI18n();\n\n if (!session?.template) {\n console.error(t(\"template.error.console_no_template\"));\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\"template.error.configuration\")}\n </h2>\n <p className=\"text-gray-600 mb-4\">{t(\"template.error.no_template\")}</p>\n </div>\n );\n }\n\n // Check if session is ended before rendering nodes\n if (session.status === \"ended\") {\n return (\n <EndFlow\n sessionId={sessionId}\n sessionStatus={session.status}\n callbackURL={session.callbackURL}\n compliantCase={session.template?.endScreenConfig?.compliant}\n nonCompliantCase={session.template?.endScreenConfig?.nonCompliant}\n />\n );\n }\n\n // Use getOrderedWorkflowSteps to get sorted and filtered nodes\n const templateNodes = useMemo(\n () => getOrderedJourneySteps(session.template),\n [session.template],\n );\n\n // Check if index is valid\n if (templateNodes.length === 0) {\n console.warn(\"No valid template nodes found after filtering\");\n return (\n <EndFlow\n sessionId={sessionId}\n sessionStatus={session?.status}\n callbackURL={session?.callbackURL}\n />\n );\n }\n\n if (templateIndex < 0 || templateIndex >= templateNodes.length) {\n console.warn(\n `Invalid template index: ${templateIndex}, max index: ${templateNodes.length - 1\n }`,\n );\n\n // If we're beyond the maximum index, it means we've completed all nodes\n if (templateIndex >= templateNodes.length) {\n return (\n <EndFlow\n sessionId={sessionId}\n sessionStatus={session?.status}\n callbackURL={session?.callbackURL}\n compliantCase={session?.template?.endScreenConfig?.compliant}\n nonCompliantCase={session?.template?.endScreenConfig?.nonCompliant}\n />\n );\n }\n\n // If index is negative, redirect to start\n if (templateIndex < 0) {\n setTimeout(() => stepObject.setStep(0), 0);\n return <LoadingState message={t(\"loading.step\")} subtitle=\"\" />;\n }\n }\n\n // At this point, we should have a valid node\n const node = templateNodes[templateIndex];\n if (!node) {\n console.error(\n `Node at index ${templateIndex} is undefined. Available nodes:`,\n templateNodes,\n );\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\"template.error.render\")}\n </h2>\n <p className=\"text-gray-600 mb-4\">\n {t(\"template.error.node_not_found\")}\n </p>\n <button\n className=\"px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n onClick={() => stepObject.setStep(0)}\n >\n {t(\"template.buttons.restart\")}\n </button>\n </div>\n );\n }\n\n switch (node.type) {\n case \"end\":\n console.log(\"📄 Rendering EndFlow component\");\n return (\n <EndFlow\n sessionId={sessionId}\n sessionStatus={session?.status}\n callbackURL={session?.callbackURL}\n endNodeId={node.id}\n expectedResult={node.expectedResult}\n compliantCase={session?.template?.endScreenConfig?.compliant}\n nonCompliantCase={session?.template?.endScreenConfig?.nonCompliant}\n />\n );\n\n case \"information-input\": {\n // runIndex = nombre de fois que ce step a déjà été visité dans l'historique\n // (0 = premier passage, 1 = deuxième, …).\n // On compte les occurrences de (templateIndex + 1) dans stepHistory,\n // minus 1 car le step courant est déjà dans l'historique.\n const currentStep = templateIndex + 1;\n const visitCount = stepHistory.filter((s) => s === currentStep).length;\n const runIndex = Math.max(0, visitCount - 1);\n\n // Pré-remplissage multi-ENTITÉS : si _list présent, utiliser _list[runIndex]\n // (ou {} hors borne). L'énumération de plusieurs entités successives passe\n // exclusivement par _list (cf. docs/multi-runs.md).\n // Sans _list : on pré-remplit TOUJOURS depuis le userInput persisté — y compris\n // sur une ré-entrée (boucle condition de correction, retour arrière, bouton\n // \"Corriger ma saisie\"). Une ré-entrée sans _list = corriger les MÊMES données,\n // pas en saisir de nouvelles → on ne doit pas vider le formulaire.\n const hasList = Array.isArray(\n (session.userInput as Record<string, unknown>)?._list,\n );\n let initialUserInput: UserInput;\n if (hasList) {\n const prefill = getRunPrefillData(\n session.userInput as Record<string, unknown>,\n runIndex,\n );\n initialUserInput = (prefill ?? {}) as UserInput;\n } else {\n initialUserInput = userInput;\n }\n return (\n // key={node.id} : remonte le formulaire à chaque changement de nœud, pour\n // qu'il se ré-initialise depuis initialUserInput (comportement \"refresh sans\n // refresh\"). Évite la réutilisation d'instance qui laissait customFormData\n // périmé au retour arrière entre deux nœuds information-input.\n <UserInputForm\n key={node.id}\n stepObject={stepObject}\n node={node}\n template={session.template}\n setUserInput={setUserInput}\n initialUserInput={initialUserInput}\n contactInfo={contactInfo}\n setContactInfo={setContactInfo}\n sessionId={sessionId}\n />\n );\n }\n\n case \"document-collection\": {\n return (\n <DocumentCollection\n key={`doc-collection-${templateIndex}`}\n node={node as NodeDocumentCollection}\n stepObject={stepObject}\n sessionId={sessionId}\n template={session.template}\n onContinueOnPC={onContinueOnPC}\n allowedDocumentTypes={(node.allowedDocumentTypes || []).map(\n (docType: any) => ({\n ...docType,\n side:\n typeof docType.side === \"string\" ||\n typeof docType.side === \"number\"\n ? (docType.side as DocumentTypeSide)\n : undefined,\n }),\n )}\n allowedAddingMethods={node.allowedAddingMethods || [\"download\"]}\n introductionPage={node.introductionPage}\n documentSelection={node.documentSelection}\n allowResubmission={node.allowResubmission}\n maxResubmissionAttempts={node.maxResubmissionAttempts}\n />\n );\n }\n\n case \"document-selection\":\n case \"controle-jdi\": {\n if (!node.requiredDocumentType) {\n console.error(\n \"Missing requiredDocumentType in document-selection node:\",\n node,\n );\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n Erreur de configuration\n </h2>\n <p className=\"text-gray-600 mb-4\">\n Le type de document requis n'est pas spécifié dans le template.\n </p>\n <button\n className=\"px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n onClick={() => stepObject.setStep(0)}\n >\n Recommencer\n </button>\n </div>\n );\n }\n\n // Determine if current device is mobile for capture method\n const isMobile =\n /Android|iPhone|iPad|iPod|Opera Mini|IEMobile|WPDesktop/i.test(\n navigator.userAgent,\n );\n\n return (\n <DocumentCheck\n key={`doc-check-${templateIndex}`}\n stepObject={stepObject}\n node={node as NodeIdentityControl}\n sessionId={sessionId}\n documentTypeId={node.requiredDocumentType}\n acceptedCountries={node.acceptedCountries}\n onContinueOnPC={onContinueOnPC}\n isMobileCapture={isMobileTemplate && isMobile}\n allowedAddingMethods={\n node.allowedAddingMethods || [\"download\", \"picture\"]\n }\n template={session.template}\n templateIndex={templateIndex}\n setUserInput={setUserInput}\n />\n );\n // }\n }\n\n case \"biometric-capture\":\n case \"selfie-capture\":\n return (\n <Selfie\n key={`selfie-${templateIndex}`}\n stepObject={stepObject}\n sessionId={sessionId}\n node={node}\n template={session.template}\n />\n );\n\n case \"signature-electronic\":\n return (\n <SignatureElectronic\n key={`signature-${templateIndex}`}\n sessionId={sessionId}\n stepObject={stepObject}\n node={node}\n session={session}\n title={node.title}\n description={node.description}\n // Always pass a stable node identifier so backend can resolve\n // either a static DocuSeal template OR a generated PDF source.\n external_id={node.templateId || node.external_id || node.id}\n fieldMappings={node.fieldMappings}\n userInput={userInput}\n contactInfo={contactInfo}\n />\n );\n\n case \"video-capture\":\n console.log(\"🎥 Rendering Video Work in Progress component\");\n return <VideoWorkInProgress onContinue={onContinueOnPC} />;\n\n case \"jdd\":\n console.log(\"🚧 Rendering JDD Work in Progress component\");\n return <JDDWorkInProgress onContinue={onContinueOnPC} />;\n\n case \"condition\":\n console.debug(\"🔀 Rendering Condition Node Handler component and well\");\n return (\n <ConditionNodeHandler\n node={node}\n session={session}\n templateNodes={templateNodes}\n stepObject={stepObject}\n userInput={userInput}\n contactInfo={contactInfo}\n />\n );\n\n case \"external-verification\":\n console.debug(\"🔍 Rendering External Verification Node Handler\");\n return (\n <ExternalVerificationNodeHandler\n node={node}\n session={session}\n userInput={userInput}\n setUserInput={setUserInput}\n onNext={() => stepObject.goToNextStep(node.id, session.template)}\n onPrevious={() => stepObject.goBack()}\n onNavigateToNode={(nodeId: string) => {\n const idx = templateNodes.findIndex((n: any) => n.id === nodeId);\n // idx est 0-based, les steps sont 1-based → idx + 1.\n // goBackToStep tronque l'historique pour que le nœud corrigé\n // redevienne runIndex 0 (formulaire pré-rempli).\n if (idx !== -1) stepObject.goBackToStep(idx + 1);\n else stepObject.goBack();\n }}\n />\n );\n\n case \"pdf-generation\":\n console.debug(\"📄 Rendering PDF Generation component\");\n return (\n <PdfGeneration\n key={`pdf-generation-${templateIndex}`}\n node={node}\n session={session}\n sessionId={sessionId}\n stepObject={stepObject}\n userInput={userInput}\n />\n );\n\n case \"legal-consent\":\n return (\n <LegalConsentNode\n node={node}\n session={session}\n sessionId={sessionId}\n stepObject={stepObject}\n />\n );\n\n case \"custom\":\n // For custom nodes, we provide a basic structure that can be extended\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-blue-500 text-4xl mb-4\">🔧</div>\n <h2 className=\"text-xl font-bold text-blue-600 mb-2\">\n Nœud personnalisé\n </h2>\n <p className=\"text-gray-600 mb-4\">\n Implémentation personnalisée requise pour: \"{node.title || node.id}\"\n </p>\n <div className=\"bg-blue-50 border border-blue-200 rounded p-3 text-left text-sm mb-4 max-w-md\">\n <p className=\"font-semibold text-blue-700 mb-2\">\n Configuration du nœud:\n </p>\n <pre className=\"text-xs overflow-auto max-h-32\">\n {JSON.stringify(\n {\n id: node.id,\n title: node.title,\n description: node.description,\n options: node.options,\n selectedOptions: node.selectedOptions,\n },\n null,\n 2,\n )}\n </pre>\n </div>\n <button\n className=\"px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 transition-colors\"\n onClick={() => {\n console.log(\"Custom node action:\", node);\n stepObject.goToNextStep(node.id, session.template);\n }}\n >\n {t(\"template.buttons.continue\")}\n </button>\n </div>\n );\n\n default:\n console.warn(`❌ Type de nœud non supporté: ${node.type}`, node);\n console.log(\"❓ Available supported types:\", [\n \"end\",\n \"information-input\",\n \"document-collection\",\n \"document-selection\",\n \"document-upload\",\n \"controle-jdi\",\n \"selfie-capture\",\n \"video-capture\",\n \"country-selection\",\n \"identity-control\",\n \"jdd\",\n \"condition\",\n \"custom\",\n ]);\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-yellow-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-yellow-600 mb-2\">\n Étape non supportée\n </h2>\n <p className=\"text-gray-600 mb-4\">\n Le type d'étape \"{node.type}\" n'est pas pris en charge.\n </p>\n <div className=\"bg-gray-100 p-4 rounded mb-4 text-left text-xs overflow-auto max-h-32\">\n <pre>{JSON.stringify(node, null, 2)}</pre>\n </div>\n <button\n className=\"px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n onClick={() => {\n stepObject.goToNextStep(node.id, session.template);\n }}\n >\n {t(\"template.buttons.continue\")}\n </button>\n </div>\n );\n }\n};\n\nexport default TemplateNodeRenderer;\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"TemplateNodeRenderer.js","sources":["../../../../../src/components/template/TemplateNodeRenderer.tsx"],"sourcesContent":["import React, { useMemo } from \"react\";\nimport Selfie from \"../session/Selfie\";\nimport VideoWorkInProgress from \"../session/VideoWorkInProgress\";\nimport DocumentCheck, { NodeIdentityControl } from \"../session/DocumentCheck\";\nimport DocumentCollection, {\n DocumentTypeSide,\n NodeDocumentCollection,\n} from \"../document-collection/DocumentCollection\";\nimport EndFlow from \"../session/EndFlow\";\nimport LoadingState from \"../states/LoadingState\";\nimport JDDWorkInProgress from \"../jdi/JDDWorkInProgress\";\nimport { getOrderedJourneySteps, getRunPrefillData } from \"../../services/sessionService\";\nimport type { SessionData, stepObject } from \"../../types/session\";\nimport type { UserInput } from \"../../types/userInput\";\nimport type { ContactInfo } from \"../../types/contactInfo\";\nimport UserInputForm from \"../session/UserInputForm\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport ConditionNodeHandler from \"./ConditionNodeHandler\";\nimport SignatureElectronic from \"../signature-electronic/SignatureElectronic\";\nimport ExternalVerificationNodeHandler from \"./ExternalVerificationNodeHandler\";\nimport PdfGeneration from \"../session/PdfGeneration\";\nimport LegalConsentNode from \"../legal-consent/LegalConsentNode\";\nimport AgeControl from \"../wallet/AgeControl\";\n\ninterface TemplateNodeRendererProps {\n session: SessionData;\n sessionId: string;\n stepObject: stepObject;\n stepHistory: number[];\n templateIndex: number;\n onContinueOnPC: () => void;\n userInput: UserInput;\n setUserInput: React.Dispatch<React.SetStateAction<UserInput>>;\n contactInfo: ContactInfo;\n setContactInfo: React.Dispatch<React.SetStateAction<ContactInfo>>;\n isMobileTemplate: boolean;\n}\n\nconst TemplateNodeRenderer: React.FC<TemplateNodeRendererProps> = ({\n session,\n sessionId,\n stepObject,\n stepHistory,\n templateIndex,\n onContinueOnPC,\n userInput,\n setUserInput,\n contactInfo,\n setContactInfo,\n isMobileTemplate,\n}) => {\n const { t } = useI18n();\n\n if (!session?.template) {\n console.error(t(\"template.error.console_no_template\"));\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\"template.error.configuration\")}\n </h2>\n <p className=\"text-gray-600 mb-4\">{t(\"template.error.no_template\")}</p>\n </div>\n );\n }\n\n // Check if session is ended before rendering nodes\n if (session.status === \"ended\") {\n return (\n <EndFlow\n sessionId={sessionId}\n sessionStatus={session.status}\n callbackURL={session.callbackURL}\n compliantCase={session.template?.endScreenConfig?.compliant}\n nonCompliantCase={session.template?.endScreenConfig?.nonCompliant}\n />\n );\n }\n\n // Use getOrderedWorkflowSteps to get sorted and filtered nodes\n const templateNodes = useMemo(\n () => getOrderedJourneySteps(session.template),\n [session.template],\n );\n\n // Check if index is valid\n if (templateNodes.length === 0) {\n console.warn(\"No valid template nodes found after filtering\");\n return (\n <EndFlow\n sessionId={sessionId}\n sessionStatus={session?.status}\n callbackURL={session?.callbackURL}\n />\n );\n }\n\n if (templateIndex < 0 || templateIndex >= templateNodes.length) {\n console.warn(\n `Invalid template index: ${templateIndex}, max index: ${templateNodes.length - 1\n }`,\n );\n\n // If we're beyond the maximum index, it means we've completed all nodes\n if (templateIndex >= templateNodes.length) {\n return (\n <EndFlow\n sessionId={sessionId}\n sessionStatus={session?.status}\n callbackURL={session?.callbackURL}\n compliantCase={session?.template?.endScreenConfig?.compliant}\n nonCompliantCase={session?.template?.endScreenConfig?.nonCompliant}\n />\n );\n }\n\n // If index is negative, redirect to start\n if (templateIndex < 0) {\n setTimeout(() => stepObject.setStep(0), 0);\n return <LoadingState message={t(\"loading.step\")} subtitle=\"\" />;\n }\n }\n\n // At this point, we should have a valid node\n const node = templateNodes[templateIndex];\n if (!node) {\n console.error(\n `Node at index ${templateIndex} is undefined. Available nodes:`,\n templateNodes,\n );\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n {t(\"template.error.render\")}\n </h2>\n <p className=\"text-gray-600 mb-4\">\n {t(\"template.error.node_not_found\")}\n </p>\n <button\n className=\"px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n onClick={() => stepObject.setStep(0)}\n >\n {t(\"template.buttons.restart\")}\n </button>\n </div>\n );\n }\n\n switch (node.type) {\n case \"end\":\n console.log(\"📄 Rendering EndFlow component\");\n return (\n <EndFlow\n sessionId={sessionId}\n sessionStatus={session?.status}\n callbackURL={session?.callbackURL}\n endNodeId={node.id}\n expectedResult={node.expectedResult}\n compliantCase={session?.template?.endScreenConfig?.compliant}\n nonCompliantCase={session?.template?.endScreenConfig?.nonCompliant}\n />\n );\n\n case \"information-input\": {\n // runIndex = nombre de fois que ce step a déjà été visité dans l'historique\n // (0 = premier passage, 1 = deuxième, …).\n // On compte les occurrences de (templateIndex + 1) dans stepHistory,\n // minus 1 car le step courant est déjà dans l'historique.\n const currentStep = templateIndex + 1;\n const visitCount = stepHistory.filter((s) => s === currentStep).length;\n const runIndex = Math.max(0, visitCount - 1);\n\n // Pré-remplissage multi-ENTITÉS : si _list présent, utiliser _list[runIndex]\n // (ou {} hors borne). L'énumération de plusieurs entités successives passe\n // exclusivement par _list (cf. docs/multi-runs.md).\n // Sans _list : on pré-remplit TOUJOURS depuis le userInput persisté — y compris\n // sur une ré-entrée (boucle condition de correction, retour arrière, bouton\n // \"Corriger ma saisie\"). Une ré-entrée sans _list = corriger les MÊMES données,\n // pas en saisir de nouvelles → on ne doit pas vider le formulaire.\n const hasList = Array.isArray(\n (session.userInput as Record<string, unknown>)?._list,\n );\n let initialUserInput: UserInput;\n if (hasList) {\n const prefill = getRunPrefillData(\n session.userInput as Record<string, unknown>,\n runIndex,\n );\n initialUserInput = (prefill ?? {}) as UserInput;\n } else {\n initialUserInput = userInput;\n }\n return (\n // key={node.id} : remonte le formulaire à chaque changement de nœud, pour\n // qu'il se ré-initialise depuis initialUserInput (comportement \"refresh sans\n // refresh\"). Évite la réutilisation d'instance qui laissait customFormData\n // périmé au retour arrière entre deux nœuds information-input.\n <UserInputForm\n key={node.id}\n stepObject={stepObject}\n node={node}\n template={session.template}\n setUserInput={setUserInput}\n initialUserInput={initialUserInput}\n contactInfo={contactInfo}\n setContactInfo={setContactInfo}\n sessionId={sessionId}\n />\n );\n }\n\n case \"document-collection\": {\n return (\n <DocumentCollection\n key={`doc-collection-${templateIndex}`}\n node={node as NodeDocumentCollection}\n stepObject={stepObject}\n sessionId={sessionId}\n template={session.template}\n onContinueOnPC={onContinueOnPC}\n allowedDocumentTypes={(node.allowedDocumentTypes || []).map(\n (docType: any) => ({\n ...docType,\n side:\n typeof docType.side === \"string\" ||\n typeof docType.side === \"number\"\n ? (docType.side as DocumentTypeSide)\n : undefined,\n }),\n )}\n allowedAddingMethods={node.allowedAddingMethods || [\"download\"]}\n introductionPage={node.introductionPage}\n documentSelection={node.documentSelection}\n allowResubmission={node.allowResubmission}\n maxResubmissionAttempts={node.maxResubmissionAttempts}\n countryCode={userInput?.countryCode}\n />\n );\n }\n\n case \"document-selection\":\n case \"controle-jdi\": {\n if (!node.requiredDocumentType) {\n console.error(\n \"Missing requiredDocumentType in document-selection node:\",\n node,\n );\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-red-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600 mb-2\">\n Erreur de configuration\n </h2>\n <p className=\"text-gray-600 mb-4\">\n Le type de document requis n'est pas spécifié dans le template.\n </p>\n <button\n className=\"px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n onClick={() => stepObject.setStep(0)}\n >\n Recommencer\n </button>\n </div>\n );\n }\n\n // Determine if current device is mobile for capture method\n const isMobile =\n /Android|iPhone|iPad|iPod|Opera Mini|IEMobile|WPDesktop/i.test(\n navigator.userAgent,\n );\n\n return (\n <DocumentCheck\n key={`doc-check-${templateIndex}`}\n stepObject={stepObject}\n node={node as NodeIdentityControl}\n sessionId={sessionId}\n documentTypeId={node.requiredDocumentType}\n acceptedCountries={node.acceptedCountries}\n onContinueOnPC={onContinueOnPC}\n isMobileCapture={isMobileTemplate && isMobile}\n allowedAddingMethods={\n node.allowedAddingMethods || [\"download\", \"picture\"]\n }\n template={session.template}\n templateIndex={templateIndex}\n setUserInput={setUserInput}\n />\n );\n // }\n }\n\n case \"biometric-capture\":\n case \"selfie-capture\":\n return (\n <Selfie\n key={`selfie-${templateIndex}`}\n stepObject={stepObject}\n sessionId={sessionId}\n node={node}\n template={session.template}\n />\n );\n\n case \"signature-electronic\":\n return (\n <SignatureElectronic\n key={`signature-${templateIndex}`}\n sessionId={sessionId}\n stepObject={stepObject}\n node={node}\n session={session}\n title={node.title}\n description={node.description}\n // Always pass a stable node identifier so backend can resolve\n // either a static DocuSeal template OR a generated PDF source.\n external_id={node.templateId || node.external_id || node.id}\n fieldMappings={node.fieldMappings}\n userInput={userInput}\n contactInfo={contactInfo}\n />\n );\n\n case \"video-capture\":\n console.log(\"🎥 Rendering Video Work in Progress component\");\n return <VideoWorkInProgress onContinue={onContinueOnPC} />;\n\n case \"jdd\":\n console.log(\"🚧 Rendering JDD Work in Progress component\");\n return <JDDWorkInProgress onContinue={onContinueOnPC} />;\n\n case \"age-control\":\n return (\n <AgeControl\n key={`age-control-${templateIndex}`}\n sessionId={sessionId}\n node={node}\n stepObject={stepObject}\n template={session.template}\n countryCode={userInput?.countryCode}\n />\n );\n\n case \"condition\":\n console.debug(\"🔀 Rendering Condition Node Handler component and well\");\n return (\n <ConditionNodeHandler\n node={node}\n session={session}\n templateNodes={templateNodes}\n stepObject={stepObject}\n userInput={userInput}\n contactInfo={contactInfo}\n />\n );\n\n case \"external-verification\":\n console.debug(\"🔍 Rendering External Verification Node Handler\");\n return (\n <ExternalVerificationNodeHandler\n node={node}\n session={session}\n userInput={userInput}\n setUserInput={setUserInput}\n onNext={() => stepObject.goToNextStep(node.id, session.template)}\n onPrevious={() => stepObject.goBack()}\n onNavigateToNode={(nodeId: string) => {\n const idx = templateNodes.findIndex((n: any) => n.id === nodeId);\n // idx est 0-based, les steps sont 1-based → idx + 1.\n // goBackToStep tronque l'historique pour que le nœud corrigé\n // redevienne runIndex 0 (formulaire pré-rempli).\n if (idx !== -1) stepObject.goBackToStep(idx + 1);\n else stepObject.goBack();\n }}\n />\n );\n\n case \"pdf-generation\":\n console.debug(\"📄 Rendering PDF Generation component\");\n return (\n <PdfGeneration\n key={`pdf-generation-${templateIndex}`}\n node={node}\n session={session}\n sessionId={sessionId}\n stepObject={stepObject}\n userInput={userInput}\n />\n );\n\n case \"legal-consent\":\n return (\n <LegalConsentNode\n node={node}\n session={session}\n sessionId={sessionId}\n stepObject={stepObject}\n />\n );\n\n case \"custom\":\n // For custom nodes, we provide a basic structure that can be extended\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-blue-500 text-4xl mb-4\">🔧</div>\n <h2 className=\"text-xl font-bold text-blue-600 mb-2\">\n Nœud personnalisé\n </h2>\n <p className=\"text-gray-600 mb-4\">\n Implémentation personnalisée requise pour: \"{node.title || node.id}\"\n </p>\n <div className=\"bg-blue-50 border border-blue-200 rounded p-3 text-left text-sm mb-4 max-w-md\">\n <p className=\"font-semibold text-blue-700 mb-2\">\n Configuration du nœud:\n </p>\n <pre className=\"text-xs overflow-auto max-h-32\">\n {JSON.stringify(\n {\n id: node.id,\n title: node.title,\n description: node.description,\n options: node.options,\n selectedOptions: node.selectedOptions,\n },\n null,\n 2,\n )}\n </pre>\n </div>\n <button\n className=\"px-4 py-2 bg-blue-600 text-white rounded hover:bg-blue-700 transition-colors\"\n onClick={() => {\n console.log(\"Custom node action:\", node);\n stepObject.goToNextStep(node.id, session.template);\n }}\n >\n {t(\"template.buttons.continue\")}\n </button>\n </div>\n );\n\n default:\n console.warn(`❌ Type de nœud non supporté: ${node.type}`, node);\n console.log(\"❓ Available supported types:\", [\n \"end\",\n \"information-input\",\n \"document-collection\",\n \"document-selection\",\n \"document-upload\",\n \"controle-jdi\",\n \"selfie-capture\",\n \"video-capture\",\n \"country-selection\",\n \"identity-control\",\n \"age-control\",\n \"jdd\",\n \"condition\",\n \"custom\",\n ]);\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-4 text-center\">\n <div className=\"text-yellow-500 text-4xl mb-4\">⚠️</div>\n <h2 className=\"text-xl font-bold text-yellow-600 mb-2\">\n Étape non supportée\n </h2>\n <p className=\"text-gray-600 mb-4\">\n Le type d'étape \"{node.type}\" n'est pas pris en charge.\n </p>\n <div className=\"bg-gray-100 p-4 rounded mb-4 text-left text-xs overflow-auto max-h-32\">\n <pre>{JSON.stringify(node, null, 2)}</pre>\n </div>\n <button\n className=\"px-4 py-2 bg-primary text-white rounded hover:bg-primary-dark transition-colors\"\n onClick={() => {\n stepObject.goToNextStep(node.id, session.template);\n }}\n >\n {t(\"template.buttons.continue\")}\n </button>\n </div>\n );\n }\n};\n\nexport default TemplateNodeRenderer;\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
|
+
import { useI18n } from '../../hooks/useI18n.js';
|
|
4
|
+
import { fetchWallets } from '../../services/sessionService.js';
|
|
5
|
+
import WalletProposal from './WalletProposal.js';
|
|
6
|
+
import WalletVerificationStep from './WalletVerificationStep.js';
|
|
7
|
+
import Button from '../ui/Button.js';
|
|
8
|
+
import ButtonDesktop from '../ui/ButtonDesktop.js';
|
|
9
|
+
import useIsMobile from '../../hooks/useIsMobile.js';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Nœud de vérification d'âge par wallet (eu.europa.ec.av.1) — cf.
|
|
13
|
+
* docs/WALLET_OID4VP_IMPLEMENTATION_PLAN.md §5.5/§7. Contrairement à
|
|
14
|
+
* identity-control, ce nœud est intrinsèquement wallet-first : pas de bascule
|
|
15
|
+
* "walletEnabled", le wallet est tenté systématiquement s'il est disponible
|
|
16
|
+
* pour le pays connu, avec repli automatique et silencieux (§5.5 : "pas de
|
|
17
|
+
* refus explicite") sinon.
|
|
18
|
+
*
|
|
19
|
+
* L'estimation d'âge Unissey de repli n'existe pas encore comme flux dédié
|
|
20
|
+
* dans le SDK (aucun nœud de ce type n'était actif avant cette phase) — le
|
|
21
|
+
* repli affiche donc un écran "en construction" (même patron que
|
|
22
|
+
* JDDWorkInProgress) plutôt que d'improviser un flux non spécifié.
|
|
23
|
+
*/
|
|
24
|
+
var AgeControl = function (_a) {
|
|
25
|
+
var _b, _c, _d;
|
|
26
|
+
var sessionId = _a.sessionId, node = _a.node, stepObject = _a.stepObject, template = _a.template, countryCode = _a.countryCode;
|
|
27
|
+
var t = useI18n().t;
|
|
28
|
+
var isMobile = useIsMobile();
|
|
29
|
+
var _e = useState("checking"), state = _e[0], setState = _e[1];
|
|
30
|
+
useEffect(function () {
|
|
31
|
+
var cancelled = false;
|
|
32
|
+
if (!countryCode) {
|
|
33
|
+
setState("fallback");
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
fetchWallets(countryCode, "age_verification")
|
|
37
|
+
.then(function (wallets) {
|
|
38
|
+
if (!cancelled)
|
|
39
|
+
setState(wallets.length > 0 ? "proposal" : "fallback");
|
|
40
|
+
})
|
|
41
|
+
.catch(function () {
|
|
42
|
+
if (!cancelled)
|
|
43
|
+
setState("fallback");
|
|
44
|
+
});
|
|
45
|
+
return function () {
|
|
46
|
+
cancelled = true;
|
|
47
|
+
};
|
|
48
|
+
}, [countryCode]);
|
|
49
|
+
var advance = function () {
|
|
50
|
+
if (template) {
|
|
51
|
+
stepObject.goToNextStep(node.id, template);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
stepObject.setStep(stepObject.step + 1);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
if (state === "checking") {
|
|
58
|
+
return (jsx("div", { className: "flex flex-col items-center justify-center h-full p-8", children: jsx("div", { className: "animate-spin w-10 h-10 border-2 border-gray-300 border-t-blue-500 rounded-full" }) }));
|
|
59
|
+
}
|
|
60
|
+
if (state === "proposal") {
|
|
61
|
+
return (jsx(WalletProposal, { walletMode: "walletOrPhoto", onUseWallet: function () { return setState("verifying"); }, onDecline: function () { return setState("fallback"); } }));
|
|
62
|
+
}
|
|
63
|
+
if (state === "verifying") {
|
|
64
|
+
return (jsx(WalletVerificationStep, { sessionId: sessionId, nodeId: node.id, credentialType: "age_verification", walletMode: "walletOrPhoto", minimumAge: (_b = node.minimumAge) !== null && _b !== void 0 ? _b : 18, onCompleted: advance, onFailedOrDeclined: function () { return setState("fallback"); }, pageTitle: (_c = node.introductionPage) === null || _c === void 0 ? void 0 : _c.title, pageDescription: (_d = node.introductionPage) === null || _d === void 0 ? void 0 : _d.description }));
|
|
65
|
+
}
|
|
66
|
+
// fallback — wallet non disponible / décliné / échoué : repli silencieux
|
|
67
|
+
return (jsxs("div", { className: "flex flex-col justify-between h-full w-full", children: [jsx("div", { className: "flex-1 flex items-start justify-center md:items-center px-4 py-8", children: jsxs("div", { className: "w-full max-w-md mx-auto text-center space-y-6", children: [jsx("h1", { className: "text-2xl md:text-3xl font-bold text-gray-800 mb-4", children: t("age_control.fallback.title", "Vérification d'âge") }), jsx("p", { className: "text-gray-600 text-lg mb-6", children: t("age_control.fallback.subtitle", "Cette vérification sera complétée automatiquement à l'étape suivante.") })] }) }), jsx("div", { className: "flex-shrink-0 p-4 border-t border-gray-200 bg-white", children: isMobile ? (jsx("div", { className: "w-full", "data-cy": "age-control-continue", children: jsx(Button, { onClick: advance, className: "w-full py-3", children: t("age_control.fallback.continue", "Continuer") }) })) : (jsx("div", { className: "flex justify-end max-w-4xl mx-auto", "data-cy": "age-control-continue", children: jsx(ButtonDesktop, { onClick: advance, type: "continue", children: t("age_control.fallback.continue", "Continuer") }) })) })] }));
|
|
68
|
+
};
|
|
69
|
+
|
|
70
|
+
export { AgeControl as default };
|
|
71
|
+
//# sourceMappingURL=AgeControl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AgeControl.js","sources":["../../../../../src/components/wallet/AgeControl.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport type { SessionTemplate, stepObject } from \"../../types/session\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport { fetchWallets } from \"../../services/sessionService\";\nimport WalletProposal from \"./WalletProposal\";\nimport WalletVerificationStep from \"./WalletVerificationStep\";\nimport Button from \"../ui/Button\";\nimport ButtonDesktop from \"../ui/ButtonDesktop\";\nimport useIsMobile from \"../../hooks/useIsMobile\";\n\ninterface AgeControlNode {\n id: string;\n minimumAge?: number;\n introductionPage?: {\n title?: string;\n description?: string;\n };\n}\n\ninterface AgeControlProps {\n sessionId: string;\n node: AgeControlNode;\n stepObject: stepObject;\n template?: SessionTemplate;\n /** Pays de l'utilisateur, connu si un nœud identity-control précède ce nœud dans le parcours. */\n countryCode?: string;\n}\n\ntype AgeControlState = \"checking\" | \"proposal\" | \"verifying\" | \"fallback\";\n\n/**\n * Nœud de vérification d'âge par wallet (eu.europa.ec.av.1) — cf.\n * docs/WALLET_OID4VP_IMPLEMENTATION_PLAN.md §5.5/§7. Contrairement à\n * identity-control, ce nœud est intrinsèquement wallet-first : pas de bascule\n * \"walletEnabled\", le wallet est tenté systématiquement s'il est disponible\n * pour le pays connu, avec repli automatique et silencieux (§5.5 : \"pas de\n * refus explicite\") sinon.\n *\n * L'estimation d'âge Unissey de repli n'existe pas encore comme flux dédié\n * dans le SDK (aucun nœud de ce type n'était actif avant cette phase) — le\n * repli affiche donc un écran \"en construction\" (même patron que\n * JDDWorkInProgress) plutôt que d'improviser un flux non spécifié.\n */\nconst AgeControl: React.FC<AgeControlProps> = ({\n sessionId,\n node,\n stepObject,\n template,\n countryCode,\n}) => {\n const { t } = useI18n();\n const isMobile = useIsMobile();\n const [state, setState] = useState<AgeControlState>(\"checking\");\n\n useEffect(() => {\n let cancelled = false;\n if (!countryCode) {\n setState(\"fallback\");\n return;\n }\n fetchWallets(countryCode, \"age_verification\")\n .then((wallets) => {\n if (!cancelled) setState(wallets.length > 0 ? \"proposal\" : \"fallback\");\n })\n .catch(() => {\n if (!cancelled) setState(\"fallback\");\n });\n return () => {\n cancelled = true;\n };\n }, [countryCode]);\n\n const advance = () => {\n if (template) {\n stepObject.goToNextStep(node.id, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n };\n\n if (state === \"checking\") {\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-8\">\n <div className=\"animate-spin w-10 h-10 border-2 border-gray-300 border-t-blue-500 rounded-full\" />\n </div>\n );\n }\n\n if (state === \"proposal\") {\n return (\n <WalletProposal\n walletMode=\"walletOrPhoto\"\n onUseWallet={() => setState(\"verifying\")}\n onDecline={() => setState(\"fallback\")}\n />\n );\n }\n\n if (state === \"verifying\") {\n return (\n <WalletVerificationStep\n sessionId={sessionId}\n nodeId={node.id}\n credentialType=\"age_verification\"\n walletMode=\"walletOrPhoto\"\n minimumAge={node.minimumAge ?? 18}\n onCompleted={advance}\n onFailedOrDeclined={() => setState(\"fallback\")}\n pageTitle={node.introductionPage?.title}\n pageDescription={node.introductionPage?.description}\n />\n );\n }\n\n // fallback — wallet non disponible / décliné / échoué : repli silencieux\n return (\n <div className=\"flex flex-col justify-between h-full w-full\">\n <div className=\"flex-1 flex items-start justify-center md:items-center px-4 py-8\">\n <div className=\"w-full max-w-md mx-auto text-center space-y-6\">\n <h1 className=\"text-2xl md:text-3xl font-bold text-gray-800 mb-4\">\n {t(\"age_control.fallback.title\", \"Vérification d'âge\")}\n </h1>\n <p className=\"text-gray-600 text-lg mb-6\">\n {t(\n \"age_control.fallback.subtitle\",\n \"Cette vérification sera complétée automatiquement à l'étape suivante.\",\n )}\n </p>\n </div>\n </div>\n <div className=\"flex-shrink-0 p-4 border-t border-gray-200 bg-white\">\n {isMobile ? (\n <div className=\"w-full\" data-cy=\"age-control-continue\">\n <Button onClick={advance} className=\"w-full py-3\">\n {t(\"age_control.fallback.continue\", \"Continuer\")}\n </Button>\n </div>\n ) : (\n <div className=\"flex justify-end max-w-4xl mx-auto\" data-cy=\"age-control-continue\">\n <ButtonDesktop onClick={advance} type=\"continue\">\n {t(\"age_control.fallback.continue\", \"Continuer\")}\n </ButtonDesktop>\n </div>\n )}\n </div>\n </div>\n );\n};\n\nexport default AgeControl;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import Title from '../ui/Title.js';
|
|
3
|
+
import Subtitle from '../ui/Subtitle.js';
|
|
4
|
+
import Button from '../ui/Button.js';
|
|
5
|
+
import PageActions from '../ui/PageActions.js';
|
|
6
|
+
import MobilePageLayout from '../ui/MobilePageLayout.js';
|
|
7
|
+
import { useI18n } from '../../hooks/useI18n.js';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Écran de proposition d'identification par wallet d'identité européen
|
|
11
|
+
* (OpenID4VP), affiché uniquement quand un wallet compatible existe pour le
|
|
12
|
+
* pays et le document choisis (cf. GET /backend/wallets). Modèle : NfcChipGate.
|
|
13
|
+
*/
|
|
14
|
+
var WalletProposal = function (_a) {
|
|
15
|
+
var onUseWallet = _a.onUseWallet, onDecline = _a.onDecline, walletMode = _a.walletMode;
|
|
16
|
+
var t = useI18n().t;
|
|
17
|
+
return (jsx(MobilePageLayout, { footer: jsx(PageActions, { className: "flex-wrap justify-center!", primary: jsx(Button, { onClick: onUseWallet, children: t("wallet.proposal.use_wallet", "Utiliser mon wallet") }), secondary: jsx(Button, { variant: "secondary", onClick: onDecline, className: "whitespace-nowrap", children: walletMode === "walletOrPhoto"
|
|
18
|
+
? t("wallet.proposal.decline_photo", "Continuer avec une photo")
|
|
19
|
+
: t("wallet.proposal.decline_no_wallet", "Je n'ai pas de wallet") }) }), children: jsx("div", { className: "px-4 py-6 pt-11 md:px-8 md:py-8", children: jsx("div", { className: "w-full max-w-md mx-auto space-y-8 text-center", children: jsxs("div", { className: "space-y-4", children: [jsx(Title, { className: "text-xl md:text-2xl lg:text-3xl", children: t("wallet.proposal.title", "Identifiez-vous avec votre wallet d'identité") }), jsx(Subtitle, { className: "text-sm text-gray-600 leading-relaxed whitespace-pre-line", children: t("wallet.proposal.subtitle", "Un wallet d'identité européen est disponible pour ce document. Vous pouvez vous identifier en ligne, sans prendre de photo.") })] }) }) }) }));
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export { WalletProposal as default };
|
|
23
|
+
//# sourceMappingURL=WalletProposal.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WalletProposal.js","sources":["../../../../../src/components/wallet/WalletProposal.tsx"],"sourcesContent":["import React from \"react\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport Button from \"../ui/Button\";\nimport PageActions from \"../ui/PageActions\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport { useI18n } from \"../../hooks/useI18n\";\n\ninterface WalletProposalProps {\n /** L'utilisateur choisit de s'identifier par wallet → écran QR/deep-link */\n onUseWallet: () => void;\n /** L'utilisateur décline (photo si walletOrPhoto, saut du nœud si walletOnly) */\n onDecline: () => void;\n /** walletOnly : pas d'alternative photo, le libellé du bouton secondaire change */\n walletMode: \"walletOnly\" | \"walletOrPhoto\";\n}\n\n/**\n * Écran de proposition d'identification par wallet d'identité européen\n * (OpenID4VP), affiché uniquement quand un wallet compatible existe pour le\n * pays et le document choisis (cf. GET /backend/wallets). Modèle : NfcChipGate.\n */\nconst WalletProposal = ({ onUseWallet, onDecline, walletMode }: WalletProposalProps) => {\n const { t } = useI18n();\n\n return (\n <MobilePageLayout\n footer={\n <PageActions\n className=\"flex-wrap justify-center!\"\n primary={\n <Button onClick={onUseWallet}>\n {t(\"wallet.proposal.use_wallet\", \"Utiliser mon wallet\")}\n </Button>\n }\n secondary={\n <Button\n variant=\"secondary\"\n onClick={onDecline}\n className=\"whitespace-nowrap\"\n >\n {walletMode === \"walletOrPhoto\"\n ? t(\"wallet.proposal.decline_photo\", \"Continuer avec une photo\")\n : t(\"wallet.proposal.decline_no_wallet\", \"Je n'ai pas de wallet\")}\n </Button>\n }\n />\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-8 text-center\">\n <div className=\"space-y-4\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl\">\n {t(\n \"wallet.proposal.title\",\n \"Identifiez-vous avec votre wallet d'identité\",\n )}\n </Title>\n <Subtitle className=\"text-sm text-gray-600 leading-relaxed whitespace-pre-line\">\n {t(\n \"wallet.proposal.subtitle\",\n \"Un wallet d'identité européen est disponible pour ce document. Vous pouvez vous identifier en ligne, sans prendre de photo.\",\n )}\n </Subtitle>\n </div>\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default WalletProposal;\n"],"names":["_jsx","_jsxs"],"mappings":";;;;;;;;AAiBA;;;;AAIG;AACH,IAAM,cAAc,GAAG,UAAC,EAA2D,EAAA;AAAzD,IAAA,IAAA,WAAW,iBAAA,EAAE,SAAS,GAAA,EAAA,CAAA,SAAA,EAAE,UAAU,GAAA,EAAA,CAAA,UAAA;AAClD,IAAA,IAAA,CAAC,GAAK,OAAO,EAAE,EAAd;IAET,QACEA,IAAC,gBAAgB,EAAA,EACf,MAAM,EACJA,GAAA,CAAC,WAAW,EAAA,EACV,SAAS,EAAC,2BAA2B,EACrC,OAAO,EACLA,GAAA,CAAC,MAAM,IAAC,OAAO,EAAE,WAAW,EAAA,QAAA,EACzB,CAAC,CAAC,4BAA4B,EAAE,qBAAqB,CAAC,EAAA,CAChD,EAEX,SAAS,EACPA,GAAA,CAAC,MAAM,EAAA,EACL,OAAO,EAAC,WAAW,EACnB,OAAO,EAAE,SAAS,EAClB,SAAS,EAAC,mBAAmB,EAAA,QAAA,EAE5B,UAAU,KAAK;AACd,sBAAE,CAAC,CAAC,+BAA+B,EAAE,0BAA0B;sBAC7D,CAAC,CAAC,mCAAmC,EAAE,uBAAuB,CAAC,EAAA,CAC5D,EAAA,CAEX,EAAA,QAAA,EAGJA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,iCAAiC,EAAA,QAAA,EAC9CA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,+CAA+C,EAAA,QAAA,EAC5DC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,WAAW,EAAA,QAAA,EAAA,CACxBD,GAAA,CAAC,KAAK,EAAA,EAAC,SAAS,EAAC,iCAAiC,EAAA,QAAA,EAC/C,CAAC,CACA,uBAAuB,EACvB,8CAA8C,CAC/C,EAAA,CACK,EACRA,GAAA,CAAC,QAAQ,EAAA,EAAC,SAAS,EAAC,2DAA2D,EAAA,QAAA,EAC5E,CAAC,CACA,0BAA0B,EAC1B,6HAA6H,CAC9H,EAAA,CACQ,CAAA,EAAA,CACP,EAAA,CACF,EAAA,CACF,EAAA,CACW;AAEvB;;;;"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { useState, useEffect } from 'react';
|
|
3
|
+
import { useI18n } from '../../hooks/useI18n.js';
|
|
4
|
+
|
|
5
|
+
/** Même animation visuelle que NfcSuccessAnimation, avec un libellé adapté au wallet. */
|
|
6
|
+
var WalletSuccessAnimation = function () {
|
|
7
|
+
var t = useI18n().t;
|
|
8
|
+
var _a = useState(false), visible = _a[0], setVisible = _a[1];
|
|
9
|
+
useEffect(function () {
|
|
10
|
+
var id = requestAnimationFrame(function () { return setVisible(true); });
|
|
11
|
+
return function () { return cancelAnimationFrame(id); };
|
|
12
|
+
}, []);
|
|
13
|
+
return (jsxs("div", { className: "flex flex-col items-center gap-6 p-8", style: {
|
|
14
|
+
opacity: visible ? 1 : 0,
|
|
15
|
+
transform: visible ? "scale(1)" : "scale(0.85)",
|
|
16
|
+
transition: "opacity 0.4s ease, transform 0.4s ease",
|
|
17
|
+
}, children: [jsxs("div", { style: { position: "relative", width: 72, height: 72, flexShrink: 0 }, children: [jsx("div", { style: {
|
|
18
|
+
position: "absolute",
|
|
19
|
+
inset: 0,
|
|
20
|
+
borderRadius: "50%",
|
|
21
|
+
backgroundColor: "var(--uni-primary-color, #11e5c5)",
|
|
22
|
+
transformOrigin: "center center",
|
|
23
|
+
animation: "wallet-pulse 1.6s ease-out infinite",
|
|
24
|
+
pointerEvents: "none",
|
|
25
|
+
} }), jsxs("svg", { width: 72, height: 72, viewBox: "0 0 72 72", fill: "none", xmlns: "http://www.w3.org/2000/svg", "aria-hidden": "true", children: [jsx("circle", { cx: 36, cy: 36, r: 34, fill: "var(--uni-primary-color, #11e5c5)", style: { opacity: visible ? 1 : 0, transition: "opacity 0.3s ease 0.1s" } }), jsx("polyline", { points: "20,37 30,47 52,25", stroke: "#ffffff", strokeWidth: 5, strokeLinecap: "round", strokeLinejoin: "round", fill: "none", style: {
|
|
26
|
+
strokeDasharray: 50,
|
|
27
|
+
strokeDashoffset: visible ? 0 : 50,
|
|
28
|
+
transition: "stroke-dashoffset 0.45s cubic-bezier(0.4, 0, 0.2, 1) 0.35s",
|
|
29
|
+
} })] })] }), jsxs("div", { className: "text-center space-y-1", children: [jsx("p", { className: "font-semibold text-base", style: { color: "var(--uni-secondary-color, #0a9983)" }, children: t("wallet.verification.success_title", "Identité vérifiée") }), jsx("p", { className: "text-sm text-gray-500", children: t("wallet.verification.success_subtitle", "Vérification par wallet confirmée avec succès") })] }), jsx("style", { children: "\n @keyframes wallet-pulse {\n 0% { transform: scale(1); opacity: 0.25; }\n 70% { transform: scale(1.65); opacity: 0.05; }\n 100% { transform: scale(1.65); opacity: 0; }\n }\n " })] }));
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
export { WalletSuccessAnimation as default };
|
|
33
|
+
//# sourceMappingURL=WalletSuccessAnimation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WalletSuccessAnimation.js","sources":["../../../../../src/components/wallet/WalletSuccessAnimation.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport { useI18n } from \"../../hooks/useI18n\";\n\n/** Même animation visuelle que NfcSuccessAnimation, avec un libellé adapté au wallet. */\nconst WalletSuccessAnimation: React.FC = () => {\n const { t } = useI18n();\n const [visible, setVisible] = useState(false);\n\n useEffect(() => {\n const id = requestAnimationFrame(() => setVisible(true));\n return () => cancelAnimationFrame(id);\n }, []);\n\n return (\n <div\n className=\"flex flex-col items-center gap-6 p-8\"\n style={{\n opacity: visible ? 1 : 0,\n transform: visible ? \"scale(1)\" : \"scale(0.85)\",\n transition: \"opacity 0.4s ease, transform 0.4s ease\",\n }}\n >\n <div style={{ position: \"relative\", width: 72, height: 72, flexShrink: 0 }}>\n <div\n style={{\n position: \"absolute\",\n inset: 0,\n borderRadius: \"50%\",\n backgroundColor: \"var(--uni-primary-color, #11e5c5)\",\n transformOrigin: \"center center\",\n animation: \"wallet-pulse 1.6s ease-out infinite\",\n pointerEvents: \"none\",\n }}\n />\n <svg\n width={72}\n height={72}\n viewBox=\"0 0 72 72\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n aria-hidden=\"true\"\n >\n <circle\n cx={36}\n cy={36}\n r={34}\n fill=\"var(--uni-primary-color, #11e5c5)\"\n style={{ opacity: visible ? 1 : 0, transition: \"opacity 0.3s ease 0.1s\" }}\n />\n <polyline\n points=\"20,37 30,47 52,25\"\n stroke=\"#ffffff\"\n strokeWidth={5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n fill=\"none\"\n style={{\n strokeDasharray: 50,\n strokeDashoffset: visible ? 0 : 50,\n transition: \"stroke-dashoffset 0.45s cubic-bezier(0.4, 0, 0.2, 1) 0.35s\",\n }}\n />\n </svg>\n </div>\n\n <div className=\"text-center space-y-1\">\n <p\n className=\"font-semibold text-base\"\n style={{ color: \"var(--uni-secondary-color, #0a9983)\" }}\n >\n {t(\"wallet.verification.success_title\", \"Identité vérifiée\")}\n </p>\n <p className=\"text-sm text-gray-500\">\n {t(\"wallet.verification.success_subtitle\", \"Vérification par wallet confirmée avec succès\")}\n </p>\n </div>\n\n <style>{`\n @keyframes wallet-pulse {\n 0% { transform: scale(1); opacity: 0.25; }\n 70% { transform: scale(1.65); opacity: 0.05; }\n 100% { transform: scale(1.65); opacity: 0; }\n }\n `}</style>\n </div>\n );\n};\n\nexport default WalletSuccessAnimation;\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { __awaiter, __generator } from '../../node_modules/tslib/tslib.es6.js';
|
|
2
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
3
|
+
import { useRef, useState, useMemo, useEffect } from 'react';
|
|
4
|
+
import QRCode from 'qrcode';
|
|
5
|
+
import { useI18n } from '../../hooks/useI18n.js';
|
|
6
|
+
import { useWalletSseStatus } from '../../hooks/useWalletSseStatus.js';
|
|
7
|
+
import { getBaseURL } from '../../services/api.js';
|
|
8
|
+
import { startWalletVerification } from '../../services/sessionService.js';
|
|
9
|
+
import { isMobileDevice } from '../../utils/isMobileDevice.js';
|
|
10
|
+
import MobilePageLayout from '../ui/MobilePageLayout.js';
|
|
11
|
+
import Button from '../ui/Button.js';
|
|
12
|
+
import Title from '../ui/Title.js';
|
|
13
|
+
import Subtitle from '../ui/Subtitle.js';
|
|
14
|
+
import WalletSuccessAnimation from './WalletSuccessAnimation.js';
|
|
15
|
+
|
|
16
|
+
var WalletVerificationStep = function (_a) {
|
|
17
|
+
var sessionId = _a.sessionId, nodeId = _a.nodeId, credentialType = _a.credentialType, walletMode = _a.walletMode, minimumAge = _a.minimumAge, onCompleted = _a.onCompleted, onFailedOrDeclined = _a.onFailedOrDeclined, pageTitle = _a.pageTitle, pageDescription = _a.pageDescription;
|
|
18
|
+
var t = useI18n().t;
|
|
19
|
+
var canvasRef = useRef(null);
|
|
20
|
+
var _b = useState(null), qrError = _b[0], setQrError = _b[1];
|
|
21
|
+
var _c = useState(null), deepLink = _c[0], setDeepLink = _c[1];
|
|
22
|
+
var _d = useState(null), startError = _d[0], setStartError = _d[1];
|
|
23
|
+
var isMobile = useMemo(function () { return isMobileDevice(); }, []);
|
|
24
|
+
var apiBaseUrl = useMemo(function () { return getBaseURL(); }, []);
|
|
25
|
+
useEffect(function () {
|
|
26
|
+
var cancelled = false;
|
|
27
|
+
(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
28
|
+
var result, error_1;
|
|
29
|
+
return __generator(this, function (_a) {
|
|
30
|
+
switch (_a.label) {
|
|
31
|
+
case 0:
|
|
32
|
+
_a.trys.push([0, 2, , 3]);
|
|
33
|
+
return [4 /*yield*/, startWalletVerification(sessionId, {
|
|
34
|
+
nodeId: nodeId,
|
|
35
|
+
credentialType: credentialType,
|
|
36
|
+
minimumAge: minimumAge,
|
|
37
|
+
})];
|
|
38
|
+
case 1:
|
|
39
|
+
result = _a.sent();
|
|
40
|
+
if (!cancelled)
|
|
41
|
+
setDeepLink(result.deepLink);
|
|
42
|
+
return [3 /*break*/, 3];
|
|
43
|
+
case 2:
|
|
44
|
+
error_1 = _a.sent();
|
|
45
|
+
console.error("Failed to start wallet verification:", error_1);
|
|
46
|
+
if (!cancelled) {
|
|
47
|
+
setStartError(t("wallet.verification.start_failed", "Impossible de démarrer la vérification par wallet."));
|
|
48
|
+
}
|
|
49
|
+
return [3 /*break*/, 3];
|
|
50
|
+
case 3: return [2 /*return*/];
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
}); })();
|
|
54
|
+
return function () {
|
|
55
|
+
cancelled = true;
|
|
56
|
+
};
|
|
57
|
+
}, [sessionId, nodeId, credentialType, minimumAge, t]);
|
|
58
|
+
var status = useWalletSseStatus({
|
|
59
|
+
sessionId: sessionId,
|
|
60
|
+
apiBaseUrl: apiBaseUrl,
|
|
61
|
+
onCompleted: onCompleted,
|
|
62
|
+
}).status;
|
|
63
|
+
// Sur mobile : ouvrir directement l'app wallet via le deep-link openid4vp://,
|
|
64
|
+
// une seule fois, tant que la vérification n'a pas progressé.
|
|
65
|
+
var hasRedirectedRef = useRef(false);
|
|
66
|
+
useEffect(function () {
|
|
67
|
+
if (!isMobile || !deepLink || status !== "pending" || hasRedirectedRef.current)
|
|
68
|
+
return;
|
|
69
|
+
hasRedirectedRef.current = true;
|
|
70
|
+
window.location.assign(deepLink);
|
|
71
|
+
}, [isMobile, deepLink, status]);
|
|
72
|
+
useEffect(function () {
|
|
73
|
+
if (isMobile)
|
|
74
|
+
return; // pas de QR sur mobile (redirection directe)
|
|
75
|
+
if (!deepLink || status !== "pending")
|
|
76
|
+
return;
|
|
77
|
+
var generate = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
78
|
+
var dataUrl, canvas_1, ctx_1, img_1;
|
|
79
|
+
return __generator(this, function (_b) {
|
|
80
|
+
switch (_b.label) {
|
|
81
|
+
case 0:
|
|
82
|
+
if (!canvasRef.current)
|
|
83
|
+
return [2 /*return*/];
|
|
84
|
+
setQrError(null);
|
|
85
|
+
_b.label = 1;
|
|
86
|
+
case 1:
|
|
87
|
+
_b.trys.push([1, 3, , 4]);
|
|
88
|
+
return [4 /*yield*/, QRCode.toDataURL(deepLink, {
|
|
89
|
+
width: 256,
|
|
90
|
+
margin: 2,
|
|
91
|
+
color: { dark: "#000000", light: "#FFFFFF" },
|
|
92
|
+
})];
|
|
93
|
+
case 2:
|
|
94
|
+
dataUrl = _b.sent();
|
|
95
|
+
canvas_1 = canvasRef.current;
|
|
96
|
+
ctx_1 = canvas_1.getContext("2d");
|
|
97
|
+
if (ctx_1) {
|
|
98
|
+
img_1 = new Image();
|
|
99
|
+
img_1.onload = function () {
|
|
100
|
+
canvas_1.width = img_1.width;
|
|
101
|
+
canvas_1.height = img_1.height;
|
|
102
|
+
ctx_1.drawImage(img_1, 0, 0);
|
|
103
|
+
};
|
|
104
|
+
img_1.src = dataUrl;
|
|
105
|
+
}
|
|
106
|
+
return [3 /*break*/, 4];
|
|
107
|
+
case 3:
|
|
108
|
+
_b.sent();
|
|
109
|
+
setQrError(t("qr_code.generation_failed", "Erreur de génération du QR code"));
|
|
110
|
+
return [3 /*break*/, 4];
|
|
111
|
+
case 4: return [2 /*return*/];
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
}); };
|
|
115
|
+
generate();
|
|
116
|
+
}, [deepLink, status, t, isMobile]);
|
|
117
|
+
var title = pageTitle || t("wallet.verification.page_title", "Identification par wallet");
|
|
118
|
+
var subtitle = pageDescription ||
|
|
119
|
+
t("wallet.verification.page_description", "Scannez le QR code ci-dessous avec votre wallet d'identité pour vous identifier en ligne.");
|
|
120
|
+
var declineLabel = walletMode === "walletOrPhoto"
|
|
121
|
+
? t("wallet.verification.continue_with_photo", "Continuer avec une photo")
|
|
122
|
+
: t("wallet.verification.skip", "Passer");
|
|
123
|
+
var footer = status === "failed" || startError ? (jsx(Button, { onClick: onFailedOrDeclined, children: declineLabel })) : null;
|
|
124
|
+
return (jsx(MobilePageLayout, { footer: footer, children: jsx("div", { className: "px-4 py-6 pt-11 md:px-8 md:py-8", children: jsxs("div", { className: "w-full max-w-md mx-auto space-y-6", children: [jsxs("div", { className: "text-center space-y-4 mt-16 md:mt-20", children: [jsx(Title, { className: "text-xl md:text-2xl lg:text-3xl", children: title }), jsx(Subtitle, { className: "text-sm md:text-base text-gray-600 leading-relaxed whitespace-pre-line", children: subtitle })] }), jsx("div", { className: "flex-1 flex justify-center items-center", children: startError ? (jsx("div", { className: "text-red-500 text-center p-4", "data-cy": "wallet-start-error", children: startError })) : status === "success" ? (jsx(WalletSuccessAnimation, {})) : status === "completed" ? (jsxs("div", { className: "flex flex-col items-center gap-4 p-8", children: [jsx("div", { className: "animate-spin w-10 h-10 border-2 border-gray-300 border-t-blue-500 rounded-full" }), jsx("p", { className: "text-sm text-gray-600", children: t("wallet.verification.verifying", "Vérification en cours…") })] })) : status === "failed" ? (jsx("div", { className: "w-full max-w-sm rounded-2xl border border-red-200 bg-red-50 p-6 text-center shadow-sm", "data-cy": "wallet-verification-failed", children: jsx("p", { className: "text-sm leading-relaxed text-red-700", children: t("wallet.verification.failed", "La vérification par wallet a échoué.") }) })) : qrError ? (jsx("div", { className: "text-red-500 text-center p-4", children: qrError })) : isMobile ? (jsxs("div", { className: "flex flex-col items-center gap-4 p-8 text-center", children: [jsx("div", { className: "animate-spin w-10 h-10 border-2 border-gray-300 border-t-blue-500 rounded-full" }), jsx("p", { className: "text-sm text-gray-600", children: t("wallet.verification.opening_app", "Ouverture du wallet…") }), deepLink && (jsx("a", { href: deepLink, className: "text-sm font-medium text-blue-600 underline", children: t("wallet.verification.open_app_link", "Ouvrir mon wallet") }))] })) : deepLink ? (jsx("div", { className: "bg-white p-4 rounded-lg shadow-lg border-2 border-gray-200", "data-cy": "wallet-qr-code", children: jsx("canvas", { ref: canvasRef }) })) : (jsx("div", { className: "flex flex-col items-center gap-4 p-8", children: jsx("div", { className: "animate-spin w-10 h-10 border-2 border-gray-300 border-t-blue-500 rounded-full" }) })) })] }) }) }));
|
|
125
|
+
};
|
|
126
|
+
|
|
127
|
+
export { WalletVerificationStep as default };
|
|
128
|
+
//# sourceMappingURL=WalletVerificationStep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WalletVerificationStep.js","sources":["../../../../../src/components/wallet/WalletVerificationStep.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport QRCode from \"qrcode\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport { useWalletSseStatus } from \"../../hooks/useWalletSseStatus\";\nimport { getBaseURL } from \"../../services/api\";\nimport { startWalletVerification } from \"../../services/sessionService\";\nimport { isMobileDevice } from \"../../utils/isMobileDevice\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport Button from \"../ui/Button\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport WalletSuccessAnimation from \"./WalletSuccessAnimation\";\n\nexport type WalletCredentialType =\n | \"pid\"\n | \"driving_license\"\n | \"vehicle_registration\"\n | \"age_verification\";\n\ninterface WalletVerificationStepProps {\n sessionId: string;\n nodeId: string;\n credentialType: WalletCredentialType;\n walletMode: \"walletOnly\" | \"walletOrPhoto\";\n minimumAge?: number;\n onCompleted: () => void;\n /** Échec de la vérification ou wallet non disponible — le parent décide de la\n * suite (fallback photo en walletOrPhoto, saut du nœud en walletOnly). */\n onFailedOrDeclined: () => void;\n pageTitle?: string;\n pageDescription?: string;\n}\n\nconst WalletVerificationStep: React.FC<WalletVerificationStepProps> = ({\n sessionId,\n nodeId,\n credentialType,\n walletMode,\n minimumAge,\n onCompleted,\n onFailedOrDeclined,\n pageTitle,\n pageDescription,\n}) => {\n const { t } = useI18n();\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [qrError, setQrError] = useState<string | null>(null);\n const [deepLink, setDeepLink] = useState<string | null>(null);\n const [startError, setStartError] = useState<string | null>(null);\n const isMobile = useMemo(() => isMobileDevice(), []);\n const apiBaseUrl = useMemo(() => getBaseURL(), []);\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n try {\n const result = await startWalletVerification(sessionId, {\n nodeId,\n credentialType,\n minimumAge,\n });\n if (!cancelled) setDeepLink(result.deepLink);\n } catch (error) {\n console.error(\"Failed to start wallet verification:\", error);\n if (!cancelled) {\n setStartError(\n t(\n \"wallet.verification.start_failed\",\n \"Impossible de démarrer la vérification par wallet.\",\n ),\n );\n }\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [sessionId, nodeId, credentialType, minimumAge, t]);\n\n const { status } = useWalletSseStatus({\n sessionId,\n apiBaseUrl,\n onCompleted,\n });\n\n // Sur mobile : ouvrir directement l'app wallet via le deep-link openid4vp://,\n // une seule fois, tant que la vérification n'a pas progressé.\n const hasRedirectedRef = useRef(false);\n useEffect(() => {\n if (!isMobile || !deepLink || status !== \"pending\" || hasRedirectedRef.current) return;\n hasRedirectedRef.current = true;\n window.location.assign(deepLink);\n }, [isMobile, deepLink, status]);\n\n useEffect(() => {\n if (isMobile) return; // pas de QR sur mobile (redirection directe)\n if (!deepLink || status !== \"pending\") return;\n\n const generate = async () => {\n if (!canvasRef.current) return;\n setQrError(null);\n try {\n const dataUrl = await QRCode.toDataURL(deepLink, {\n width: 256,\n margin: 2,\n color: { dark: \"#000000\", light: \"#FFFFFF\" },\n });\n const canvas = canvasRef.current;\n const ctx = canvas.getContext(\"2d\");\n if (ctx) {\n const img = new Image();\n img.onload = () => {\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0);\n };\n img.src = dataUrl;\n }\n } catch {\n setQrError(t(\"qr_code.generation_failed\", \"Erreur de génération du QR code\"));\n }\n };\n\n generate();\n }, [deepLink, status, t, isMobile]);\n\n const title = pageTitle || t(\"wallet.verification.page_title\", \"Identification par wallet\");\n const subtitle =\n pageDescription ||\n t(\n \"wallet.verification.page_description\",\n \"Scannez le QR code ci-dessous avec votre wallet d'identité pour vous identifier en ligne.\",\n );\n\n const declineLabel =\n walletMode === \"walletOrPhoto\"\n ? t(\"wallet.verification.continue_with_photo\", \"Continuer avec une photo\")\n : t(\"wallet.verification.skip\", \"Passer\");\n\n const footer =\n status === \"failed\" || startError ? (\n <Button onClick={onFailedOrDeclined}>\n {declineLabel}\n </Button>\n ) : null;\n\n return (\n <MobilePageLayout footer={footer}>\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 <div className=\"text-center space-y-4 mt-16 md:mt-20\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl\">{title}</Title>\n <Subtitle className=\"text-sm md:text-base text-gray-600 leading-relaxed whitespace-pre-line\">\n {subtitle}\n </Subtitle>\n </div>\n\n <div className=\"flex-1 flex justify-center items-center\">\n {startError ? (\n <div className=\"text-red-500 text-center p-4\" data-cy=\"wallet-start-error\">\n {startError}\n </div>\n ) : status === \"success\" ? (\n <WalletSuccessAnimation />\n ) : status === \"completed\" ? (\n <div className=\"flex flex-col items-center gap-4 p-8\">\n <div className=\"animate-spin w-10 h-10 border-2 border-gray-300 border-t-blue-500 rounded-full\" />\n <p className=\"text-sm text-gray-600\">\n {t(\"wallet.verification.verifying\", \"Vérification en cours…\")}\n </p>\n </div>\n ) : status === \"failed\" ? (\n <div\n className=\"w-full max-w-sm rounded-2xl border border-red-200 bg-red-50 p-6 text-center shadow-sm\"\n data-cy=\"wallet-verification-failed\"\n >\n <p className=\"text-sm leading-relaxed text-red-700\">\n {t(\n \"wallet.verification.failed\",\n \"La vérification par wallet a échoué.\",\n )}\n </p>\n </div>\n ) : qrError ? (\n <div className=\"text-red-500 text-center p-4\">{qrError}</div>\n ) : isMobile ? (\n <div className=\"flex flex-col items-center gap-4 p-8 text-center\">\n <div className=\"animate-spin w-10 h-10 border-2 border-gray-300 border-t-blue-500 rounded-full\" />\n <p className=\"text-sm text-gray-600\">\n {t(\"wallet.verification.opening_app\", \"Ouverture du wallet…\")}\n </p>\n {deepLink && (\n <a href={deepLink} className=\"text-sm font-medium text-blue-600 underline\">\n {t(\"wallet.verification.open_app_link\", \"Ouvrir mon wallet\")}\n </a>\n )}\n </div>\n ) : deepLink ? (\n <div\n className=\"bg-white p-4 rounded-lg shadow-lg border-2 border-gray-200\"\n data-cy=\"wallet-qr-code\"\n >\n <canvas ref={canvasRef} />\n </div>\n ) : (\n <div className=\"flex flex-col items-center gap-4 p-8\">\n <div className=\"animate-spin w-10 h-10 border-2 border-gray-300 border-t-blue-500 rounded-full\" />\n </div>\n )}\n </div>\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default WalletVerificationStep;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
@@ -39,6 +39,7 @@ var ADDRESS_SUGGESTIONS = [
|
|
|
39
39
|
var DEFAULT_FIELDS = {
|
|
40
40
|
identity: ["nom", "prenom", "date_naissance"],
|
|
41
41
|
"identity-legal": ["nom", "registrationNumber", "siret", "tva", "adresse"],
|
|
42
|
+
"identity-legal-rep": ["legalRepresentativeNom", "legalRepresentativePrenom"],
|
|
42
43
|
contact: ["email", "sms"],
|
|
43
44
|
address: ["adresse"],
|
|
44
45
|
nationality: ["nationalite"],
|
|
@@ -54,8 +55,7 @@ var FIELD_LABELS = {
|
|
|
54
55
|
company: "user_input_form.fields.company_name",
|
|
55
56
|
siret: "user_input_form.fields.siret",
|
|
56
57
|
tva: "user_input_form.fields.vat_number",
|
|
57
|
-
registrationNumber: "user_input_form.fields.registration_number"
|
|
58
|
-
};
|
|
58
|
+
registrationNumber: "user_input_form.fields.registration_number"};
|
|
59
59
|
// Backend endpoint pour l'autocomplétion d'adresses (sécurisé)
|
|
60
60
|
var GEOCODING_AUTOCOMPLETE_ENDPOINT = "/geocoding/autocomplete";
|
|
61
61
|
var FALLBACK_ADDRESS_SUGGESTIONS = ADDRESS_SUGGESTIONS.map(function (label, index) { return ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"userInputForm.js","sources":["../../../../src/constants/userInputForm.ts"],"sourcesContent":["import type {\n AddressSuggestion,\n InformationType,\n RequestedFieldKey,\n SelectOption,\n} from \"../types/userInputForm\";\n\nconst days = Array.from({ length: 31 }, (_, index) => index + 1);\nconst currentYear = new Date().getFullYear();\nconst years = Array.from({ length: 120 }, (_, index) => currentYear - index);\n\nconst monthLabels = [\n \"Janvier\",\n \"Février\",\n \"Mars\",\n \"Avril\",\n \"Mai\",\n \"Juin\",\n \"Juillet\",\n \"Août\",\n \"Septembre\",\n \"Octobre\",\n \"Novembre\",\n \"Décembre\",\n];\n\nexport const DAY_OPTIONS: SelectOption[] = days.map((value) => ({\n value: String(value).padStart(2, \"0\"),\n label: String(value).padStart(2, \"0\"),\n}));\n\nexport const MONTH_OPTIONS: SelectOption[] = monthLabels.map(\n (label, index) => ({\n value: String(index + 1).padStart(2, \"0\"),\n label,\n })\n);\n\nexport const YEAR_OPTIONS: SelectOption[] = years.map((value) => ({\n value: String(value),\n label: String(value),\n}));\n\n\nexport const ADDRESS_SUGGESTIONS: string[] = [\n \"10 Rue de Rivoli, 75001 Paris, France\",\n \"221B Baker Street, NW1 6XE Londres, Royaume-Uni\",\n \"1600 Amphitheatre Parkway, 94043 Mountain View, États-Unis\",\n \"55 Rue du Faubourg Saint-Honoré, 75008 Paris, France\",\n \"1 Place du Commerce, 44000 Nantes, France\",\n \"Piazza del Colosseo 1, 00184 Rome, Italie\",\n \"Av. Paulista 1578, 01310-200 São Paulo, Brésil\",\n];\n\nexport const DEFAULT_FIELDS: Record<InformationType, RequestedFieldKey[]> = {\n identity: [\"nom\", \"prenom\", \"date_naissance\"],\n \"identity-legal\": [\"nom\", \"registrationNumber\", \"siret\", \"tva\", \"adresse\"],\n contact: [\"email\", \"sms\"],\n address: [\"adresse\"],\n nationality: [\"nationalite\"],\n custom: [], // Custom forms use customFields instead\n};\n\nexport const FIELD_LABELS: Record<RequestedFieldKey, string> = {\n nom: \"user_input_form.fields.last_name\",\n prenom: \"user_input_form.fields.first_name\",\n date_naissance: \"user_input_form.fields.birth_date\",\n email: \"user_input_form.fields.email\",\n sms: \"user_input_form.fields.phone\",\n adresse: \"user_input_form.fields.address_line1\",\n nationalite: \"user_input_form.fields.nationality\",\n company: \"user_input_form.fields.company_name\",\n siret: \"user_input_form.fields.siret\",\n tva: \"user_input_form.fields.vat_number\",\n registrationNumber: \"user_input_form.fields.registration_number\",\n};\n\n// Backend endpoint pour l'autocomplétion d'adresses (sécurisé)\nexport const GEOCODING_AUTOCOMPLETE_ENDPOINT = \"/geocoding/autocomplete\";\n\nexport const FALLBACK_ADDRESS_SUGGESTIONS: AddressSuggestion[] =\n ADDRESS_SUGGESTIONS.map((label, index) => ({\n id: `fallback-${index}`,\n label,\n addressLine1: label,\n postalCode: \"\",\n city: \"\",\n country: \"\",\n }));\n"],"names":[],"mappings":"AAOA,IAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,UAAC,CAAC,EAAE,KAAK,EAAA,EAAK,OAAA,KAAK,GAAG,CAAC,CAAA,CAAT,CAAS,CAAC;AAChE,IAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;AAC5C,IAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,UAAC,CAAC,EAAE,KAAK,EAAA,EAAK,OAAA,WAAW,GAAG,KAAK,CAAA,CAAnB,CAAmB,CAAC;AAE5E,IAAM,WAAW,GAAG;IAClB,SAAS;IACT,SAAS;IACT,MAAM;IACN,OAAO;IACP,KAAK;IACL,MAAM;IACN,SAAS;IACT,MAAM;IACN,WAAW;IACX,SAAS;IACT,UAAU;IACV,UAAU;CACX;AAEM,IAAM,WAAW,GAAmB,IAAI,CAAC,GAAG,CAAC,UAAC,KAAK,EAAA,EAAK,QAAC;IAC9D,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;IACrC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;CACtC,EAAC,CAH6D,CAG7D;AAEK,IAAM,aAAa,GAAmB,WAAW,CAAC,GAAG,CAC1D,UAAC,KAAK,EAAE,KAAK,EAAA,EAAK,QAAC;AACjB,IAAA,KAAK,EAAE,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AACzC,IAAA,KAAK,EAAA,KAAA;CACN,EAAC,CAHgB,CAGhB;AAGG,IAAM,YAAY,GAAmB,KAAK,CAAC,GAAG,CAAC,UAAC,KAAK,EAAA,EAAK,QAAC;AAChE,IAAA,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;AACpB,IAAA,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;CACrB,EAAC,CAH+D,CAG/D;AAGK,IAAM,mBAAmB,GAAa;IAC3C,uCAAuC;IACvC,iDAAiD;IACjD,4DAA4D;IAC5D,sDAAsD;IACtD,2CAA2C;IAC3C,2CAA2C;IAC3C,gDAAgD;;AAG3C,IAAM,cAAc,GAAiD;AAC1E,IAAA,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,gBAAgB,CAAC;IAC7C,gBAAgB,EAAE,CAAC,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC;AAC1E,IAAA,OAAO,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC;IACzB,OAAO,EAAE,CAAC,SAAS,CAAC;IACpB,WAAW,EAAE,CAAC,aAAa,CAAC;IAC5B,MAAM,EAAE,EAAE;;AAGL,IAAM,YAAY,GAAsC;AAC7D,IAAA,GAAG,EAAE,kCAAkC;AACvC,IAAA,MAAM,EAAE,mCAAmC;AAC3C,IAAA,cAAc,EAAE,mCAAmC;AACnD,IAAA,KAAK,EAAE,8BAA8B;AACrC,IAAA,GAAG,EAAE,8BAA8B;AACnC,IACA,WAAW,EAAE,oCAAoC;AACjD,IAAA,OAAO,EAAE,qCAAqC;AAC9C,IAAA,KAAK,EAAE,8BAA8B;AACrC,IAAA,GAAG,EAAE,mCAAmC;AACxC,IAAA,kBAAkB,EAAE
|
|
1
|
+
{"version":3,"file":"userInputForm.js","sources":["../../../../src/constants/userInputForm.ts"],"sourcesContent":["import type {\n AddressSuggestion,\n InformationType,\n RequestedFieldKey,\n SelectOption,\n} from \"../types/userInputForm\";\n\nconst days = Array.from({ length: 31 }, (_, index) => index + 1);\nconst currentYear = new Date().getFullYear();\nconst years = Array.from({ length: 120 }, (_, index) => currentYear - index);\n\nconst monthLabels = [\n \"Janvier\",\n \"Février\",\n \"Mars\",\n \"Avril\",\n \"Mai\",\n \"Juin\",\n \"Juillet\",\n \"Août\",\n \"Septembre\",\n \"Octobre\",\n \"Novembre\",\n \"Décembre\",\n];\n\nexport const DAY_OPTIONS: SelectOption[] = days.map((value) => ({\n value: String(value).padStart(2, \"0\"),\n label: String(value).padStart(2, \"0\"),\n}));\n\nexport const MONTH_OPTIONS: SelectOption[] = monthLabels.map(\n (label, index) => ({\n value: String(index + 1).padStart(2, \"0\"),\n label,\n })\n);\n\nexport const YEAR_OPTIONS: SelectOption[] = years.map((value) => ({\n value: String(value),\n label: String(value),\n}));\n\n\nexport const ADDRESS_SUGGESTIONS: string[] = [\n \"10 Rue de Rivoli, 75001 Paris, France\",\n \"221B Baker Street, NW1 6XE Londres, Royaume-Uni\",\n \"1600 Amphitheatre Parkway, 94043 Mountain View, États-Unis\",\n \"55 Rue du Faubourg Saint-Honoré, 75008 Paris, France\",\n \"1 Place du Commerce, 44000 Nantes, France\",\n \"Piazza del Colosseo 1, 00184 Rome, Italie\",\n \"Av. Paulista 1578, 01310-200 São Paulo, Brésil\",\n];\n\nexport const DEFAULT_FIELDS: Record<InformationType, RequestedFieldKey[]> = {\n identity: [\"nom\", \"prenom\", \"date_naissance\"],\n \"identity-legal\": [\"nom\", \"registrationNumber\", \"siret\", \"tva\", \"adresse\"],\n \"identity-legal-rep\": [\"legalRepresentativeNom\", \"legalRepresentativePrenom\"],\n contact: [\"email\", \"sms\"],\n address: [\"adresse\"],\n nationality: [\"nationalite\"],\n custom: [], // Custom forms use customFields instead\n};\n\nexport const FIELD_LABELS: Record<RequestedFieldKey, string> = {\n nom: \"user_input_form.fields.last_name\",\n prenom: \"user_input_form.fields.first_name\",\n date_naissance: \"user_input_form.fields.birth_date\",\n email: \"user_input_form.fields.email\",\n sms: \"user_input_form.fields.phone\",\n adresse: \"user_input_form.fields.address_line1\",\n nationalite: \"user_input_form.fields.nationality\",\n company: \"user_input_form.fields.company_name\",\n siret: \"user_input_form.fields.siret\",\n tva: \"user_input_form.fields.vat_number\",\n registrationNumber: \"user_input_form.fields.registration_number\",\n legalRepresentativeNom:\n \"user_input_form.fields.legal_representative_last_name\",\n legalRepresentativePrenom:\n \"user_input_form.fields.legal_representative_first_name\",\n};\n\n// Backend endpoint pour l'autocomplétion d'adresses (sécurisé)\nexport const GEOCODING_AUTOCOMPLETE_ENDPOINT = \"/geocoding/autocomplete\";\n\nexport const FALLBACK_ADDRESS_SUGGESTIONS: AddressSuggestion[] =\n ADDRESS_SUGGESTIONS.map((label, index) => ({\n id: `fallback-${index}`,\n label,\n addressLine1: label,\n postalCode: \"\",\n city: \"\",\n country: \"\",\n }));\n"],"names":[],"mappings":"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"}
|
|
@@ -57,6 +57,8 @@ var useUserInputForm = function (_a) {
|
|
|
57
57
|
siret: (initialUserInput === null || initialUserInput === void 0 ? void 0 : initialUserInput.siret) || "",
|
|
58
58
|
tva: (initialUserInput === null || initialUserInput === void 0 ? void 0 : initialUserInput.tva) || "",
|
|
59
59
|
registrationNumber: (initialUserInput === null || initialUserInput === void 0 ? void 0 : initialUserInput.registrationNumber) || "",
|
|
60
|
+
legalRepresentativeLastName: (initialUserInput === null || initialUserInput === void 0 ? void 0 : initialUserInput.legalRepresentativeLastName) || "",
|
|
61
|
+
legalRepresentativeFirstName: (initialUserInput === null || initialUserInput === void 0 ? void 0 : initialUserInput.legalRepresentativeFirstName) || "",
|
|
60
62
|
}), form = _b[0], setForm = _b[1];
|
|
61
63
|
var _c = useState({}), errors = _c[0], setErrors = _c[1];
|
|
62
64
|
// Custom form state
|
|
@@ -365,6 +367,16 @@ var useUserInputForm = function (_a) {
|
|
|
365
367
|
markError("registrationNumber");
|
|
366
368
|
}
|
|
367
369
|
}
|
|
370
|
+
if (informationType === "identity-legal-rep") {
|
|
371
|
+
if (requestedFields.has("legalRepresentativeNom") &&
|
|
372
|
+
!form.legalRepresentativeLastName) {
|
|
373
|
+
markError("legalRepresentativeLastName");
|
|
374
|
+
}
|
|
375
|
+
if (requestedFields.has("legalRepresentativePrenom") &&
|
|
376
|
+
!form.legalRepresentativeFirstName) {
|
|
377
|
+
markError("legalRepresentativeFirstName");
|
|
378
|
+
}
|
|
379
|
+
}
|
|
368
380
|
if (informationType === "contact") {
|
|
369
381
|
if (requestedFields.has("email")) {
|
|
370
382
|
var emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
@@ -583,7 +595,7 @@ var useUserInputForm = function (_a) {
|
|
|
583
595
|
if (!validateForm()) {
|
|
584
596
|
return;
|
|
585
597
|
}
|
|
586
|
-
setUserInput(function (previous) { return (__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign({}, previous), (requestedFields.has("nom") && __assign({}, (informationType === "identity-legal"
|
|
598
|
+
setUserInput(function (previous) { return (__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign(__assign({}, previous), (requestedFields.has("nom") && __assign({}, (informationType === "identity-legal"
|
|
587
599
|
? { companyName: form.companyName }
|
|
588
600
|
: { lastName: form.lastName })))), (requestedFields.has("prenom") && { firstName: form.firstName })), (requestedFields.has("date_naissance") && {
|
|
589
601
|
birthDate: form.birthDate,
|
|
@@ -598,6 +610,10 @@ var useUserInputForm = function (_a) {
|
|
|
598
610
|
countryCode: form.countryCode,
|
|
599
611
|
})), (requestedFields.has("siret") && { siret: form.siret })), (requestedFields.has("tva") && { tva: form.tva })), (requestedFields.has("registrationNumber") && { registrationNumber: form.registrationNumber })), (requestedFields.has("siret") && !requestedFields.has("registrationNumber") && { registrationNumber: form.siret })), (requestedFields.has("nationalite") && {
|
|
600
612
|
nationality: form.nationality,
|
|
613
|
+
})), (requestedFields.has("legalRepresentativeNom") && {
|
|
614
|
+
legalRepresentativeLastName: form.legalRepresentativeLastName,
|
|
615
|
+
})), (requestedFields.has("legalRepresentativePrenom") && {
|
|
616
|
+
legalRepresentativeFirstName: form.legalRepresentativeFirstName,
|
|
601
617
|
}))); });
|
|
602
618
|
if (informationType === "contact" && setContactInfo) {
|
|
603
619
|
setContactInfo(function (previous) { return (__assign(__assign(__assign({}, previous), (requestedFields.has("email") && { email: form.email })), (requestedFields.has("sms") && { phoneNumber: form.phoneNumber }))); });
|