datakeen-session-react 1.1.159 → 1.1.161

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 (192) hide show
  1. package/dist/cjs/components/DatakeenSession.js +22 -3
  2. package/dist/cjs/components/DatakeenSession.js.map +1 -1
  3. package/dist/cjs/components/document-collection/DocumentCollection.js +2 -2
  4. package/dist/cjs/components/document-collection/DocumentCollection.js.map +1 -1
  5. package/dist/cjs/components/document-collection/DocumentCollectionIntroduction.js +5 -5
  6. package/dist/cjs/components/document-collection/DocumentCollectionIntroduction.js.map +1 -1
  7. package/dist/cjs/components/document-collection/DocumentCollectionMethodSelection.js +2 -2
  8. package/dist/cjs/components/document-collection/DocumentCollectionMethodSelection.js.map +1 -1
  9. package/dist/cjs/components/document-collection/DocumentCollectionSelection.js +5 -5
  10. package/dist/cjs/components/document-collection/DocumentCollectionSelection.js.map +1 -1
  11. package/dist/cjs/components/document-collection/DocumentCollectionUpload.js +11 -11
  12. package/dist/cjs/components/document-collection/DocumentCollectionUpload.js.map +1 -1
  13. package/dist/cjs/components/document-collection/DocumentError.js +4 -2
  14. package/dist/cjs/components/document-collection/DocumentError.js.map +1 -1
  15. package/dist/cjs/components/document-collection/DocumentSuccess.js +2 -2
  16. package/dist/cjs/components/document-collection/DocumentSuccess.js.map +1 -1
  17. package/dist/cjs/components/id-check/Photo.js +9 -1
  18. package/dist/cjs/components/id-check/Photo.js.map +1 -1
  19. package/dist/cjs/components/jdi/JDDWorkInProgress.js +1 -1
  20. package/dist/cjs/components/jdi/JDDWorkInProgress.js.map +1 -1
  21. package/dist/cjs/components/jdi/JDIDocumentUpload.js +1 -1
  22. package/dist/cjs/components/jdi/JDIDocumentUpload.js.map +1 -1
  23. package/dist/cjs/components/selfie/selfie-flow/SelfieRecorder.js +26 -7
  24. package/dist/cjs/components/selfie/selfie-flow/SelfieRecorder.js.map +1 -1
  25. package/dist/cjs/components/session/DocumentCheck.js +2 -2
  26. package/dist/cjs/components/session/DocumentCheck.js.map +1 -1
  27. package/dist/cjs/components/session/UserInputForm/CustomFormFields.js +42 -45
  28. package/dist/cjs/components/session/UserInputForm/CustomFormFields.js.map +1 -1
  29. package/dist/cjs/components/session/UserInputForm/DatePickerField.js +154 -0
  30. package/dist/cjs/components/session/UserInputForm/DatePickerField.js.map +1 -0
  31. package/dist/cjs/components/session/UserInputForm.js +2 -2
  32. package/dist/cjs/components/session/UserInputForm.js.map +1 -1
  33. package/dist/cjs/components/session/VideoWorkInProgress.js +1 -1
  34. package/dist/cjs/components/session/VideoWorkInProgress.js.map +1 -1
  35. package/dist/cjs/components/signature-electronic/DocusealSignature.js +2 -1
  36. package/dist/cjs/components/signature-electronic/DocusealSignature.js.map +1 -1
  37. package/dist/cjs/components/signature-electronic/SignatureElectronic.js +2 -1
  38. package/dist/cjs/components/signature-electronic/SignatureElectronic.js.map +1 -1
  39. package/dist/cjs/components/signature-electronic/SignatureElectronicIntroduction.js +2 -1
  40. package/dist/cjs/components/signature-electronic/SignatureElectronicIntroduction.js.map +1 -1
  41. package/dist/cjs/components/start-flow/CGU.js +5 -2
  42. package/dist/cjs/components/start-flow/CGU.js.map +1 -1
  43. package/dist/cjs/components/start-flow/Start.js +5 -2
  44. package/dist/cjs/components/start-flow/Start.js.map +1 -1
  45. package/dist/cjs/components/template/ExternalVerificationNodeHandler.js +2 -1
  46. package/dist/cjs/components/template/ExternalVerificationNodeHandler.js.map +1 -1
  47. package/dist/cjs/components/ui/MobilePageLayout.js +1 -1
  48. package/dist/cjs/components/ui/MobilePageLayout.js.map +1 -1
  49. package/dist/cjs/components/ui/Paper.js +2 -2
  50. package/dist/cjs/components/ui/Paper.js.map +1 -1
  51. package/dist/cjs/hooks/useUserInputForm.js +90 -29
  52. package/dist/cjs/hooks/useUserInputForm.js.map +1 -1
  53. package/dist/cjs/i18n/en.json.js +35 -5
  54. package/dist/cjs/i18n/en.json.js.map +1 -1
  55. package/dist/cjs/i18n/fr.json.js +36 -6
  56. package/dist/cjs/i18n/fr.json.js.map +1 -1
  57. package/dist/cjs/index.css.js +1 -1
  58. package/dist/cjs/node_modules/date-fns/locale/_lib/buildFormatLongFn.js +13 -0
  59. package/dist/cjs/node_modules/date-fns/locale/_lib/buildFormatLongFn.js.map +1 -0
  60. package/dist/cjs/node_modules/date-fns/locale/_lib/buildLocalizeFn.js +67 -0
  61. package/dist/cjs/node_modules/date-fns/locale/_lib/buildLocalizeFn.js.map +1 -0
  62. package/dist/cjs/node_modules/date-fns/locale/_lib/buildMatchFn.js +62 -0
  63. package/dist/cjs/node_modules/date-fns/locale/_lib/buildMatchFn.js.map +1 -0
  64. package/dist/cjs/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js +25 -0
  65. package/dist/cjs/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js.map +1 -0
  66. package/dist/cjs/node_modules/date-fns/locale/en-US/_lib/formatDistance.js +106 -0
  67. package/dist/cjs/node_modules/date-fns/locale/en-US/_lib/formatDistance.js.map +1 -0
  68. package/dist/cjs/node_modules/date-fns/locale/en-US/_lib/formatLong.js +44 -0
  69. package/dist/cjs/node_modules/date-fns/locale/en-US/_lib/formatLong.js.map +1 -0
  70. package/dist/cjs/node_modules/date-fns/locale/en-US/_lib/formatRelative.js +16 -0
  71. package/dist/cjs/node_modules/date-fns/locale/en-US/_lib/formatRelative.js.map +1 -0
  72. package/dist/cjs/node_modules/date-fns/locale/en-US/_lib/localize.js +192 -0
  73. package/dist/cjs/node_modules/date-fns/locale/en-US/_lib/localize.js.map +1 -0
  74. package/dist/cjs/node_modules/date-fns/locale/en-US/_lib/match.js +137 -0
  75. package/dist/cjs/node_modules/date-fns/locale/en-US/_lib/match.js.map +1 -0
  76. package/dist/cjs/node_modules/date-fns/locale/en-US.js +31 -0
  77. package/dist/cjs/node_modules/date-fns/locale/en-US.js.map +1 -0
  78. package/dist/cjs/node_modules/date-fns/locale/fr/_lib/formatDistance.js +105 -0
  79. package/dist/cjs/node_modules/date-fns/locale/fr/_lib/formatDistance.js.map +1 -0
  80. package/dist/cjs/node_modules/date-fns/locale/fr/_lib/formatLong.js +44 -0
  81. package/dist/cjs/node_modules/date-fns/locale/fr/_lib/formatLong.js.map +1 -0
  82. package/dist/cjs/node_modules/date-fns/locale/fr/_lib/formatRelative.js +16 -0
  83. package/dist/cjs/node_modules/date-fns/locale/fr/_lib/formatRelative.js.map +1 -0
  84. package/dist/cjs/node_modules/date-fns/locale/fr/_lib/localize.js +170 -0
  85. package/dist/cjs/node_modules/date-fns/locale/fr/_lib/localize.js.map +1 -0
  86. package/dist/cjs/node_modules/date-fns/locale/fr/_lib/match.js +138 -0
  87. package/dist/cjs/node_modules/date-fns/locale/fr/_lib/match.js.map +1 -0
  88. package/dist/cjs/node_modules/date-fns/locale/fr.js +31 -0
  89. package/dist/cjs/node_modules/date-fns/locale/fr.js.map +1 -0
  90. package/dist/cjs/types/session.js +6 -0
  91. package/dist/cjs/types/session.js.map +1 -0
  92. package/dist/cjs/utils/customFieldValidation.js +62 -0
  93. package/dist/cjs/utils/customFieldValidation.js.map +1 -0
  94. package/dist/esm/components/DatakeenSession.js +22 -3
  95. package/dist/esm/components/DatakeenSession.js.map +1 -1
  96. package/dist/esm/components/document-collection/DocumentCollection.js +2 -2
  97. package/dist/esm/components/document-collection/DocumentCollection.js.map +1 -1
  98. package/dist/esm/components/document-collection/DocumentCollectionIntroduction.js +5 -5
  99. package/dist/esm/components/document-collection/DocumentCollectionIntroduction.js.map +1 -1
  100. package/dist/esm/components/document-collection/DocumentCollectionMethodSelection.js +2 -2
  101. package/dist/esm/components/document-collection/DocumentCollectionMethodSelection.js.map +1 -1
  102. package/dist/esm/components/document-collection/DocumentCollectionSelection.js +5 -5
  103. package/dist/esm/components/document-collection/DocumentCollectionSelection.js.map +1 -1
  104. package/dist/esm/components/document-collection/DocumentCollectionUpload.js +11 -11
  105. package/dist/esm/components/document-collection/DocumentCollectionUpload.js.map +1 -1
  106. package/dist/esm/components/document-collection/DocumentError.js +4 -2
  107. package/dist/esm/components/document-collection/DocumentError.js.map +1 -1
  108. package/dist/esm/components/document-collection/DocumentSuccess.js +2 -2
  109. package/dist/esm/components/document-collection/DocumentSuccess.js.map +1 -1
  110. package/dist/esm/components/id-check/Photo.js +9 -1
  111. package/dist/esm/components/id-check/Photo.js.map +1 -1
  112. package/dist/esm/components/jdi/JDDWorkInProgress.js +1 -1
  113. package/dist/esm/components/jdi/JDDWorkInProgress.js.map +1 -1
  114. package/dist/esm/components/jdi/JDIDocumentUpload.js +1 -1
  115. package/dist/esm/components/jdi/JDIDocumentUpload.js.map +1 -1
  116. package/dist/esm/components/selfie/selfie-flow/SelfieRecorder.js +26 -7
  117. package/dist/esm/components/selfie/selfie-flow/SelfieRecorder.js.map +1 -1
  118. package/dist/esm/components/session/DocumentCheck.js +2 -2
  119. package/dist/esm/components/session/DocumentCheck.js.map +1 -1
  120. package/dist/esm/components/session/UserInputForm/CustomFormFields.js +42 -45
  121. package/dist/esm/components/session/UserInputForm/CustomFormFields.js.map +1 -1
  122. package/dist/esm/components/session/UserInputForm/DatePickerField.js +132 -0
  123. package/dist/esm/components/session/UserInputForm/DatePickerField.js.map +1 -0
  124. package/dist/esm/components/session/UserInputForm.js +2 -2
  125. package/dist/esm/components/session/UserInputForm.js.map +1 -1
  126. package/dist/esm/components/session/VideoWorkInProgress.js +1 -1
  127. package/dist/esm/components/session/VideoWorkInProgress.js.map +1 -1
  128. package/dist/esm/components/signature-electronic/DocusealSignature.js +2 -1
  129. package/dist/esm/components/signature-electronic/DocusealSignature.js.map +1 -1
  130. package/dist/esm/components/signature-electronic/SignatureElectronic.js +2 -1
  131. package/dist/esm/components/signature-electronic/SignatureElectronic.js.map +1 -1
  132. package/dist/esm/components/signature-electronic/SignatureElectronicIntroduction.js +2 -1
  133. package/dist/esm/components/signature-electronic/SignatureElectronicIntroduction.js.map +1 -1
  134. package/dist/esm/components/start-flow/CGU.js +5 -2
  135. package/dist/esm/components/start-flow/CGU.js.map +1 -1
  136. package/dist/esm/components/start-flow/Start.js +5 -2
  137. package/dist/esm/components/start-flow/Start.js.map +1 -1
  138. package/dist/esm/components/template/ExternalVerificationNodeHandler.js +2 -1
  139. package/dist/esm/components/template/ExternalVerificationNodeHandler.js.map +1 -1
  140. package/dist/esm/components/ui/MobilePageLayout.js +1 -1
  141. package/dist/esm/components/ui/MobilePageLayout.js.map +1 -1
  142. package/dist/esm/components/ui/Paper.js +2 -2
  143. package/dist/esm/components/ui/Paper.js.map +1 -1
  144. package/dist/esm/components/ui/SelectComponent.js +3 -3
  145. package/dist/esm/components/ui/SelectComponent.js.map +1 -1
  146. package/dist/esm/hooks/useUserInputForm.js +92 -31
  147. package/dist/esm/hooks/useUserInputForm.js.map +1 -1
  148. package/dist/esm/i18n/en.json.js +35 -5
  149. package/dist/esm/i18n/en.json.js.map +1 -1
  150. package/dist/esm/i18n/fr.json.js +36 -6
  151. package/dist/esm/i18n/fr.json.js.map +1 -1
  152. package/dist/esm/index.css.js +1 -1
  153. package/dist/esm/node_modules/date-fns/locale/_lib/buildFormatLongFn.js +11 -0
  154. package/dist/esm/node_modules/date-fns/locale/_lib/buildFormatLongFn.js.map +1 -0
  155. package/dist/esm/node_modules/date-fns/locale/_lib/buildLocalizeFn.js +65 -0
  156. package/dist/esm/node_modules/date-fns/locale/_lib/buildLocalizeFn.js.map +1 -0
  157. package/dist/esm/node_modules/date-fns/locale/_lib/buildMatchFn.js +60 -0
  158. package/dist/esm/node_modules/date-fns/locale/_lib/buildMatchFn.js.map +1 -0
  159. package/dist/esm/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js +23 -0
  160. package/dist/esm/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js.map +1 -0
  161. package/dist/esm/node_modules/date-fns/locale/en-US/_lib/formatDistance.js +104 -0
  162. package/dist/esm/node_modules/date-fns/locale/en-US/_lib/formatDistance.js.map +1 -0
  163. package/dist/esm/node_modules/date-fns/locale/en-US/_lib/formatLong.js +42 -0
  164. package/dist/esm/node_modules/date-fns/locale/en-US/_lib/formatLong.js.map +1 -0
  165. package/dist/esm/node_modules/date-fns/locale/en-US/_lib/formatRelative.js +14 -0
  166. package/dist/esm/node_modules/date-fns/locale/en-US/_lib/formatRelative.js.map +1 -0
  167. package/dist/esm/node_modules/date-fns/locale/en-US/_lib/localize.js +190 -0
  168. package/dist/esm/node_modules/date-fns/locale/en-US/_lib/localize.js.map +1 -0
  169. package/dist/esm/node_modules/date-fns/locale/en-US/_lib/match.js +135 -0
  170. package/dist/esm/node_modules/date-fns/locale/en-US/_lib/match.js.map +1 -0
  171. package/dist/esm/node_modules/date-fns/locale/en-US.js +29 -0
  172. package/dist/esm/node_modules/date-fns/locale/en-US.js.map +1 -0
  173. package/dist/esm/node_modules/date-fns/locale/fr/_lib/formatDistance.js +103 -0
  174. package/dist/esm/node_modules/date-fns/locale/fr/_lib/formatDistance.js.map +1 -0
  175. package/dist/esm/node_modules/date-fns/locale/fr/_lib/formatLong.js +42 -0
  176. package/dist/esm/node_modules/date-fns/locale/fr/_lib/formatLong.js.map +1 -0
  177. package/dist/esm/node_modules/date-fns/locale/fr/_lib/formatRelative.js +14 -0
  178. package/dist/esm/node_modules/date-fns/locale/fr/_lib/formatRelative.js.map +1 -0
  179. package/dist/esm/node_modules/date-fns/locale/fr/_lib/localize.js +168 -0
  180. package/dist/esm/node_modules/date-fns/locale/fr/_lib/localize.js.map +1 -0
  181. package/dist/esm/node_modules/date-fns/locale/fr/_lib/match.js +136 -0
  182. package/dist/esm/node_modules/date-fns/locale/fr/_lib/match.js.map +1 -0
  183. package/dist/esm/node_modules/date-fns/locale/fr.js +29 -0
  184. package/dist/esm/node_modules/date-fns/locale/fr.js.map +1 -0
  185. package/dist/esm/providers/I18nProvider.js +2 -2
  186. package/dist/esm/providers/I18nProvider.js.map +1 -1
  187. package/dist/esm/types/session.js +4 -0
  188. package/dist/esm/types/session.js.map +1 -0
  189. package/dist/esm/utils/customFieldValidation.js +56 -0
  190. package/dist/esm/utils/customFieldValidation.js.map +1 -0
  191. package/jest.config.js +1 -0
  192. package/package.json +4 -1
@@ -1 +1 @@
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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"}
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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"}
@@ -31,10 +31,13 @@ import '../jdi/JDIProcessing.js';
31
31
  import '../../services/cameraService.js';
32
32
  import '../../services/documentDetectionService.js';
33
33
  import 'lucide-react';
34
- import 'react-i18next';
35
34
  import '../document-collection/DocumentProcessing.js';
36
35
  import '../../constants/userInputForm.js';
37
- import '../session/UserInputForm/CustomFormFields.js';
36
+ import 'date-fns';
37
+ import 'react-day-picker';
38
+ import '@radix-ui/react-popover';
39
+ import 'react-i18next';
40
+ import '../../i18n/index.js';
38
41
  import '@docuseal/react';
39
42
  import '../../services/professionalImageQuality.js';
40
43
  import '../../providers/I18nProvider.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 goOnCGU = () => {\n setStep(1);\n };\n\n return (\n <MobilePageLayout\n footer={\n <PageActions\n primary={\n <Button onClick={goOnCGU}>{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":["_jsx","_jsxs"],"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,GAAK,OAAO,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,OAAO,GAAG,YAAA;QACd,OAAO,CAAC,CAAC,CAAC;AACZ,IAAA,CAAC;IAED,QACEA,GAAA,CAAC,gBAAgB,EAAA,EACf,MAAM,EACJA,GAAA,CAAC,WAAW,EAAA,EACV,OAAO,EACLA,GAAA,CAAC,MAAM,EAAA,EAAC,OAAO,EAAE,OAAO,EAAA,QAAA,EAAG,CAAC,CAAC,oBAAoB,CAAC,EAAA,CAAU,EAAA,CAE9D,EAEJ,OAAO,EAAE,OAAO,EAAA,QAAA,EAEhBA,aAAK,SAAS,EAAC,8CAA8C,EAAA,QAAA,EAC3DC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,6DAA6D,EAAA,QAAA,EAAA,CAE1ED,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,qBAAqB,EAAA,QAAA,EACjC,YAAY,IACXA,GAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,YAAY,EACjB,GAAG,EAAC,eAAe,EACnB,SAAS,EAAC,mCAAmC,EAAA,CAC7C,KAEFA,GAAA,CAAC,SAAS,EAAA,EAAC,SAAS,EAAC,WAAW,EAAA,CAAG,CACpC,EAAA,CACG,EAGNC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,WAAW,EAAA,QAAA,EAAA,CACxBD,GAAA,CAAC,KAAK,EAAA,EAAC,SAAS,EAAC,iCAAiC,EAAA,QAAA,EAC/C,YAAY,EAAA,CACP,EACRA,GAAA,CAAC,QAAQ,EAAA,EAAC,SAAS,EAAC,wEAAwE,EAAA,QAAA,EACzF,eAAe,EAAA,CACP,CAAA,EAAA,CACP,EAGNA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,eAAe,EAAA,QAAA,EAC5BA,GAAA,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 goOnCGU = () => {\n setStep(1);\n };\n\n return (\n <MobilePageLayout\n footer={\n <PageActions\n primary={\n <Button onClick={goOnCGU}>{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":["_jsx","_jsxs"],"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,GAAK,OAAO,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,OAAO,GAAG,YAAA;QACd,OAAO,CAAC,CAAC,CAAC;AACZ,IAAA,CAAC;IAED,QACEA,GAAA,CAAC,gBAAgB,EAAA,EACf,MAAM,EACJA,GAAA,CAAC,WAAW,EAAA,EACV,OAAO,EACLA,GAAA,CAAC,MAAM,EAAA,EAAC,OAAO,EAAE,OAAO,EAAA,QAAA,EAAG,CAAC,CAAC,oBAAoB,CAAC,EAAA,CAAU,EAAA,CAE9D,EAEJ,OAAO,EAAE,OAAO,EAAA,QAAA,EAEhBA,aAAK,SAAS,EAAC,8CAA8C,EAAA,QAAA,EAC3DC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,6DAA6D,EAAA,QAAA,EAAA,CAE1ED,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,qBAAqB,EAAA,QAAA,EACjC,YAAY,IACXA,GAAA,CAAA,KAAA,EAAA,EACE,GAAG,EAAE,YAAY,EACjB,GAAG,EAAC,eAAe,EACnB,SAAS,EAAC,mCAAmC,EAAA,CAC7C,KAEFA,GAAA,CAAC,SAAS,EAAA,EAAC,SAAS,EAAC,WAAW,EAAA,CAAG,CACpC,EAAA,CACG,EAGNC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,WAAW,EAAA,QAAA,EAAA,CACxBD,GAAA,CAAC,KAAK,EAAA,EAAC,SAAS,EAAC,iCAAiC,EAAA,QAAA,EAC/C,YAAY,EAAA,CACP,EACRA,GAAA,CAAC,QAAQ,EAAA,EAAC,SAAS,EAAC,wEAAwE,EAAA,QAAA,EACzF,eAAe,EAAA,CACP,CAAA,EAAA,CACP,EAGNA,GAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,eAAe,EAAA,QAAA,EAC5BA,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,4EAA4E,EAAA,QAAA,EACtF,kBAAkB,EAAA,CACjB,EAAA,CACA,CAAA,EAAA,CACF,EAAA,CACF,EAAA,CACW;AAEvB;;;;"}
@@ -2,6 +2,7 @@ import { __awaiter, __generator, __assign, __spreadArray } from '../../node_modu
2
2
  import { jsxs, jsx } from 'react/jsx-runtime';
3
3
  import { useEffect } from 'react';
4
4
  import { useTranslation } from 'react-i18next';
5
+ import sdkI18n from '../../i18n/index.js';
5
6
  import { Loader2 } from 'lucide-react';
6
7
  import { apiService } from '../../services/api.js';
7
8
 
@@ -29,7 +30,7 @@ var maskReferenceValue = function (value) {
29
30
  };
30
31
  var ExternalVerificationNodeHandler = function (_a) {
31
32
  var node = _a.node, session = _a.session, userInput = _a.userInput, setUserInput = _a.setUserInput, onNext = _a.onNext;
32
- var t = useTranslation().t;
33
+ var t = useTranslation('translation', { i18n: sdkI18n }).t;
33
34
  useEffect(function () {
34
35
  var performVerification = function () { return __awaiter(void 0, void 0, void 0, function () {
35
36
  var verificationResult, apiType, referenceField, referenceValueMasked, nodeData, referenceNodeId, referenceVariable, nodeInput, userInputFlat, lookupKeys, referenceValue, _i, lookupKeys_1, key, candidateValue, allCustomFields, _a, _b, _c, key, value, stringValue, response, result, apiErr_1, apiResult, err_1;
@@ -1 +1 @@
1
- {"version":3,"file":"ExternalVerificationNodeHandler.js","sources":["../../../../../src/components/template/ExternalVerificationNodeHandler.tsx"],"sourcesContent":["import React, { useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Loader2 } from 'lucide-react';\nimport { apiService } from '../../services/api';\nimport type { SessionData, SessionTemplateNode } from '../../types/session';\nimport type { UserInput } from '../../types/userInput';\n\ntype VerificationStatus =\n | 'ok'\n | 'not_found'\n | 'invalid_input'\n | 'config_error'\n | 'external_error';\n\ninterface VerificationResponsePayload {\n isVerified: boolean;\n status: VerificationStatus;\n message?: string;\n errorCode?: string;\n}\n\ninterface ExternalVerificationNodeHandlerProps {\n node: SessionTemplateNode;\n session: SessionData;\n userInput: UserInput;\n setUserInput: React.Dispatch<React.SetStateAction<UserInput>>;\n onNext: () => void;\n onPrevious: () => void;\n}\n\nconst FIELD_ALIASES: Record<'siren' | 'siret', string[]> = {\n siren: ['siren', 'siren_number', 'company_siren', 'legal_siren', 'num_siren'],\n siret: ['siret', 'siret_number', 'company_siret', 'legal_siret', 'num_siret'],\n};\n\nconst normalizeReferenceField = (field?: string): 'siren' | 'siret' | undefined => {\n if (!field) return undefined;\n const normalized = field.toLowerCase().replace(/[\\s_.-]/g, '');\n if (normalized.includes('siret')) return 'siret';\n if (normalized.includes('siren')) return 'siren';\n return undefined;\n};\n\nconst maskReferenceValue = (value: string): string => {\n const clean = value.replace(/\\s+/g, '');\n if (!clean) return '';\n if (clean.length <= 4) return '****';\n return `${'*'.repeat(clean.length - 4)}${clean.slice(-4)}`;\n};\n\nconst ExternalVerificationNodeHandler: React.FC<ExternalVerificationNodeHandlerProps> = ({\n node,\n session,\n userInput,\n setUserInput,\n onNext,\n}) => {\n const { t } = useTranslation();\n\n useEffect(() => {\n const performVerification = async () => {\n let verificationResult: VerificationResponsePayload = {\n isVerified: false,\n status: 'external_error',\n message: 'Verification did not run.',\n };\n let apiType = (node as any).targetApi || 'INSEE';\n let referenceField: 'siren' | 'siret' | undefined;\n let referenceValueMasked = '';\n console.log(\"Api Type :\", apiType);\n try {\n if (!session?.id) {\n throw new Error('Session ID is missing');\n }\n\n const nodeData = node as any;\n apiType = String(nodeData.targetApi || 'INSEE');\n const referenceNodeId = String(nodeData.referenceNodeId || '');\n const referenceVariable = String(nodeData.referenceVariable || '');\n referenceField = normalizeReferenceField(\n String(nodeData.referenceField || referenceVariable || ''),\n );\n\n if (!referenceNodeId || !referenceField) {\n verificationResult = {\n isVerified: false,\n status: 'config_error',\n message: 'External verification node is missing reference configuration.',\n errorCode: 'MISSING_REFERENCE_CONFIG',\n };\n } else {\n const nodeInput = (userInput as any)[referenceNodeId];\n const userInputFlat = userInput as any;\n const lookupKeys = Array.from(\n new Set([\n referenceVariable,\n referenceField,\n ...FIELD_ALIASES[referenceField],\n ].filter(Boolean)),\n );\n\n let referenceValue: string | undefined;\n for (const key of lookupKeys) {\n const candidateValue =\n nodeInput?.[key] ??\n nodeInput?.customFormData?.[key] ??\n userInputFlat?.customFormData?.[key] ??\n userInputFlat?.[key];\n\n if (candidateValue !== undefined && candidateValue !== null && `${candidateValue}`.trim() !== '') {\n referenceValue = String(candidateValue);\n break;\n }\n }\n\n // Fallback: Smart lookup if no value found by key\n if (!referenceValue) {\n const allCustomFields = {\n ...(userInputFlat?.customFormData || {}),\n ...(nodeInput?.customFormData || {}),\n ...(nodeInput || {}),\n };\n\n for (const [key, value] of Object.entries(allCustomFields)) {\n if (typeof value !== 'string' && typeof value !== 'number') continue;\n const stringValue = String(value).replace(/\\s+/g, '');\n\n // 9-digit SIREN pattern\n if (referenceField === 'siren' && /^\\d{9}$/.test(stringValue)) {\n referenceValue = stringValue;\n break;\n }\n // 14-digit SIRET pattern\n if (referenceField === 'siret' && /^\\d{14}$/.test(stringValue)) {\n referenceValue = stringValue;\n break;\n }\n }\n }\n\n if (!referenceValue) {\n verificationResult = {\n isVerified: false,\n status: 'invalid_input',\n message: 'No SIREN/SIRET value found in source node data.',\n errorCode: 'REFERENCE_VALUE_NOT_FOUND',\n };\n } else {\n referenceValueMasked = maskReferenceValue(referenceValue);\n\n try {\n const response = await apiService.post(\n `/session/sdk/${session.id}/verify-external/${node.id}`,\n { apiType, referenceValue, referenceField },\n );\n const result = response.data?.data as VerificationResponsePayload | undefined;\n if (result && typeof result.isVerified === 'boolean') {\n verificationResult = result;\n }\n } catch (apiErr: any) {\n const apiResult = apiErr?.response?.data?.data as VerificationResponsePayload | undefined;\n if (apiResult && typeof apiResult.isVerified === 'boolean') {\n verificationResult = apiResult;\n } else {\n verificationResult = {\n isVerified: false,\n status: 'external_error',\n message: 'External verification request failed.',\n errorCode: 'REQUEST_FAILED',\n };\n }\n }\n }\n }\n } catch (err) {\n verificationResult = {\n isVerified: false,\n status: 'external_error',\n message: 'Unexpected error during verification.',\n errorCode: 'UNEXPECTED_ERROR',\n };\n console.warn('[ExternalVerificationNodeHandler] Unexpected error:', err);\n }\n\n setUserInput((prev) => ({\n ...prev,\n [node.id]: {\n isVerified: verificationResult.isVerified,\n apiType,\n referenceField,\n referenceValueMasked,\n verifiedAt: new Date().toISOString(),\n status: verificationResult.status,\n errorCode: verificationResult.errorCode,\n message: verificationResult.message,\n hasError: verificationResult.status !== 'ok' && verificationResult.status !== 'not_found',\n },\n } as any));\n\n onNext();\n };\n\n performVerification();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <div className=\"flex min-h-[300px] flex-col items-center justify-center space-y-4 p-6 text-center\">\n <Loader2 className=\"h-12 w-12 animate-spin text-[#1c2c5c]\" />\n <h3 className=\"text-xl font-semibold text-gray-900\">\n {t('verification_node.verifying_title', 'Vérification en cours...')}\n </h3>\n <p className=\"text-gray-500\">\n {t('verification_node.verifying_desc', 'Nous interrogeons la base de données.')}\n </p>\n </div>\n );\n};\n\nexport default ExternalVerificationNodeHandler;\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"ExternalVerificationNodeHandler.js","sources":["../../../../../src/components/template/ExternalVerificationNodeHandler.tsx"],"sourcesContent":["import React, { useEffect } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport sdkI18n from '../../i18n';\nimport { Loader2 } from 'lucide-react';\nimport { apiService } from '../../services/api';\nimport type { SessionData, SessionTemplateNode } from '../../types/session';\nimport type { UserInput } from '../../types/userInput';\n\ntype VerificationStatus =\n | 'ok'\n | 'not_found'\n | 'invalid_input'\n | 'config_error'\n | 'external_error';\n\ninterface VerificationResponsePayload {\n isVerified: boolean;\n status: VerificationStatus;\n message?: string;\n errorCode?: string;\n}\n\ninterface ExternalVerificationNodeHandlerProps {\n node: SessionTemplateNode;\n session: SessionData;\n userInput: UserInput;\n setUserInput: React.Dispatch<React.SetStateAction<UserInput>>;\n onNext: () => void;\n onPrevious: () => void;\n}\n\nconst FIELD_ALIASES: Record<'siren' | 'siret', string[]> = {\n siren: ['siren', 'siren_number', 'company_siren', 'legal_siren', 'num_siren'],\n siret: ['siret', 'siret_number', 'company_siret', 'legal_siret', 'num_siret'],\n};\n\nconst normalizeReferenceField = (field?: string): 'siren' | 'siret' | undefined => {\n if (!field) return undefined;\n const normalized = field.toLowerCase().replace(/[\\s_.-]/g, '');\n if (normalized.includes('siret')) return 'siret';\n if (normalized.includes('siren')) return 'siren';\n return undefined;\n};\n\nconst maskReferenceValue = (value: string): string => {\n const clean = value.replace(/\\s+/g, '');\n if (!clean) return '';\n if (clean.length <= 4) return '****';\n return `${'*'.repeat(clean.length - 4)}${clean.slice(-4)}`;\n};\n\nconst ExternalVerificationNodeHandler: React.FC<ExternalVerificationNodeHandlerProps> = ({\n node,\n session,\n userInput,\n setUserInput,\n onNext,\n}) => {\n const { t } = useTranslation('translation', { i18n: sdkI18n });\n\n useEffect(() => {\n const performVerification = async () => {\n let verificationResult: VerificationResponsePayload = {\n isVerified: false,\n status: 'external_error',\n message: 'Verification did not run.',\n };\n let apiType = (node as any).targetApi || 'INSEE';\n let referenceField: 'siren' | 'siret' | undefined;\n let referenceValueMasked = '';\n console.log(\"Api Type :\", apiType);\n try {\n if (!session?.id) {\n throw new Error('Session ID is missing');\n }\n\n const nodeData = node as any;\n apiType = String(nodeData.targetApi || 'INSEE');\n const referenceNodeId = String(nodeData.referenceNodeId || '');\n const referenceVariable = String(nodeData.referenceVariable || '');\n referenceField = normalizeReferenceField(\n String(nodeData.referenceField || referenceVariable || ''),\n );\n\n if (!referenceNodeId || !referenceField) {\n verificationResult = {\n isVerified: false,\n status: 'config_error',\n message: 'External verification node is missing reference configuration.',\n errorCode: 'MISSING_REFERENCE_CONFIG',\n };\n } else {\n const nodeInput = (userInput as any)[referenceNodeId];\n const userInputFlat = userInput as any;\n const lookupKeys = Array.from(\n new Set([\n referenceVariable,\n referenceField,\n ...FIELD_ALIASES[referenceField],\n ].filter(Boolean)),\n );\n\n let referenceValue: string | undefined;\n for (const key of lookupKeys) {\n const candidateValue =\n nodeInput?.[key] ??\n nodeInput?.customFormData?.[key] ??\n userInputFlat?.customFormData?.[key] ??\n userInputFlat?.[key];\n\n if (candidateValue !== undefined && candidateValue !== null && `${candidateValue}`.trim() !== '') {\n referenceValue = String(candidateValue);\n break;\n }\n }\n\n // Fallback: Smart lookup if no value found by key\n if (!referenceValue) {\n const allCustomFields = {\n ...(userInputFlat?.customFormData || {}),\n ...(nodeInput?.customFormData || {}),\n ...(nodeInput || {}),\n };\n\n for (const [key, value] of Object.entries(allCustomFields)) {\n if (typeof value !== 'string' && typeof value !== 'number') continue;\n const stringValue = String(value).replace(/\\s+/g, '');\n\n // 9-digit SIREN pattern\n if (referenceField === 'siren' && /^\\d{9}$/.test(stringValue)) {\n referenceValue = stringValue;\n break;\n }\n // 14-digit SIRET pattern\n if (referenceField === 'siret' && /^\\d{14}$/.test(stringValue)) {\n referenceValue = stringValue;\n break;\n }\n }\n }\n\n if (!referenceValue) {\n verificationResult = {\n isVerified: false,\n status: 'invalid_input',\n message: 'No SIREN/SIRET value found in source node data.',\n errorCode: 'REFERENCE_VALUE_NOT_FOUND',\n };\n } else {\n referenceValueMasked = maskReferenceValue(referenceValue);\n\n try {\n const response = await apiService.post(\n `/session/sdk/${session.id}/verify-external/${node.id}`,\n { apiType, referenceValue, referenceField },\n );\n const result = response.data?.data as VerificationResponsePayload | undefined;\n if (result && typeof result.isVerified === 'boolean') {\n verificationResult = result;\n }\n } catch (apiErr: any) {\n const apiResult = apiErr?.response?.data?.data as VerificationResponsePayload | undefined;\n if (apiResult && typeof apiResult.isVerified === 'boolean') {\n verificationResult = apiResult;\n } else {\n verificationResult = {\n isVerified: false,\n status: 'external_error',\n message: 'External verification request failed.',\n errorCode: 'REQUEST_FAILED',\n };\n }\n }\n }\n }\n } catch (err) {\n verificationResult = {\n isVerified: false,\n status: 'external_error',\n message: 'Unexpected error during verification.',\n errorCode: 'UNEXPECTED_ERROR',\n };\n console.warn('[ExternalVerificationNodeHandler] Unexpected error:', err);\n }\n\n setUserInput((prev) => ({\n ...prev,\n [node.id]: {\n isVerified: verificationResult.isVerified,\n apiType,\n referenceField,\n referenceValueMasked,\n verifiedAt: new Date().toISOString(),\n status: verificationResult.status,\n errorCode: verificationResult.errorCode,\n message: verificationResult.message,\n hasError: verificationResult.status !== 'ok' && verificationResult.status !== 'not_found',\n },\n } as any));\n\n onNext();\n };\n\n performVerification();\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n return (\n <div className=\"flex min-h-[300px] flex-col items-center justify-center space-y-4 p-6 text-center\">\n <Loader2 className=\"h-12 w-12 animate-spin text-[#1c2c5c]\" />\n <h3 className=\"text-xl font-semibold text-gray-900\">\n {t('verification_node.verifying_title', 'Vérification en cours...')}\n </h3>\n <p className=\"text-gray-500\">\n {t('verification_node.verifying_desc', 'Nous interrogeons la base de données.')}\n </p>\n </div>\n );\n};\n\nexport default ExternalVerificationNodeHandler;\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
@@ -6,7 +6,7 @@ import PoweredBy from './PoweredBy.js';
6
6
  var MobilePageLayout = function (_a) {
7
7
  var _b, _c;
8
8
  var header = _a.header, children = _a.children, footer = _a.footer, _d = _a.className, className = _d === void 0 ? "" : _d, _e = _a.headerClassName, headerClassName = _e === void 0 ? "" : _e, _f = _a.contentClassName, contentClassName = _f === void 0 ? "overflow-y-auto" : _f, _g = _a.footerClassName, footerClassName = _g === void 0 ? "" : _g, session = _a.session;
9
- var isMobile = useIsMobile(768);
9
+ var isMobile = useIsMobile();
10
10
  var footerRef = useRef(null);
11
11
  var _h = useState(140), footerHeight = _h[0], setFooterHeight = _h[1];
12
12
  useEffect(function () {
@@ -1 +1 @@
1
- {"version":3,"file":"MobilePageLayout.js","sources":["../../../../../src/components/ui/MobilePageLayout.tsx"],"sourcesContent":["import React, { ReactNode, useRef, useState, useEffect } from \"react\";\nimport useIsMobile from \"../../hooks/useIsMobile\";\nimport PoweredBy from \"./PoweredBy\";\nimport { SessionData } from \"../../types/session\";\n\ninterface MobilePageLayoutProps {\n /** Contenu de l'en-tête (optionnel) */\n header?: ReactNode;\n /** Contenu principal de la page */\n children: ReactNode;\n /** Contenu du footer (boutons, etc.) */\n footer: ReactNode;\n /** Classes CSS supplémentaires pour le conteneur principal */\n className?: string;\n /** Classes CSS pour l'en-tête */\n headerClassName?: string;\n /** Classes CSS pour le contenu */\n contentClassName?: string;\n /** Classes CSS pour le footer */\n footerClassName?: string;\n /** @deprecated Ignoré */\n contentPaddingBottom?: string;\n\n session?: SessionData;\n}\n\nconst MobilePageLayout: React.FC<MobilePageLayoutProps> = ({\n header,\n children,\n footer,\n className = \"\",\n headerClassName = \"\",\n contentClassName = \"overflow-y-auto\",\n footerClassName = \"\",\n session,\n}) => {\n const isMobile = useIsMobile(768);\n const footerRef = useRef<HTMLDivElement>(null);\n const [footerHeight, setFooterHeight] = useState(140);\n\n useEffect(() => {\n if (!isMobile) return;\n const el = footerRef.current;\n if (!el) return;\n\n const update = () => setFooterHeight(el.offsetHeight);\n update();\n\n const observer = new ResizeObserver(update);\n observer.observe(el);\n return () => observer.disconnect();\n }, [isMobile]);\n\n if (isMobile) {\n return (\n <div className={`flex flex-col h-full w-full ${className}`}>\n {header && (\n <div className={`shrink-0 sticky top-0 bg-white z-20 ${headerClassName}`}>\n {header}\n </div>\n )}\n <div\n className={`flex-1 min-h-0 ${contentClassName}`}\n style={{ paddingBottom: footerHeight }}\n >\n {children}\n </div>\n <div\n ref={footerRef}\n className={`fixed bottom-0 left-0 right-0 bg-white border-t px-4 pt-4 pb-4 z-10 ${footerClassName}`}\n >\n <div className=\"space-y-3\">\n {footer}\n <PoweredBy\n logo={session?.template?.logo}\n text={session?.template?.logo ? \"par\" : undefined}\n />\n </div>\n </div>\n </div>\n );\n }\n\n // DESKTOP\n return (\n <div className=\"flex flex-col justify-between h-full\">\n {children}\n <div className={`px-6 pb-6 ${footerClassName}`}>{footer}</div>\n </div>\n );\n};\n\nexport default MobilePageLayout;\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"MobilePageLayout.js","sources":["../../../../../src/components/ui/MobilePageLayout.tsx"],"sourcesContent":["import React, { ReactNode, useRef, useState, useEffect } from \"react\";\nimport useIsMobile from \"../../hooks/useIsMobile\";\nimport PoweredBy from \"./PoweredBy\";\nimport { SessionData } from \"../../types/session\";\n\ninterface MobilePageLayoutProps {\n /** Contenu de l'en-tête (optionnel) */\n header?: ReactNode;\n /** Contenu principal de la page */\n children: ReactNode;\n /** Contenu du footer (boutons, etc.) */\n footer: ReactNode;\n /** Classes CSS supplémentaires pour le conteneur principal */\n className?: string;\n /** Classes CSS pour l'en-tête */\n headerClassName?: string;\n /** Classes CSS pour le contenu */\n contentClassName?: string;\n /** Classes CSS pour le footer */\n footerClassName?: string;\n /** @deprecated Ignoré */\n contentPaddingBottom?: string;\n\n session?: SessionData;\n}\n\nconst MobilePageLayout: React.FC<MobilePageLayoutProps> = ({\n header,\n children,\n footer,\n className = \"\",\n headerClassName = \"\",\n contentClassName = \"overflow-y-auto\",\n footerClassName = \"\",\n session,\n}) => {\n const isMobile = useIsMobile();\n const footerRef = useRef<HTMLDivElement>(null);\n const [footerHeight, setFooterHeight] = useState(140);\n\n useEffect(() => {\n if (!isMobile) return;\n const el = footerRef.current;\n if (!el) return;\n\n const update = () => setFooterHeight(el.offsetHeight);\n update();\n\n const observer = new ResizeObserver(update);\n observer.observe(el);\n return () => observer.disconnect();\n }, [isMobile]);\n\n if (isMobile) {\n return (\n <div className={`flex flex-col h-full w-full ${className}`}>\n {header && (\n <div className={`shrink-0 sticky top-0 bg-white z-20 ${headerClassName}`}>\n {header}\n </div>\n )}\n <div\n className={`flex-1 min-h-0 ${contentClassName}`}\n style={{ paddingBottom: footerHeight }}\n >\n {children}\n </div>\n <div\n ref={footerRef}\n className={`fixed bottom-0 left-0 right-0 bg-white border-t px-4 pt-4 pb-4 z-10 ${footerClassName}`}\n >\n <div className=\"space-y-3\">\n {footer}\n <PoweredBy\n logo={session?.template?.logo}\n text={session?.template?.logo ? \"par\" : undefined}\n />\n </div>\n </div>\n </div>\n );\n }\n\n // DESKTOP\n return (\n <div className=\"flex flex-col justify-between h-full\">\n {children}\n <div className={`px-6 pb-6 ${footerClassName}`}>{footer}</div>\n </div>\n );\n};\n\nexport default MobilePageLayout;\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import { jsx } from 'react/jsx-runtime';
2
2
 
3
3
  var Paper = function (_a) {
4
- var children = _a.children, _b = _a.className, className = _b === void 0 ? "" : _b;
5
- return (jsx("div", { "data-testid": "paper-container", className: "bg-white shadow-md rounded-lg ".concat(className), children: children }));
4
+ var children = _a.children, _b = _a.className, className = _b === void 0 ? "" : _b, style = _a.style;
5
+ return (jsx("div", { "data-testid": "paper-container", className: "bg-white shadow-md rounded-lg ".concat(className), style: style, children: children }));
6
6
  };
7
7
 
8
8
  export { Paper as default };
@@ -1 +1 @@
1
- {"version":3,"file":"Paper.js","sources":["../../../../../src/components/ui/Paper.tsx"],"sourcesContent":["import React from \"react\";\nimport type { ReactNode } from \"react\";\n\ninterface PaperProps {\n children: ReactNode;\n className?: string;\n}\n\nconst Paper = ({ children, className = \"\" }: PaperProps) => {\n return (\n <div data-testid=\"paper-container\" className={`bg-white shadow-md rounded-lg ${className}`}>\n {children}\n </div>\n );\n};\n\nexport default Paper;\n"],"names":["_jsx"],"mappings":";;AAQA,IAAM,KAAK,GAAG,UAAC,EAAwC,EAAA;AAAtC,IAAA,IAAA,QAAQ,cAAA,EAAE,EAAA,GAAA,EAAA,CAAA,SAAc,EAAd,SAAS,GAAA,EAAA,KAAA,MAAA,GAAG,EAAE,GAAA,EAAA;AACvC,IAAA,QACEA,GAAA,CAAA,KAAA,EAAA,EAAA,aAAA,EAAiB,iBAAiB,EAAC,SAAS,EAAE,gCAAA,CAAA,MAAA,CAAiC,SAAS,CAAE,EAAA,QAAA,EACvF,QAAQ,EAAA,CACL;AAEV;;;;"}
1
+ {"version":3,"file":"Paper.js","sources":["../../../../../src/components/ui/Paper.tsx"],"sourcesContent":["import React from \"react\";\nimport type { CSSProperties, ReactNode } from \"react\";\n\ninterface PaperProps {\n children: ReactNode;\n className?: string;\n style?: CSSProperties;\n}\n\nconst Paper = ({ children, className = \"\", style }: PaperProps) => {\n return (\n <div\n data-testid=\"paper-container\"\n className={`bg-white shadow-md rounded-lg ${className}`}\n style={style}\n >\n {children}\n </div>\n );\n};\n\nexport default Paper;\n"],"names":["_jsx"],"mappings":";;AASA,IAAM,KAAK,GAAG,UAAC,EAA+C,EAAA;QAA7C,QAAQ,GAAA,EAAA,CAAA,QAAA,EAAE,EAAA,GAAA,EAAA,CAAA,SAAc,EAAd,SAAS,mBAAG,EAAE,GAAA,EAAA,EAAE,KAAK,GAAA,EAAA,CAAA,KAAA;AAC9C,IAAA,QACEA,GAAA,CAAA,KAAA,EAAA,EAAA,aAAA,EACc,iBAAiB,EAC7B,SAAS,EAAE,gCAAA,CAAA,MAAA,CAAiC,SAAS,CAAE,EACvD,KAAK,EAAE,KAAK,YAEX,QAAQ,EAAA,CACL;AAEV;;;;"}
@@ -1,10 +1,10 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
- import React, { useState, useRef, useEffect } from 'react';
2
+ import React__default, { useState, useRef, useEffect } from 'react';
3
3
  import ReactDOM from 'react-dom';
4
4
  import { ChevronDownIcon } from 'lucide-react';
5
5
  import { useI18n } from '../../hooks/useI18n.js';
6
6
 
7
- var Select = React.forwardRef(function (_a, ref) {
7
+ var Select = React__default.forwardRef(function (_a, ref) {
8
8
  var options = _a.options, value = _a.value, onValueChange = _a.onValueChange, placeholder = _a.placeholder, _b = _a.className, className = _b === void 0 ? "" : _b, _c = _a.disabled, disabled = _c === void 0 ? false : _c, _d = _a.error, error = _d === void 0 ? false : _d, _e = _a.allowCustomValue, allowCustomValue = _e === void 0 ? false : _e, inputMode = _a.inputMode, maxLength = _a.maxLength, pattern = _a.pattern, _f = _a.compact, compact = _f === void 0 ? false : _f;
9
9
  var t = useI18n().t;
10
10
  var _g = useState(false), isOpen = _g[0], setIsOpen = _g[1];
@@ -15,7 +15,7 @@ var Select = React.forwardRef(function (_a, ref) {
15
15
  var _k = useState({}), dropdownStyle = _k[0], setDropdownStyle = _k[1];
16
16
  var dropdownRef = useRef(null);
17
17
  // Combine refs
18
- React.useImperativeHandle(ref, function () { return internalInputRef.current; });
18
+ React__default.useImperativeHandle(ref, function () { return internalInputRef.current; });
19
19
  var normalizeText = function (text) {
20
20
  return (text || "")
21
21
  .normalize("NFD")
@@ -1 +1 @@
1
- {"version":3,"file":"SelectComponent.js","sources":["../../../../../src/components/ui/SelectComponent.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { ChevronDownIcon } from \"lucide-react\";\nimport { useI18n } from \"../../hooks/useI18n\";\n\ninterface SelectOption {\n value: string;\n label: string;\n flag?: string;\n}\n\ninterface SelectProps {\n options: SelectOption[];\n value: string;\n onValueChange: (value: string) => void;\n placeholder?: string;\n className?: string;\n disabled?: boolean;\n error?: boolean;\n allowCustomValue?: boolean;\n inputMode?: React.InputHTMLAttributes<HTMLInputElement>[\"inputMode\"];\n maxLength?: number;\n pattern?: string;\n /** Réduit le padding pour une utilisation dans des cellules de tableau */\n compact?: boolean;\n}\n\nexport const Select = React.forwardRef<HTMLInputElement, SelectProps>(({\n options,\n value,\n onValueChange,\n placeholder,\n className = \"\",\n disabled = false,\n error = false,\n allowCustomValue = false,\n inputMode,\n maxLength,\n pattern,\n compact = false,\n}, ref) => {\n const { t } = useI18n();\n const [isOpen, setIsOpen] = useState(false);\n const selectRef = useRef<HTMLDivElement>(null);\n const [inputValue, setInputValue] = useState<string>(value || \"\");\n const [isSearching, setIsSearching] = useState(false);\n const internalInputRef = useRef<HTMLInputElement>(null);\n const [dropdownStyle, setDropdownStyle] = useState<React.CSSProperties>({});\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Combine refs\n React.useImperativeHandle(ref, () => internalInputRef.current as HTMLInputElement);\n\n const normalizeText = (text: string) =>\n (text || \"\")\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .toLowerCase();\n\n const matchesNumericValue = (optionValue: string, input: string) => {\n // Strict matching for length to avoid \"1\" matching \"01\" and triggering auto-advance\n if (optionValue.length !== input.length) return false;\n\n const numericOption = parseInt(optionValue, 10);\n const numericInput = parseInt(input, 10);\n if (Number.isNaN(numericOption) || Number.isNaN(numericInput)) {\n return false;\n }\n return numericOption === numericInput;\n };\n\n // Helper to remove emoji flags from search input\n const removeEmojis = (text: string) => {\n // Remove emoji flags (regional indicator symbols) - using surrogate pairs\n return text.replace(/[\\uD83C][\\uDDE6-\\uDDFF]/g, '').trim();\n };\n\n const displayPlaceholder =\n placeholder ?? t(\"select_component.placeholder\");\n\n // Close dropdown when clicking outside (trigger ou portail dropdown)\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n const insideTrigger = selectRef.current?.contains(target);\n const insideDropdown = dropdownRef.current?.contains(target);\n if (!insideTrigger && !insideDropdown) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () =>\n document.removeEventListener(\"mousedown\", handleClickOutside);\n }\n }, [isOpen]);\n\n const selectedOption = options.find((option) => option.value === value);\n\n useEffect(() => {\n if (!allowCustomValue) return;\n\n // Don't update input value if the input is currently focused\n // This prevents auto-formatting while typing (e.g. typing \"1\" becoming \"01\")\n if (document.activeElement === internalInputRef.current) return;\n\n if (!value) {\n setInputValue(\"\");\n return;\n }\n\n const optionMatch = options.find((option) => option.value === value);\n if (optionMatch) {\n // Include flag in the input value if it exists\n const displayValue = optionMatch.flag\n ? `${optionMatch.flag} ${optionMatch.label}`\n : optionMatch.label;\n setInputValue(displayValue);\n } else if (inputMode === \"numeric\") {\n // Pour les champs numériques, afficher la valeur brute\n setInputValue(value);\n }\n // Pour les autres cas, ne pas mettre à jour inputValue si pas de match\n // Cela permet de garder la recherche en cours\n }, [value, allowCustomValue, options, inputMode]);\n\n const handleSelect = (optionValue: string) => {\n onValueChange(optionValue);\n if (allowCustomValue) {\n const optionMatch = options.find(\n (option) => option.value === optionValue\n );\n if (optionMatch) {\n // Include flag in the input value if it exists\n const displayValue = optionMatch.flag\n ? `${optionMatch.flag} ${optionMatch.label}`\n : optionMatch.label;\n setInputValue(displayValue);\n } else {\n setInputValue(optionValue);\n }\n }\n setIsSearching(false);\n setIsOpen(false);\n };\n\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (!allowCustomValue) return;\n\n const nextValue = event.target.value;\n // Remove emojis before normalizing for matching\n const cleanedValue = removeEmojis(nextValue);\n const normalizedNext = normalizeText(cleanedValue);\n setInputValue(nextValue);\n setIsSearching(true);\n\n const exactMatch = options.find(\n (option) =>\n (normalizeText(option.value) === normalizedNext && option.value.length === normalizedNext.length) ||\n (normalizeText(option.label) === normalizedNext && option.label.length === normalizedNext.length) ||\n matchesNumericValue(option.value, normalizedNext)\n );\n\n if (exactMatch) {\n onValueChange(exactMatch.value);\n } else if (inputMode === \"numeric\") {\n // Pour les champs numériques (date), on accepte les valeurs personnalisées\n onValueChange(nextValue);\n } else if (cleanedValue === \"\") {\n // If the user clears the input, clear the selection\n onValueChange(\"\");\n }\n // Pour les autres cas (pays, etc.), on ne met à jour que si match exact\n };\n\n\n\n const filteredOptions =\n allowCustomValue && isSearching && inputValue\n ? options.filter((option) => {\n // Remove emojis from input before searching\n const cleanedInput = removeEmojis(inputValue);\n const searchValue = normalizeText(cleanedInput);\n return (\n normalizeText(option.label).includes(searchValue) ||\n normalizeText(option.value).includes(searchValue) ||\n matchesNumericValue(option.value, searchValue)\n );\n })\n : options;\n\n // Calcule la position absolue du dropdown pour le portail\n useEffect(() => {\n if (isOpen && selectRef.current) {\n const rect = selectRef.current.getBoundingClientRect();\n setDropdownStyle({\n position: \"fixed\",\n top: rect.bottom + 4,\n left: rect.left,\n width: rect.width,\n zIndex: 9999,\n });\n }\n }, [isOpen]);\n\n const fieldBaseClasses = `w-full px-3 border rounded-lg text-base transition-colors\n focus:outline-none focus:ring-2 focus:ring-[#11E5C5] focus:border-transparent\n focus-within:outline-none focus-within:ring-2 focus-within:ring-[#11E5C5] focus-within:border-transparent\n ${compact ? \"py-2 text-sm\" : \"py-3 md:py-4\"}\n ${error\n ? \"border-red-500 bg-red-50\"\n : \"border-gray-300 hover:border-gray-400\"\n }\n ${disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\"}`;\n\n return (\n <div className={`relative ${className}`} ref={selectRef}>\n {allowCustomValue ? (\n <div\n className={fieldBaseClasses.replace(\n \"cursor-pointer\",\n allowCustomValue ? \"cursor-text\" : \"cursor-pointer\"\n )}\n onClick={() => {\n if (disabled) return;\n internalInputRef.current?.focus();\n }}\n >\n <div className=\"flex items-center gap-2 w-full\">\n <input\n type=\"text\"\n value={inputValue}\n onChange={handleInputChange}\n onFocus={() => {\n if (!disabled) {\n setIsOpen(true);\n setIsSearching(false);\n }\n }}\n onBlur={(e) => {\n // Close dropdown if focus moves outside the component AND its dropdown portal\n const isInsideSelect = selectRef.current?.contains(e.relatedTarget as Node);\n const isInsideDropdown = dropdownRef.current?.contains(e.relatedTarget as Node);\n\n if (!isInsideSelect && !isInsideDropdown) {\n setIsOpen(false);\n }\n\n // On blur, ensure the input value matches the selected value's label if possible\n if (value) {\n const optionMatch = options.find((option) => option.value === value);\n if (optionMatch) {\n // Include flag in the input value if it exists\n const displayValue = optionMatch.flag\n ? `${optionMatch.flag} ${optionMatch.label}`\n : optionMatch.label;\n setInputValue(displayValue);\n }\n }\n }}\n placeholder={displayPlaceholder}\n className=\"flex-1 bg-transparent outline-none text-gray-900 placeholder:text-gray-500\"\n disabled={disabled}\n inputMode={inputMode}\n maxLength={maxLength}\n pattern={pattern}\n ref={internalInputRef}\n />\n </div>\n </div>\n ) : (\n <button\n type=\"button\"\n onClick={() => !disabled && setIsOpen(!isOpen)}\n disabled={disabled}\n className={`${fieldBaseClasses} text-left flex items-center justify-between`}\n >\n <span className={selectedOption ? \"text-gray-900\" : \"text-gray-500\"}>\n {selectedOption ? (\n <span className=\"flex items-center gap-2\">\n {selectedOption.flag && <span>{selectedOption.flag}</span>}\n {selectedOption.label}\n </span>\n ) : (\n displayPlaceholder\n )}\n </span>\n <ChevronDownIcon\n className={`h-4 w-4 text-gray-400 transition-transform ${isOpen ? \"rotate-180\" : \"\"\n }`}\n />\n </button>\n )}\n\n {isOpen && !disabled && ReactDOM.createPortal(\n <div\n ref={dropdownRef}\n style={dropdownStyle}\n className=\"bg-white border border-gray-300 rounded-lg shadow-lg max-h-60 overflow-y-auto\"\n >\n <div className=\"py-1\">\n {filteredOptions.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n onMouseDown={(e) => {\n // Prevent input blur before click fires\n e.preventDefault();\n }}\n onClick={() => handleSelect(option.value)}\n className={`w-full text-left px-3 py-2 hover:bg-gray-100\n active:bg-gray-200 transition-colors text-base flex items-center gap-2\n ${option.value === value\n ? \"bg-gray-50 text-gray-900\"\n : \"text-gray-700\"\n }\n `}\n >\n {option.flag && <span className=\"text-lg\">{option.flag}</span>}\n {option.label}\n </button>\n ))}\n {filteredOptions.length === 0 && (\n <div className=\"px-3 py-2 text-sm text-gray-500\">\n {t(\"select_component.no_results\")}\n </div>\n )}\n </div>\n </div>,\n document.body,\n )}\n </div>\n );\n});\n"],"names":["_jsxs","_jsx"],"mappings":"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"}
1
+ {"version":3,"file":"SelectComponent.js","sources":["../../../../../src/components/ui/SelectComponent.tsx"],"sourcesContent":["import React, { useState, useRef, useEffect } from \"react\";\nimport ReactDOM from \"react-dom\";\nimport { ChevronDownIcon } from \"lucide-react\";\nimport { useI18n } from \"../../hooks/useI18n\";\n\ninterface SelectOption {\n value: string;\n label: string;\n flag?: string;\n}\n\ninterface SelectProps {\n options: SelectOption[];\n value: string;\n onValueChange: (value: string) => void;\n placeholder?: string;\n className?: string;\n disabled?: boolean;\n error?: boolean;\n allowCustomValue?: boolean;\n inputMode?: React.InputHTMLAttributes<HTMLInputElement>[\"inputMode\"];\n maxLength?: number;\n pattern?: string;\n /** Réduit le padding pour une utilisation dans des cellules de tableau */\n compact?: boolean;\n}\n\nexport const Select = React.forwardRef<HTMLInputElement, SelectProps>(({\n options,\n value,\n onValueChange,\n placeholder,\n className = \"\",\n disabled = false,\n error = false,\n allowCustomValue = false,\n inputMode,\n maxLength,\n pattern,\n compact = false,\n}, ref) => {\n const { t } = useI18n();\n const [isOpen, setIsOpen] = useState(false);\n const selectRef = useRef<HTMLDivElement>(null);\n const [inputValue, setInputValue] = useState<string>(value || \"\");\n const [isSearching, setIsSearching] = useState(false);\n const internalInputRef = useRef<HTMLInputElement>(null);\n const [dropdownStyle, setDropdownStyle] = useState<React.CSSProperties>({});\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // Combine refs\n React.useImperativeHandle(ref, () => internalInputRef.current as HTMLInputElement);\n\n const normalizeText = (text: string) =>\n (text || \"\")\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .toLowerCase();\n\n const matchesNumericValue = (optionValue: string, input: string) => {\n // Strict matching for length to avoid \"1\" matching \"01\" and triggering auto-advance\n if (optionValue.length !== input.length) return false;\n\n const numericOption = parseInt(optionValue, 10);\n const numericInput = parseInt(input, 10);\n if (Number.isNaN(numericOption) || Number.isNaN(numericInput)) {\n return false;\n }\n return numericOption === numericInput;\n };\n\n // Helper to remove emoji flags from search input\n const removeEmojis = (text: string) => {\n // Remove emoji flags (regional indicator symbols) - using surrogate pairs\n return text.replace(/[\\uD83C][\\uDDE6-\\uDDFF]/g, '').trim();\n };\n\n const displayPlaceholder =\n placeholder ?? t(\"select_component.placeholder\");\n\n // Close dropdown when clicking outside (trigger ou portail dropdown)\n useEffect(() => {\n const handleClickOutside = (event: MouseEvent) => {\n const target = event.target as Node;\n const insideTrigger = selectRef.current?.contains(target);\n const insideDropdown = dropdownRef.current?.contains(target);\n if (!insideTrigger && !insideDropdown) {\n setIsOpen(false);\n }\n };\n\n if (isOpen) {\n document.addEventListener(\"mousedown\", handleClickOutside);\n return () =>\n document.removeEventListener(\"mousedown\", handleClickOutside);\n }\n }, [isOpen]);\n\n const selectedOption = options.find((option) => option.value === value);\n\n useEffect(() => {\n if (!allowCustomValue) return;\n\n // Don't update input value if the input is currently focused\n // This prevents auto-formatting while typing (e.g. typing \"1\" becoming \"01\")\n if (document.activeElement === internalInputRef.current) return;\n\n if (!value) {\n setInputValue(\"\");\n return;\n }\n\n const optionMatch = options.find((option) => option.value === value);\n if (optionMatch) {\n // Include flag in the input value if it exists\n const displayValue = optionMatch.flag\n ? `${optionMatch.flag} ${optionMatch.label}`\n : optionMatch.label;\n setInputValue(displayValue);\n } else if (inputMode === \"numeric\") {\n // Pour les champs numériques, afficher la valeur brute\n setInputValue(value);\n }\n // Pour les autres cas, ne pas mettre à jour inputValue si pas de match\n // Cela permet de garder la recherche en cours\n }, [value, allowCustomValue, options, inputMode]);\n\n const handleSelect = (optionValue: string) => {\n onValueChange(optionValue);\n if (allowCustomValue) {\n const optionMatch = options.find(\n (option) => option.value === optionValue\n );\n if (optionMatch) {\n // Include flag in the input value if it exists\n const displayValue = optionMatch.flag\n ? `${optionMatch.flag} ${optionMatch.label}`\n : optionMatch.label;\n setInputValue(displayValue);\n } else {\n setInputValue(optionValue);\n }\n }\n setIsSearching(false);\n setIsOpen(false);\n };\n\n const handleInputChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n if (!allowCustomValue) return;\n\n const nextValue = event.target.value;\n // Remove emojis before normalizing for matching\n const cleanedValue = removeEmojis(nextValue);\n const normalizedNext = normalizeText(cleanedValue);\n setInputValue(nextValue);\n setIsSearching(true);\n\n const exactMatch = options.find(\n (option) =>\n (normalizeText(option.value) === normalizedNext && option.value.length === normalizedNext.length) ||\n (normalizeText(option.label) === normalizedNext && option.label.length === normalizedNext.length) ||\n matchesNumericValue(option.value, normalizedNext)\n );\n\n if (exactMatch) {\n onValueChange(exactMatch.value);\n } else if (inputMode === \"numeric\") {\n // Pour les champs numériques (date), on accepte les valeurs personnalisées\n onValueChange(nextValue);\n } else if (cleanedValue === \"\") {\n // If the user clears the input, clear the selection\n onValueChange(\"\");\n }\n // Pour les autres cas (pays, etc.), on ne met à jour que si match exact\n };\n\n\n\n const filteredOptions =\n allowCustomValue && isSearching && inputValue\n ? options.filter((option) => {\n // Remove emojis from input before searching\n const cleanedInput = removeEmojis(inputValue);\n const searchValue = normalizeText(cleanedInput);\n return (\n normalizeText(option.label).includes(searchValue) ||\n normalizeText(option.value).includes(searchValue) ||\n matchesNumericValue(option.value, searchValue)\n );\n })\n : options;\n\n // Calcule la position absolue du dropdown pour le portail\n useEffect(() => {\n if (isOpen && selectRef.current) {\n const rect = selectRef.current.getBoundingClientRect();\n setDropdownStyle({\n position: \"fixed\",\n top: rect.bottom + 4,\n left: rect.left,\n width: rect.width,\n zIndex: 9999,\n });\n }\n }, [isOpen]);\n\n const fieldBaseClasses = `w-full px-3 border rounded-lg text-base transition-colors\n focus:outline-none focus:ring-2 focus:ring-[#11E5C5] focus:border-transparent\n focus-within:outline-none focus-within:ring-2 focus-within:ring-[#11E5C5] focus-within:border-transparent\n ${compact ? \"py-2 text-sm\" : \"py-3 md:py-4\"}\n ${error\n ? \"border-red-500 bg-red-50\"\n : \"border-gray-300 hover:border-gray-400\"\n }\n ${disabled ? \"opacity-50 cursor-not-allowed\" : \"cursor-pointer\"}`;\n\n return (\n <div className={`relative ${className}`} ref={selectRef}>\n {allowCustomValue ? (\n <div\n className={fieldBaseClasses.replace(\n \"cursor-pointer\",\n allowCustomValue ? \"cursor-text\" : \"cursor-pointer\"\n )}\n onClick={() => {\n if (disabled) return;\n internalInputRef.current?.focus();\n }}\n >\n <div className=\"flex items-center gap-2 w-full\">\n <input\n type=\"text\"\n value={inputValue}\n onChange={handleInputChange}\n onFocus={() => {\n if (!disabled) {\n setIsOpen(true);\n setIsSearching(false);\n }\n }}\n onBlur={(e) => {\n // Close dropdown if focus moves outside the component AND its dropdown portal\n const isInsideSelect = selectRef.current?.contains(e.relatedTarget as Node);\n const isInsideDropdown = dropdownRef.current?.contains(e.relatedTarget as Node);\n\n if (!isInsideSelect && !isInsideDropdown) {\n setIsOpen(false);\n }\n\n // On blur, ensure the input value matches the selected value's label if possible\n if (value) {\n const optionMatch = options.find((option) => option.value === value);\n if (optionMatch) {\n // Include flag in the input value if it exists\n const displayValue = optionMatch.flag\n ? `${optionMatch.flag} ${optionMatch.label}`\n : optionMatch.label;\n setInputValue(displayValue);\n }\n }\n }}\n placeholder={displayPlaceholder}\n className=\"flex-1 bg-transparent outline-none text-gray-900 placeholder:text-gray-500\"\n disabled={disabled}\n inputMode={inputMode}\n maxLength={maxLength}\n pattern={pattern}\n ref={internalInputRef}\n />\n </div>\n </div>\n ) : (\n <button\n type=\"button\"\n onClick={() => !disabled && setIsOpen(!isOpen)}\n disabled={disabled}\n className={`${fieldBaseClasses} text-left flex items-center justify-between`}\n >\n <span className={selectedOption ? \"text-gray-900\" : \"text-gray-500\"}>\n {selectedOption ? (\n <span className=\"flex items-center gap-2\">\n {selectedOption.flag && <span>{selectedOption.flag}</span>}\n {selectedOption.label}\n </span>\n ) : (\n displayPlaceholder\n )}\n </span>\n <ChevronDownIcon\n className={`h-4 w-4 text-gray-400 transition-transform ${isOpen ? \"rotate-180\" : \"\"\n }`}\n />\n </button>\n )}\n\n {isOpen && !disabled && ReactDOM.createPortal(\n <div\n ref={dropdownRef}\n style={dropdownStyle}\n className=\"bg-white border border-gray-300 rounded-lg shadow-lg max-h-60 overflow-y-auto\"\n >\n <div className=\"py-1\">\n {filteredOptions.map((option) => (\n <button\n key={option.value}\n type=\"button\"\n onMouseDown={(e) => {\n // Prevent input blur before click fires\n e.preventDefault();\n }}\n onClick={() => handleSelect(option.value)}\n className={`w-full text-left px-3 py-2 hover:bg-gray-100\n active:bg-gray-200 transition-colors text-base flex items-center gap-2\n ${option.value === value\n ? \"bg-gray-50 text-gray-900\"\n : \"text-gray-700\"\n }\n `}\n >\n {option.flag && <span className=\"text-lg\">{option.flag}</span>}\n {option.label}\n </button>\n ))}\n {filteredOptions.length === 0 && (\n <div className=\"px-3 py-2 text-sm text-gray-500\">\n {t(\"select_component.no_results\")}\n </div>\n )}\n </div>\n </div>,\n document.body,\n )}\n </div>\n );\n});\n"],"names":["React","_jsxs","_jsx"],"mappings":"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"}
@@ -1,9 +1,11 @@
1
- import { __assign, __awaiter, __generator } from '../node_modules/tslib/tslib.es6.js';
1
+ import { __assign, __rest, __awaiter, __generator } from '../node_modules/tslib/tslib.es6.js';
2
2
  import { useMemo, useState, useRef, useEffect } from 'react';
3
3
  import { DEFAULT_FIELDS, FALLBACK_ADDRESS_SUGGESTIONS, GEOCODING_AUTOCOMPLETE_ENDPOINT } from '../constants/userInputForm.js';
4
4
  import { API_BASE_URL } from '../config/env.js';
5
5
  import { resolveInformationType, parseBirthDate, checkIsMajor } from '../utils/userInputForm.js';
6
- import { getListFieldMinRows, countNonEmptyListRows } from '../utils/listFieldUtils.js';
6
+ import { getListFieldMinRows, normalizeListColumns, countNonEmptyListRows } from '../utils/listFieldUtils.js';
7
+ import { cellErrorKey, isRegexMatch, isDateValid, isEmailValid } from '../utils/customFieldValidation.js';
8
+ import { DEFAULT_DATE_DISPLAY_FORMAT } from '../types/session.js';
7
9
  import { useI18n } from './useI18n.js';
8
10
 
9
11
  var useUserInputForm = function (_a) {
@@ -71,8 +73,9 @@ var useUserInputForm = function (_a) {
71
73
  return initial;
72
74
  }), customFormData = _d[0], setCustomFormData = _d[1];
73
75
  var _e = useState({}), customFormErrors = _e[0], setCustomFormErrors = _e[1];
74
- var _f = useState([]), addressSuggestions = _f[0], setAddressSuggestions = _f[1];
75
- var _g = useState(false), showSuggestions = _g[0], setShowSuggestions = _g[1];
76
+ var _f = useState({}), customFormCellErrors = _f[0], setCustomFormCellErrors = _f[1];
77
+ var _g = useState([]), addressSuggestions = _g[0], setAddressSuggestions = _g[1];
78
+ var _h = useState(false), showSuggestions = _h[0], setShowSuggestions = _h[1];
76
79
  var isFirstRender = useRef(true);
77
80
  var hideSuggestionTimeout = useRef(null);
78
81
  var addressRequestState = useRef({
@@ -366,15 +369,71 @@ var useUserInputForm = function (_a) {
366
369
  var validateCustomForm = function () {
367
370
  var _a;
368
371
  var errors = {};
372
+ var cellErrors = {};
369
373
  var hasError = false;
370
374
  (_a = node.customFields) === null || _a === void 0 ? void 0 : _a.forEach(function (field) {
375
+ var _a, _b;
371
376
  var value = customFormData[field.id];
372
377
  if (field.valueType === "list") {
373
378
  var rows = Array.isArray(value) ? value : [];
374
379
  var minRows = getListFieldMinRows(field);
380
+ var columns_1 = normalizeListColumns(field.listColumns);
381
+ var fieldCellErrors_1 = {};
382
+ var listFieldInvalid_1 = false;
375
383
  if (field.required && countNonEmptyListRows(rows) < minRows) {
376
384
  errors[field.id] = true;
377
385
  hasError = true;
386
+ listFieldInvalid_1 = true;
387
+ }
388
+ rows.forEach(function (row, rowIndex) {
389
+ var rowIsEmpty = columns_1.every(function (col) { var _a; return !String((_a = row === null || row === void 0 ? void 0 : row[col.label]) !== null && _a !== void 0 ? _a : "").trim(); });
390
+ if (rowIsEmpty && !field.required)
391
+ return;
392
+ columns_1.forEach(function (col) {
393
+ var _a, _b;
394
+ var cellValue = String((_a = row === null || row === void 0 ? void 0 : row[col.label]) !== null && _a !== void 0 ? _a : "").trim();
395
+ var key = cellErrorKey(rowIndex, col.label);
396
+ if (!cellValue) {
397
+ if (field.required && !rowIsEmpty) {
398
+ fieldCellErrors_1[key] = t("custom_form.required_field");
399
+ listFieldInvalid_1 = true;
400
+ }
401
+ return;
402
+ }
403
+ switch (col.type) {
404
+ case "email":
405
+ if (!isEmailValid(cellValue)) {
406
+ fieldCellErrors_1[key] = t("custom_form.invalid_email");
407
+ listFieldInvalid_1 = true;
408
+ }
409
+ break;
410
+ case "date": {
411
+ var fmt = (_b = col.dateFormat) !== null && _b !== void 0 ? _b : DEFAULT_DATE_DISPLAY_FORMAT;
412
+ if (!isDateValid(cellValue, fmt)) {
413
+ fieldCellErrors_1[key] = t("custom_form.invalid_date", {
414
+ format: fmt,
415
+ });
416
+ listFieldInvalid_1 = true;
417
+ }
418
+ break;
419
+ }
420
+ case "text":
421
+ if (col.regex && !isRegexMatch(cellValue, col.regex)) {
422
+ fieldCellErrors_1[key] =
423
+ col.regexErrorMessage ||
424
+ t("custom_form.invalid_format");
425
+ listFieldInvalid_1 = true;
426
+ }
427
+ break;
428
+ }
429
+ });
430
+ });
431
+ if (Object.keys(fieldCellErrors_1).length > 0) {
432
+ cellErrors[field.id] = fieldCellErrors_1;
433
+ }
434
+ if (listFieldInvalid_1) {
435
+ errors[field.id] = (_a = errors[field.id]) !== null && _a !== void 0 ? _a : true;
436
+ hasError = true;
378
437
  }
379
438
  return;
380
439
  }
@@ -393,35 +452,29 @@ var useUserInputForm = function (_a) {
393
452
  hasError = true;
394
453
  }
395
454
  break;
396
- case "date":
397
- // Date format: DD-MM-YYYY
398
- // For required dates, all parts must be filled
399
- if (field.required) {
400
- var dateParts = value.split("-");
401
- if (dateParts.length !== 3 ||
402
- !dateParts[0] ||
403
- !dateParts[1] ||
404
- !dateParts[2]) {
405
- errors[field.id] = true;
406
- hasError = true;
407
- break;
408
- }
409
- // Validate month and day ranges
410
- var day = parseInt(dateParts[0], 10);
411
- var month = parseInt(dateParts[1], 10);
412
- var year = parseInt(dateParts[2], 10);
413
- if (isNaN(day) ||
414
- isNaN(month) ||
415
- isNaN(year) ||
416
- month < 1 ||
417
- month > 12 ||
418
- day < 1 ||
419
- day > 31) {
420
- errors[field.id] = true;
421
- hasError = true;
422
- }
455
+ case "email":
456
+ if (!isEmailValid(String(value))) {
457
+ errors[field.id] = t("custom_form.invalid_email");
458
+ hasError = true;
459
+ }
460
+ break;
461
+ case "text":
462
+ if (field.regex && !isRegexMatch(String(value), field.regex)) {
463
+ errors[field.id] =
464
+ field.regexErrorMessage || t("custom_form.invalid_format");
465
+ hasError = true;
466
+ }
467
+ break;
468
+ case "date": {
469
+ var fmt = (_b = field.dateFormat) !== null && _b !== void 0 ? _b : DEFAULT_DATE_DISPLAY_FORMAT;
470
+ if (!isDateValid(String(value), fmt)) {
471
+ errors[field.id] = t("custom_form.invalid_date", {
472
+ format: fmt,
473
+ });
474
+ hasError = true;
423
475
  }
424
476
  break;
477
+ }
425
478
  case "address":
426
479
  // Validate address object if required
427
480
  if (field.required && typeof value === "object") {
@@ -439,6 +492,7 @@ var useUserInputForm = function (_a) {
439
492
  }
440
493
  });
441
494
  setCustomFormErrors(errors);
495
+ setCustomFormCellErrors(cellErrors);
442
496
  return !hasError;
443
497
  };
444
498
  var handleCustomFieldChange = function (fieldId, value) {
@@ -450,6 +504,12 @@ var useUserInputForm = function (_a) {
450
504
  var _a;
451
505
  return (__assign(__assign({}, prev), (_a = {}, _a[fieldId] = false, _a)));
452
506
  });
507
+ setCustomFormCellErrors(function (prev) {
508
+ if (!(fieldId in prev))
509
+ return prev;
510
+ var _a = prev, _b = fieldId; _a[_b]; var rest = __rest(_a, [typeof _b === "symbol" ? _b : _b + ""]);
511
+ return rest;
512
+ });
453
513
  };
454
514
  var goOnNextStep = function () {
455
515
  // Handle custom form validation and submission
@@ -523,6 +583,7 @@ var useUserInputForm = function (_a) {
523
583
  goOnPreviousStep: goOnPreviousStep,
524
584
  customFormData: customFormData,
525
585
  customFormErrors: customFormErrors,
586
+ customFormCellErrors: customFormCellErrors,
526
587
  handleCustomFieldChange: handleCustomFieldChange,
527
588
  };
528
589
  };