datakeen-session-react 1.1.194 → 1.1.195
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/dist/cjs/components/session/StartSession.js +4 -29
- package/dist/cjs/components/session/StartSession.js.map +1 -1
- package/dist/cjs/components/start-flow/Start.js +5 -6
- package/dist/cjs/components/start-flow/Start.js.map +1 -1
- package/dist/cjs/i18n/en.json.js +0 -25
- package/dist/cjs/i18n/en.json.js.map +1 -1
- package/dist/cjs/i18n/es.json.js +0 -25
- package/dist/cjs/i18n/es.json.js.map +1 -1
- package/dist/cjs/i18n/fr.json.js +0 -25
- package/dist/cjs/i18n/fr.json.js.map +1 -1
- package/dist/cjs/types/session.js.map +1 -1
- package/dist/esm/components/session/StartSession.js +5 -30
- package/dist/esm/components/session/StartSession.js.map +1 -1
- package/dist/esm/components/start-flow/Start.js +5 -6
- package/dist/esm/components/start-flow/Start.js.map +1 -1
- package/dist/esm/i18n/en.json.js +1 -25
- package/dist/esm/i18n/en.json.js.map +1 -1
- package/dist/esm/i18n/es.json.js +1 -25
- package/dist/esm/i18n/es.json.js.map +1 -1
- package/dist/esm/i18n/fr.json.js +1 -25
- package/dist/esm/i18n/fr.json.js.map +1 -1
- package/dist/esm/types/session.js.map +1 -1
- package/package.json +1 -1
- package/dist/cjs/components/start-flow/CGU.js +0 -132
- package/dist/cjs/components/start-flow/CGU.js.map +0 -1
- package/dist/cjs/components/ui/LanguageSelector.js +0 -46
- package/dist/cjs/components/ui/LanguageSelector.js.map +0 -1
- package/dist/cjs/utils/languageFlags.js +0 -46
- package/dist/cjs/utils/languageFlags.js.map +0 -1
- package/dist/esm/components/start-flow/CGU.js +0 -108
- package/dist/esm/components/start-flow/CGU.js.map +0 -1
- package/dist/esm/components/ui/LanguageSelector.js +0 -42
- package/dist/esm/components/ui/LanguageSelector.js.map +0 -1
- package/dist/esm/utils/languageFlags.js +0 -42
- package/dist/esm/utils/languageFlags.js.map +0 -1
package/dist/esm/i18n/es.json.js
CHANGED
|
@@ -313,29 +313,6 @@ var documentTypes = {
|
|
|
313
313
|
delegation_of_power: "Poder de representación"
|
|
314
314
|
};
|
|
315
315
|
var start_verification = "Iniciar mi verificación";
|
|
316
|
-
var CGU = {
|
|
317
|
-
terms_of_use: "Condiciones de uso y Condiciones de venta",
|
|
318
|
-
title: "Este proceso de identificación lo proporciona Datakeen.",
|
|
319
|
-
description: "Capturamos fotos y/o vídeos de tus documentos y de tu rostro para verificar tu identidad por cuenta de la entidad solicitante. Esto incluye la recopilación y el análisis de datos biométricos.",
|
|
320
|
-
description2_before: "Datakeen también puede utilizar tus datos como responsable del tratamiento para sus propios fines, de conformidad con su",
|
|
321
|
-
privacy_link_label: "política de privacidad",
|
|
322
|
-
privacy_url: "https://www.datakeen.co/regles-de-confidentialite/",
|
|
323
|
-
description2_after: ".",
|
|
324
|
-
by_proceeding_before: "Al hacer clic en \"Continuar\", confirmas que has leído y aceptado las",
|
|
325
|
-
cgu_link_label: "condiciones de uso y venta",
|
|
326
|
-
cgu_url: "https://www.datakeen.co/conditions-generales-dutilisation/",
|
|
327
|
-
by_proceeding_after: ".",
|
|
328
|
-
checkbox_text: "Consiento que mi información biométrica sea tratada con la finalidad de verificar mi identidad a distancia y acepto las Condiciones de uso y las Condiciones de venta.",
|
|
329
|
-
error: {
|
|
330
|
-
required: "Debes aceptar las Condiciones de uso y las Condiciones de venta para continuar.",
|
|
331
|
-
general: "Se ha producido un error al actualizar la sesión. Inténtalo de nuevo.",
|
|
332
|
-
console_update_status: "Error al actualizar el estado de la sesión:"
|
|
333
|
-
},
|
|
334
|
-
button: {
|
|
335
|
-
"continue": "Continuar",
|
|
336
|
-
loading: "Cargando..."
|
|
337
|
-
}
|
|
338
|
-
};
|
|
339
316
|
var LEGAL_CONSENT = {
|
|
340
317
|
default_title: "Condiciones de uso y Condiciones de venta",
|
|
341
318
|
default_checkbox: "Acepto las Condiciones de uso y las Condiciones de venta.",
|
|
@@ -1137,7 +1114,6 @@ var esTranslations = {
|
|
|
1137
1114
|
success: success,
|
|
1138
1115
|
documentTypes: documentTypes,
|
|
1139
1116
|
start_verification: start_verification,
|
|
1140
|
-
CGU: CGU,
|
|
1141
1117
|
LEGAL_CONSENT: LEGAL_CONSENT,
|
|
1142
1118
|
language_selection: language_selection,
|
|
1143
1119
|
jdi: jdi,
|
|
@@ -1163,5 +1139,5 @@ var esTranslations = {
|
|
|
1163
1139
|
signed_document: signed_document
|
|
1164
1140
|
};
|
|
1165
1141
|
|
|
1166
|
-
export {
|
|
1142
|
+
export { LEGAL_CONSENT, before, before_verso, buttons, camera, custom_form, esTranslations as default, documentTypes, document_check, document_collection, document_upload, document_video, errors, id_check, inpi_verification, jdi, language_selection, loading, nfc_scan, orientation, pdf_generation, photo, powered_by, processing, qr_code, select_component, selfie, session, signature, signed_document, start, start_verification, success, unissey, user_guidance, user_input_form, validation_points };
|
|
1167
1143
|
//# sourceMappingURL=es.json.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"es.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"es.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
package/dist/esm/i18n/fr.json.js
CHANGED
|
@@ -313,29 +313,6 @@ var documentTypes = {
|
|
|
313
313
|
delegation_of_power: "Délégation de pouvoir"
|
|
314
314
|
};
|
|
315
315
|
var start_verification = "Commencer ma vérification";
|
|
316
|
-
var CGU = {
|
|
317
|
-
terms_of_use: "Nos conditions d'utilisation",
|
|
318
|
-
title: "Ce parcours d'identification est proposé par Datakeen.",
|
|
319
|
-
description: "Nous capturons des photos et/ou vidéos de vos documents et de votre visage afin de vérifier votre identité pour le compte de l'entité qui en fait la demande. Cela inclut la collecte et l'analyse de données biométriques.",
|
|
320
|
-
description2_before: "Datakeen peut également utiliser vos données en tant que responsable du traitement pour ses propres besoins, conformément à sa",
|
|
321
|
-
privacy_link_label: "politique de confidentialité",
|
|
322
|
-
privacy_url: "https://www.datakeen.co/regles-de-confidentialite/",
|
|
323
|
-
description2_after: ".",
|
|
324
|
-
by_proceeding_before: "En cliquant sur \"Continuer\", vous confirmez avoir pris connaissance et accepté les",
|
|
325
|
-
cgu_link_label: "conditions générales d'utilisation",
|
|
326
|
-
cgu_url: "https://www.datakeen.co/conditions-generales-dutilisation/",
|
|
327
|
-
by_proceeding_after: ".",
|
|
328
|
-
checkbox_text: "Je consens à ce que mes informations biométriques soient traitées dans le but de vérifier mon identité à distance.",
|
|
329
|
-
error: {
|
|
330
|
-
required: "Vous devez accepter les conditions d'utilisation pour continuer.",
|
|
331
|
-
general: "Une erreur est survenue lors de la mise à jour de la session. Veuillez réessayer.",
|
|
332
|
-
console_update_status: "Erreur lors de la mise à jour du statut de la session:"
|
|
333
|
-
},
|
|
334
|
-
button: {
|
|
335
|
-
"continue": "Continuer",
|
|
336
|
-
loading: "Chargement..."
|
|
337
|
-
}
|
|
338
|
-
};
|
|
339
316
|
var LEGAL_CONSENT = {
|
|
340
317
|
default_title: "Conditions d'utilisation",
|
|
341
318
|
default_checkbox: "J'accepte les conditions générales d'utilisation.",
|
|
@@ -1137,7 +1114,6 @@ var frTranslations = {
|
|
|
1137
1114
|
success: success,
|
|
1138
1115
|
documentTypes: documentTypes,
|
|
1139
1116
|
start_verification: start_verification,
|
|
1140
|
-
CGU: CGU,
|
|
1141
1117
|
LEGAL_CONSENT: LEGAL_CONSENT,
|
|
1142
1118
|
language_selection: language_selection,
|
|
1143
1119
|
jdi: jdi,
|
|
@@ -1163,5 +1139,5 @@ var frTranslations = {
|
|
|
1163
1139
|
signed_document: signed_document
|
|
1164
1140
|
};
|
|
1165
1141
|
|
|
1166
|
-
export {
|
|
1142
|
+
export { LEGAL_CONSENT, before, before_verso, buttons, camera, custom_form, frTranslations as default, documentTypes, document_check, document_collection, document_upload, document_video, errors, id_check, inpi_verification, jdi, language_selection, loading, nfc_scan, orientation, pdf_generation, photo, powered_by, processing, qr_code, select_component, selfie, session, signature, signed_document, start, start_verification, success, unissey, user_guidance, user_input_form, validation_points };
|
|
1167
1143
|
//# sourceMappingURL=fr.json.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fr.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fr.json.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session.js","sources":["../../../../src/types/session.ts"],"sourcesContent":["import type React from \"react\";\n\nexport interface SessionConfig {\n sessionToken?: string;\n selfie?: boolean;\n requireMobile?: boolean;\n}\n\nexport interface DatakeenSessionProps {\n /** Session credential returned by server-side session creation. Required by secured backends. */\n sessionToken?: string;\n sessionId: string;\n sessionConfig?: SessionConfig;\n apiBaseUrl?: string; // Optional API base URL for dynamic environment configuration\n}\n\nexport interface UseSessionReturn {\n SessionComponent: React.ReactElement;\n}\n\nexport type stepObject = {\n setStep: (step: number, skipHistory?: boolean) => void;\n goBack: () => void;\n /** Retour arrière vers un nœud précis (ex: \"Corriger ma saisie\") :\n * tronque l'historique jusqu'à `targetStep` au lieu de l'empiler. */\n goBackToStep: (targetStep: number) => void;\n goToNextStep: (\n currentNodeId: string,\n template: SessionTemplate,\n handle?: string,\n ) => void;\n /** Avance via le graphe et tronque l'historique au nœud d'arrivée. */\n goToNextStepCommitted: (\n currentNodeId: string,\n template: SessionTemplate,\n handle?: string,\n ) => void;\n step: number;\n canGoBack: boolean;\n};\n\nexport interface ProcessingStep {\n title: string;\n subtitle: string;\n hasError?: boolean;\n}\n\nexport type ConditionTokenType = \"variable\" | \"control\" | \"operator\" | \"input\";\n\nexport interface ConditionToken {\n type: ConditionTokenType;\n value: string;\n label?: string;\n sourceNodeId?: string;\n}\n\n/**\n * Type for custom field value types\n */\nexport type CustomFieldValueType =\n | \"text\"\n | \"enum\"\n | \"number\"\n | \"boolean\"\n | \"date\"\n | \"email\"\n | \"address\"\n | \"list\";\n\n/**\n * Display formats supported for date fields (top-level and list columns).\n */\nexport type DateDisplayFormat = \"dd/mm/yyyy\" | \"mm/dd/yyyy\" | \"yyyy-mm-dd\";\n\nexport const DEFAULT_DATE_DISPLAY_FORMAT: DateDisplayFormat = \"dd/mm/yyyy\";\n\n/**\n * Column definition for a list-type custom field\n */\nexport interface ListColumn {\n label: string;\n type: \"text\" | \"enum\" | \"date\" | \"email\";\n options?: string[]; // required when type === 'enum'\n placeholder?: string; // text/email/date — shown to the end user\n regex?: string; // text — JS regex source (without slashes)\n regexErrorMessage?: string; // text — message displayed when regex fails\n dateFormat?: DateDisplayFormat; // date — display format expected\n}\n\n/**\n * Interface for custom field definition\n */\nexport interface CustomField {\n id: string;\n label: string;\n placeholder?: string;\n description?: string;\n valueType: CustomFieldValueType;\n enumOptions?: string[];\n listColumns?: ListColumn[]; // for list type: column definitions\n minRows?: number; // for list type: minimum rows expected\n required?: boolean;\n /** Absent means personal data. Lists are classified as a whole, not per column. */\n containsPersonalData?: boolean;\n regex?: string; // text — JS regex source (without slashes)\n regexErrorMessage?: string; // text — message displayed when regex fails\n dateFormat?: DateDisplayFormat; // date — display format expected\n lockedFromApi?: boolean;\n editableIfMissing?: boolean; // soft lock — éditable si la valeur API est absente\n userInputKey?: string;\n}\n\n/**\n * Interface for session template node\n */\nexport interface SessionTemplateNode {\n id: string;\n type: string;\n title: string;\n description: string;\n informationType?:\n | \"identity\"\n | \"identity-legal\"\n | \"contact\"\n | \"address\"\n | \"nationality\"\n | \"custom\";\n position: {\n x: number;\n y: number;\n };\n options: unknown[];\n selectedOptions: string[];\n requiredDocumentType?: string;\n isRequired: boolean;\n order: number;\n optionalFields?: string[];\n requiredFields?: string[];\n pageTitle?: string;\n pageDescription?: string;\n // Properties for document-collection node type\n allowedDocumentTypes?: Array<{\n id: string;\n name: string;\n /**\n * Optional side information coming from the template.\n * When provided and equals to two (\"two\", 2, \"double\", \"recto-verso\"),\n * consumers should allow uploading two sides (front/back).\n */\n side?: string | number;\n }>;\n allowedAddingMethods?: string[];\n introductionPage?: {\n title?: string;\n description?: string;\n };\n documentSelection?: {\n title?: string;\n description?: string;\n };\n // Start node specific properties\n welcomeTitle?: string;\n welcomeSubtitle?: string;\n welcomeDescription?: string;\n welcomeImage?: string;\n qrCodeTitle?: string;\n qrCodeDescription?: string;\n showLegacyCGU?: boolean; // default: true — rétrocompatibilité\n\n // Legal consent node specific properties\n consentDescription?: string;\n consentDescription2?: string;\n cguUrl?: string;\n privacyPolicyUrl?: string;\n cguLinkLabel?: string;\n privacyLinkLabel?: string;\n checkboxText?: string;\n // Identity control specific properties\n automaticPhotoCapture?: boolean;\n nfcEnabled?: boolean;\n // \"nfcAndApi\" reste accepté pour rétrocompat (parcours legacy) ; à normaliser à la lecture.\n nfcMode?: \"nfcOnly\" | \"nfcOrPhoto\" | \"nfcAndApi\";\n acceptedCountries?: AcceptedCountry[];\n // End node specific properties\n callbackURL?: string | null;\n // Résultat forcé par le nœud `end` (configuré dans le builder). Sert au SDK à\n // afficher la variante « erreur conservée » de l'écran de fin quand la branche\n // fausse d'une condition pointe directement vers un end non_compliant.\n expectedResult?: string;\n // Condition node specific properties\n conditionExpression?: string;\n conditionTokens?: ConditionToken[];\n conditionFalseErrorMessage?: string;\n conditionMaxRetries?: number;\n conditionMaxRetryAction?: \"end-journey\" | \"force-true\";\n // Undefined is treated as \"loop\" by the SDK for legacy templates.\n conditionFalseMode?: \"retry\" | \"loop\";\n\n // External verification specific properties\n targetApi?: \"INSEE\" | \"INPI_RBE\";\n /** INPI_RBE only. Opt-in: retry against the RNA (associations) when the RNE finds nothing. */\n rnaFallbackEnabled?: boolean;\n referenceNodeId?: string;\n referenceNodeType?:\n | \"information-input\"\n | \"document-collection\"\n | \"identity-control\";\n referenceField?: \"siren\" | \"siret\";\n referenceVariable?: string;\n // Custom form fields (for information-input with type 'custom')\n customFields?: CustomField[];\n\n // Electronic signature specific properties\n templateId?: string;\n external_id?: string;\n /** Écran affiché après la signature. Valeurs vides : textes standard traduits. */\n signedScreenTitle?: string;\n signedScreenDescription?: string;\n signedScreenDownloadHint?: string;\n fieldMappings?: Array<{\n sourceFieldId: string;\n label: string;\n docusealType: string;\n readonly: boolean;\n role?: string;\n sourceNodeId?: string;\n }>;\n /** If set, the generated PDF from this upstream pdf-generation node will be used as the document to sign */\n sourcePdfNodeId?: string;\n\n // PDF generation node specific properties\n // Note: htmlTemplate is intentionally NOT included — it is server-side only and never sent to the client\n pdfMode?: \"upload\" | \"html-template\";\n sourceNodeIds?: string[];\n\n // retry properties\n allowResubmission: boolean;\n maxResubmissionAttempts?: number;\n\n /**\n * Paramétrable par nœud depuis le journey builder : autorise ou non le\n * bouton \"Poursuivre quand même\" en cas d'échec. S'applique aux nœuds\n * identity-control, document-collection, biometric-capture (selfie/video)\n * et external-verification. Absent/true = comportement actuel inchangé\n * (bouton proposé), false = masqué.\n *\n * Déprécié pour controle-jdi/identity-control quand une sortie \"false\" est\n * câblée : dans ce cas le routage automatique (blockingCodes +\n * maxResubmissionAction) prend le relais et ce bouton disparaît. Reste lu\n * tel quel pour les nœuds legacy sans sortie \"false\" (rétrocompat).\n */\n allowContinueOnFailure?: boolean;\n\n /**\n * Codes JDI exacts considérés comme bloquants pour ce nœud controle-jdi\n * (déclenchent la boucle de resoumission). Absent = DEFAULT_BLOCKING_CODES\n * (utils/jdiCodes.ts) — comportement legacy inchangé. Le code 8.0 est\n * toujours bloquant indépendamment de cette liste.\n */\n blockingCodes?: string[];\n\n /**\n * Action suivie quand les resoumissions sont épuisées sur un code bloquant\n * ET qu'une sortie \"false\" est câblée sur ce nœud controle-jdi (miroir de\n * conditionMaxRetryAction sur le nœud condition). Défaut \"end-journey\".\n */\n maxResubmissionAction?: \"end-journey\" | \"force-true\";\n}\n\n/**\n * Interface for accepted countries\n */\nexport interface AcceptedCountry {\n code: string;\n documents: {\n passport: string[];\n idCard: string[];\n driverLicense: string[];\n residencePermit: string[];\n pinkDriverLicense: string[];\n };\n}\n\n/**\n * Interface for session template edge\n */\nexport interface SessionTemplateEdge {\n id: string;\n source: string;\n target: string;\n sourceHandle?: string;\n targetHandle?: string;\n conditionValue?: string;\n}\n\n/**\n * Interface for platform information\n */\nexport interface PlatformInfo {\n mobile: boolean;\n desktop: boolean;\n backoffice: boolean;\n}\n\n/**\n * Interface for session template\n */\n/** Clé du catalogue d'icônes des écrans de fin (mappée vers lucide-react au rendu). */\nexport type EndScreenIcon =\n | \"thanks\"\n | \"send\"\n | \"mail\"\n | \"check\"\n | \"clock\"\n | \"shield\"\n | \"user\"\n | \"info\";\n\nexport interface EndScreenItem {\n icon: EndScreenIcon;\n text: string;\n}\n\nexport interface EndScreenCase {\n title?: string;\n items: EndScreenItem[];\n}\n\n/** Textes de fin personnalisés (config globale du journey). Vide → fallback standard. */\nexport interface EndScreenConfig {\n compliant?: EndScreenCase;\n nonCompliant?: EndScreenCase;\n}\n\nexport interface SessionTemplate {\n id: string;\n name: string;\n description: string;\n version: string;\n languages: string[];\n nodes: SessionTemplateNode[];\n edges: SessionTemplateEdge[];\n groupId: string;\n userId: string | null;\n created_at: string;\n updated_at: string;\n platforms?: PlatformInfo;\n logo?: string;\n showQRCode?: boolean;\n buttonBgColor?: string;\n buttonTextColor?: string;\n endScreenConfig?: EndScreenConfig;\n}\n\n/**\n * Interface for session data\n */\nexport interface SessionData {\n id: string;\n userId: string | null;\n token: string;\n templateId: string;\n templateKey: string;\n expireTime: number;\n status: string;\n result: Record<string, unknown>;\n landingPage: unknown;\n withSelfie: boolean | null;\n groupId: string | null;\n userInput: Record<string, unknown>;\n contactInfo?: {\n email: string;\n phoneNumber: string;\n };\n callbackURL?: string | null;\n webhookURL: string;\n analysisTemplateId: string | null;\n userAgent: unknown[];\n mobile: boolean;\n analysisId: string | null;\n currentStep?: number;\n nfcStatus?: \"pending\" | \"opened\" | \"completed\" | \"skipped\" | \"failed\";\n createdAt: string;\n updatedAt: string;\n auditTrail: unknown[];\n user: unknown | null;\n analysis: unknown[];\n documents: unknown[];\n template: SessionTemplate;\n retryCounts?: Record<string, number>; // nodeId -> retry count\n}\n\nexport interface ClientInfo {\n ip?: string;\n location?: string;\n device: string;\n browser: string;\n os: string;\n}\n"],"names":[],"mappings":"AA0EO,IAAM,2BAA2B,GAAsB;;;;"}
|
|
1
|
+
{"version":3,"file":"session.js","sources":["../../../../src/types/session.ts"],"sourcesContent":["import type React from \"react\";\n\nexport interface SessionConfig {\n sessionToken?: string;\n selfie?: boolean;\n requireMobile?: boolean;\n}\n\nexport interface DatakeenSessionProps {\n /** Session credential returned by server-side session creation. Required by secured backends. */\n sessionToken?: string;\n sessionId: string;\n sessionConfig?: SessionConfig;\n apiBaseUrl?: string; // Optional API base URL for dynamic environment configuration\n}\n\nexport interface UseSessionReturn {\n SessionComponent: React.ReactElement;\n}\n\nexport type stepObject = {\n setStep: (step: number, skipHistory?: boolean) => void;\n goBack: () => void;\n /** Retour arrière vers un nœud précis (ex: \"Corriger ma saisie\") :\n * tronque l'historique jusqu'à `targetStep` au lieu de l'empiler. */\n goBackToStep: (targetStep: number) => void;\n goToNextStep: (\n currentNodeId: string,\n template: SessionTemplate,\n handle?: string,\n ) => void;\n /** Avance via le graphe et tronque l'historique au nœud d'arrivée. */\n goToNextStepCommitted: (\n currentNodeId: string,\n template: SessionTemplate,\n handle?: string,\n ) => void;\n step: number;\n canGoBack: boolean;\n};\n\nexport interface ProcessingStep {\n title: string;\n subtitle: string;\n hasError?: boolean;\n}\n\nexport type ConditionTokenType = \"variable\" | \"control\" | \"operator\" | \"input\";\n\nexport interface ConditionToken {\n type: ConditionTokenType;\n value: string;\n label?: string;\n sourceNodeId?: string;\n}\n\n/**\n * Type for custom field value types\n */\nexport type CustomFieldValueType =\n | \"text\"\n | \"enum\"\n | \"number\"\n | \"boolean\"\n | \"date\"\n | \"email\"\n | \"address\"\n | \"list\";\n\n/**\n * Display formats supported for date fields (top-level and list columns).\n */\nexport type DateDisplayFormat = \"dd/mm/yyyy\" | \"mm/dd/yyyy\" | \"yyyy-mm-dd\";\n\nexport const DEFAULT_DATE_DISPLAY_FORMAT: DateDisplayFormat = \"dd/mm/yyyy\";\n\n/**\n * Column definition for a list-type custom field\n */\nexport interface ListColumn {\n label: string;\n type: \"text\" | \"enum\" | \"date\" | \"email\";\n options?: string[]; // required when type === 'enum'\n placeholder?: string; // text/email/date — shown to the end user\n regex?: string; // text — JS regex source (without slashes)\n regexErrorMessage?: string; // text — message displayed when regex fails\n dateFormat?: DateDisplayFormat; // date — display format expected\n}\n\n/**\n * Interface for custom field definition\n */\nexport interface CustomField {\n id: string;\n label: string;\n placeholder?: string;\n description?: string;\n valueType: CustomFieldValueType;\n enumOptions?: string[];\n listColumns?: ListColumn[]; // for list type: column definitions\n minRows?: number; // for list type: minimum rows expected\n required?: boolean;\n /** Absent means personal data. Lists are classified as a whole, not per column. */\n containsPersonalData?: boolean;\n regex?: string; // text — JS regex source (without slashes)\n regexErrorMessage?: string; // text — message displayed when regex fails\n dateFormat?: DateDisplayFormat; // date — display format expected\n lockedFromApi?: boolean;\n editableIfMissing?: boolean; // soft lock — éditable si la valeur API est absente\n userInputKey?: string;\n}\n\n/**\n * Interface for session template node\n */\nexport interface SessionTemplateNode {\n id: string;\n type: string;\n title: string;\n description: string;\n informationType?:\n | \"identity\"\n | \"identity-legal\"\n | \"contact\"\n | \"address\"\n | \"nationality\"\n | \"custom\";\n position: {\n x: number;\n y: number;\n };\n options: unknown[];\n selectedOptions: string[];\n requiredDocumentType?: string;\n isRequired: boolean;\n order: number;\n optionalFields?: string[];\n requiredFields?: string[];\n pageTitle?: string;\n pageDescription?: string;\n // Properties for document-collection node type\n allowedDocumentTypes?: Array<{\n id: string;\n name: string;\n /**\n * Optional side information coming from the template.\n * When provided and equals to two (\"two\", 2, \"double\", \"recto-verso\"),\n * consumers should allow uploading two sides (front/back).\n */\n side?: string | number;\n }>;\n allowedAddingMethods?: string[];\n introductionPage?: {\n title?: string;\n description?: string;\n };\n documentSelection?: {\n title?: string;\n description?: string;\n };\n // Start node specific properties\n welcomeTitle?: string;\n welcomeSubtitle?: string;\n welcomeDescription?: string;\n welcomeImage?: string;\n qrCodeTitle?: string;\n qrCodeDescription?: string;\n\n // Legal consent node specific properties\n consentDescription?: string;\n consentDescription2?: string;\n cguUrl?: string;\n privacyPolicyUrl?: string;\n cguLinkLabel?: string;\n privacyLinkLabel?: string;\n checkboxText?: string;\n // Identity control specific properties\n automaticPhotoCapture?: boolean;\n nfcEnabled?: boolean;\n // \"nfcAndApi\" reste accepté pour rétrocompat (parcours legacy) ; à normaliser à la lecture.\n nfcMode?: \"nfcOnly\" | \"nfcOrPhoto\" | \"nfcAndApi\";\n acceptedCountries?: AcceptedCountry[];\n // End node specific properties\n callbackURL?: string | null;\n // Résultat forcé par le nœud `end` (configuré dans le builder). Sert au SDK à\n // afficher la variante « erreur conservée » de l'écran de fin quand la branche\n // fausse d'une condition pointe directement vers un end non_compliant.\n expectedResult?: string;\n // Condition node specific properties\n conditionExpression?: string;\n conditionTokens?: ConditionToken[];\n conditionFalseErrorMessage?: string;\n conditionMaxRetries?: number;\n conditionMaxRetryAction?: \"end-journey\" | \"force-true\";\n // Undefined is treated as \"loop\" by the SDK for legacy templates.\n conditionFalseMode?: \"retry\" | \"loop\";\n\n // External verification specific properties\n targetApi?: \"INSEE\" | \"INPI_RBE\";\n /** INPI_RBE only. Opt-in: retry against the RNA (associations) when the RNE finds nothing. */\n rnaFallbackEnabled?: boolean;\n referenceNodeId?: string;\n referenceNodeType?:\n | \"information-input\"\n | \"document-collection\"\n | \"identity-control\";\n referenceField?: \"siren\" | \"siret\";\n referenceVariable?: string;\n // Custom form fields (for information-input with type 'custom')\n customFields?: CustomField[];\n\n // Electronic signature specific properties\n templateId?: string;\n external_id?: string;\n /** Écran affiché après la signature. Valeurs vides : textes standard traduits. */\n signedScreenTitle?: string;\n signedScreenDescription?: string;\n signedScreenDownloadHint?: string;\n fieldMappings?: Array<{\n sourceFieldId: string;\n label: string;\n docusealType: string;\n readonly: boolean;\n role?: string;\n sourceNodeId?: string;\n }>;\n /** If set, the generated PDF from this upstream pdf-generation node will be used as the document to sign */\n sourcePdfNodeId?: string;\n\n // PDF generation node specific properties\n // Note: htmlTemplate is intentionally NOT included — it is server-side only and never sent to the client\n pdfMode?: \"upload\" | \"html-template\";\n sourceNodeIds?: string[];\n\n // retry properties\n allowResubmission: boolean;\n maxResubmissionAttempts?: number;\n\n /**\n * Paramétrable par nœud depuis le journey builder : autorise ou non le\n * bouton \"Poursuivre quand même\" en cas d'échec. S'applique aux nœuds\n * identity-control, document-collection, biometric-capture (selfie/video)\n * et external-verification. Absent/true = comportement actuel inchangé\n * (bouton proposé), false = masqué.\n *\n * Déprécié pour controle-jdi/identity-control quand une sortie \"false\" est\n * câblée : dans ce cas le routage automatique (blockingCodes +\n * maxResubmissionAction) prend le relais et ce bouton disparaît. Reste lu\n * tel quel pour les nœuds legacy sans sortie \"false\" (rétrocompat).\n */\n allowContinueOnFailure?: boolean;\n\n /**\n * Codes JDI exacts considérés comme bloquants pour ce nœud controle-jdi\n * (déclenchent la boucle de resoumission). Absent = DEFAULT_BLOCKING_CODES\n * (utils/jdiCodes.ts) — comportement legacy inchangé. Le code 8.0 est\n * toujours bloquant indépendamment de cette liste.\n */\n blockingCodes?: string[];\n\n /**\n * Action suivie quand les resoumissions sont épuisées sur un code bloquant\n * ET qu'une sortie \"false\" est câblée sur ce nœud controle-jdi (miroir de\n * conditionMaxRetryAction sur le nœud condition). Défaut \"end-journey\".\n */\n maxResubmissionAction?: \"end-journey\" | \"force-true\";\n}\n\n/**\n * Interface for accepted countries\n */\nexport interface AcceptedCountry {\n code: string;\n documents: {\n passport: string[];\n idCard: string[];\n driverLicense: string[];\n residencePermit: string[];\n pinkDriverLicense: string[];\n };\n}\n\n/**\n * Interface for session template edge\n */\nexport interface SessionTemplateEdge {\n id: string;\n source: string;\n target: string;\n sourceHandle?: string;\n targetHandle?: string;\n conditionValue?: string;\n}\n\n/**\n * Interface for platform information\n */\nexport interface PlatformInfo {\n mobile: boolean;\n desktop: boolean;\n backoffice: boolean;\n}\n\n/**\n * Interface for session template\n */\n/** Clé du catalogue d'icônes des écrans de fin (mappée vers lucide-react au rendu). */\nexport type EndScreenIcon =\n | \"thanks\"\n | \"send\"\n | \"mail\"\n | \"check\"\n | \"clock\"\n | \"shield\"\n | \"user\"\n | \"info\";\n\nexport interface EndScreenItem {\n icon: EndScreenIcon;\n text: string;\n}\n\nexport interface EndScreenCase {\n title?: string;\n items: EndScreenItem[];\n}\n\n/** Textes de fin personnalisés (config globale du journey). Vide → fallback standard. */\nexport interface EndScreenConfig {\n compliant?: EndScreenCase;\n nonCompliant?: EndScreenCase;\n}\n\nexport interface SessionTemplate {\n id: string;\n name: string;\n description: string;\n version: string;\n languages: string[];\n nodes: SessionTemplateNode[];\n edges: SessionTemplateEdge[];\n groupId: string;\n userId: string | null;\n created_at: string;\n updated_at: string;\n platforms?: PlatformInfo;\n logo?: string;\n showQRCode?: boolean;\n buttonBgColor?: string;\n buttonTextColor?: string;\n endScreenConfig?: EndScreenConfig;\n}\n\n/**\n * Interface for session data\n */\nexport interface SessionData {\n id: string;\n userId: string | null;\n token: string;\n templateId: string;\n templateKey: string;\n expireTime: number;\n status: string;\n result: Record<string, unknown>;\n landingPage: unknown;\n withSelfie: boolean | null;\n groupId: string | null;\n userInput: Record<string, unknown>;\n contactInfo?: {\n email: string;\n phoneNumber: string;\n };\n callbackURL?: string | null;\n webhookURL: string;\n analysisTemplateId: string | null;\n userAgent: unknown[];\n mobile: boolean;\n analysisId: string | null;\n currentStep?: number;\n nfcStatus?: \"pending\" | \"opened\" | \"completed\" | \"skipped\" | \"failed\";\n createdAt: string;\n updatedAt: string;\n auditTrail: unknown[];\n user: unknown | null;\n analysis: unknown[];\n documents: unknown[];\n template: SessionTemplate;\n retryCounts?: Record<string, number>; // nodeId -> retry count\n}\n\nexport interface ClientInfo {\n ip?: string;\n location?: string;\n device: string;\n browser: string;\n os: string;\n}\n"],"names":[],"mappings":"AA0EO,IAAM,2BAA2B,GAAsB;;;;"}
|
package/package.json
CHANGED
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
-
|
|
5
|
-
var tslib_es6 = require('../../node_modules/tslib/tslib.es6.js');
|
|
6
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
7
|
-
var Body = require('../ui/Body.js');
|
|
8
|
-
var Title = require('../ui/Title.js');
|
|
9
|
-
var React = require('react');
|
|
10
|
-
var sessionService = require('../../services/sessionService.js');
|
|
11
|
-
var CheckboxPrimitive = require('@radix-ui/react-checkbox');
|
|
12
|
-
var Label = require('@radix-ui/react-label');
|
|
13
|
-
var reactIcons = require('@radix-ui/react-icons');
|
|
14
|
-
var Button = require('../ui/Button.js');
|
|
15
|
-
var PageActions = require('../ui/PageActions.js');
|
|
16
|
-
require('../../index.css.js');
|
|
17
|
-
var useI18n = require('../../hooks/useI18n.js');
|
|
18
|
-
require('../../assets/icons/shield_magic_link.svg.js');
|
|
19
|
-
require('../../utils/cssLoader.js');
|
|
20
|
-
require('../../context/DocumentContext.js');
|
|
21
|
-
require('../../services/api.js');
|
|
22
|
-
require('../../config/env.js');
|
|
23
|
-
require('../../services/auditTrailService.js');
|
|
24
|
-
require('ua-parser-js');
|
|
25
|
-
var MobilePageLayout = require('../ui/MobilePageLayout.js');
|
|
26
|
-
var LanguageSelector = require('../ui/LanguageSelector.js');
|
|
27
|
-
require('qrcode');
|
|
28
|
-
require('lucide-react');
|
|
29
|
-
require('../../assets/check.svg.js');
|
|
30
|
-
require('../selfie/Video.css.js');
|
|
31
|
-
require('../selfie/VideoFixes.css.js');
|
|
32
|
-
require('../selfie/selfie-flow/SelfieFlow.js');
|
|
33
|
-
require('../ui/SelectComponent.js');
|
|
34
|
-
require('clsx');
|
|
35
|
-
require('tailwind-merge');
|
|
36
|
-
require('../jdi/JDIProcessing.js');
|
|
37
|
-
require('../../assets/before-photo.png.js');
|
|
38
|
-
require('../../assets/before-verso.png.js');
|
|
39
|
-
require('../../assets/before-document.png.js');
|
|
40
|
-
require('../../assets/selfietake.svg.js');
|
|
41
|
-
require('../../assets/before-passport.png.js');
|
|
42
|
-
require('../../services/cameraService.js');
|
|
43
|
-
require('../../services/documentEdgeDetectionService.js');
|
|
44
|
-
require('../document-video/document-video-flow/DocumentVideoFlow.js');
|
|
45
|
-
require('../document-collection/DocumentProcessing.js');
|
|
46
|
-
require('../../constants/userInputForm.js');
|
|
47
|
-
require('date-fns');
|
|
48
|
-
require('react-day-picker');
|
|
49
|
-
require('@radix-ui/react-popover');
|
|
50
|
-
require('react-i18next');
|
|
51
|
-
require('../../i18n/index.js');
|
|
52
|
-
require('@docuseal/react');
|
|
53
|
-
require('../../services/professionalImageQuality.js');
|
|
54
|
-
require('../../providers/I18nProvider.js');
|
|
55
|
-
|
|
56
|
-
function _interopNamespaceDefault(e) {
|
|
57
|
-
var n = Object.create(null);
|
|
58
|
-
if (e) {
|
|
59
|
-
Object.keys(e).forEach(function (k) {
|
|
60
|
-
if (k !== 'default') {
|
|
61
|
-
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
62
|
-
Object.defineProperty(n, k, d.get ? d : {
|
|
63
|
-
enumerable: true,
|
|
64
|
-
get: function () { return e[k]; }
|
|
65
|
-
});
|
|
66
|
-
}
|
|
67
|
-
});
|
|
68
|
-
}
|
|
69
|
-
n.default = e;
|
|
70
|
-
return Object.freeze(n);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
var CheckboxPrimitive__namespace = /*#__PURE__*/_interopNamespaceDefault(CheckboxPrimitive);
|
|
74
|
-
var Label__namespace = /*#__PURE__*/_interopNamespaceDefault(Label);
|
|
75
|
-
|
|
76
|
-
var CGU = function (_a) {
|
|
77
|
-
var setStep = _a.setStep, sessionId = _a.sessionId, showQRCodeInstructions = _a.showQRCodeInstructions, languages = _a.languages, session = _a.session, onBack = _a.onBack;
|
|
78
|
-
var _b = useI18n.useI18n(), t = _b.t; _b.setLanguage;
|
|
79
|
-
var _c = React.useState(languages ? languages[0] : "fr"); _c[0]; _c[1];
|
|
80
|
-
var _d = React.useState(false), checked = _d[0], setChecked = _d[1];
|
|
81
|
-
var _e = React.useState(false), error = _e[0], setError = _e[1];
|
|
82
|
-
var _f = React.useState(null), submitError = _f[0], setSubmitError = _f[1];
|
|
83
|
-
var _g = React.useState(false), isSubmitting = _g[0], setIsSubmitting = _g[1];
|
|
84
|
-
var handleCheckboxChange = function (value) {
|
|
85
|
-
setChecked(value);
|
|
86
|
-
setError(false);
|
|
87
|
-
setSubmitError(null);
|
|
88
|
-
};
|
|
89
|
-
var goOnNextStep = function () { return tslib_es6.__awaiter(void 0, void 0, void 0, function () {
|
|
90
|
-
var nextStep, statusError_1;
|
|
91
|
-
return tslib_es6.__generator(this, function (_a) {
|
|
92
|
-
switch (_a.label) {
|
|
93
|
-
case 0:
|
|
94
|
-
if (!checked) {
|
|
95
|
-
setError(true);
|
|
96
|
-
return [2 /*return*/];
|
|
97
|
-
}
|
|
98
|
-
nextStep = showQRCodeInstructions ? 0.5 : 1;
|
|
99
|
-
if (!sessionId) {
|
|
100
|
-
setStep(nextStep);
|
|
101
|
-
return [2 /*return*/];
|
|
102
|
-
}
|
|
103
|
-
setIsSubmitting(true);
|
|
104
|
-
_a.label = 1;
|
|
105
|
-
case 1:
|
|
106
|
-
_a.trys.push([1, 3, 4, 5]);
|
|
107
|
-
return [4 /*yield*/, sessionService.updateSessionStatus(sessionId, "started")];
|
|
108
|
-
case 2:
|
|
109
|
-
_a.sent();
|
|
110
|
-
setStep(nextStep);
|
|
111
|
-
return [3 /*break*/, 5];
|
|
112
|
-
case 3:
|
|
113
|
-
statusError_1 = _a.sent();
|
|
114
|
-
console.error(t("CGU.error.console_update_status"), statusError_1);
|
|
115
|
-
setSubmitError(t("CGU.error.general"));
|
|
116
|
-
return [3 /*break*/, 5];
|
|
117
|
-
case 4:
|
|
118
|
-
setIsSubmitting(false);
|
|
119
|
-
return [7 /*endfinally*/];
|
|
120
|
-
case 5: return [2 /*return*/];
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
}); };
|
|
124
|
-
return (jsxRuntime.jsx(MobilePageLayout.default, { session: session !== null && session !== void 0 ? session : undefined, footer: jsxRuntime.jsxs("div", { className: "w-full space-y-4", children: [(error || submitError) && (jsxRuntime.jsx("div", { className: "bg-red-50 border border-red-200 rounded-lg p-3", children: jsxRuntime.jsx(Body.default, { className: "text-red-600 text-sm text-center", children: submitError ? submitError : t("CGU.error.required") }) })), jsxRuntime.jsxs("div", { className: "flex items-start gap-3 p-3 bg-gray-50 rounded-lg", children: [jsxRuntime.jsx(CheckboxPrimitive__namespace.Root, { id: "checkbox", checked: checked, onCheckedChange: function (value) { return handleCheckboxChange(!!value); }, className: "mt-1 h-5 w-5 shrink-0 rounded border bg-white transition-colors\n data-[state=checked]:bg-[var(--dk-btn-bg)] data-[state=checked]:border-[var(--dk-btn-bg)]\n ".concat(error
|
|
125
|
-
? "border-red-500"
|
|
126
|
-
: "border-gray-300 hover:border-gray-400", "\n "), children: jsxRuntime.jsx(CheckboxPrimitive__namespace.Indicator, { className: "flex items-center justify-center text-white", children: jsxRuntime.jsx(reactIcons.CheckIcon, { className: "h-4 w-4" }) }) }), jsxRuntime.jsx(Label__namespace.Root, { htmlFor: "checkbox", className: "cursor-pointer", children: jsxRuntime.jsx(Body.default, { className: "text-left text-sm leading-relaxed ".concat(error ? "text-red-600" : "text-gray-700"), children: t("CGU.checkbox_text") }) })] }), jsxRuntime.jsx(PageActions.default, { primary: jsxRuntime.jsx(Button.default, { onClick: goOnNextStep, disabled: !checked || isSubmitting, children: isSubmitting
|
|
127
|
-
? t("CGU.button.loading")
|
|
128
|
-
: t("CGU.button.continue") }), secondary: onBack ? (jsxRuntime.jsx(Button.default, { variant: "secondary", onClick: onBack, children: t("jdi.country_selection.back") })) : undefined })] }), children: jsxRuntime.jsx("div", { className: "px-4 py-8 md:px-8 flex flex-col", children: jsxRuntime.jsxs("div", { className: "w-full max-w-2xl mx-auto space-y-6", children: [jsxRuntime.jsxs("div", { className: "text-center justify-center items-center", children: [jsxRuntime.jsx(Title.default, { className: "text-xl md:text-2xl lg:text-3xl mb-6", children: t("CGU.terms_of_use") }), languages && languages.length > 1 && (jsxRuntime.jsx("div", { className: "flex justify-center items-center mb-6", children: jsxRuntime.jsx(LanguageSelector.default, { className: "w-64 mx-auto", languages: languages }) }))] }), jsxRuntime.jsx("div", { className: "bg-gray-50 rounded-lg p-4 md:p-6", children: jsxRuntime.jsxs(Body.default, { className: "text-left text-sm md:text-base leading-relaxed space-y-4", children: [jsxRuntime.jsx("p", { children: t("CGU.title") }), jsxRuntime.jsx("p", { children: t("CGU.description") }), jsxRuntime.jsxs("p", { children: [t("CGU.description2_before"), " ", jsxRuntime.jsx("a", { href: t("CGU.privacy_url"), target: "_blank", rel: "noopener noreferrer", className: "underline text-blue-600 hover:text-blue-800", children: t("CGU.privacy_link_label") }), t("CGU.description2_after")] }), jsxRuntime.jsxs("p", { children: [t("CGU.by_proceeding_before"), " ", jsxRuntime.jsx("a", { href: t("CGU.cgu_url"), target: "_blank", rel: "noopener noreferrer", className: "underline text-blue-600 hover:text-blue-800", children: t("CGU.cgu_link_label") }), t("CGU.by_proceeding_after")] })] }) })] }) }) }));
|
|
129
|
-
};
|
|
130
|
-
|
|
131
|
-
exports.default = CGU;
|
|
132
|
-
//# sourceMappingURL=CGU.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CGU.js","sources":["../../../../../src/components/start-flow/CGU.tsx"],"sourcesContent":["import Body from \"../ui/Body\";\nimport Title from \"../ui/Title\";\nimport { useState } from \"react\";\nimport { updateSessionStatus } from \"../../services/sessionService\";\n\n// For checkbox\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport * as LabelPrimitive from \"@radix-ui/react-label\";\nimport { CheckIcon } from \"@radix-ui/react-icons\";\nimport Button from \"../ui/Button\";\nimport PageActions from \"../ui/PageActions\";\nimport { useI18n } from \"../..\";\nimport LanguageSelector from \"../ui/LanguageSelector\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport { SessionData } from \"../../types/session\";\n\ninterface CGUProps {\n setStep: (nubr: number) => void;\n sessionId?: string;\n showQRCodeInstructions: boolean;\n languages?: string[];\n session?: SessionData;\n onBack?: () => void;\n}\n\nconst CGU = ({\n setStep,\n sessionId,\n showQRCodeInstructions,\n languages,\n session,\n onBack,\n}: CGUProps) => {\n const { t, setLanguage } = useI18n();\n const [selectedLanguage, setSelectedLanguage] = useState(\n languages ? languages[0] : \"fr\"\n );\n const [checked, setChecked] = useState(false);\n const [error, setError] = useState(false);\n const [submitError, setSubmitError] = useState<string | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const handleCheckboxChange = (value: boolean) => {\n setChecked(value);\n setError(false);\n setSubmitError(null);\n };\n\n const goOnNextStep = async () => {\n if (!checked) {\n setError(true);\n return;\n }\n\n const nextStep = showQRCodeInstructions ? 0.5 : 1;\n\n if (!sessionId) {\n setStep(nextStep);\n return;\n }\n\n setIsSubmitting(true);\n try {\n await updateSessionStatus(sessionId, \"started\");\n setStep(nextStep);\n } catch (statusError) {\n console.error(t(\"CGU.error.console_update_status\"), statusError);\n setSubmitError(t(\"CGU.error.general\"));\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const handleLanguageChange = (langId: string) => {\n const lang = languages?.find((l) => l === langId);\n if (lang) {\n setLanguage(lang);\n setSelectedLanguage(lang);\n }\n };\n\n return (\n <MobilePageLayout\n session={session ?? undefined}\n footer={\n <div className=\"w-full space-y-4\">\n {/* Error message */}\n {(error || submitError) && (\n <div className=\"bg-red-50 border border-red-200 rounded-lg p-3\">\n <Body className=\"text-red-600 text-sm text-center\">\n {submitError ? submitError : t(\"CGU.error.required\")}\n </Body>\n </div>\n )}\n\n {/* Consent checkbox */}\n <div className=\"flex items-start gap-3 p-3 bg-gray-50 rounded-lg\">\n <CheckboxPrimitive.Root\n id=\"checkbox\"\n checked={checked}\n onCheckedChange={(value) => handleCheckboxChange(!!value)}\n className={`mt-1 h-5 w-5 shrink-0 rounded border bg-white transition-colors\n data-[state=checked]:bg-[var(--dk-btn-bg)] data-[state=checked]:border-[var(--dk-btn-bg)]\n ${error\n ? \"border-red-500\"\n : \"border-gray-300 hover:border-gray-400\"\n }\n `}\n >\n <CheckboxPrimitive.Indicator className=\"flex items-center justify-center text-white\">\n <CheckIcon className=\"h-4 w-4\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n\n <LabelPrimitive.Root htmlFor=\"checkbox\" className=\"cursor-pointer\">\n <Body\n className={`text-left text-sm leading-relaxed ${error ? \"text-red-600\" : \"text-gray-700\"\n }`}\n >\n {t(\"CGU.checkbox_text\")}\n </Body>\n </LabelPrimitive.Root>\n </div>\n\n {/* Buttons */}\n <PageActions\n primary={\n <Button\n onClick={goOnNextStep}\n disabled={!checked || isSubmitting}\n >\n {isSubmitting\n ? t(\"CGU.button.loading\")\n : t(\"CGU.button.continue\")}\n </Button>\n }\n secondary={\n onBack ? (\n <Button variant=\"secondary\" onClick={onBack}>\n {t(\"jdi.country_selection.back\")}\n </Button>\n ) : undefined\n }\n />\n </div>\n }\n >\n <div className=\"px-4 py-8 md:px-8 flex flex-col\">\n <div className=\"w-full max-w-2xl mx-auto space-y-6\">\n <div className=\"text-center justify-center items-center\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl mb-6\">\n {t(\"CGU.terms_of_use\")}\n </Title>\n\n {/* Language selector */}\n {languages && languages.length > 1 && (\n <div className=\"flex justify-center items-center mb-6\">\n <LanguageSelector\n className=\"w-64 mx-auto\"\n languages={languages}\n />\n </div>\n )}\n </div>\n\n {/* Terms content */}\n <div className=\"bg-gray-50 rounded-lg p-4 md:p-6\">\n <Body className=\"text-left text-sm md:text-base leading-relaxed space-y-4\">\n <p>{t(\"CGU.title\")}</p>\n <p>{t(\"CGU.description\")}</p>\n <p>\n {t(\"CGU.description2_before\")}{\" \"}\n <a\n href={t(\"CGU.privacy_url\")}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"underline text-blue-600 hover:text-blue-800\"\n >\n {t(\"CGU.privacy_link_label\")}\n </a>\n {t(\"CGU.description2_after\")}\n </p>\n <p>\n {t(\"CGU.by_proceeding_before\")}{\" \"}\n <a\n href={t(\"CGU.cgu_url\")}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"underline text-blue-600 hover:text-blue-800\"\n >\n {t(\"CGU.cgu_link_label\")}\n </a>\n {t(\"CGU.by_proceeding_after\")}\n </p>\n </Body>\n </div>\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default CGU;\n"],"names":["useI18n","useState","__awaiter","updateSessionStatus","_jsx","MobilePageLayout","_jsxs","Body","CheckboxPrimitive","CheckIcon","LabelPrimitive","PageActions","Button","Title","LanguageSelector"],"mappings":"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"}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
-
|
|
5
|
-
var tslib_es6 = require('../../node_modules/tslib/tslib.es6.js');
|
|
6
|
-
var jsxRuntime = require('react/jsx-runtime');
|
|
7
|
-
var React = require('react');
|
|
8
|
-
var useI18n = require('../../hooks/useI18n.js');
|
|
9
|
-
var languageFlags = require('../../utils/languageFlags.js');
|
|
10
|
-
var reactCircleFlags = require('react-circle-flags');
|
|
11
|
-
|
|
12
|
-
var LanguageSelector = function (_a) {
|
|
13
|
-
var _b = _a.className, className = _b === void 0 ? '' : _b, languages = _a.languages;
|
|
14
|
-
var _c = useI18n.useI18n(), currentLanguage = _c.currentLanguage, setLanguage = _c.setLanguage; _c.t;
|
|
15
|
-
var _d = React.useState(false), isOpen = _d[0], setIsOpen = _d[1];
|
|
16
|
-
var dropdownRef = React.useRef(null);
|
|
17
|
-
var languageFormat = languages
|
|
18
|
-
? languages.map(function (code) { return languageFlags.getSupportedLanguages().find(function (lang) { return lang.code === code; }); }).filter(Boolean)
|
|
19
|
-
: languageFlags.getSupportedLanguages();
|
|
20
|
-
var currentLangInfo = languageFormat.find(function (lang) { return lang.code === currentLanguage; }) || languageFormat[0];
|
|
21
|
-
var handleLanguageChange = function (languageCode) { return tslib_es6.__awaiter(void 0, void 0, void 0, function () {
|
|
22
|
-
return tslib_es6.__generator(this, function (_a) {
|
|
23
|
-
switch (_a.label) {
|
|
24
|
-
case 0: return [4 /*yield*/, setLanguage(languageCode)];
|
|
25
|
-
case 1:
|
|
26
|
-
_a.sent();
|
|
27
|
-
setIsOpen(false);
|
|
28
|
-
return [2 /*return*/];
|
|
29
|
-
}
|
|
30
|
-
});
|
|
31
|
-
}); };
|
|
32
|
-
// Close dropdown when clicking outside
|
|
33
|
-
React.useEffect(function () {
|
|
34
|
-
var handleClickOutside = function (event) {
|
|
35
|
-
if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
|
|
36
|
-
setIsOpen(false);
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
document.addEventListener('mousedown', handleClickOutside);
|
|
40
|
-
return function () { return document.removeEventListener('mousedown', handleClickOutside); };
|
|
41
|
-
}, []);
|
|
42
|
-
return (jsxRuntime.jsxs("div", { className: "relative ".concat(className), ref: dropdownRef, children: [jsxRuntime.jsxs("button", { onClick: function () { return setIsOpen(!isOpen); }, className: "flex items-center space-x-2 px-3 py-2 text-sm border border-gray-300 rounded bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500 min-w-[120px] mx-auto", children: [jsxRuntime.jsx("span", { className: "inline-flex items-center justify-center w-5 h-5 shrink-0 overflow-hidden rounded-full", children: jsxRuntime.jsx(reactCircleFlags.CircleFlag, { countryCode: languageFlags.getLanguageAlpha2(currentLangInfo.code) || 'UN', height: 20 }) }), jsxRuntime.jsx("span", { className: "overflow-hidden text-ellipsis whitespace-nowrap", children: currentLangInfo.nativeName }), jsxRuntime.jsx("svg", { className: "w-4 h-4 transition-transform ".concat(isOpen ? 'rotate-180' : ''), fill: "none", stroke: "currentColor", viewBox: "0 0 24 24", children: jsxRuntime.jsx("path", { strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: 2, d: "M19 9l-7 7-7-7" }) })] }), isOpen && (jsxRuntime.jsx("div", { className: "absolute top-full left-1/2 transform -translate-x-1/2 mt-1 bg-white border border-gray-300 rounded shadow-lg z-50 max-h-48 overflow-y-auto min-w-[120px]", children: languageFormat.map(function (lang) { return (jsxRuntime.jsxs("button", { onClick: function () { return handleLanguageChange(lang.code); }, className: "w-full flex items-center space-x-2 px-3 py-2 text-sm hover:bg-gray-100 focus:outline-none focus:bg-gray-100 ".concat(lang.code === currentLanguage ? 'bg-blue-50 text-blue-600' : 'text-gray-700'), children: [jsxRuntime.jsx("span", { className: "inline-flex items-center justify-center w-5 h-5 shrink-0 overflow-hidden rounded-full", children: jsxRuntime.jsx(reactCircleFlags.CircleFlag, { countryCode: languageFlags.getLanguageAlpha2(lang.code) || 'fr', height: 20 }) }), jsxRuntime.jsx("span", { className: "overflow-hidden text-ellipsis whitespace-nowrap", children: lang.nativeName })] }, lang.code)); }) }))] }));
|
|
43
|
-
};
|
|
44
|
-
|
|
45
|
-
exports.default = LanguageSelector;
|
|
46
|
-
//# sourceMappingURL=LanguageSelector.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"LanguageSelector.js","sources":["../../../../../src/components/ui/LanguageSelector.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect } from 'react';\nimport { useI18n } from '../../hooks/useI18n';\nimport { getLanguageAlpha2, getSupportedLanguages, LanguageFlag } from '../../utils/languageFlags';\nimport { CircleFlag } from 'react-circle-flags';\n\ninterface LanguageSelectorProps {\n className?: string;\n languages?: string[];\n}\n\nconst LanguageSelector: React.FC<LanguageSelectorProps> = ({ className = '', languages }) => {\n const { currentLanguage, setLanguage, t } = useI18n();\n const [isOpen, setIsOpen] = useState(false);\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n const languageFormat: LanguageFlag[] = languages\n ? languages.map(code => getSupportedLanguages().find(lang => lang.code === code)!).filter(Boolean)\n : getSupportedLanguages();\n\n const currentLangInfo = languageFormat.find(lang => lang.code === currentLanguage) || languageFormat[0];\n\n const handleLanguageChange = async (languageCode: string) => {\n await setLanguage(languageCode);\n setIsOpen(false);\n };\n\n // Close dropdown when clicking outside\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n if (dropdownRef.current && !dropdownRef.current.contains(event.target as Node)) {\n setIsOpen(false);\n }\n };\n\n document.addEventListener('mousedown', handleClickOutside);\n return () => document.removeEventListener('mousedown', handleClickOutside);\n }, []);\n\n return (\n <div className={`relative ${className}`} ref={dropdownRef}>\n {/* Selected language display */}\n <button\n onClick={() => setIsOpen(!isOpen)}\n className=\"flex items-center space-x-2 px-3 py-2 text-sm border border-gray-300 rounded bg-white hover:bg-gray-50 focus:outline-none focus:ring-2 focus:ring-blue-500 min-w-[120px] mx-auto\"\n >\n <span className=\"inline-flex items-center justify-center w-5 h-5 shrink-0 overflow-hidden rounded-full\">\n <CircleFlag\n countryCode={getLanguageAlpha2(currentLangInfo.code) || 'UN'}\n height={20}\n />\n </span>\n <span className=\"overflow-hidden text-ellipsis whitespace-nowrap\">\n {currentLangInfo.nativeName}\n </span>\n <svg\n className={`w-4 h-4 transition-transform ${isOpen ? 'rotate-180' : ''}`}\n fill=\"none\"\n stroke=\"currentColor\"\n viewBox=\"0 0 24 24\"\n >\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M19 9l-7 7-7-7\" />\n </svg>\n </button>\n\n {/* Dropdown options */}\n {isOpen && (\n <div className=\"absolute top-full left-1/2 transform -translate-x-1/2 mt-1 bg-white border border-gray-300 rounded shadow-lg z-50 max-h-48 overflow-y-auto min-w-[120px]\">\n {languageFormat.map((lang) => (\n <button\n key={lang.code}\n onClick={() => handleLanguageChange(lang.code)}\n className={`w-full flex items-center space-x-2 px-3 py-2 text-sm hover:bg-gray-100 focus:outline-none focus:bg-gray-100 ${lang.code === currentLanguage ? 'bg-blue-50 text-blue-600' : 'text-gray-700'\n }`}\n >\n <span className=\"inline-flex items-center justify-center w-5 h-5 shrink-0 overflow-hidden rounded-full\">\n <CircleFlag\n countryCode={getLanguageAlpha2(lang.code) || 'fr'}\n height={20}\n />\n </span>\n <span className=\"overflow-hidden text-ellipsis whitespace-nowrap\">\n {lang.nativeName}\n </span>\n </button>\n ))}\n </div>\n )}\n </div>\n );\n};\n\nexport default LanguageSelector;"],"names":["useI18n","useState","useRef","getSupportedLanguages","__awaiter","useEffect","_jsxs","_jsx","CircleFlag","getLanguageAlpha2"],"mappings":"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"}
|
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* Mapping of language codes to country flags and names
|
|
5
|
-
*/
|
|
6
|
-
var LANGUAGE_FLAGS = {
|
|
7
|
-
fr: {
|
|
8
|
-
code: 'fr',
|
|
9
|
-
name: 'French',
|
|
10
|
-
alpha2: 'fr',
|
|
11
|
-
nativeName: 'Français'
|
|
12
|
-
},
|
|
13
|
-
en: {
|
|
14
|
-
code: 'en',
|
|
15
|
-
name: 'English',
|
|
16
|
-
alpha2: 'gb',
|
|
17
|
-
nativeName: 'English'
|
|
18
|
-
},
|
|
19
|
-
es: {
|
|
20
|
-
code: 'es',
|
|
21
|
-
name: 'Spanish',
|
|
22
|
-
alpha2: 'es',
|
|
23
|
-
nativeName: 'Español'
|
|
24
|
-
}
|
|
25
|
-
};
|
|
26
|
-
/**
|
|
27
|
-
* Get flag for a language code
|
|
28
|
-
* @param languageCode - The language code (e.g., 'fr', 'en')
|
|
29
|
-
* @returns The flag emoji or empty string if not found
|
|
30
|
-
*/
|
|
31
|
-
var getLanguageAlpha2 = function (languageCode) {
|
|
32
|
-
var _a;
|
|
33
|
-
return (_a = LANGUAGE_FLAGS[languageCode]) === null || _a === void 0 ? void 0 : _a.alpha2;
|
|
34
|
-
};
|
|
35
|
-
/**
|
|
36
|
-
* Get all supported languages with their flags
|
|
37
|
-
* @returns Array of all supported language flags
|
|
38
|
-
*/
|
|
39
|
-
var getSupportedLanguages = function () {
|
|
40
|
-
return Object.values(LANGUAGE_FLAGS);
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
exports.LANGUAGE_FLAGS = LANGUAGE_FLAGS;
|
|
44
|
-
exports.getLanguageAlpha2 = getLanguageAlpha2;
|
|
45
|
-
exports.getSupportedLanguages = getSupportedLanguages;
|
|
46
|
-
//# sourceMappingURL=languageFlags.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"languageFlags.js","sources":["../../../../src/utils/languageFlags.ts"],"sourcesContent":["/**\n * Language flag mapping utility\n * Maps language codes to their corresponding country flags\n */\nexport interface LanguageFlag {\n code: string;\n name: string;\n alpha2: string;\n nativeName: string;\n}\n\n/**\n * Mapping of language codes to country flags and names\n */\nexport const LANGUAGE_FLAGS: Record<string, LanguageFlag> = {\n fr: {\n code: 'fr',\n name: 'French',\n alpha2: 'fr',\n nativeName: 'Français'\n },\n en: {\n code: 'en',\n name: 'English',\n alpha2: 'gb',\n nativeName: 'English'\n },\n es: {\n code: 'es',\n name: 'Spanish',\n alpha2: 'es',\n nativeName: 'Español'\n }\n};\n\n/**\n * Get flag for a language code\n * @param languageCode - The language code (e.g., 'fr', 'en')\n * @returns The flag emoji or empty string if not found\n*/\nexport const getLanguageAlpha2 = (languageCode: string): string | null => {\n return LANGUAGE_FLAGS[languageCode]?.alpha2;\n};\n\n/**\n * Get language info for a language code\n * @param languageCode - The language code (e.g., 'fr', 'en')\n * @returns The language flag info or null if not found\n */\nexport const getLanguageInfo = (languageCode: string): LanguageFlag | null => {\n return LANGUAGE_FLAGS[languageCode] || null;\n};\n\n/**\n * Get all supported languages with their flags\n * @returns Array of all supported language flags\n */\nexport const getSupportedLanguages = (): LanguageFlag[] => {\n return Object.values(LANGUAGE_FLAGS);\n};\n\n/**\n * Check if a language code is supported\n * @param languageCode - The language code to check\n * @returns True if the language is supported\n */\nexport const isLanguageSupported = (languageCode: string): boolean => {\n return languageCode in LANGUAGE_FLAGS;\n};\n"],"names":[],"mappings":";;AAWA;;AAEG;AACI,IAAM,cAAc,GAAiC;AAC1D,IAAA,EAAE,EAAE;AACF,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,IAAI,EAAE,QAAQ;AACd,QAAA,MAAM,EAAE,IAAI;AACZ,QAAA,UAAU,EAAE;AACb,KAAA;AACD,IAAA,EAAE,EAAE;AACF,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,IAAI,EAAE,SAAS;AACf,QAAA,MAAM,EAAE,IAAI;AACZ,QAAA,UAAU,EAAE;AACb,KAAA;AACD,IAAA,EAAE,EAAE;AACF,QAAA,IAAI,EAAE,IAAI;AACV,QAAA,IAAI,EAAE,SAAS;AACf,QAAA,MAAM,EAAE,IAAI;AACZ,QAAA,UAAU,EAAE;AACb;;AAGH;;;;AAIE;AACK,IAAM,iBAAiB,GAAG,UAAC,YAAoB,EAAA;;AAClD,IAAA,OAAO,MAAA,cAAc,CAAC,YAAY,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,MAAM;AAC/C;AAWA;;;AAGG;AACI,IAAM,qBAAqB,GAAG,YAAA;AACnC,IAAA,OAAO,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC;AACtC;;;;;;"}
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
import { __awaiter, __generator } from '../../node_modules/tslib/tslib.es6.js';
|
|
2
|
-
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
3
|
-
import Body from '../ui/Body.js';
|
|
4
|
-
import Title from '../ui/Title.js';
|
|
5
|
-
import { useState } from 'react';
|
|
6
|
-
import { updateSessionStatus } from '../../services/sessionService.js';
|
|
7
|
-
import * as CheckboxPrimitive from '@radix-ui/react-checkbox';
|
|
8
|
-
import * as Label from '@radix-ui/react-label';
|
|
9
|
-
import { CheckIcon } from '@radix-ui/react-icons';
|
|
10
|
-
import Button from '../ui/Button.js';
|
|
11
|
-
import PageActions from '../ui/PageActions.js';
|
|
12
|
-
import '../../index.css.js';
|
|
13
|
-
import { useI18n } from '../../hooks/useI18n.js';
|
|
14
|
-
import '../../assets/icons/shield_magic_link.svg.js';
|
|
15
|
-
import '../../utils/cssLoader.js';
|
|
16
|
-
import '../../context/DocumentContext.js';
|
|
17
|
-
import '../../services/api.js';
|
|
18
|
-
import '../../config/env.js';
|
|
19
|
-
import '../../services/auditTrailService.js';
|
|
20
|
-
import 'ua-parser-js';
|
|
21
|
-
import MobilePageLayout from '../ui/MobilePageLayout.js';
|
|
22
|
-
import LanguageSelector from '../ui/LanguageSelector.js';
|
|
23
|
-
import 'qrcode';
|
|
24
|
-
import 'lucide-react';
|
|
25
|
-
import '../../assets/check.svg.js';
|
|
26
|
-
import '../selfie/Video.css.js';
|
|
27
|
-
import '../selfie/VideoFixes.css.js';
|
|
28
|
-
import '../selfie/selfie-flow/SelfieFlow.js';
|
|
29
|
-
import '../ui/SelectComponent.js';
|
|
30
|
-
import 'clsx';
|
|
31
|
-
import 'tailwind-merge';
|
|
32
|
-
import '../jdi/JDIProcessing.js';
|
|
33
|
-
import '../../assets/before-photo.png.js';
|
|
34
|
-
import '../../assets/before-verso.png.js';
|
|
35
|
-
import '../../assets/before-document.png.js';
|
|
36
|
-
import '../../assets/selfietake.svg.js';
|
|
37
|
-
import '../../assets/before-passport.png.js';
|
|
38
|
-
import '../../services/cameraService.js';
|
|
39
|
-
import '../../services/documentEdgeDetectionService.js';
|
|
40
|
-
import '../document-video/document-video-flow/DocumentVideoFlow.js';
|
|
41
|
-
import '../document-collection/DocumentProcessing.js';
|
|
42
|
-
import '../../constants/userInputForm.js';
|
|
43
|
-
import 'date-fns';
|
|
44
|
-
import 'react-day-picker';
|
|
45
|
-
import '@radix-ui/react-popover';
|
|
46
|
-
import 'react-i18next';
|
|
47
|
-
import '../../i18n/index.js';
|
|
48
|
-
import '@docuseal/react';
|
|
49
|
-
import '../../services/professionalImageQuality.js';
|
|
50
|
-
import '../../providers/I18nProvider.js';
|
|
51
|
-
|
|
52
|
-
var CGU = function (_a) {
|
|
53
|
-
var setStep = _a.setStep, sessionId = _a.sessionId, showQRCodeInstructions = _a.showQRCodeInstructions, languages = _a.languages, session = _a.session, onBack = _a.onBack;
|
|
54
|
-
var _b = useI18n(), t = _b.t; _b.setLanguage;
|
|
55
|
-
var _c = useState(languages ? languages[0] : "fr"); _c[0]; _c[1];
|
|
56
|
-
var _d = useState(false), checked = _d[0], setChecked = _d[1];
|
|
57
|
-
var _e = useState(false), error = _e[0], setError = _e[1];
|
|
58
|
-
var _f = useState(null), submitError = _f[0], setSubmitError = _f[1];
|
|
59
|
-
var _g = useState(false), isSubmitting = _g[0], setIsSubmitting = _g[1];
|
|
60
|
-
var handleCheckboxChange = function (value) {
|
|
61
|
-
setChecked(value);
|
|
62
|
-
setError(false);
|
|
63
|
-
setSubmitError(null);
|
|
64
|
-
};
|
|
65
|
-
var goOnNextStep = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
66
|
-
var nextStep, statusError_1;
|
|
67
|
-
return __generator(this, function (_a) {
|
|
68
|
-
switch (_a.label) {
|
|
69
|
-
case 0:
|
|
70
|
-
if (!checked) {
|
|
71
|
-
setError(true);
|
|
72
|
-
return [2 /*return*/];
|
|
73
|
-
}
|
|
74
|
-
nextStep = showQRCodeInstructions ? 0.5 : 1;
|
|
75
|
-
if (!sessionId) {
|
|
76
|
-
setStep(nextStep);
|
|
77
|
-
return [2 /*return*/];
|
|
78
|
-
}
|
|
79
|
-
setIsSubmitting(true);
|
|
80
|
-
_a.label = 1;
|
|
81
|
-
case 1:
|
|
82
|
-
_a.trys.push([1, 3, 4, 5]);
|
|
83
|
-
return [4 /*yield*/, updateSessionStatus(sessionId, "started")];
|
|
84
|
-
case 2:
|
|
85
|
-
_a.sent();
|
|
86
|
-
setStep(nextStep);
|
|
87
|
-
return [3 /*break*/, 5];
|
|
88
|
-
case 3:
|
|
89
|
-
statusError_1 = _a.sent();
|
|
90
|
-
console.error(t("CGU.error.console_update_status"), statusError_1);
|
|
91
|
-
setSubmitError(t("CGU.error.general"));
|
|
92
|
-
return [3 /*break*/, 5];
|
|
93
|
-
case 4:
|
|
94
|
-
setIsSubmitting(false);
|
|
95
|
-
return [7 /*endfinally*/];
|
|
96
|
-
case 5: return [2 /*return*/];
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
}); };
|
|
100
|
-
return (jsx(MobilePageLayout, { session: session !== null && session !== void 0 ? session : undefined, footer: jsxs("div", { className: "w-full space-y-4", children: [(error || submitError) && (jsx("div", { className: "bg-red-50 border border-red-200 rounded-lg p-3", children: jsx(Body, { className: "text-red-600 text-sm text-center", children: submitError ? submitError : t("CGU.error.required") }) })), jsxs("div", { className: "flex items-start gap-3 p-3 bg-gray-50 rounded-lg", children: [jsx(CheckboxPrimitive.Root, { id: "checkbox", checked: checked, onCheckedChange: function (value) { return handleCheckboxChange(!!value); }, className: "mt-1 h-5 w-5 shrink-0 rounded border bg-white transition-colors\n data-[state=checked]:bg-[var(--dk-btn-bg)] data-[state=checked]:border-[var(--dk-btn-bg)]\n ".concat(error
|
|
101
|
-
? "border-red-500"
|
|
102
|
-
: "border-gray-300 hover:border-gray-400", "\n "), children: jsx(CheckboxPrimitive.Indicator, { className: "flex items-center justify-center text-white", children: jsx(CheckIcon, { className: "h-4 w-4" }) }) }), jsx(Label.Root, { htmlFor: "checkbox", className: "cursor-pointer", children: jsx(Body, { className: "text-left text-sm leading-relaxed ".concat(error ? "text-red-600" : "text-gray-700"), children: t("CGU.checkbox_text") }) })] }), jsx(PageActions, { primary: jsx(Button, { onClick: goOnNextStep, disabled: !checked || isSubmitting, children: isSubmitting
|
|
103
|
-
? t("CGU.button.loading")
|
|
104
|
-
: t("CGU.button.continue") }), secondary: onBack ? (jsx(Button, { variant: "secondary", onClick: onBack, children: t("jdi.country_selection.back") })) : undefined })] }), children: jsx("div", { className: "px-4 py-8 md:px-8 flex flex-col", children: jsxs("div", { className: "w-full max-w-2xl mx-auto space-y-6", children: [jsxs("div", { className: "text-center justify-center items-center", children: [jsx(Title, { className: "text-xl md:text-2xl lg:text-3xl mb-6", children: t("CGU.terms_of_use") }), languages && languages.length > 1 && (jsx("div", { className: "flex justify-center items-center mb-6", children: jsx(LanguageSelector, { className: "w-64 mx-auto", languages: languages }) }))] }), jsx("div", { className: "bg-gray-50 rounded-lg p-4 md:p-6", children: jsxs(Body, { className: "text-left text-sm md:text-base leading-relaxed space-y-4", children: [jsx("p", { children: t("CGU.title") }), jsx("p", { children: t("CGU.description") }), jsxs("p", { children: [t("CGU.description2_before"), " ", jsx("a", { href: t("CGU.privacy_url"), target: "_blank", rel: "noopener noreferrer", className: "underline text-blue-600 hover:text-blue-800", children: t("CGU.privacy_link_label") }), t("CGU.description2_after")] }), jsxs("p", { children: [t("CGU.by_proceeding_before"), " ", jsx("a", { href: t("CGU.cgu_url"), target: "_blank", rel: "noopener noreferrer", className: "underline text-blue-600 hover:text-blue-800", children: t("CGU.cgu_link_label") }), t("CGU.by_proceeding_after")] })] }) })] }) }) }));
|
|
105
|
-
};
|
|
106
|
-
|
|
107
|
-
export { CGU as default };
|
|
108
|
-
//# sourceMappingURL=CGU.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CGU.js","sources":["../../../../../src/components/start-flow/CGU.tsx"],"sourcesContent":["import Body from \"../ui/Body\";\nimport Title from \"../ui/Title\";\nimport { useState } from \"react\";\nimport { updateSessionStatus } from \"../../services/sessionService\";\n\n// For checkbox\nimport * as CheckboxPrimitive from \"@radix-ui/react-checkbox\";\nimport * as LabelPrimitive from \"@radix-ui/react-label\";\nimport { CheckIcon } from \"@radix-ui/react-icons\";\nimport Button from \"../ui/Button\";\nimport PageActions from \"../ui/PageActions\";\nimport { useI18n } from \"../..\";\nimport LanguageSelector from \"../ui/LanguageSelector\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport { SessionData } from \"../../types/session\";\n\ninterface CGUProps {\n setStep: (nubr: number) => void;\n sessionId?: string;\n showQRCodeInstructions: boolean;\n languages?: string[];\n session?: SessionData;\n onBack?: () => void;\n}\n\nconst CGU = ({\n setStep,\n sessionId,\n showQRCodeInstructions,\n languages,\n session,\n onBack,\n}: CGUProps) => {\n const { t, setLanguage } = useI18n();\n const [selectedLanguage, setSelectedLanguage] = useState(\n languages ? languages[0] : \"fr\"\n );\n const [checked, setChecked] = useState(false);\n const [error, setError] = useState(false);\n const [submitError, setSubmitError] = useState<string | null>(null);\n const [isSubmitting, setIsSubmitting] = useState(false);\n\n const handleCheckboxChange = (value: boolean) => {\n setChecked(value);\n setError(false);\n setSubmitError(null);\n };\n\n const goOnNextStep = async () => {\n if (!checked) {\n setError(true);\n return;\n }\n\n const nextStep = showQRCodeInstructions ? 0.5 : 1;\n\n if (!sessionId) {\n setStep(nextStep);\n return;\n }\n\n setIsSubmitting(true);\n try {\n await updateSessionStatus(sessionId, \"started\");\n setStep(nextStep);\n } catch (statusError) {\n console.error(t(\"CGU.error.console_update_status\"), statusError);\n setSubmitError(t(\"CGU.error.general\"));\n } finally {\n setIsSubmitting(false);\n }\n };\n\n const handleLanguageChange = (langId: string) => {\n const lang = languages?.find((l) => l === langId);\n if (lang) {\n setLanguage(lang);\n setSelectedLanguage(lang);\n }\n };\n\n return (\n <MobilePageLayout\n session={session ?? undefined}\n footer={\n <div className=\"w-full space-y-4\">\n {/* Error message */}\n {(error || submitError) && (\n <div className=\"bg-red-50 border border-red-200 rounded-lg p-3\">\n <Body className=\"text-red-600 text-sm text-center\">\n {submitError ? submitError : t(\"CGU.error.required\")}\n </Body>\n </div>\n )}\n\n {/* Consent checkbox */}\n <div className=\"flex items-start gap-3 p-3 bg-gray-50 rounded-lg\">\n <CheckboxPrimitive.Root\n id=\"checkbox\"\n checked={checked}\n onCheckedChange={(value) => handleCheckboxChange(!!value)}\n className={`mt-1 h-5 w-5 shrink-0 rounded border bg-white transition-colors\n data-[state=checked]:bg-[var(--dk-btn-bg)] data-[state=checked]:border-[var(--dk-btn-bg)]\n ${error\n ? \"border-red-500\"\n : \"border-gray-300 hover:border-gray-400\"\n }\n `}\n >\n <CheckboxPrimitive.Indicator className=\"flex items-center justify-center text-white\">\n <CheckIcon className=\"h-4 w-4\" />\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n\n <LabelPrimitive.Root htmlFor=\"checkbox\" className=\"cursor-pointer\">\n <Body\n className={`text-left text-sm leading-relaxed ${error ? \"text-red-600\" : \"text-gray-700\"\n }`}\n >\n {t(\"CGU.checkbox_text\")}\n </Body>\n </LabelPrimitive.Root>\n </div>\n\n {/* Buttons */}\n <PageActions\n primary={\n <Button\n onClick={goOnNextStep}\n disabled={!checked || isSubmitting}\n >\n {isSubmitting\n ? t(\"CGU.button.loading\")\n : t(\"CGU.button.continue\")}\n </Button>\n }\n secondary={\n onBack ? (\n <Button variant=\"secondary\" onClick={onBack}>\n {t(\"jdi.country_selection.back\")}\n </Button>\n ) : undefined\n }\n />\n </div>\n }\n >\n <div className=\"px-4 py-8 md:px-8 flex flex-col\">\n <div className=\"w-full max-w-2xl mx-auto space-y-6\">\n <div className=\"text-center justify-center items-center\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl mb-6\">\n {t(\"CGU.terms_of_use\")}\n </Title>\n\n {/* Language selector */}\n {languages && languages.length > 1 && (\n <div className=\"flex justify-center items-center mb-6\">\n <LanguageSelector\n className=\"w-64 mx-auto\"\n languages={languages}\n />\n </div>\n )}\n </div>\n\n {/* Terms content */}\n <div className=\"bg-gray-50 rounded-lg p-4 md:p-6\">\n <Body className=\"text-left text-sm md:text-base leading-relaxed space-y-4\">\n <p>{t(\"CGU.title\")}</p>\n <p>{t(\"CGU.description\")}</p>\n <p>\n {t(\"CGU.description2_before\")}{\" \"}\n <a\n href={t(\"CGU.privacy_url\")}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"underline text-blue-600 hover:text-blue-800\"\n >\n {t(\"CGU.privacy_link_label\")}\n </a>\n {t(\"CGU.description2_after\")}\n </p>\n <p>\n {t(\"CGU.by_proceeding_before\")}{\" \"}\n <a\n href={t(\"CGU.cgu_url\")}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"underline text-blue-600 hover:text-blue-800\"\n >\n {t(\"CGU.cgu_link_label\")}\n </a>\n {t(\"CGU.by_proceeding_after\")}\n </p>\n </Body>\n </div>\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default CGU;\n"],"names":["_jsx","_jsxs","LabelPrimitive"],"mappings":"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"}
|