datakeen-session-react 1.1.196 → 1.1.198-rc.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.
Files changed (49) hide show
  1. package/dist/cjs/components/start-flow/Start.js +1 -0
  2. package/dist/cjs/components/start-flow/Start.js.map +1 -1
  3. package/dist/cjs/components/template/ComplementaryMandateNodeHandler.js +36 -0
  4. package/dist/cjs/components/template/ComplementaryMandateNodeHandler.js.map +1 -0
  5. package/dist/cjs/components/template/TemplateNodeRenderer.js +3 -0
  6. package/dist/cjs/components/template/TemplateNodeRenderer.js.map +1 -1
  7. package/dist/cjs/hooks/useSessionData.js +10 -5
  8. package/dist/cjs/hooks/useSessionData.js.map +1 -1
  9. package/dist/cjs/hooks/useStepNavigation.js +1 -1
  10. package/dist/cjs/hooks/useStepNavigation.js.map +1 -1
  11. package/dist/cjs/hooks/useUserInputForm.js +27 -6
  12. package/dist/cjs/hooks/useUserInputForm.js.map +1 -1
  13. package/dist/cjs/i18n/en.json.js +22 -1
  14. package/dist/cjs/i18n/en.json.js.map +1 -1
  15. package/dist/cjs/i18n/es.json.js +22 -1
  16. package/dist/cjs/i18n/es.json.js.map +1 -1
  17. package/dist/cjs/i18n/fr.json.js +22 -1
  18. package/dist/cjs/i18n/fr.json.js.map +1 -1
  19. package/dist/cjs/services/sessionService.js +33 -6
  20. package/dist/cjs/services/sessionService.js.map +1 -1
  21. package/dist/cjs/types/session.js.map +1 -1
  22. package/dist/cjs/utils/customFieldValidation.js +44 -1
  23. package/dist/cjs/utils/customFieldValidation.js.map +1 -1
  24. package/dist/esm/components/start-flow/Start.js +1 -0
  25. package/dist/esm/components/start-flow/Start.js.map +1 -1
  26. package/dist/esm/components/template/ComplementaryMandateNodeHandler.js +32 -0
  27. package/dist/esm/components/template/ComplementaryMandateNodeHandler.js.map +1 -0
  28. package/dist/esm/components/template/TemplateNodeRenderer.js +3 -0
  29. package/dist/esm/components/template/TemplateNodeRenderer.js.map +1 -1
  30. package/dist/esm/hooks/useSessionData.js +10 -5
  31. package/dist/esm/hooks/useSessionData.js.map +1 -1
  32. package/dist/esm/hooks/useStepNavigation.js +1 -1
  33. package/dist/esm/hooks/useStepNavigation.js.map +1 -1
  34. package/dist/esm/hooks/useUserInputForm.js +28 -7
  35. package/dist/esm/hooks/useUserInputForm.js.map +1 -1
  36. package/dist/esm/i18n/en.json.js +22 -2
  37. package/dist/esm/i18n/en.json.js.map +1 -1
  38. package/dist/esm/i18n/es.json.js +22 -2
  39. package/dist/esm/i18n/es.json.js.map +1 -1
  40. package/dist/esm/i18n/fr.json.js +22 -2
  41. package/dist/esm/i18n/fr.json.js.map +1 -1
  42. package/dist/esm/services/sessionService.js +33 -7
  43. package/dist/esm/services/sessionService.js.map +1 -1
  44. package/dist/esm/types/session.js.map +1 -1
  45. package/dist/esm/utils/customFieldValidation.js +44 -2
  46. package/dist/esm/utils/customFieldValidation.js.map +1 -1
  47. package/docs/COMPLEMENTARY_MANDATE.md +22 -0
  48. package/docs/JOURNEY_NODE_BUILDER.md +15 -0
  49. package/package.json +1 -1
@@ -13,6 +13,7 @@ require('../../utils/cssLoader.js');
13
13
  require('../../context/DocumentContext.js');
14
14
  require('../../services/api.js');
15
15
  require('../../config/env.js');
16
+ require('axios');
16
17
  require('../../services/auditTrailService.js');
17
18
  require('ua-parser-js');
18
19
  var StartIcon = require('../icons/StartIcon.js');
@@ -1 +1 @@
1
- {"version":3,"file":"Start.js","sources":["../../../../../src/components/start-flow/Start.tsx"],"sourcesContent":["import { useI18n } from \"../..\";\nimport { SessionData } from \"../../types/session\";\nimport StartIcon from \"../icons/StartIcon\";\nimport Button from \"../ui/Button\";\nimport PageActions from \"../ui/PageActions\";\nimport Subtitle from \"../ui/Subtitle\";\nimport Title from \"../ui/Title\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\n\ninterface StartProps {\n setStep: (nubr: number) => void;\n welcomeTitle?: string;\n welcomeSubtitle?: string;\n welcomeDescription?: string;\n welcomeImage?: string;\n session?: SessionData;\n}\n\nconst Start = ({\n setStep,\n welcomeTitle,\n welcomeSubtitle,\n welcomeDescription,\n welcomeImage,\n session,\n}: StartProps) => {\n const { t } = useI18n();\n\n const displayTitle =\n welcomeTitle || t(\"start.welcome_title\", \"Vérifions votre identité\");\n const displaySubtitle =\n welcomeSubtitle ||\n t(\"start.welcome_subtitle\", \"Nous devons vérifier votre identité\");\n const displayDescription =\n welcomeDescription || t(\"start.welcome_description\");\n\n const goOnNextStep = () => {\n setStep(1);\n };\n\n return (\n <MobilePageLayout\n footer={\n <PageActions\n primary={\n <Button onClick={goOnNextStep}>{t(\"start_verification\")}</Button>\n }\n />\n }\n session={session}\n >\n <div className=\"flex flex-col items-center px-4 py-8 md:px-8\">\n <div className=\"w-full max-w-md mx-auto text-center space-y-6 flex flex-col\">\n {/* Icon/Image - shown on top for both mobile and desktop */}\n <div className=\"flex justify-center\">\n {welcomeImage ? (\n <img\n src={welcomeImage}\n alt=\"Welcome image\"\n className=\"max-w-48 w-auto h-auto rounded-lg\"\n />\n ) : (\n <StartIcon className=\"w-48 h-48\" />\n )}\n </div>\n\n {/* Text content */}\n <div className=\"space-y-4\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl\">\n {displayTitle}\n </Title>\n <Subtitle className=\"text-sm md:text-base text-gray-600 leading-relaxed whitespace-pre-line\">\n {displaySubtitle}\n </Subtitle>\n </div>\n\n {/* Terms notice */}\n <div className=\"md:block mt-8\">\n <p className=\"text-xs text-gray-500 leading-relaxed max-w-sm mx-auto whitespace-pre-line\">\n {displayDescription}\n </p>\n </div>\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default Start;\n"],"names":["useI18n","_jsx","MobilePageLayout","PageActions","Button","_jsxs","StartIcon","Title","Subtitle"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,IAAM,KAAK,GAAG,UAAC,EAOF,EAAA;AANX,IAAA,IAAA,OAAO,GAAA,EAAA,CAAA,OAAA,EACP,YAAY,GAAA,EAAA,CAAA,YAAA,EACZ,eAAe,GAAA,EAAA,CAAA,eAAA,EACf,kBAAkB,wBAAA,EAClB,YAAY,GAAA,EAAA,CAAA,YAAA,EACZ,OAAO,GAAA,EAAA,CAAA,OAAA;AAEC,IAAA,IAAA,CAAC,GAAKA,eAAO,EAAE,EAAd;IAET,IAAM,YAAY,GAChB,YAAY,IAAI,CAAC,CAAC,qBAAqB,EAAE,0BAA0B,CAAC;IACtE,IAAM,eAAe,GACnB,eAAe;AACf,QAAA,CAAC,CAAC,wBAAwB,EAAE,qCAAqC,CAAC;IACpE,IAAM,kBAAkB,GACtB,kBAAkB,IAAI,CAAC,CAAC,2BAA2B,CAAC;AAEtD,IAAA,IAAM,YAAY,GAAG,YAAA;QACnB,OAAO,CAAC,CAAC,CAAC;AACZ,IAAA,CAAC;IAED,QACEC,cAAA,CAACC,wBAAgB,EAAA,EACf,MAAM,EACJD,cAAA,CAACE,mBAAW,EAAA,EACV,OAAO,EACLF,cAAA,CAACG,cAAM,EAAA,EAAC,OAAO,EAAE,YAAY,EAAA,QAAA,EAAG,CAAC,CAAC,oBAAoB,CAAC,EAAA,CAAU,EAAA,CAEnE,EAEJ,OAAO,EAAE,OAAO,EAAA,QAAA,EAEhBH,wBAAK,SAAS,EAAC,8CAA8C,EAAA,QAAA,EAC3DI,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,6DAA6D,EAAA,QAAA,EAAA,CAE1EJ,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,qBAAqB,EAAA,QAAA,EACjC,YAAY,IACXA,cAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,YAAY,EACjB,GAAG,EAAC,eAAe,EACnB,SAAS,EAAC,mCAAmC,EAAA,CAC7C,KAEFA,cAAA,CAACK,iBAAS,EAAA,EAAC,SAAS,EAAC,WAAW,EAAA,CAAG,CACpC,EAAA,CACG,EAGND,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,WAAW,EAAA,QAAA,EAAA,CACxBJ,cAAA,CAACM,aAAK,EAAA,EAAC,SAAS,EAAC,iCAAiC,EAAA,QAAA,EAC/C,YAAY,EAAA,CACP,EACRN,cAAA,CAACO,gBAAQ,EAAA,EAAC,SAAS,EAAC,wEAAwE,EAAA,QAAA,EACzF,eAAe,EAAA,CACP,CAAA,EAAA,CACP,EAGNP,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,eAAe,EAAA,QAAA,EAC5BA,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,4EAA4E,EAAA,QAAA,EACtF,kBAAkB,EAAA,CACjB,EAAA,CACA,CAAA,EAAA,CACF,EAAA,CACF,EAAA,CACW;AAEvB;;;;"}
1
+ {"version":3,"file":"Start.js","sources":["../../../../../src/components/start-flow/Start.tsx"],"sourcesContent":["import { useI18n } from \"../..\";\nimport { SessionData } from \"../../types/session\";\nimport StartIcon from \"../icons/StartIcon\";\nimport Button from \"../ui/Button\";\nimport PageActions from \"../ui/PageActions\";\nimport Subtitle from \"../ui/Subtitle\";\nimport Title from \"../ui/Title\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\n\ninterface StartProps {\n setStep: (nubr: number) => void;\n welcomeTitle?: string;\n welcomeSubtitle?: string;\n welcomeDescription?: string;\n welcomeImage?: string;\n session?: SessionData;\n}\n\nconst Start = ({\n setStep,\n welcomeTitle,\n welcomeSubtitle,\n welcomeDescription,\n welcomeImage,\n session,\n}: StartProps) => {\n const { t } = useI18n();\n\n const displayTitle =\n welcomeTitle || t(\"start.welcome_title\", \"Vérifions votre identité\");\n const displaySubtitle =\n welcomeSubtitle ||\n t(\"start.welcome_subtitle\", \"Nous devons vérifier votre identité\");\n const displayDescription =\n welcomeDescription || t(\"start.welcome_description\");\n\n const goOnNextStep = () => {\n setStep(1);\n };\n\n return (\n <MobilePageLayout\n footer={\n <PageActions\n primary={\n <Button onClick={goOnNextStep}>{t(\"start_verification\")}</Button>\n }\n />\n }\n session={session}\n >\n <div className=\"flex flex-col items-center px-4 py-8 md:px-8\">\n <div className=\"w-full max-w-md mx-auto text-center space-y-6 flex flex-col\">\n {/* Icon/Image - shown on top for both mobile and desktop */}\n <div className=\"flex justify-center\">\n {welcomeImage ? (\n <img\n src={welcomeImage}\n alt=\"Welcome image\"\n className=\"max-w-48 w-auto h-auto rounded-lg\"\n />\n ) : (\n <StartIcon className=\"w-48 h-48\" />\n )}\n </div>\n\n {/* Text content */}\n <div className=\"space-y-4\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl\">\n {displayTitle}\n </Title>\n <Subtitle className=\"text-sm md:text-base text-gray-600 leading-relaxed whitespace-pre-line\">\n {displaySubtitle}\n </Subtitle>\n </div>\n\n {/* Terms notice */}\n <div className=\"md:block mt-8\">\n <p className=\"text-xs text-gray-500 leading-relaxed max-w-sm mx-auto whitespace-pre-line\">\n {displayDescription}\n </p>\n </div>\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default Start;\n"],"names":["useI18n","_jsx","MobilePageLayout","PageActions","Button","_jsxs","StartIcon","Title","Subtitle"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAkBA,IAAM,KAAK,GAAG,UAAC,EAOF,EAAA;AANX,IAAA,IAAA,OAAO,GAAA,EAAA,CAAA,OAAA,EACP,YAAY,GAAA,EAAA,CAAA,YAAA,EACZ,eAAe,GAAA,EAAA,CAAA,eAAA,EACf,kBAAkB,wBAAA,EAClB,YAAY,GAAA,EAAA,CAAA,YAAA,EACZ,OAAO,GAAA,EAAA,CAAA,OAAA;AAEC,IAAA,IAAA,CAAC,GAAKA,eAAO,EAAE,EAAd;IAET,IAAM,YAAY,GAChB,YAAY,IAAI,CAAC,CAAC,qBAAqB,EAAE,0BAA0B,CAAC;IACtE,IAAM,eAAe,GACnB,eAAe;AACf,QAAA,CAAC,CAAC,wBAAwB,EAAE,qCAAqC,CAAC;IACpE,IAAM,kBAAkB,GACtB,kBAAkB,IAAI,CAAC,CAAC,2BAA2B,CAAC;AAEtD,IAAA,IAAM,YAAY,GAAG,YAAA;QACnB,OAAO,CAAC,CAAC,CAAC;AACZ,IAAA,CAAC;IAED,QACEC,cAAA,CAACC,wBAAgB,EAAA,EACf,MAAM,EACJD,cAAA,CAACE,mBAAW,EAAA,EACV,OAAO,EACLF,cAAA,CAACG,cAAM,EAAA,EAAC,OAAO,EAAE,YAAY,EAAA,QAAA,EAAG,CAAC,CAAC,oBAAoB,CAAC,EAAA,CAAU,EAAA,CAEnE,EAEJ,OAAO,EAAE,OAAO,EAAA,QAAA,EAEhBH,wBAAK,SAAS,EAAC,8CAA8C,EAAA,QAAA,EAC3DI,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,6DAA6D,EAAA,QAAA,EAAA,CAE1EJ,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,qBAAqB,EAAA,QAAA,EACjC,YAAY,IACXA,cAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,YAAY,EACjB,GAAG,EAAC,eAAe,EACnB,SAAS,EAAC,mCAAmC,EAAA,CAC7C,KAEFA,cAAA,CAACK,iBAAS,EAAA,EAAC,SAAS,EAAC,WAAW,EAAA,CAAG,CACpC,EAAA,CACG,EAGND,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,WAAW,EAAA,QAAA,EAAA,CACxBJ,cAAA,CAACM,aAAK,EAAA,EAAC,SAAS,EAAC,iCAAiC,EAAA,QAAA,EAC/C,YAAY,EAAA,CACP,EACRN,cAAA,CAACO,gBAAQ,EAAA,EAAC,SAAS,EAAC,wEAAwE,EAAA,QAAA,EACzF,eAAe,EAAA,CACP,CAAA,EAAA,CACP,EAGNP,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,eAAe,EAAA,QAAA,EAC5BA,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,4EAA4E,EAAA,QAAA,EACtF,kBAAkB,EAAA,CACjB,EAAA,CACA,CAAA,EAAA,CACF,EAAA,CACF,EAAA,CACW;AAEvB;;;;"}
@@ -0,0 +1,36 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var jsxRuntime = require('react/jsx-runtime');
6
+ var React = require('react');
7
+ var useI18n = require('../../hooks/useI18n.js');
8
+ var sessionService = require('../../services/sessionService.js');
9
+ var LoadingState = require('../states/LoadingState.js');
10
+ var Button = require('../ui/Button.js');
11
+
12
+ function ComplementaryMandateNodeHandler(_a) {
13
+ var sessionId = _a.sessionId, nodeId = _a.nodeId, onOutcome = _a.onOutcome;
14
+ var t = useI18n.useI18n().t;
15
+ var _b = React.useState(false), error = _b[0], setError = _b[1];
16
+ var _c = React.useState(0), attempt = _c[0], setAttempt = _c[1];
17
+ var callback = React.useRef(onOutcome);
18
+ callback.current = onOutcome;
19
+ React.useEffect(function () {
20
+ var active = true;
21
+ setError(false);
22
+ sessionService.checkComplementaryMandate(sessionId, nodeId).then(function (_a) {
23
+ var outcome = _a.outcome;
24
+ if (active)
25
+ callback.current(outcome);
26
+ }).catch(function () { if (active)
27
+ setError(true); });
28
+ return function () { active = false; };
29
+ }, [sessionId, nodeId, attempt]);
30
+ if (!error)
31
+ return jsxRuntime.jsx(LoadingState.default, { message: t('complementary_mandate.loading') });
32
+ return jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-4 p-6", children: [jsxRuntime.jsx("p", { role: "alert", children: t('complementary_mandate.error') }), jsxRuntime.jsx(Button.default, { onClick: function () { return setAttempt(function (value) { return value + 1; }); }, children: t('complementary_mandate.retry') })] });
33
+ }
34
+
35
+ exports.default = ComplementaryMandateNodeHandler;
36
+ //# sourceMappingURL=ComplementaryMandateNodeHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ComplementaryMandateNodeHandler.js","sources":["../../../../../src/components/template/ComplementaryMandateNodeHandler.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from 'react';\nimport { useI18n } from '../../hooks/useI18n';\nimport { checkComplementaryMandate } from '../../services/sessionService';\nimport type { ComplementaryMandateOutcome } from '../../types/session';\nimport LoadingState from '../states/LoadingState';\nimport Button from '../ui/Button';\n\nexport default function ComplementaryMandateNodeHandler({ sessionId, nodeId, onOutcome }: { sessionId: string; nodeId: string; onOutcome: (outcome: ComplementaryMandateOutcome) => void }) {\n const { t } = useI18n();\n const [error, setError] = useState(false);\n const [attempt, setAttempt] = useState(0);\n const callback = useRef(onOutcome);\n callback.current = onOutcome;\n useEffect(() => {\n let active = true;\n setError(false);\n checkComplementaryMandate(sessionId, nodeId).then(({ outcome }) => {\n if (active) callback.current(outcome);\n }).catch(() => { if (active) setError(true); });\n return () => { active = false; };\n }, [sessionId, nodeId, attempt]);\n if (!error) return <LoadingState message={t('complementary_mandate.loading')} />;\n return <div className=\"flex flex-col items-center gap-4 p-6\">\n <p role=\"alert\">{t('complementary_mandate.error')}</p>\n <Button onClick={() => setAttempt(value => value + 1)}>{t('complementary_mandate.retry')}</Button>\n </div>;\n}\n"],"names":["useI18n","useState","useRef","useEffect","checkComplementaryMandate","_jsx","LoadingState","_jsxs","Button"],"mappings":";;;;;;;;;;;AAOc,SAAU,+BAA+B,CAAC,EAAkI,EAAA;AAAhI,IAAA,IAAA,SAAS,eAAA,EAAE,MAAM,GAAA,EAAA,CAAA,MAAA,EAAE,SAAS,GAAA,EAAA,CAAA,SAAA;AAC5E,IAAA,IAAA,CAAC,GAAKA,eAAO,EAAE,EAAd;IACH,IAAA,EAAA,GAAoBC,cAAQ,CAAC,KAAK,CAAC,EAAlC,KAAK,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,QAAQ,GAAA,EAAA,CAAA,CAAA,CAAmB;IACnC,IAAA,EAAA,GAAwBA,cAAQ,CAAC,CAAC,CAAC,EAAlC,OAAO,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,UAAU,GAAA,EAAA,CAAA,CAAA,CAAe;AACzC,IAAA,IAAM,QAAQ,GAAGC,YAAM,CAAC,SAAS,CAAC;AAClC,IAAA,QAAQ,CAAC,OAAO,GAAG,SAAS;AAC5B,IAAAC,eAAS,CAAC,YAAA;QACR,IAAI,MAAM,GAAG,IAAI;QACjB,QAAQ,CAAC,KAAK,CAAC;QACfC,wCAAyB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,UAAC,EAAW,EAAA;AAAT,YAAA,IAAA,OAAO,GAAA,EAAA,CAAA,OAAA;AAC1D,YAAA,IAAI,MAAM;AAAE,gBAAA,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC;AACvC,QAAA,CAAC,CAAC,CAAC,KAAK,CAAC,YAAA,EAAQ,IAAI,MAAM;AAAE,YAAA,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,QAAA,OAAO,cAAQ,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC;IAClC,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAChC,IAAA,IAAI,CAAC,KAAK;QAAE,OAAOC,cAAA,CAACC,oBAAY,EAAA,EAAC,OAAO,EAAE,CAAC,CAAC,+BAA+B,CAAC,EAAA,CAAI;IAChF,OAAOC,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,sCAAsC,aAC1DF,cAAA,CAAA,GAAA,EAAA,EAAG,IAAI,EAAC,OAAO,EAAA,QAAA,EAAE,CAAC,CAAC,6BAA6B,CAAC,EAAA,CAAK,EACtDA,eAACG,cAAM,EAAA,EAAC,OAAO,EAAE,YAAA,EAAM,OAAA,UAAU,CAAC,UAAA,KAAK,EAAA,EAAI,OAAA,KAAK,GAAG,CAAC,CAAA,CAAT,CAAS,CAAC,CAAA,CAA9B,CAA8B,YAAG,CAAC,CAAC,6BAA6B,CAAC,EAAA,CAAU,IAC9F;AACR;;;;"}
@@ -4,6 +4,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var tslib_es6 = require('../../node_modules/tslib/tslib.es6.js');
6
6
  var jsxRuntime = require('react/jsx-runtime');
7
+ var ComplementaryMandateNodeHandler = require('./ComplementaryMandateNodeHandler.js');
7
8
  var React = require('react');
8
9
  var Selfie = require('../session/Selfie.js');
9
10
  var VideoWorkInProgress = require('../session/VideoWorkInProgress.js');
@@ -127,6 +128,8 @@ var TemplateNodeRenderer = function (_a) {
127
128
  case "condition":
128
129
  console.debug("🔀 Rendering Condition Node Handler component and well");
129
130
  return (jsxRuntime.jsx(ConditionNodeHandler.default, { node: node, session: session, templateNodes: templateNodes, stepObject: stepObject, userInput: userInput, contactInfo: contactInfo }));
131
+ case "complementary-mandate":
132
+ return jsxRuntime.jsx(ComplementaryMandateNodeHandler.default, { sessionId: sessionId, nodeId: node.id, onOutcome: function (outcome) { return stepObject.goToNextStep(node.id, session.template, outcome); } });
130
133
  case "external-verification":
131
134
  console.debug("🔍 Rendering External Verification Node Handler");
132
135
  return (jsxRuntime.jsx(ExternalVerificationNodeHandler.default, { node: node, session: session, userInput: userInput, setUserInput: setUserInput, onNext: function () { return stepObject.goToNextStep(node.id, session.template); }, onPrevious: function () { return stepObject.goBack(); }, onNavigateToNode: function (nodeId) {
@@ -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":["useI18n","_jsxs","_jsx","EndFlow","useMemo","getOrderedJourneySteps","LoadingState","getRunPrefillData","UserInputForm","DocumentCollection","__assign","DocumentCheck","Selfie","SignatureElectronic","VideoWorkInProgress","JDDWorkInProgress","ConditionNodeHandler","ExternalVerificationNodeHandler","PdfGeneration","LegalConsentNode"],"mappings":"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"}
1
+ {"version":3,"file":"TemplateNodeRenderer.js","sources":["../../../../../src/components/template/TemplateNodeRenderer.tsx"],"sourcesContent":["import ComplementaryMandateNodeHandler from './ComplementaryMandateNodeHandler';\nimport 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 \"complementary-mandate\":\n return <ComplementaryMandateNodeHandler sessionId={sessionId} nodeId={node.id} onOutcome={outcome => stepObject.goToNextStep(node.id, session.template, outcome)} />;\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":["useI18n","_jsxs","_jsx","EndFlow","useMemo","getOrderedJourneySteps","LoadingState","getRunPrefillData","UserInputForm","DocumentCollection","__assign","DocumentCheck","Selfie","SignatureElectronic","VideoWorkInProgress","JDDWorkInProgress","ConditionNodeHandler","ComplementaryMandateNodeHandler","ExternalVerificationNodeHandler","PdfGeneration","LegalConsentNode"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var tslib_es6 = require('../node_modules/tslib/tslib.es6.js');
4
+ var axios = require('axios');
4
5
  var React = require('react');
5
6
  var sessionService = require('../services/sessionService.js');
6
7
  var auditTrailService = require('../services/auditTrailService.js');
@@ -201,20 +202,24 @@ var useSessionData = function (sessionId, clientInfo, clientInfoLoaded) {
201
202
  sessionMemoryStore.setSessionMemoryUserInput(sessionId, cleanedUserInput);
202
203
  var updateUserData = function () { return tslib_es6.__awaiter(void 0, void 0, void 0, function () {
203
204
  var updatedSession, err_3;
204
- return tslib_es6.__generator(this, function (_a) {
205
- switch (_a.label) {
205
+ var _a, _b;
206
+ return tslib_es6.__generator(this, function (_c) {
207
+ switch (_c.label) {
206
208
  case 0:
207
- _a.trys.push([0, 2, , 3]);
209
+ _c.trys.push([0, 2, , 3]);
208
210
  return [4 /*yield*/, sessionService.updateSessionUserInput(sessionId, cleanedUserInput)];
209
211
  case 1:
210
- updatedSession = _a.sent();
212
+ updatedSession = _c.sent();
211
213
  // Ne mettre à jour que si la requête réussit
212
214
  if (updatedSession) {
213
215
  setSession(updatedSession);
214
216
  }
215
217
  return [3 /*break*/, 3];
216
218
  case 2:
217
- err_3 = _a.sent();
219
+ err_3 = _c.sent();
220
+ if (axios.isAxiosError(err_3) && ((_b = (_a = err_3.response) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.code) === "CUSTOM_FIELD_VALIDATION_FAILED") {
221
+ console.error("CUSTOM_FIELD_VALIDATION_FAILED: user input synchronization rejected");
222
+ }
218
223
  console.error("Failed to update user input:", err_3);
219
224
  return [3 /*break*/, 3];
220
225
  case 3: return [2 /*return*/];
@@ -1 +1 @@
1
- {"version":3,"file":"useSessionData.js","sources":["../../../../src/hooks/useSessionData.ts"],"sourcesContent":["import { useState, useEffect, useRef } from \"react\";\nimport type { UserInput } from \"../types/userInput\";\nimport type { ContactInfo } from \"../types/contactInfo\";\nimport {\n clearSessionSensitiveData,\n fetchSessionById,\n isSessionExpired,\n updateSessionUserInput,\n updateSessionContactInfo,\n storeDocumentOptions,\n sendClientInfo,\n} from \"../services/sessionService\";\nimport { logSessionStarted } from \"../services/auditTrailService\";\nimport type { ClientInfo, SessionData } from \"../types/session\";\nimport {\n getSessionMemoryContactInfo,\n getSessionMemoryUserInput,\n setActiveSessionId,\n setSessionMemoryContactInfo,\n setSessionMemoryUserInput,\n} from \"../services/sessionMemoryStore\";\n\nexport const useSessionData = (\n sessionId: string,\n clientInfo: ClientInfo,\n clientInfoLoaded: boolean,\n) => {\n const [session, setSessionState] = useState<SessionData | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [isExpired, setIsExpired] = useState(false);\n\n const [userInput, setUserInput] = useState<UserInput>({});\n\n const [contactInfo, setContactInfo] = useState<ContactInfo>({\n email: \"\",\n phoneNumber: \"\",\n });\n\n const maskClientInfoForLog = (input: ClientInfo): string => {\n if (!input) {\n return \"[client-info-unavailable]\";\n }\n\n const maskedIp = input.ip ? input.ip.replace(/\\d+$/, \"***\") : \"unknown\";\n const device = input.device || \"unknown\";\n return `device=${device}, ip=${maskedIp}`;\n };\n\n const normalizeSessionData = (\n sessionData: SessionData,\n previousSession?: SessionData | null,\n ): SessionData => {\n const templateToUse = sessionData.template ?? previousSession?.template;\n const normalizedBase =\n templateToUse && sessionData.template !== templateToUse\n ? ({\n ...sessionData,\n template: templateToUse,\n } as SessionData)\n : sessionData;\n\n const templateNodes = templateToUse?.nodes || [];\n const endNodeWithCallback = templateNodes.find(\n (node) => node.type === \"end\" && node.callbackURL !== undefined,\n );\n\n if (endNodeWithCallback && endNodeWithCallback.callbackURL !== undefined) {\n const callbackValue =\n endNodeWithCallback.callbackURL !== null\n ? endNodeWithCallback.callbackURL\n : \"\";\n return {\n ...normalizedBase,\n callbackURL: callbackValue,\n };\n }\n\n if (normalizedBase.callbackURL !== undefined) {\n return normalizedBase;\n }\n\n if (previousSession?.callbackURL !== undefined) {\n return {\n ...normalizedBase,\n callbackURL: previousSession.callbackURL,\n };\n }\n\n return normalizedBase;\n };\n\n const setSession = (\n value:\n | SessionData\n | null\n | ((prev: SessionData | null) => SessionData | null),\n ) => {\n setSessionState((previousSession) => {\n const nextValue =\n typeof value === \"function\"\n ? (value as (prev: SessionData | null) => SessionData | null)(\n previousSession,\n )\n : value;\n\n if (nextValue) {\n return normalizeSessionData(nextValue, previousSession);\n }\n\n return null;\n });\n };\n\n // Load session data\n const loadSession = async () => {\n if (!sessionId) return;\n setActiveSessionId(sessionId);\n\n setLoading(true);\n try {\n const sessionData = await fetchSessionById(sessionId);\n setSession(sessionData);\n\n // Check if session is expired\n if (isSessionExpired(sessionData)) {\n setIsExpired(true);\n setLoading(false);\n return;\n }\n\n // Initialize configuration based on session template\n if (sessionData.template) {\n // Store document options for each type in localStorage\n const templateNodes = sessionData.template.nodes;\n templateNodes.forEach((node) => {\n if (\n node.type === \"document-selection\" &&\n node.requiredDocumentType &&\n node.selectedOptions.length > 0\n ) {\n storeDocumentOptions(\n sessionId,\n node.requiredDocumentType,\n node.selectedOptions,\n );\n } else if (\n node.type === \"document-collection\" &&\n node.allowedDocumentTypes &&\n node.allowedDocumentTypes.length > 0\n ) {\n // Store allowed document types as names for document-collection nodes\n const documentNames = node.allowedDocumentTypes.map(\n (doc) => doc.name,\n );\n storeDocumentOptions(\n sessionId,\n \"document-collection\",\n documentNames,\n );\n }\n });\n\n const memoryUserInput = getSessionMemoryUserInput(sessionId);\n if (Object.keys(memoryUserInput).length > 0) {\n setUserInput((prev) => ({\n ...prev,\n ...memoryUserInput,\n }));\n } else if (\n sessionData.userInput &&\n Object.keys(sessionData.userInput).length > 0\n ) {\n const mergedUserInput = {\n ...(sessionData.userInput as Record<string, unknown>),\n };\n setUserInput((prev) => ({\n ...prev,\n ...mergedUserInput,\n }));\n setSessionMemoryUserInput(sessionId, mergedUserInput as UserInput);\n }\n\n const memoryContactInfo = getSessionMemoryContactInfo(sessionId);\n if (memoryContactInfo.email || memoryContactInfo.phoneNumber) {\n setContactInfo((prev) => ({\n ...prev,\n ...memoryContactInfo,\n }));\n } else if (\n sessionData.contactInfo &&\n Object.keys(sessionData.contactInfo).length > 0\n ) {\n const mergedContactInfo: ContactInfo = {\n email: String(sessionData.contactInfo.email || \"\"),\n phoneNumber: String(sessionData.contactInfo.phoneNumber || \"\"),\n };\n setContactInfo((prev) => ({\n ...prev,\n ...mergedContactInfo,\n }));\n setSessionMemoryContactInfo(sessionId, mergedContactInfo);\n }\n }\n\n setError(null);\n } catch (err) {\n console.error(\"Failed to load session:\", err);\n setError(\"Failed to load session data. Please try again.\");\n } finally {\n setLoading(false);\n }\n };\n\n // Retry loading the session\n const handleRetrySession = async () => {\n setIsExpired(false);\n setLoading(true);\n setError(null);\n\n try {\n const sessionData = await fetchSessionById(sessionId);\n\n if (isSessionExpired(sessionData)) {\n setIsExpired(true);\n } else {\n setSession(sessionData);\n }\n } catch (err) {\n console.error(\"Failed to retry loading session:\", err);\n setError(\"Failed to load session data. Please try again.\");\n } finally {\n setLoading(false);\n }\n };\n\n const userInputSyncInitialized = useRef(false);\n\n // Update user input in backend and in-memory store\n useEffect(() => {\n if (!sessionId) {\n return;\n }\n\n const entries = Object.entries(userInput || {}).filter(([, value]) => {\n if (value === undefined || value === null) {\n return false;\n }\n if (typeof value === \"string\") {\n return value.trim().length > 0;\n }\n return true;\n });\n\n if (!userInputSyncInitialized.current) {\n userInputSyncInitialized.current = true;\n return;\n }\n\n if (entries.length === 0) {\n return;\n }\n\n const cleanedUserInput = entries.reduce<Record<string, unknown>>(\n (acc, [key, value]) => {\n acc[key] = value;\n return acc;\n },\n {},\n );\n\n setSessionMemoryUserInput(sessionId, cleanedUserInput as UserInput);\n\n const updateUserData = async () => {\n try {\n const updatedSession = await updateSessionUserInput(\n sessionId,\n cleanedUserInput,\n );\n // Ne mettre à jour que si la requête réussit\n if (updatedSession) {\n setSession(updatedSession);\n }\n } catch (err) {\n console.error(\"Failed to update user input:\", err);\n // Ne pas mettre à jour la session en cas d'erreur\n }\n };\n\n updateUserData();\n }, [sessionId, userInput]);\n\n // Update contact info in backend and in-memory store\n useEffect(() => {\n if (contactInfo && contactInfo.email && contactInfo.phoneNumber) {\n setSessionMemoryContactInfo(sessionId, contactInfo);\n\n const updateContactData = async () => {\n if (sessionId && contactInfo.email && contactInfo.phoneNumber) {\n try {\n const updatedSession = await updateSessionContactInfo(sessionId, {\n email: contactInfo.email,\n phoneNumber: contactInfo.phoneNumber,\n });\n // Ne mettre à jour que si la requête réussit\n if (updatedSession) {\n setSession(updatedSession);\n }\n } catch (err) {\n console.error(\"Failed to update contact info:\", err);\n // Ne pas mettre à jour la session en cas d'erreur\n }\n }\n };\n\n updateContactData();\n }\n }, [contactInfo, sessionId]);\n\n // Send client info when it becomes available\n useEffect(() => {\n if (clientInfoLoaded && clientInfo && session) {\n console.log(\n \"Sending client info to backend:\",\n maskClientInfoForLog(clientInfo),\n );\n\n const sendClientInfoAsync = async () => {\n try {\n await sendClientInfo(sessionId, clientInfo);\n } catch (e) {\n console.error(\"Failed to send client info:\", e);\n }\n };\n\n const sendStartAuditTrail = async () => {\n try {\n // Utiliser analysisId et clientInfoId s'il existe\n await logSessionStarted(sessionId);\n } catch (err) {\n console.error(\"Failed to log session start in audit trail:\", err);\n // Non-blocking error - continue session loading\n }\n };\n\n sendClientInfoAsync();\n sendStartAuditTrail();\n }\n }, [clientInfoLoaded, clientInfo, sessionId, session]);\n\n // Keep active session id in memory only and clear traces on unmount/session switch.\n useEffect(() => {\n if (!sessionId) {\n return;\n }\n\n setActiveSessionId(sessionId);\n\n return () => {\n clearSessionSensitiveData(sessionId);\n };\n }, [sessionId]);\n\n // Check session expiration periodically\n useEffect(() => {\n if (!session || isExpired) return;\n\n if (isSessionExpired(session)) {\n setIsExpired(true);\n return;\n }\n\n const intervalId = setInterval(() => {\n if (isSessionExpired(session)) {\n setIsExpired(true);\n }\n }, 30000);\n\n return () => {\n clearInterval(intervalId);\n };\n }, [session, isExpired]);\n\n useEffect(() => {\n if (!isExpired || !sessionId) {\n return;\n }\n\n clearSessionSensitiveData(sessionId);\n }, [isExpired, sessionId]);\n\n const sessionSummary = session\n ? {\n id: session.id,\n status: session.status,\n currentStep: session.currentStep,\n expireTime: session.expireTime,\n templateId: session.template?.id,\n }\n : null;\n\n return {\n session,\n sessionSummary,\n setSession,\n loading,\n setLoading,\n error,\n setError,\n isExpired,\n setIsExpired,\n userInput,\n setUserInput,\n contactInfo,\n setContactInfo,\n loadSession,\n handleRetrySession,\n };\n};\n"],"names":["useState","__assign","__awaiter","setActiveSessionId","fetchSessionById","isSessionExpired","storeDocumentOptions","getSessionMemoryUserInput","setSessionMemoryUserInput","getSessionMemoryContactInfo","setSessionMemoryContactInfo","useRef","useEffect","updateSessionUserInput","updateSessionContactInfo","sendClientInfo","logSessionStarted","clearSessionSensitiveData"],"mappings":"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"}
1
+ {"version":3,"file":"useSessionData.js","sources":["../../../../src/hooks/useSessionData.ts"],"sourcesContent":["import { isAxiosError } from \"axios\";\nimport { useState, useEffect, useRef } from \"react\";\nimport type { UserInput } from \"../types/userInput\";\nimport type { ContactInfo } from \"../types/contactInfo\";\nimport {\n clearSessionSensitiveData,\n fetchSessionById,\n isSessionExpired,\n updateSessionUserInput,\n updateSessionContactInfo,\n storeDocumentOptions,\n sendClientInfo,\n} from \"../services/sessionService\";\nimport { logSessionStarted } from \"../services/auditTrailService\";\nimport type { ClientInfo, SessionData } from \"../types/session\";\nimport {\n getSessionMemoryContactInfo,\n getSessionMemoryUserInput,\n setActiveSessionId,\n setSessionMemoryContactInfo,\n setSessionMemoryUserInput,\n} from \"../services/sessionMemoryStore\";\n\nexport const useSessionData = (\n sessionId: string,\n clientInfo: ClientInfo,\n clientInfoLoaded: boolean,\n) => {\n const [session, setSessionState] = useState<SessionData | null>(null);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const [isExpired, setIsExpired] = useState(false);\n\n const [userInput, setUserInput] = useState<UserInput>({});\n\n const [contactInfo, setContactInfo] = useState<ContactInfo>({\n email: \"\",\n phoneNumber: \"\",\n });\n\n const maskClientInfoForLog = (input: ClientInfo): string => {\n if (!input) {\n return \"[client-info-unavailable]\";\n }\n\n const maskedIp = input.ip ? input.ip.replace(/\\d+$/, \"***\") : \"unknown\";\n const device = input.device || \"unknown\";\n return `device=${device}, ip=${maskedIp}`;\n };\n\n const normalizeSessionData = (\n sessionData: SessionData,\n previousSession?: SessionData | null,\n ): SessionData => {\n const templateToUse = sessionData.template ?? previousSession?.template;\n const normalizedBase =\n templateToUse && sessionData.template !== templateToUse\n ? ({\n ...sessionData,\n template: templateToUse,\n } as SessionData)\n : sessionData;\n\n const templateNodes = templateToUse?.nodes || [];\n const endNodeWithCallback = templateNodes.find(\n (node) => node.type === \"end\" && node.callbackURL !== undefined,\n );\n\n if (endNodeWithCallback && endNodeWithCallback.callbackURL !== undefined) {\n const callbackValue =\n endNodeWithCallback.callbackURL !== null\n ? endNodeWithCallback.callbackURL\n : \"\";\n return {\n ...normalizedBase,\n callbackURL: callbackValue,\n };\n }\n\n if (normalizedBase.callbackURL !== undefined) {\n return normalizedBase;\n }\n\n if (previousSession?.callbackURL !== undefined) {\n return {\n ...normalizedBase,\n callbackURL: previousSession.callbackURL,\n };\n }\n\n return normalizedBase;\n };\n\n const setSession = (\n value:\n | SessionData\n | null\n | ((prev: SessionData | null) => SessionData | null),\n ) => {\n setSessionState((previousSession) => {\n const nextValue =\n typeof value === \"function\"\n ? (value as (prev: SessionData | null) => SessionData | null)(\n previousSession,\n )\n : value;\n\n if (nextValue) {\n return normalizeSessionData(nextValue, previousSession);\n }\n\n return null;\n });\n };\n\n // Load session data\n const loadSession = async () => {\n if (!sessionId) return;\n setActiveSessionId(sessionId);\n\n setLoading(true);\n try {\n const sessionData = await fetchSessionById(sessionId);\n setSession(sessionData);\n\n // Check if session is expired\n if (isSessionExpired(sessionData)) {\n setIsExpired(true);\n setLoading(false);\n return;\n }\n\n // Initialize configuration based on session template\n if (sessionData.template) {\n // Store document options for each type in localStorage\n const templateNodes = sessionData.template.nodes;\n templateNodes.forEach((node) => {\n if (\n node.type === \"document-selection\" &&\n node.requiredDocumentType &&\n node.selectedOptions.length > 0\n ) {\n storeDocumentOptions(\n sessionId,\n node.requiredDocumentType,\n node.selectedOptions,\n );\n } else if (\n node.type === \"document-collection\" &&\n node.allowedDocumentTypes &&\n node.allowedDocumentTypes.length > 0\n ) {\n // Store allowed document types as names for document-collection nodes\n const documentNames = node.allowedDocumentTypes.map(\n (doc) => doc.name,\n );\n storeDocumentOptions(\n sessionId,\n \"document-collection\",\n documentNames,\n );\n }\n });\n\n const memoryUserInput = getSessionMemoryUserInput(sessionId);\n if (Object.keys(memoryUserInput).length > 0) {\n setUserInput((prev) => ({\n ...prev,\n ...memoryUserInput,\n }));\n } else if (\n sessionData.userInput &&\n Object.keys(sessionData.userInput).length > 0\n ) {\n const mergedUserInput = {\n ...(sessionData.userInput as Record<string, unknown>),\n };\n setUserInput((prev) => ({\n ...prev,\n ...mergedUserInput,\n }));\n setSessionMemoryUserInput(sessionId, mergedUserInput as UserInput);\n }\n\n const memoryContactInfo = getSessionMemoryContactInfo(sessionId);\n if (memoryContactInfo.email || memoryContactInfo.phoneNumber) {\n setContactInfo((prev) => ({\n ...prev,\n ...memoryContactInfo,\n }));\n } else if (\n sessionData.contactInfo &&\n Object.keys(sessionData.contactInfo).length > 0\n ) {\n const mergedContactInfo: ContactInfo = {\n email: String(sessionData.contactInfo.email || \"\"),\n phoneNumber: String(sessionData.contactInfo.phoneNumber || \"\"),\n };\n setContactInfo((prev) => ({\n ...prev,\n ...mergedContactInfo,\n }));\n setSessionMemoryContactInfo(sessionId, mergedContactInfo);\n }\n }\n\n setError(null);\n } catch (err) {\n console.error(\"Failed to load session:\", err);\n setError(\"Failed to load session data. Please try again.\");\n } finally {\n setLoading(false);\n }\n };\n\n // Retry loading the session\n const handleRetrySession = async () => {\n setIsExpired(false);\n setLoading(true);\n setError(null);\n\n try {\n const sessionData = await fetchSessionById(sessionId);\n\n if (isSessionExpired(sessionData)) {\n setIsExpired(true);\n } else {\n setSession(sessionData);\n }\n } catch (err) {\n console.error(\"Failed to retry loading session:\", err);\n setError(\"Failed to load session data. Please try again.\");\n } finally {\n setLoading(false);\n }\n };\n\n const userInputSyncInitialized = useRef(false);\n\n // Update user input in backend and in-memory store\n useEffect(() => {\n if (!sessionId) {\n return;\n }\n\n const entries = Object.entries(userInput || {}).filter(([, value]) => {\n if (value === undefined || value === null) {\n return false;\n }\n if (typeof value === \"string\") {\n return value.trim().length > 0;\n }\n return true;\n });\n\n if (!userInputSyncInitialized.current) {\n userInputSyncInitialized.current = true;\n return;\n }\n\n if (entries.length === 0) {\n return;\n }\n\n const cleanedUserInput = entries.reduce<Record<string, unknown>>(\n (acc, [key, value]) => {\n acc[key] = value;\n return acc;\n },\n {},\n );\n\n setSessionMemoryUserInput(sessionId, cleanedUserInput as UserInput);\n\n const updateUserData = async () => {\n try {\n const updatedSession = await updateSessionUserInput(\n sessionId,\n cleanedUserInput,\n );\n // Ne mettre à jour que si la requête réussit\n if (updatedSession) {\n setSession(updatedSession);\n }\n } catch (err) {\n if (isAxiosError(err) && err.response?.data?.code === \"CUSTOM_FIELD_VALIDATION_FAILED\") {\n console.error(\"CUSTOM_FIELD_VALIDATION_FAILED: user input synchronization rejected\");\n }\n console.error(\"Failed to update user input:\", err);\n // Ne pas mettre à jour la session en cas d'erreur\n }\n };\n\n updateUserData();\n }, [sessionId, userInput]);\n\n // Update contact info in backend and in-memory store\n useEffect(() => {\n if (contactInfo && contactInfo.email && contactInfo.phoneNumber) {\n setSessionMemoryContactInfo(sessionId, contactInfo);\n\n const updateContactData = async () => {\n if (sessionId && contactInfo.email && contactInfo.phoneNumber) {\n try {\n const updatedSession = await updateSessionContactInfo(sessionId, {\n email: contactInfo.email,\n phoneNumber: contactInfo.phoneNumber,\n });\n // Ne mettre à jour que si la requête réussit\n if (updatedSession) {\n setSession(updatedSession);\n }\n } catch (err) {\n console.error(\"Failed to update contact info:\", err);\n // Ne pas mettre à jour la session en cas d'erreur\n }\n }\n };\n\n updateContactData();\n }\n }, [contactInfo, sessionId]);\n\n // Send client info when it becomes available\n useEffect(() => {\n if (clientInfoLoaded && clientInfo && session) {\n console.log(\n \"Sending client info to backend:\",\n maskClientInfoForLog(clientInfo),\n );\n\n const sendClientInfoAsync = async () => {\n try {\n await sendClientInfo(sessionId, clientInfo);\n } catch (e) {\n console.error(\"Failed to send client info:\", e);\n }\n };\n\n const sendStartAuditTrail = async () => {\n try {\n // Utiliser analysisId et clientInfoId s'il existe\n await logSessionStarted(sessionId);\n } catch (err) {\n console.error(\"Failed to log session start in audit trail:\", err);\n // Non-blocking error - continue session loading\n }\n };\n\n sendClientInfoAsync();\n sendStartAuditTrail();\n }\n }, [clientInfoLoaded, clientInfo, sessionId, session]);\n\n // Keep active session id in memory only and clear traces on unmount/session switch.\n useEffect(() => {\n if (!sessionId) {\n return;\n }\n\n setActiveSessionId(sessionId);\n\n return () => {\n clearSessionSensitiveData(sessionId);\n };\n }, [sessionId]);\n\n // Check session expiration periodically\n useEffect(() => {\n if (!session || isExpired) return;\n\n if (isSessionExpired(session)) {\n setIsExpired(true);\n return;\n }\n\n const intervalId = setInterval(() => {\n if (isSessionExpired(session)) {\n setIsExpired(true);\n }\n }, 30000);\n\n return () => {\n clearInterval(intervalId);\n };\n }, [session, isExpired]);\n\n useEffect(() => {\n if (!isExpired || !sessionId) {\n return;\n }\n\n clearSessionSensitiveData(sessionId);\n }, [isExpired, sessionId]);\n\n const sessionSummary = session\n ? {\n id: session.id,\n status: session.status,\n currentStep: session.currentStep,\n expireTime: session.expireTime,\n templateId: session.template?.id,\n }\n : null;\n\n return {\n session,\n sessionSummary,\n setSession,\n loading,\n setLoading,\n error,\n setError,\n isExpired,\n setIsExpired,\n userInput,\n setUserInput,\n contactInfo,\n setContactInfo,\n loadSession,\n handleRetrySession,\n };\n};\n"],"names":["useState","__assign","__awaiter","setActiveSessionId","fetchSessionById","isSessionExpired","storeDocumentOptions","getSessionMemoryUserInput","setSessionMemoryUserInput","getSessionMemoryContactInfo","setSessionMemoryContactInfo","useRef","useEffect","updateSessionUserInput","isAxiosError","updateSessionContactInfo","sendClientInfo","logSessionStarted","clearSessionSensitiveData"],"mappings":"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"}
@@ -5,7 +5,7 @@ var React = require('react');
5
5
  var sessionService = require('../services/sessionService.js');
6
6
 
7
7
  /** Node types that auto-execute and should be skipped when going back */
8
- var AUTO_EXECUTING_TYPES = new Set(["external-verification", "condition"]);
8
+ var AUTO_EXECUTING_TYPES = new Set(["external-verification", "condition", "complementary-mandate"]);
9
9
  var COMMITTED_NODE_TYPES = new Set(["selfie-capture", "biometric-capture"]);
10
10
  var getNodeTypeAtStep = function (step, template) { var _a; return (_a = sessionService.getOrderedJourneySteps(template)[step - 1]) === null || _a === void 0 ? void 0 : _a.type; };
11
11
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"useStepNavigation.js","sources":["../../../../src/hooks/useStepNavigation.ts"],"sourcesContent":["import { useState, useEffect, useRef } from \"react\";\nimport {\n updateSessionCurrentStep,\n getNextStepIndex,\n getOrderedJourneySteps,\n reconstructHistoryToStep,\n} from \"../services/sessionService\";\nimport type { SessionTemplate } from \"../types/session\";\n\n/** Node types that auto-execute and should be skipped when going back */\nconst AUTO_EXECUTING_TYPES = new Set([\"external-verification\", \"condition\"]);\nconst COMMITTED_NODE_TYPES = new Set([\"selfie-capture\", \"biometric-capture\"]);\n\nconst getNodeTypeAtStep = (\n step: number,\n template: SessionTemplate,\n): string | undefined => getOrderedJourneySteps(template)[step - 1]?.type;\n\n/**\n * Rebuilds only the reversible part of a path after a committed node.\n * Auto-executing nodes immediately following the commit are excluded so the\n * first interactive destination remains the history boundary after reload.\n */\nconst trimHistoryAfterCommittedNode = (\n reconstructedHistory: number[],\n template: SessionTemplate,\n): number[] => {\n let committedHistoryIndex = -1;\n\n for (let index = reconstructedHistory.length - 2; index >= 0; index -= 1) {\n const nodeType = getNodeTypeAtStep(reconstructedHistory[index], template);\n if (nodeType && COMMITTED_NODE_TYPES.has(nodeType)) {\n committedHistoryIndex = index;\n break;\n }\n }\n\n if (committedHistoryIndex === -1) {\n return reconstructedHistory;\n }\n\n let reversibleHistoryStart = committedHistoryIndex + 1;\n while (reversibleHistoryStart < reconstructedHistory.length - 1) {\n const nodeType = getNodeTypeAtStep(\n reconstructedHistory[reversibleHistoryStart],\n template,\n );\n if (!nodeType || !AUTO_EXECUTING_TYPES.has(nodeType)) {\n break;\n }\n reversibleHistoryStart += 1;\n }\n\n return reconstructedHistory.slice(reversibleHistoryStart);\n};\n\nexport const useStepNavigation = (\n sessionId: string,\n sessionStatus?: string,\n initialStep?: number,\n template?: SessionTemplate,\n) => {\n const [step, setStepState] = useState(initialStep ?? 0);\n const [history, setHistory] = useState<number[]>(initialStep !== undefined ? [initialStep] : [0]);\n const hasInitialized = useRef(false);\n const committedNavigationPending = useRef(false);\n\n const setStep = (newStep: number, skipHistory = false) => {\n if (!skipHistory && newStep !== step) {\n setHistory((prev) => {\n if (prev[prev.length - 1] === newStep) return prev;\n return [...prev, newStep];\n });\n }\n setStepState(newStep);\n\n // Update current step in database\n if (sessionId) {\n updateSessionCurrentStep(sessionId, newStep).catch((error) => {\n console.error(\"Failed to update current step in database:\", error);\n // Non-blocking error - the step is still updated locally\n });\n }\n };\n\n const goBack = () => {\n if (history.length > 1) {\n let newHistory = [...history];\n newHistory.pop(); // Remove current step\n\n // Skip auto-executing nodes when going back\n if (template) {\n const orderedNodes = getOrderedJourneySteps(template);\n while (newHistory.length > 1) {\n const candidateStep = newHistory[newHistory.length - 1];\n // steps are 1-indexed (step 0 = start, step 1 = first node, etc.)\n const nodeIndex = candidateStep - 1;\n const candidateNode = orderedNodes[nodeIndex];\n if (candidateNode && AUTO_EXECUTING_TYPES.has(candidateNode.type)) {\n newHistory.pop();\n } else {\n break;\n }\n }\n }\n\n const previousStep = newHistory[newHistory.length - 1];\n setHistory(newHistory);\n setStep(previousStep, true);\n } else {\n console.warn(\"[goBack] BLOCKED — history.length <= 1, history:\", [...history]);\n }\n };\n\n /**\n * Retour arrière vers un nœud précis (ex: bouton \"Corriger ma saisie\").\n * Contrairement à `setStep`, on TRONQUE l'historique jusqu'à la dernière\n * occurrence de `targetStep` au lieu de l'empiler : le nœud cible cesse\n * ainsi d'être compté comme un \"revisit\" (runIndex 0 côté\n * TemplateNodeRenderer → formulaire pré-rempli). Si la cible n'est pas dans\n * l'historique, on retombe sur un `setStep` classique.\n */\n const goBackToStep = (targetStep: number) => {\n const idx = history.lastIndexOf(targetStep);\n if (idx !== -1) {\n const newHistory = history.slice(0, idx + 1);\n setHistory(newHistory);\n setStep(targetStep, true);\n } else {\n console.warn(\"[goBackToStep] target not in history — pushing instead:\", targetStep);\n setStep(targetStep);\n }\n };\n\n const goToNextStep = (\n currentNodeId: string,\n template: SessionTemplate,\n handle?: string\n ) => {\n const nextStepIndex = getNextStepIndex(currentNodeId, template, handle);\n\n if (nextStepIndex !== null) {\n if (committedNavigationPending.current) {\n const destinationType = getNodeTypeAtStep(nextStepIndex, template);\n committedNavigationPending.current = Boolean(\n destinationType && AUTO_EXECUTING_TYPES.has(destinationType),\n );\n setHistory([nextStepIndex]);\n setStep(nextStepIndex, true);\n } else {\n setStep(nextStepIndex);\n }\n } else {\n committedNavigationPending.current = false;\n console.warn(\n `[useStepNavigation] Could not find next step for node ${currentNodeId}. Staying on current step.`\n );\n }\n };\n\n /**\n * Navigates through the graph and makes the destination a point of no return.\n * The destination remains persisted by setStep, while prior history is discarded.\n */\n const goToNextStepCommitted = (\n currentNodeId: string,\n template: SessionTemplate,\n handle?: string,\n ) => {\n const nextStepIndex = getNextStepIndex(currentNodeId, template, handle);\n\n if (nextStepIndex !== null) {\n const destinationType = getNodeTypeAtStep(nextStepIndex, template);\n committedNavigationPending.current = Boolean(\n destinationType && AUTO_EXECUTING_TYPES.has(destinationType),\n );\n setHistory([nextStepIndex]);\n setStep(nextStepIndex, true);\n } else {\n committedNavigationPending.current = false;\n console.warn(\n `[useStepNavigation] Could not find next step for node ${currentNodeId}. Staying on current step.`,\n );\n }\n };\n\n // Initialize step from session data or status\n useEffect(() => {\n if (!sessionId) {\n return;\n }\n\n // Check if session is already ended\n if (sessionStatus === \"ended\") {\n setStepState(100);\n return;\n }\n\n // Only initialize once when initialStep becomes available\n if (initialStep !== undefined && !hasInitialized.current) {\n setStepState(initialStep);\n setHistory((prev) => {\n // Preserve history if the user already navigated past the initial step\n if (prev.length > 1 && prev[prev.length - 1] === initialStep) {\n return prev;\n }\n // Reconstruct history by following the graph from step 0\n const reconstructed = template\n ? trimHistoryAfterCommittedNode(\n reconstructHistoryToStep(initialStep, template),\n template,\n )\n : initialStep > 0 ? [0, initialStep] : [initialStep];\n return reconstructed;\n });\n hasInitialized.current = true;\n }\n }, [sessionId, sessionStatus, initialStep]);\n\n const stepObject = {\n setStep,\n goBack,\n goBackToStep,\n goToNextStep,\n goToNextStepCommitted,\n step,\n canGoBack: history.length > 1,\n };\n\n return {\n step,\n setStep,\n goBack,\n goBackToStep,\n goToNextStep,\n goToNextStepCommitted,\n stepObject,\n history,\n };\n};\n"],"names":["getOrderedJourneySteps","useState","useRef","__spreadArray","updateSessionCurrentStep","getNextStepIndex","useEffect","reconstructHistoryToStep"],"mappings":"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"}
1
+ {"version":3,"file":"useStepNavigation.js","sources":["../../../../src/hooks/useStepNavigation.ts"],"sourcesContent":["import { useState, useEffect, useRef } from \"react\";\nimport {\n updateSessionCurrentStep,\n getNextStepIndex,\n getOrderedJourneySteps,\n reconstructHistoryToStep,\n} from \"../services/sessionService\";\nimport type { SessionTemplate } from \"../types/session\";\n\n/** Node types that auto-execute and should be skipped when going back */\nconst AUTO_EXECUTING_TYPES = new Set([\"external-verification\", \"condition\", \"complementary-mandate\"]);\nconst COMMITTED_NODE_TYPES = new Set([\"selfie-capture\", \"biometric-capture\"]);\n\nconst getNodeTypeAtStep = (\n step: number,\n template: SessionTemplate,\n): string | undefined => getOrderedJourneySteps(template)[step - 1]?.type;\n\n/**\n * Rebuilds only the reversible part of a path after a committed node.\n * Auto-executing nodes immediately following the commit are excluded so the\n * first interactive destination remains the history boundary after reload.\n */\nconst trimHistoryAfterCommittedNode = (\n reconstructedHistory: number[],\n template: SessionTemplate,\n): number[] => {\n let committedHistoryIndex = -1;\n\n for (let index = reconstructedHistory.length - 2; index >= 0; index -= 1) {\n const nodeType = getNodeTypeAtStep(reconstructedHistory[index], template);\n if (nodeType && COMMITTED_NODE_TYPES.has(nodeType)) {\n committedHistoryIndex = index;\n break;\n }\n }\n\n if (committedHistoryIndex === -1) {\n return reconstructedHistory;\n }\n\n let reversibleHistoryStart = committedHistoryIndex + 1;\n while (reversibleHistoryStart < reconstructedHistory.length - 1) {\n const nodeType = getNodeTypeAtStep(\n reconstructedHistory[reversibleHistoryStart],\n template,\n );\n if (!nodeType || !AUTO_EXECUTING_TYPES.has(nodeType)) {\n break;\n }\n reversibleHistoryStart += 1;\n }\n\n return reconstructedHistory.slice(reversibleHistoryStart);\n};\n\nexport const useStepNavigation = (\n sessionId: string,\n sessionStatus?: string,\n initialStep?: number,\n template?: SessionTemplate,\n) => {\n const [step, setStepState] = useState(initialStep ?? 0);\n const [history, setHistory] = useState<number[]>(initialStep !== undefined ? [initialStep] : [0]);\n const hasInitialized = useRef(false);\n const committedNavigationPending = useRef(false);\n\n const setStep = (newStep: number, skipHistory = false) => {\n if (!skipHistory && newStep !== step) {\n setHistory((prev) => {\n if (prev[prev.length - 1] === newStep) return prev;\n return [...prev, newStep];\n });\n }\n setStepState(newStep);\n\n // Update current step in database\n if (sessionId) {\n updateSessionCurrentStep(sessionId, newStep).catch((error) => {\n console.error(\"Failed to update current step in database:\", error);\n // Non-blocking error - the step is still updated locally\n });\n }\n };\n\n const goBack = () => {\n if (history.length > 1) {\n let newHistory = [...history];\n newHistory.pop(); // Remove current step\n\n // Skip auto-executing nodes when going back\n if (template) {\n const orderedNodes = getOrderedJourneySteps(template);\n while (newHistory.length > 1) {\n const candidateStep = newHistory[newHistory.length - 1];\n // steps are 1-indexed (step 0 = start, step 1 = first node, etc.)\n const nodeIndex = candidateStep - 1;\n const candidateNode = orderedNodes[nodeIndex];\n if (candidateNode && AUTO_EXECUTING_TYPES.has(candidateNode.type)) {\n newHistory.pop();\n } else {\n break;\n }\n }\n }\n\n const previousStep = newHistory[newHistory.length - 1];\n setHistory(newHistory);\n setStep(previousStep, true);\n } else {\n console.warn(\"[goBack] BLOCKED — history.length <= 1, history:\", [...history]);\n }\n };\n\n /**\n * Retour arrière vers un nœud précis (ex: bouton \"Corriger ma saisie\").\n * Contrairement à `setStep`, on TRONQUE l'historique jusqu'à la dernière\n * occurrence de `targetStep` au lieu de l'empiler : le nœud cible cesse\n * ainsi d'être compté comme un \"revisit\" (runIndex 0 côté\n * TemplateNodeRenderer → formulaire pré-rempli). Si la cible n'est pas dans\n * l'historique, on retombe sur un `setStep` classique.\n */\n const goBackToStep = (targetStep: number) => {\n const idx = history.lastIndexOf(targetStep);\n if (idx !== -1) {\n const newHistory = history.slice(0, idx + 1);\n setHistory(newHistory);\n setStep(targetStep, true);\n } else {\n console.warn(\"[goBackToStep] target not in history — pushing instead:\", targetStep);\n setStep(targetStep);\n }\n };\n\n const goToNextStep = (\n currentNodeId: string,\n template: SessionTemplate,\n handle?: string\n ) => {\n const nextStepIndex = getNextStepIndex(currentNodeId, template, handle);\n\n if (nextStepIndex !== null) {\n if (committedNavigationPending.current) {\n const destinationType = getNodeTypeAtStep(nextStepIndex, template);\n committedNavigationPending.current = Boolean(\n destinationType && AUTO_EXECUTING_TYPES.has(destinationType),\n );\n setHistory([nextStepIndex]);\n setStep(nextStepIndex, true);\n } else {\n setStep(nextStepIndex);\n }\n } else {\n committedNavigationPending.current = false;\n console.warn(\n `[useStepNavigation] Could not find next step for node ${currentNodeId}. Staying on current step.`\n );\n }\n };\n\n /**\n * Navigates through the graph and makes the destination a point of no return.\n * The destination remains persisted by setStep, while prior history is discarded.\n */\n const goToNextStepCommitted = (\n currentNodeId: string,\n template: SessionTemplate,\n handle?: string,\n ) => {\n const nextStepIndex = getNextStepIndex(currentNodeId, template, handle);\n\n if (nextStepIndex !== null) {\n const destinationType = getNodeTypeAtStep(nextStepIndex, template);\n committedNavigationPending.current = Boolean(\n destinationType && AUTO_EXECUTING_TYPES.has(destinationType),\n );\n setHistory([nextStepIndex]);\n setStep(nextStepIndex, true);\n } else {\n committedNavigationPending.current = false;\n console.warn(\n `[useStepNavigation] Could not find next step for node ${currentNodeId}. Staying on current step.`,\n );\n }\n };\n\n // Initialize step from session data or status\n useEffect(() => {\n if (!sessionId) {\n return;\n }\n\n // Check if session is already ended\n if (sessionStatus === \"ended\") {\n setStepState(100);\n return;\n }\n\n // Only initialize once when initialStep becomes available\n if (initialStep !== undefined && !hasInitialized.current) {\n setStepState(initialStep);\n setHistory((prev) => {\n // Preserve history if the user already navigated past the initial step\n if (prev.length > 1 && prev[prev.length - 1] === initialStep) {\n return prev;\n }\n // Reconstruct history by following the graph from step 0\n const reconstructed = template\n ? trimHistoryAfterCommittedNode(\n reconstructHistoryToStep(initialStep, template),\n template,\n )\n : initialStep > 0 ? [0, initialStep] : [initialStep];\n return reconstructed;\n });\n hasInitialized.current = true;\n }\n }, [sessionId, sessionStatus, initialStep]);\n\n const stepObject = {\n setStep,\n goBack,\n goBackToStep,\n goToNextStep,\n goToNextStepCommitted,\n step,\n canGoBack: history.length > 1,\n };\n\n return {\n step,\n setStep,\n goBack,\n goBackToStep,\n goToNextStep,\n goToNextStepCommitted,\n stepObject,\n history,\n };\n};\n"],"names":["getOrderedJourneySteps","useState","useRef","__spreadArray","updateSessionCurrentStep","getNextStepIndex","useEffect","reconstructHistoryToStep"],"mappings":"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"}
@@ -371,7 +371,8 @@ var useUserInputForm = function (_a) {
371
371
  if (requestedFields.has("tva") && !form.tva) {
372
372
  markError("tva");
373
373
  }
374
- if (requestedFields.has("registrationNumber") && !form.registrationNumber) {
374
+ if (requestedFields.has("registrationNumber") &&
375
+ !form.registrationNumber) {
375
376
  markError("registrationNumber");
376
377
  }
377
378
  }
@@ -438,7 +439,9 @@ var useUserInputForm = function (_a) {
438
439
  var _a, _b;
439
440
  var value = customFormData[field.id];
440
441
  if (field.valueType === "list") {
441
- var rows = Array.isArray(value) ? value : [];
442
+ var rows = Array.isArray(value)
443
+ ? value
444
+ : [];
442
445
  var minRows = listFieldUtils.getListFieldMinRows(field);
443
446
  var columns_1 = listFieldUtils.normalizeListColumns(field.listColumns);
444
447
  var fieldCellErrors_1 = {};
@@ -469,6 +472,16 @@ var useUserInputForm = function (_a) {
469
472
  fieldCellErrors_1[key] = t("custom_form.invalid_email");
470
473
  listFieldInvalid_1 = true;
471
474
  }
475
+ else {
476
+ var _c = customFieldValidation.resolveColumnRegex(col, row), regex = _c.regex, errorMessage = _c.errorMessage;
477
+ if (regex && !customFieldValidation.isRegexMatch(cellValue, regex)) {
478
+ fieldCellErrors_1[key] =
479
+ errorMessage ||
480
+ col.regexErrorMessage ||
481
+ t("custom_form.invalid_format");
482
+ listFieldInvalid_1 = true;
483
+ }
484
+ }
472
485
  break;
473
486
  case "date": {
474
487
  var fmt = (_b = col.dateFormat) !== null && _b !== void 0 ? _b : session.DEFAULT_DATE_DISPLAY_FORMAT;
@@ -480,14 +493,17 @@ var useUserInputForm = function (_a) {
480
493
  }
481
494
  break;
482
495
  }
483
- case "text":
484
- if (col.regex && !customFieldValidation.isRegexMatch(cellValue, col.regex)) {
496
+ case "text": {
497
+ var _d = customFieldValidation.resolveColumnRegex(col, row), regex = _d.regex, errorMessage = _d.errorMessage;
498
+ if (regex && !customFieldValidation.isRegexMatch(cellValue, regex)) {
485
499
  fieldCellErrors_1[key] =
486
- col.regexErrorMessage ||
500
+ errorMessage ||
501
+ col.regexErrorMessage ||
487
502
  t("custom_form.invalid_format");
488
503
  listFieldInvalid_1 = true;
489
504
  }
490
505
  break;
506
+ }
491
507
  }
492
508
  });
493
509
  });
@@ -623,7 +639,12 @@ var useUserInputForm = function (_a) {
623
639
  postalCode: form.postalCode,
624
640
  city: form.city,
625
641
  countryCode: form.countryCode,
626
- })), (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") && {
642
+ })), (requestedFields.has("siret") && { siret: form.siret })), (requestedFields.has("tva") && { tva: form.tva })), (requestedFields.has("registrationNumber") && {
643
+ registrationNumber: form.registrationNumber,
644
+ })), (requestedFields.has("siret") &&
645
+ !requestedFields.has("registrationNumber") && {
646
+ registrationNumber: form.siret,
647
+ })), (requestedFields.has("nationalite") && {
627
648
  nationality: form.nationality,
628
649
  })), (requestedFields.has("legalRepresentativeNom") && {
629
650
  legalRepresentativeLastName: form.legalRepresentativeLastName,