datakeen-session-react 1.1.140-rc.97 → 1.1.140-rc.99
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/DatakeenSession.js +7 -1
- package/dist/cjs/components/DatakeenSession.js.map +1 -1
- package/dist/cjs/components/session/EndFlow.js +3 -2
- package/dist/cjs/components/session/EndFlow.js.map +1 -1
- package/dist/cjs/components/session/MobileRedirect.js +4 -0
- package/dist/cjs/components/session/MobileRedirect.js.map +1 -1
- package/dist/cjs/components/session/PdfGeneration.js +25 -19
- package/dist/cjs/components/session/PdfGeneration.js.map +1 -1
- package/dist/cjs/components/session/UserInputForm/CustomFormFields.js +0 -10
- package/dist/cjs/components/session/UserInputForm/CustomFormFields.js.map +1 -1
- package/dist/cjs/components/session/UserInputForm.js +2 -2
- package/dist/cjs/components/session/UserInputForm.js.map +1 -1
- package/dist/cjs/components/signature-electronic/SignedDocumentPreview.js +12 -14
- package/dist/cjs/components/signature-electronic/SignedDocumentPreview.js.map +1 -1
- package/dist/cjs/components/template/ExternalVerificationNodeHandler.js +67 -4
- package/dist/cjs/components/template/ExternalVerificationNodeHandler.js.map +1 -1
- package/dist/cjs/hooks/useSession.js +3 -3
- package/dist/cjs/hooks/useSession.js.map +1 -1
- package/dist/cjs/hooks/useUserInputForm.js +13 -9
- package/dist/cjs/hooks/useUserInputForm.js.map +1 -1
- package/dist/cjs/i18n/en.json.js +4 -1
- package/dist/cjs/i18n/en.json.js.map +1 -1
- package/dist/cjs/i18n/fr.json.js +4 -1
- package/dist/cjs/i18n/fr.json.js.map +1 -1
- package/dist/cjs/services/api.js +5 -0
- package/dist/cjs/services/api.js.map +1 -1
- package/dist/cjs/services/auditTrailService.js +19 -9
- package/dist/cjs/services/auditTrailService.js.map +1 -1
- package/dist/cjs/services/integrationService.js +2 -0
- package/dist/cjs/services/integrationService.js.map +1 -1
- package/dist/cjs/services/sessionCredentials.js +24 -0
- package/dist/cjs/services/sessionCredentials.js.map +1 -0
- package/dist/cjs/types/session.js.map +1 -1
- package/dist/cjs/utils/customFieldIds.js +52 -0
- package/dist/cjs/utils/customFieldIds.js.map +1 -0
- package/dist/cjs/utils/jdiCodes.js +3 -1
- package/dist/cjs/utils/jdiCodes.js.map +1 -1
- package/dist/cjs/utils/navigation.js +21 -0
- package/dist/cjs/utils/navigation.js.map +1 -0
- package/dist/esm/components/DatakeenSession.js +8 -2
- package/dist/esm/components/DatakeenSession.js.map +1 -1
- package/dist/esm/components/session/EndFlow.js +3 -2
- package/dist/esm/components/session/EndFlow.js.map +1 -1
- package/dist/esm/components/session/MobileRedirect.js +4 -0
- package/dist/esm/components/session/MobileRedirect.js.map +1 -1
- package/dist/esm/components/session/PdfGeneration.js +25 -19
- package/dist/esm/components/session/PdfGeneration.js.map +1 -1
- package/dist/esm/components/session/UserInputForm/CustomFormFields.js +0 -10
- package/dist/esm/components/session/UserInputForm/CustomFormFields.js.map +1 -1
- package/dist/esm/components/session/UserInputForm.js +2 -2
- package/dist/esm/components/session/UserInputForm.js.map +1 -1
- package/dist/esm/components/signature-electronic/SignedDocumentPreview.js +12 -14
- package/dist/esm/components/signature-electronic/SignedDocumentPreview.js.map +1 -1
- package/dist/esm/components/template/ExternalVerificationNodeHandler.js +67 -4
- package/dist/esm/components/template/ExternalVerificationNodeHandler.js.map +1 -1
- package/dist/esm/hooks/useSession.js +3 -3
- package/dist/esm/hooks/useSession.js.map +1 -1
- package/dist/esm/hooks/useUserInputForm.js +13 -9
- package/dist/esm/hooks/useUserInputForm.js.map +1 -1
- package/dist/esm/i18n/en.json.js +4 -1
- package/dist/esm/i18n/en.json.js.map +1 -1
- package/dist/esm/i18n/fr.json.js +4 -1
- package/dist/esm/i18n/fr.json.js.map +1 -1
- package/dist/esm/services/api.js +5 -0
- package/dist/esm/services/api.js.map +1 -1
- package/dist/esm/services/auditTrailService.js +19 -9
- package/dist/esm/services/auditTrailService.js.map +1 -1
- package/dist/esm/services/integrationService.js +2 -0
- package/dist/esm/services/integrationService.js.map +1 -1
- package/dist/esm/services/sessionCredentials.js +20 -0
- package/dist/esm/services/sessionCredentials.js.map +1 -0
- package/dist/esm/types/session.js.map +1 -1
- package/dist/esm/utils/customFieldIds.js +50 -0
- package/dist/esm/utils/customFieldIds.js.map +1 -0
- package/dist/esm/utils/jdiCodes.js +3 -1
- package/dist/esm/utils/jdiCodes.js.map +1 -1
- package/dist/esm/utils/navigation.js +19 -0
- package/dist/esm/utils/navigation.js.map +1 -0
- package/dist/types/components/DatakeenSession.d.ts +1 -1
- package/dist/types/hooks/useSession.d.ts +1 -1
- package/dist/types/types/session.d.ts +3 -0
- package/docs/SESSION_TOKEN_MIGRATION.md +52 -0
- package/package.json +1 -1
|
@@ -13,51 +13,57 @@ var PdfGeneration = function (_a) {
|
|
|
13
13
|
var _d = useState(null), generationError = _d[0], setGenerationError = _d[1];
|
|
14
14
|
var baseURL = (apiService.getRawClient().defaults.baseURL || "").replace(/\/+$/, "");
|
|
15
15
|
var generatedPdfPath = "/session/sdk/".concat(sessionId, "/generated-pdf/").concat(node.id, ".pdf");
|
|
16
|
-
var generatedPdfUrl =
|
|
17
|
-
|
|
18
|
-
: generatedPdfPath;
|
|
19
|
-
var downloadPdfUrl = "".concat(generatedPdfUrl, "?download=1");
|
|
16
|
+
var _e = useState(''), generatedPdfUrl = _e[0], setGeneratedPdfUrl = _e[1];
|
|
17
|
+
var downloadPdfUrl = generatedPdfUrl;
|
|
20
18
|
var isDevEnv = /localhost|app\.dev\.datakeen\.co/.test(baseURL);
|
|
21
19
|
useEffect(function () {
|
|
22
20
|
var cancelled = false;
|
|
21
|
+
var objectUrl;
|
|
23
22
|
var generate = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
24
|
-
var error_1;
|
|
23
|
+
var response, error_1;
|
|
25
24
|
var _a;
|
|
26
25
|
return __generator(this, function (_b) {
|
|
27
26
|
switch (_b.label) {
|
|
28
27
|
case 0:
|
|
29
|
-
_b.trys.push([0,
|
|
28
|
+
_b.trys.push([0, 5, , 6]);
|
|
30
29
|
return [4 /*yield*/, apiService.post("/session/sdk/".concat(sessionId, "/generate-pdf"), {
|
|
31
30
|
nodeId: node.id,
|
|
32
31
|
userInput: __assign(__assign({}, userInput), { customFormData: (_a = userInput.customFormData) !== null && _a !== void 0 ? _a : {} }),
|
|
33
32
|
}, { timeout: 60000 })];
|
|
34
33
|
case 1:
|
|
35
34
|
_b.sent();
|
|
36
|
-
if (
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
35
|
+
if (!!cancelled) return [3 /*break*/, 4];
|
|
36
|
+
setGenerationError(null);
|
|
37
|
+
if (!!isDevEnv) return [3 /*break*/, 2];
|
|
38
|
+
stepObject.goToNextStep(node.id, session.template);
|
|
39
|
+
return [3 /*break*/, 4];
|
|
40
|
+
case 2: return [4 /*yield*/, apiService.get(generatedPdfPath, { responseType: 'blob' })];
|
|
41
|
+
case 3:
|
|
42
|
+
response = _b.sent();
|
|
43
|
+
if (cancelled)
|
|
44
|
+
return [2 /*return*/];
|
|
45
|
+
objectUrl = URL.createObjectURL(response.data);
|
|
46
|
+
setGeneratedPdfUrl(objectUrl);
|
|
47
|
+
setStatus("ready");
|
|
48
|
+
_b.label = 4;
|
|
49
|
+
case 4: return [3 /*break*/, 6];
|
|
50
|
+
case 5:
|
|
47
51
|
error_1 = _b.sent();
|
|
48
52
|
if (!cancelled) {
|
|
49
53
|
setGenerationError((error_1 === null || error_1 === void 0 ? void 0 : error_1.message) ||
|
|
50
54
|
t("pdf_generation.error_unknown", "Erreur inconnue pendant la génération du PDF."));
|
|
51
55
|
setStatus("error");
|
|
52
56
|
}
|
|
53
|
-
return [3 /*break*/,
|
|
54
|
-
case
|
|
57
|
+
return [3 /*break*/, 6];
|
|
58
|
+
case 6: return [2 /*return*/];
|
|
55
59
|
}
|
|
56
60
|
});
|
|
57
61
|
}); };
|
|
58
62
|
generate();
|
|
59
63
|
return function () {
|
|
60
64
|
cancelled = true;
|
|
65
|
+
if (objectUrl)
|
|
66
|
+
URL.revokeObjectURL(objectUrl);
|
|
61
67
|
};
|
|
62
68
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
63
69
|
}, [runId]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PdfGeneration.js","sources":["../../../../../src/components/session/PdfGeneration.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport LoadingState from \"../states/LoadingState\";\nimport { apiService } from \"../../services/api\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport type { SessionData, stepObject } from \"../../types/session\";\nimport type { UserInput } from \"../../types/userInput\";\n\ninterface PdfGenerationProps {\n node: {\n id: string;\n type: string;\n pageTitle?: string;\n pageDescription?: string;\n };\n session: SessionData;\n sessionId: string;\n stepObject: stepObject;\n userInput: UserInput;\n}\n\nconst PdfGeneration: React.FC<PdfGenerationProps> = ({\n node,\n session,\n sessionId,\n stepObject,\n userInput,\n}) => {\n const { t } = useI18n();\n const [status, setStatus] = useState<\"loading\" | \"ready\" | \"error\">(\n \"loading\",\n );\n const [runId, setRunId] = useState(0);\n const [generationError, setGenerationError] = useState<string | null>(null);\n\n const baseURL = (apiService.getRawClient().defaults.baseURL || \"\").replace(\n /\\/+$/,\n \"\",\n );\n const generatedPdfPath = `/session/sdk/${sessionId}/generated-pdf/${node.id}.pdf`;\n const generatedPdfUrl = baseURL\n ? `${baseURL}${generatedPdfPath}`\n : generatedPdfPath;\n const downloadPdfUrl = `${generatedPdfUrl}?download=1`;\n\n const isDevEnv = /localhost|app\\.dev\\.datakeen\\.co/.test(baseURL);\n\n useEffect(() => {\n let cancelled = false;\n\n const generate = async () => {\n try {\n await apiService.post(\n `/session/sdk/${sessionId}/generate-pdf`,\n {\n nodeId: node.id,\n userInput: {\n ...userInput,\n customFormData: (userInput as any).customFormData ?? {},\n },\n },\n { timeout: 60_000 }, // PDF generation can take up to 60s\n );\n\n if (!cancelled) {\n setGenerationError(null);\n if (!isDevEnv) {\n stepObject.goToNextStep(node.id, session.template);\n } else {\n setStatus(\"ready\");\n }\n }\n } catch (error: any) {\n if (!cancelled) {\n setGenerationError(\n error?.message ||\n t(\n \"pdf_generation.error_unknown\",\n \"Erreur inconnue pendant la génération du PDF.\",\n ),\n );\n setStatus(\"error\");\n }\n }\n };\n\n generate();\n\n return () => {\n cancelled = true;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runId]);\n\n if (status === \"loading\") {\n return (\n <LoadingState\n message={\n node.pageTitle ||\n t(\"pdf_generation.loading_title\", \"Génération du document\")\n }\n subtitle={\n node.pageDescription ||\n t(\n \"pdf_generation.loading_subtitle\",\n \"Votre document est en cours de préparation...\",\n )\n }\n />\n );\n }\n\n if (status === \"ready\") {\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-6 text-center gap-4\">\n <div className=\"text-green-500 text-4xl\">✅</div>\n <h2 className=\"text-xl font-bold text-gray-900\">\n {t(\"pdf_generation.ready_title\", \"Document généré\")}\n </h2>\n <p className=\"text-gray-600 max-w-md\">\n {t(\n \"pdf_generation.ready_description\",\n \"Vous pouvez prévisualiser ou télécharger le PDF avant de continuer.\",\n )}\n </p>\n <div className=\"flex flex-wrap justify-center gap-3 mt-2\">\n <a\n href={generatedPdfUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"px-4 py-2 border border-gray-300 rounded text-gray-700 hover:bg-gray-50 transition-colors\"\n >\n {t(\"pdf_generation.preview\", \"Aperçu\")}\n </a>\n <a\n href={downloadPdfUrl}\n className=\"px-4 py-2 border border-gray-300 rounded text-gray-700 hover:bg-gray-50 transition-colors\"\n >\n {t(\"pdf_generation.download\", \"Télécharger\")}\n </a>\n <button\n type=\"button\"\n className=\"px-4 py-2 bg-primary text-white rounded hover:opacity-90 transition-opacity\"\n onClick={() => stepObject.goToNextStep(node.id, session.template)}\n >\n {t(\"template.buttons.continue\", \"Continuer\")}\n </button>\n </div>\n </div>\n );\n }\n\n // Error state\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-6 text-center gap-4\">\n <div className=\"text-red-500 text-4xl\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600\">\n {t(\"pdf_generation.error_title\", \"Erreur lors de la génération\")}\n </h2>\n <p className=\"text-gray-600 max-w-sm\">\n {t(\n \"pdf_generation.error_description\",\n \"Une erreur est survenue lors de la génération de votre document. Veuillez réessayer.\",\n )}\n </p>\n {generationError && (\n <p className=\"max-w-md text-xs text-red-500\">{generationError}</p>\n )}\n <div className=\"flex gap-3 mt-2\">\n {stepObject.canGoBack && (\n <button\n type=\"button\"\n className=\"px-4 py-2 border border-gray-300 rounded text-gray-700 hover:bg-gray-50 transition-colors\"\n onClick={() => stepObject.goBack()}\n >\n {t(\"template.buttons.back\", \"Retour\")}\n </button>\n )}\n <button\n type=\"button\"\n className=\"px-4 py-2 bg-primary text-white rounded hover:opacity-90 transition-opacity\"\n onClick={() => {\n setGenerationError(null);\n setStatus(\"loading\");\n setRunId((value) => value + 1);\n }}\n >\n {t(\"pdf_generation.retry\", \"Réessayer\")}\n </button>\n </div>\n </div>\n );\n};\n\nexport default PdfGeneration;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PdfGeneration.js","sources":["../../../../../src/components/session/PdfGeneration.tsx"],"sourcesContent":["import React, { useEffect, useState } from \"react\";\nimport LoadingState from \"../states/LoadingState\";\nimport { apiService } from \"../../services/api\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport type { SessionData, stepObject } from \"../../types/session\";\nimport type { UserInput } from \"../../types/userInput\";\n\ninterface PdfGenerationProps {\n node: {\n id: string;\n type: string;\n pageTitle?: string;\n pageDescription?: string;\n };\n session: SessionData;\n sessionId: string;\n stepObject: stepObject;\n userInput: UserInput;\n}\n\nconst PdfGeneration: React.FC<PdfGenerationProps> = ({\n node,\n session,\n sessionId,\n stepObject,\n userInput,\n}) => {\n const { t } = useI18n();\n const [status, setStatus] = useState<\"loading\" | \"ready\" | \"error\">(\n \"loading\",\n );\n const [runId, setRunId] = useState(0);\n const [generationError, setGenerationError] = useState<string | null>(null);\n\n const baseURL = (apiService.getRawClient().defaults.baseURL || \"\").replace(\n /\\/+$/,\n \"\",\n );\n const generatedPdfPath = `/session/sdk/${sessionId}/generated-pdf/${node.id}.pdf`;\n const [generatedPdfUrl, setGeneratedPdfUrl] = useState('');\n const downloadPdfUrl = generatedPdfUrl;\n\n const isDevEnv = /localhost|app\\.dev\\.datakeen\\.co/.test(baseURL);\n\n useEffect(() => {\n let cancelled = false;\n let objectUrl: string | undefined;\n\n const generate = async () => {\n try {\n await apiService.post(\n `/session/sdk/${sessionId}/generate-pdf`,\n {\n nodeId: node.id,\n userInput: {\n ...userInput,\n customFormData: (userInput as any).customFormData ?? {},\n },\n },\n { timeout: 60_000 }, // PDF generation can take up to 60s\n );\n\n if (!cancelled) {\n setGenerationError(null);\n if (!isDevEnv) {\n stepObject.goToNextStep(node.id, session.template);\n } else {\n const response = await apiService.get(generatedPdfPath, { responseType: 'blob' });\n if (cancelled) return;\n objectUrl = URL.createObjectURL(response.data);\n setGeneratedPdfUrl(objectUrl);\n setStatus(\"ready\");\n }\n }\n } catch (error: any) {\n if (!cancelled) {\n setGenerationError(\n error?.message ||\n t(\n \"pdf_generation.error_unknown\",\n \"Erreur inconnue pendant la génération du PDF.\",\n ),\n );\n setStatus(\"error\");\n }\n }\n };\n\n generate();\n\n return () => {\n cancelled = true;\n if (objectUrl) URL.revokeObjectURL(objectUrl);\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [runId]);\n\n if (status === \"loading\") {\n return (\n <LoadingState\n message={\n node.pageTitle ||\n t(\"pdf_generation.loading_title\", \"Génération du document\")\n }\n subtitle={\n node.pageDescription ||\n t(\n \"pdf_generation.loading_subtitle\",\n \"Votre document est en cours de préparation...\",\n )\n }\n />\n );\n }\n\n if (status === \"ready\") {\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-6 text-center gap-4\">\n <div className=\"text-green-500 text-4xl\">✅</div>\n <h2 className=\"text-xl font-bold text-gray-900\">\n {t(\"pdf_generation.ready_title\", \"Document généré\")}\n </h2>\n <p className=\"text-gray-600 max-w-md\">\n {t(\n \"pdf_generation.ready_description\",\n \"Vous pouvez prévisualiser ou télécharger le PDF avant de continuer.\",\n )}\n </p>\n <div className=\"flex flex-wrap justify-center gap-3 mt-2\">\n <a\n href={generatedPdfUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"px-4 py-2 border border-gray-300 rounded text-gray-700 hover:bg-gray-50 transition-colors\"\n >\n {t(\"pdf_generation.preview\", \"Aperçu\")}\n </a>\n <a\n href={downloadPdfUrl}\n className=\"px-4 py-2 border border-gray-300 rounded text-gray-700 hover:bg-gray-50 transition-colors\"\n >\n {t(\"pdf_generation.download\", \"Télécharger\")}\n </a>\n <button\n type=\"button\"\n className=\"px-4 py-2 bg-primary text-white rounded hover:opacity-90 transition-opacity\"\n onClick={() => stepObject.goToNextStep(node.id, session.template)}\n >\n {t(\"template.buttons.continue\", \"Continuer\")}\n </button>\n </div>\n </div>\n );\n }\n\n // Error state\n return (\n <div className=\"flex flex-col items-center justify-center h-full p-6 text-center gap-4\">\n <div className=\"text-red-500 text-4xl\">⚠️</div>\n <h2 className=\"text-xl font-bold text-red-600\">\n {t(\"pdf_generation.error_title\", \"Erreur lors de la génération\")}\n </h2>\n <p className=\"text-gray-600 max-w-sm\">\n {t(\n \"pdf_generation.error_description\",\n \"Une erreur est survenue lors de la génération de votre document. Veuillez réessayer.\",\n )}\n </p>\n {generationError && (\n <p className=\"max-w-md text-xs text-red-500\">{generationError}</p>\n )}\n <div className=\"flex gap-3 mt-2\">\n {stepObject.canGoBack && (\n <button\n type=\"button\"\n className=\"px-4 py-2 border border-gray-300 rounded text-gray-700 hover:bg-gray-50 transition-colors\"\n onClick={() => stepObject.goBack()}\n >\n {t(\"template.buttons.back\", \"Retour\")}\n </button>\n )}\n <button\n type=\"button\"\n className=\"px-4 py-2 bg-primary text-white rounded hover:opacity-90 transition-opacity\"\n onClick={() => {\n setGenerationError(null);\n setStatus(\"loading\");\n setRunId((value) => value + 1);\n }}\n >\n {t(\"pdf_generation.retry\", \"Réessayer\")}\n </button>\n </div>\n </div>\n );\n};\n\nexport default PdfGeneration;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
@@ -32,16 +32,6 @@ var ListCell = function (_a) {
|
|
|
32
32
|
var CustomFormFields = function (_a) {
|
|
33
33
|
var customFields = _a.customFields, formData = _a.formData, errors = _a.errors, _b = _a.cellErrors, cellErrors = _b === void 0 ? {} : _b, onFieldChange = _a.onFieldChange, _c = _a.addressSuggestions, addressSuggestions = _c === void 0 ? [] : _c, _d = _a.showSuggestions, showSuggestions = _d === void 0 ? false : _d, onAddressChange = _a.onAddressChange, onAddressFocus = _a.onAddressFocus, onAddressBlur = _a.onAddressBlur, onApplySuggestion = _a.onApplySuggestion;
|
|
34
34
|
var _e = useI18n(), t = _e.t, currentLanguage = _e.currentLanguage;
|
|
35
|
-
console.log("🎨 [CustomFormFields] Rendering with:", {
|
|
36
|
-
fieldsCount: customFields.length,
|
|
37
|
-
fields: customFields.map(function (f) { return ({
|
|
38
|
-
id: f.id,
|
|
39
|
-
label: f.label,
|
|
40
|
-
type: f.valueType,
|
|
41
|
-
}); }),
|
|
42
|
-
formData: formData,
|
|
43
|
-
errors: errors,
|
|
44
|
-
});
|
|
45
35
|
var renderField = function (field) {
|
|
46
36
|
var _a, _b;
|
|
47
37
|
var hasError = Boolean(errors[field.id]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomFormFields.js","sources":["../../../../../../src/components/session/UserInputForm/CustomFormFields.tsx"],"sourcesContent":["import { Fragment, useRef } from \"react\";\nimport * as Label from \"@radix-ui/react-label\";\nimport clsx from \"clsx\";\nimport { Select } from \"../../ui/SelectComponent\";\nimport type { CustomField, ListColumn } from \"../../../types/session\";\nimport { useI18n } from \"../../../hooks/useI18n\";\nimport AddressFields from \"./AddressFields\";\nimport type { AddressSuggestion } from \"../../../types/userInputForm\";\nimport {\n createEmptyListRow,\n ensureMinimumListRows,\n getListFieldMinRows,\n normalizeListColumns,\n} from \"../../../utils/listFieldUtils\";\nimport { cellErrorKey } from \"../../../utils/customFieldValidation\";\nimport { DatePickerField } from \"./DatePickerField\";\n\ntype CellErrorValue = string | boolean;\n\n/**\n * Sous-composant dédié au rendu d'une cellule du tableau dynamique.\n * Nécessaire pour que les hooks internes à Select soient toujours appelés\n * de façon stable (règle des hooks React).\n */\nconst ListCell = ({\n col,\n value,\n hasError,\n cellClasses,\n onChange,\n language,\n}: {\n col: ListColumn;\n value: string;\n hasError: boolean;\n cellClasses: string;\n onChange: (val: string) => void;\n language: string;\n}) => {\n if (col.type === \"enum\") {\n return (\n <Select\n options={(col.options ?? []).map((opt) => ({ value: opt, label: opt }))}\n value={value}\n onValueChange={onChange}\n placeholder={col.placeholder || col.label}\n error={hasError}\n compact\n />\n );\n }\n if (col.type === \"email\") {\n return (\n <input\n type=\"email\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={col.placeholder || col.label}\n className={cellClasses}\n autoComplete=\"off\"\n inputMode=\"email\"\n />\n );\n }\n if (col.type === \"date\") {\n return (\n <DatePickerField\n value={value}\n dateFormat={col.dateFormat ?? \"dd/mm/yyyy\"}\n placeholder={col.placeholder}\n hasError={hasError}\n language={language}\n onChange={onChange}\n className={cellClasses}\n />\n );\n }\n return (\n <input\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={col.placeholder || col.label}\n className={cellClasses}\n autoComplete=\"off\"\n />\n );\n};\n\ninterface CustomFormFieldsProps {\n customFields: CustomField[];\n formData: Record<string, any>;\n errors: Record<string, CellErrorValue>;\n cellErrors?: Record<string, Record<string, CellErrorValue>>;\n onFieldChange: (fieldId: string, value: any) => void;\n // Address autocomplete props (for address field type)\n addressSuggestions?: AddressSuggestion[];\n showSuggestions?: boolean;\n onAddressChange?: (fieldId: string, value: string) => void;\n onAddressFocus?: (fieldId: string) => void;\n onAddressBlur?: (fieldId: string) => void;\n onApplySuggestion?: (fieldId: string, suggestion: AddressSuggestion) => void;\n}\n\nconst CustomFormFields = ({\n customFields,\n formData,\n errors,\n cellErrors = {},\n onFieldChange,\n addressSuggestions = [],\n showSuggestions = false,\n onAddressChange,\n onAddressFocus,\n onAddressBlur,\n onApplySuggestion,\n}: CustomFormFieldsProps) => {\n const { t, currentLanguage } = useI18n();\n\n console.log(\"🎨 [CustomFormFields] Rendering with:\", {\n fieldsCount: customFields.length,\n fields: customFields.map((f) => ({\n id: f.id,\n label: f.label,\n type: f.valueType,\n })),\n formData,\n errors,\n });\n\n const renderField = (field: CustomField) => {\n const hasError = Boolean(errors[field.id]);\n const value = formData[field.id];\n\n // Classes communes (EXACTEMENT comme IdentityFields/ContactFields)\n const inputClasses = clsx(\n \"w-full px-3 py-3 md:py-4 border rounded-lg text-base transition-colors focus:outline-none focus:ring-2 focus:ring-[#11E5C5] focus:border-transparent\",\n hasError\n ? \"border-red-500 bg-red-50\"\n : \"border-gray-300 hover:border-gray-400\",\n );\n\n switch (field.valueType) {\n case \"text\":\n return (\n <input\n id={field.id}\n type=\"text\"\n value={value || \"\"}\n onChange={(e) => onFieldChange(field.id, e.target.value)}\n placeholder={field.placeholder}\n className={inputClasses}\n autoComplete=\"off\"\n />\n );\n\n case \"number\":\n return (\n <input\n id={field.id}\n type=\"number\"\n inputMode=\"numeric\"\n value={value || \"\"}\n onChange={(e) => onFieldChange(field.id, e.target.value)}\n placeholder={field.placeholder}\n className={inputClasses}\n />\n );\n\n case \"date\":\n return (\n <DatePickerField\n id={field.id}\n value={value || \"\"}\n dateFormat={field.dateFormat ?? \"dd/mm/yyyy\"}\n placeholder={field.placeholder}\n hasError={hasError}\n language={currentLanguage}\n onChange={(v) => onFieldChange(field.id, v)}\n className={inputClasses}\n />\n );\n\n case \"boolean\":\n return (\n <div className=\"flex items-center gap-2\">\n <input\n id={field.id}\n type=\"checkbox\"\n checked={value || false}\n onChange={(e) => onFieldChange(field.id, e.target.checked)}\n className=\"h-4 w-4 text-[#11E5C5] border-gray-300 rounded focus:ring-[#11E5C5]\"\n />\n {field.description && (\n <span className=\"text-sm text-gray-600\">{field.description}</span>\n )}\n </div>\n );\n\n case \"enum\":\n return (\n <Select\n options={(field.enumOptions || []).map((opt) => ({\n value: opt,\n label: opt,\n }))}\n value={value || \"\"}\n onValueChange={(val) => onFieldChange(field.id, val)}\n placeholder={field.placeholder || t(\"custom_form.select_option\")}\n error={hasError}\n />\n );\n\n case \"email\":\n return (\n <input\n id={field.id}\n type=\"email\"\n value={value || \"\"}\n onChange={(e) => onFieldChange(field.id, e.target.value)}\n placeholder={field.placeholder}\n className={inputClasses}\n autoComplete=\"off\"\n inputMode=\"email\"\n />\n );\n\n case \"address\":\n // For address, use the existing AddressFields component\n const addressValue = value || {};\n const addressForm = {\n lastName: \"\",\n firstName: \"\",\n birthDate: \"\",\n day: \"\",\n month: \"\",\n year: \"\",\n email: \"\",\n phoneNumber: \"\",\n sms: \"\",\n addressLine1: addressValue.addressLine1 || \"\",\n addressLine2: addressValue.addressLine2 || \"\",\n postalCode: addressValue.postalCode || \"\",\n city: addressValue.city || \"\",\n countryCode: addressValue.countryCode || \"\",\n nationality: \"\",\n companyName: \"\",\n siret: \"\",\n tva: \"\",\n };\n\n return (\n <AddressFields\n form={addressForm}\n errors={{\n addressLine1: hasError,\n addressLine2: false,\n postalCode: hasError,\n city: hasError,\n country: hasError,\n }}\n requestedFields={new Set([\"adresse\"])}\n onFieldChange={(key, val) => {\n const updatedAddress = {\n ...addressValue,\n [key]: val,\n };\n onFieldChange(field.id, updatedAddress);\n }}\n addressSuggestions={addressSuggestions}\n showSuggestions={showSuggestions}\n onAddressChange={(val) => {\n const updatedAddress = {\n ...addressValue,\n addressLine1: val,\n };\n onFieldChange(field.id, updatedAddress);\n onAddressChange?.(field.id, val);\n }}\n onAddressFocus={() => onAddressFocus?.(field.id)}\n onAddressBlur={() => onAddressBlur?.(field.id)}\n onApplySuggestion={(suggestion) => {\n const updatedAddress = {\n addressLine1: suggestion.label || \"\",\n addressLine2: addressValue.addressLine2 || \"\",\n postalCode: suggestion.postalCode || \"\",\n city: suggestion.city || \"\",\n countryCode: suggestion.countryCode || \"\",\n };\n onFieldChange(field.id, updatedAddress);\n onApplySuggestion?.(field.id, suggestion);\n }}\n />\n );\n\n case \"list\": {\n const persistedRows: Record<string, string>[] = Array.isArray(value)\n ? value\n : [];\n const columns: ListColumn[] = normalizeListColumns(field.listColumns);\n const minRows = getListFieldMinRows(field);\n const rows = ensureMinimumListRows(persistedRows, columns, minRows);\n const gridTemplateColumns = `repeat(${columns.length}, minmax(180px, 1fr)) 32px`;\n const gridMinWidth = `${columns.length * 180 + (columns.length - 1) * 8 + 32}px`;\n const fieldCellErrors = cellErrors[field.id] ?? {};\n\n if (columns.length === 0) {\n return (\n <p className=\"text-sm text-red-600\">\n {t(\n \"custom_form.list_missing_columns\",\n \"Ce tableau n'a pas de colonnes configurées.\",\n )}\n </p>\n );\n }\n\n const handleRowChange = (\n rowIndex: number,\n colName: string,\n colValue: string,\n ) => {\n const updated = [...rows];\n updated[rowIndex] = { ...updated[rowIndex], [colName]: colValue };\n onFieldChange(field.id, updated);\n };\n\n const handleAddRow = () => {\n const emptyRow = createEmptyListRow(columns);\n onFieldChange(field.id, [...rows, emptyRow]);\n };\n\n const handleRemoveRow = (rowIndex: number) => {\n if (rows.length <= minRows) {\n return;\n }\n\n onFieldChange(\n field.id,\n rows.filter((_, i) => i !== rowIndex),\n );\n };\n\n const cellClasses = clsx(\n \"w-full px-2 py-2 border rounded-lg text-sm transition-colors focus:outline-none focus:ring-2 focus:ring-[#11E5C5] focus:border-transparent\",\n hasError\n ? \"border-red-500 bg-red-50\"\n : \"border-gray-300 hover:border-gray-400\",\n );\n\n return (\n <div className=\"space-y-3 overflow-x-auto\">\n {columns.length > 0 && (\n <div\n className=\"grid gap-2 items-center w-full\"\n style={{\n gridTemplateColumns,\n minWidth: gridMinWidth,\n }}\n >\n {columns.map((col) => (\n <span\n key={col.label}\n className=\"text-xs font-semibold text-gray-600 uppercase tracking-wide truncate\"\n >\n {col.label}\n </span>\n ))}\n <span />\n </div>\n )}\n\n {rows.map((row, rowIndex) => (\n <div\n key={rowIndex}\n className=\"grid gap-2 items-start w-full\"\n style={{\n gridTemplateColumns,\n minWidth: gridMinWidth,\n }}\n >\n {columns.map((col) => {\n const cellErr =\n fieldCellErrors[cellErrorKey(rowIndex, col.label)];\n const cellHasError = Boolean(cellErr);\n const cellInputClasses = clsx(\n \"w-full px-2 py-2 border rounded-lg text-sm transition-colors focus:outline-none focus:ring-2 focus:ring-[#11E5C5] focus:border-transparent\",\n cellHasError\n ? \"border-red-500 bg-red-50\"\n : \"border-gray-300 hover:border-gray-400\",\n );\n return (\n <div\n key={col.label}\n className=\"flex flex-col gap-1 min-w-0\"\n >\n <ListCell\n col={col}\n value={row[col.label] || \"\"}\n hasError={cellHasError || hasError}\n cellClasses={cellInputClasses}\n onChange={(val) =>\n handleRowChange(rowIndex, col.label, val)\n }\n language={currentLanguage}\n />\n {typeof cellErr === \"string\" && (\n <span className=\"text-xs text-red-600\">\n {cellErr}\n </span>\n )}\n </div>\n );\n })}\n <button\n type=\"button\"\n onClick={() => handleRemoveRow(rowIndex)}\n className={clsx(\n \"flex items-center justify-center w-8 h-8 rounded-full transition-colors\",\n rows.length <= minRows\n ? \"text-gray-300 cursor-not-allowed\"\n : \"text-gray-400 hover:text-red-500 hover:bg-red-50\",\n )}\n aria-label={t(\"custom_form.remove_row\", \"Supprimer la ligne\")}\n disabled={rows.length <= minRows}\n >\n ✕\n </button>\n </div>\n ))}\n\n <button\n type=\"button\"\n onClick={handleAddRow}\n className=\"flex items-center gap-2 text-sm text-[#11E5C5] hover:underline font-medium\"\n >\n + {t(\"custom_form.add_row\", \"Ajouter une ligne\")}\n </button>\n </div>\n );\n }\n\n default:\n return null;\n }\n };\n\n // Un champ est masqué quand il est verrouillé depuis l'API :\n // - hard lock (lockedFromApi sans editableIfMissing) → toujours masqué ;\n // - soft lock (editableIfMissing) → masqué uniquement si l'API a fourni une\n // valeur ; sinon le champ redevient éditable par l'utilisateur final.\n const isValuePresent = (value: unknown): boolean => {\n if (value === null || value === undefined) return false;\n if (typeof value === \"string\") return value.trim().length > 0;\n if (Array.isArray(value)) return value.length > 0;\n return true;\n };\n\n // La décision de visibilité d'un soft lock se fige à l'OUVERTURE du nœud,\n // pas à chaque frappe : on capture une seule fois (au mount, via ref) les\n // soft locks dont l'API n'avait fourni AUCUNE valeur. Ceux-là restent\n // éditables ensuite, même quand l'utilisateur commence à taper (sinon le\n // champ se masquerait dès le 1er caractère puisque formData deviendrait\n // non vide). Le composant est remonté par nœud (key={node.id}), donc le\n // snapshot est bien réinitialisé à chaque entrée de nœud.\n const editableSoftLocksRef = useRef<Set<string> | null>(null);\n if (editableSoftLocksRef.current === null) {\n const ids = new Set<string>();\n for (const f of customFields) {\n if (f.lockedFromApi && f.editableIfMissing && !isValuePresent(formData[f.id])) {\n ids.add(f.id);\n }\n }\n editableSoftLocksRef.current = ids;\n }\n const editableSoftLocks = editableSoftLocksRef.current;\n\n const isLockedHidden = (f: CustomField): boolean => {\n if (!f.lockedFromApi) return false;\n if (!f.editableIfMissing) return true;\n // soft lock : visible seulement s'il était vide à l'ouverture du nœud\n return !editableSoftLocks.has(f.id);\n };\n\n const visibleFields = customFields.filter((f) => !isLockedHidden(f));\n\n return (\n <Fragment>\n {visibleFields.map((field) => (\n <div key={field.id} className=\"space-y-2\">\n <Label.Root\n htmlFor={field.id}\n className=\"block text-sm md:text-base font-semibold text-gray-900\"\n >\n {field.label}\n {field.required && <span className=\"text-red-500 ml-1\">*</span>}\n </Label.Root>\n\n {field.description && field.valueType !== \"boolean\" && (\n <p className=\"text-xs text-gray-500 -mt-1\">{field.description}</p>\n )}\n\n {renderField(field)}\n\n {(() => {\n const fieldCellErrs = cellErrors[field.id];\n if (fieldCellErrs && Object.keys(fieldCellErrs).length > 0) {\n return null;\n }\n const fieldErr = errors[field.id];\n if (!fieldErr) return null;\n const message =\n typeof fieldErr === \"string\"\n ? fieldErr\n : field.required && !formData[field.id]\n ? t(\"custom_form.required_field\")\n : t(\"custom_form.invalid_value\");\n return (\n <p className=\"text-red-600 text-sm flex items-center gap-1\">\n <span className=\"text-red-500\">⚠</span>\n {message}\n </p>\n );\n })()}\n </div>\n ))}\n </Fragment>\n );\n};\n\nexport default CustomFormFields;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"CustomFormFields.js","sources":["../../../../../../src/components/session/UserInputForm/CustomFormFields.tsx"],"sourcesContent":["import { Fragment, useRef } from \"react\";\nimport * as Label from \"@radix-ui/react-label\";\nimport clsx from \"clsx\";\nimport { Select } from \"../../ui/SelectComponent\";\nimport type { CustomField, ListColumn } from \"../../../types/session\";\nimport { useI18n } from \"../../../hooks/useI18n\";\nimport AddressFields from \"./AddressFields\";\nimport type { AddressSuggestion } from \"../../../types/userInputForm\";\nimport {\n createEmptyListRow,\n ensureMinimumListRows,\n getListFieldMinRows,\n normalizeListColumns,\n} from \"../../../utils/listFieldUtils\";\nimport { cellErrorKey } from \"../../../utils/customFieldValidation\";\nimport { DatePickerField } from \"./DatePickerField\";\n\ntype CellErrorValue = string | boolean;\n\n/**\n * Sous-composant dédié au rendu d'une cellule du tableau dynamique.\n * Nécessaire pour que les hooks internes à Select soient toujours appelés\n * de façon stable (règle des hooks React).\n */\nconst ListCell = ({\n col,\n value,\n hasError,\n cellClasses,\n onChange,\n language,\n}: {\n col: ListColumn;\n value: string;\n hasError: boolean;\n cellClasses: string;\n onChange: (val: string) => void;\n language: string;\n}) => {\n if (col.type === \"enum\") {\n return (\n <Select\n options={(col.options ?? []).map((opt) => ({ value: opt, label: opt }))}\n value={value}\n onValueChange={onChange}\n placeholder={col.placeholder || col.label}\n error={hasError}\n compact\n />\n );\n }\n if (col.type === \"email\") {\n return (\n <input\n type=\"email\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={col.placeholder || col.label}\n className={cellClasses}\n autoComplete=\"off\"\n inputMode=\"email\"\n />\n );\n }\n if (col.type === \"date\") {\n return (\n <DatePickerField\n value={value}\n dateFormat={col.dateFormat ?? \"dd/mm/yyyy\"}\n placeholder={col.placeholder}\n hasError={hasError}\n language={language}\n onChange={onChange}\n className={cellClasses}\n />\n );\n }\n return (\n <input\n type=\"text\"\n value={value}\n onChange={(e) => onChange(e.target.value)}\n placeholder={col.placeholder || col.label}\n className={cellClasses}\n autoComplete=\"off\"\n />\n );\n};\n\ninterface CustomFormFieldsProps {\n customFields: CustomField[];\n formData: Record<string, any>;\n errors: Record<string, CellErrorValue>;\n cellErrors?: Record<string, Record<string, CellErrorValue>>;\n onFieldChange: (fieldId: string, value: any) => void;\n // Address autocomplete props (for address field type)\n addressSuggestions?: AddressSuggestion[];\n showSuggestions?: boolean;\n onAddressChange?: (fieldId: string, value: string) => void;\n onAddressFocus?: (fieldId: string) => void;\n onAddressBlur?: (fieldId: string) => void;\n onApplySuggestion?: (fieldId: string, suggestion: AddressSuggestion) => void;\n}\n\nconst CustomFormFields = ({\n customFields,\n formData,\n errors,\n cellErrors = {},\n onFieldChange,\n addressSuggestions = [],\n showSuggestions = false,\n onAddressChange,\n onAddressFocus,\n onAddressBlur,\n onApplySuggestion,\n}: CustomFormFieldsProps) => {\n const { t, currentLanguage } = useI18n();\n\n const renderField = (field: CustomField) => {\n const hasError = Boolean(errors[field.id]);\n const value = formData[field.id];\n\n // Classes communes (EXACTEMENT comme IdentityFields/ContactFields)\n const inputClasses = clsx(\n \"w-full px-3 py-3 md:py-4 border rounded-lg text-base transition-colors focus:outline-none focus:ring-2 focus:ring-[#11E5C5] focus:border-transparent\",\n hasError\n ? \"border-red-500 bg-red-50\"\n : \"border-gray-300 hover:border-gray-400\",\n );\n\n switch (field.valueType) {\n case \"text\":\n return (\n <input\n id={field.id}\n type=\"text\"\n value={value || \"\"}\n onChange={(e) => onFieldChange(field.id, e.target.value)}\n placeholder={field.placeholder}\n className={inputClasses}\n autoComplete=\"off\"\n />\n );\n\n case \"number\":\n return (\n <input\n id={field.id}\n type=\"number\"\n inputMode=\"numeric\"\n value={value || \"\"}\n onChange={(e) => onFieldChange(field.id, e.target.value)}\n placeholder={field.placeholder}\n className={inputClasses}\n />\n );\n\n case \"date\":\n return (\n <DatePickerField\n id={field.id}\n value={value || \"\"}\n dateFormat={field.dateFormat ?? \"dd/mm/yyyy\"}\n placeholder={field.placeholder}\n hasError={hasError}\n language={currentLanguage}\n onChange={(v) => onFieldChange(field.id, v)}\n className={inputClasses}\n />\n );\n\n case \"boolean\":\n return (\n <div className=\"flex items-center gap-2\">\n <input\n id={field.id}\n type=\"checkbox\"\n checked={value || false}\n onChange={(e) => onFieldChange(field.id, e.target.checked)}\n className=\"h-4 w-4 text-[#11E5C5] border-gray-300 rounded focus:ring-[#11E5C5]\"\n />\n {field.description && (\n <span className=\"text-sm text-gray-600\">{field.description}</span>\n )}\n </div>\n );\n\n case \"enum\":\n return (\n <Select\n options={(field.enumOptions || []).map((opt) => ({\n value: opt,\n label: opt,\n }))}\n value={value || \"\"}\n onValueChange={(val) => onFieldChange(field.id, val)}\n placeholder={field.placeholder || t(\"custom_form.select_option\")}\n error={hasError}\n />\n );\n\n case \"email\":\n return (\n <input\n id={field.id}\n type=\"email\"\n value={value || \"\"}\n onChange={(e) => onFieldChange(field.id, e.target.value)}\n placeholder={field.placeholder}\n className={inputClasses}\n autoComplete=\"off\"\n inputMode=\"email\"\n />\n );\n\n case \"address\":\n // For address, use the existing AddressFields component\n const addressValue = value || {};\n const addressForm = {\n lastName: \"\",\n firstName: \"\",\n birthDate: \"\",\n day: \"\",\n month: \"\",\n year: \"\",\n email: \"\",\n phoneNumber: \"\",\n sms: \"\",\n addressLine1: addressValue.addressLine1 || \"\",\n addressLine2: addressValue.addressLine2 || \"\",\n postalCode: addressValue.postalCode || \"\",\n city: addressValue.city || \"\",\n countryCode: addressValue.countryCode || \"\",\n nationality: \"\",\n companyName: \"\",\n siret: \"\",\n tva: \"\",\n };\n\n return (\n <AddressFields\n form={addressForm}\n errors={{\n addressLine1: hasError,\n addressLine2: false,\n postalCode: hasError,\n city: hasError,\n country: hasError,\n }}\n requestedFields={new Set([\"adresse\"])}\n onFieldChange={(key, val) => {\n const updatedAddress = {\n ...addressValue,\n [key]: val,\n };\n onFieldChange(field.id, updatedAddress);\n }}\n addressSuggestions={addressSuggestions}\n showSuggestions={showSuggestions}\n onAddressChange={(val) => {\n const updatedAddress = {\n ...addressValue,\n addressLine1: val,\n };\n onFieldChange(field.id, updatedAddress);\n onAddressChange?.(field.id, val);\n }}\n onAddressFocus={() => onAddressFocus?.(field.id)}\n onAddressBlur={() => onAddressBlur?.(field.id)}\n onApplySuggestion={(suggestion) => {\n const updatedAddress = {\n addressLine1: suggestion.label || \"\",\n addressLine2: addressValue.addressLine2 || \"\",\n postalCode: suggestion.postalCode || \"\",\n city: suggestion.city || \"\",\n countryCode: suggestion.countryCode || \"\",\n };\n onFieldChange(field.id, updatedAddress);\n onApplySuggestion?.(field.id, suggestion);\n }}\n />\n );\n\n case \"list\": {\n const persistedRows: Record<string, string>[] = Array.isArray(value)\n ? value\n : [];\n const columns: ListColumn[] = normalizeListColumns(field.listColumns);\n const minRows = getListFieldMinRows(field);\n const rows = ensureMinimumListRows(persistedRows, columns, minRows);\n const gridTemplateColumns = `repeat(${columns.length}, minmax(180px, 1fr)) 32px`;\n const gridMinWidth = `${columns.length * 180 + (columns.length - 1) * 8 + 32}px`;\n const fieldCellErrors = cellErrors[field.id] ?? {};\n\n if (columns.length === 0) {\n return (\n <p className=\"text-sm text-red-600\">\n {t(\n \"custom_form.list_missing_columns\",\n \"Ce tableau n'a pas de colonnes configurées.\",\n )}\n </p>\n );\n }\n\n const handleRowChange = (\n rowIndex: number,\n colName: string,\n colValue: string,\n ) => {\n const updated = [...rows];\n updated[rowIndex] = { ...updated[rowIndex], [colName]: colValue };\n onFieldChange(field.id, updated);\n };\n\n const handleAddRow = () => {\n const emptyRow = createEmptyListRow(columns);\n onFieldChange(field.id, [...rows, emptyRow]);\n };\n\n const handleRemoveRow = (rowIndex: number) => {\n if (rows.length <= minRows) {\n return;\n }\n\n onFieldChange(\n field.id,\n rows.filter((_, i) => i !== rowIndex),\n );\n };\n\n const cellClasses = clsx(\n \"w-full px-2 py-2 border rounded-lg text-sm transition-colors focus:outline-none focus:ring-2 focus:ring-[#11E5C5] focus:border-transparent\",\n hasError\n ? \"border-red-500 bg-red-50\"\n : \"border-gray-300 hover:border-gray-400\",\n );\n\n return (\n <div className=\"space-y-3 overflow-x-auto\">\n {columns.length > 0 && (\n <div\n className=\"grid gap-2 items-center w-full\"\n style={{\n gridTemplateColumns,\n minWidth: gridMinWidth,\n }}\n >\n {columns.map((col) => (\n <span\n key={col.label}\n className=\"text-xs font-semibold text-gray-600 uppercase tracking-wide truncate\"\n >\n {col.label}\n </span>\n ))}\n <span />\n </div>\n )}\n\n {rows.map((row, rowIndex) => (\n <div\n key={rowIndex}\n className=\"grid gap-2 items-start w-full\"\n style={{\n gridTemplateColumns,\n minWidth: gridMinWidth,\n }}\n >\n {columns.map((col) => {\n const cellErr =\n fieldCellErrors[cellErrorKey(rowIndex, col.label)];\n const cellHasError = Boolean(cellErr);\n const cellInputClasses = clsx(\n \"w-full px-2 py-2 border rounded-lg text-sm transition-colors focus:outline-none focus:ring-2 focus:ring-[#11E5C5] focus:border-transparent\",\n cellHasError\n ? \"border-red-500 bg-red-50\"\n : \"border-gray-300 hover:border-gray-400\",\n );\n return (\n <div\n key={col.label}\n className=\"flex flex-col gap-1 min-w-0\"\n >\n <ListCell\n col={col}\n value={row[col.label] || \"\"}\n hasError={cellHasError || hasError}\n cellClasses={cellInputClasses}\n onChange={(val) =>\n handleRowChange(rowIndex, col.label, val)\n }\n language={currentLanguage}\n />\n {typeof cellErr === \"string\" && (\n <span className=\"text-xs text-red-600\">\n {cellErr}\n </span>\n )}\n </div>\n );\n })}\n <button\n type=\"button\"\n onClick={() => handleRemoveRow(rowIndex)}\n className={clsx(\n \"flex items-center justify-center w-8 h-8 rounded-full transition-colors\",\n rows.length <= minRows\n ? \"text-gray-300 cursor-not-allowed\"\n : \"text-gray-400 hover:text-red-500 hover:bg-red-50\",\n )}\n aria-label={t(\"custom_form.remove_row\", \"Supprimer la ligne\")}\n disabled={rows.length <= minRows}\n >\n ✕\n </button>\n </div>\n ))}\n\n <button\n type=\"button\"\n onClick={handleAddRow}\n className=\"flex items-center gap-2 text-sm text-[#11E5C5] hover:underline font-medium\"\n >\n + {t(\"custom_form.add_row\", \"Ajouter une ligne\")}\n </button>\n </div>\n );\n }\n\n default:\n return null;\n }\n };\n\n // Un champ est masqué quand il est verrouillé depuis l'API :\n // - hard lock (lockedFromApi sans editableIfMissing) → toujours masqué ;\n // - soft lock (editableIfMissing) → masqué uniquement si l'API a fourni une\n // valeur ; sinon le champ redevient éditable par l'utilisateur final.\n const isValuePresent = (value: unknown): boolean => {\n if (value === null || value === undefined) return false;\n if (typeof value === \"string\") return value.trim().length > 0;\n if (Array.isArray(value)) return value.length > 0;\n return true;\n };\n\n // La décision de visibilité d'un soft lock se fige à l'OUVERTURE du nœud,\n // pas à chaque frappe : on capture une seule fois (au mount, via ref) les\n // soft locks dont l'API n'avait fourni AUCUNE valeur. Ceux-là restent\n // éditables ensuite, même quand l'utilisateur commence à taper (sinon le\n // champ se masquerait dès le 1er caractère puisque formData deviendrait\n // non vide). Le composant est remonté par nœud (key={node.id}), donc le\n // snapshot est bien réinitialisé à chaque entrée de nœud.\n const editableSoftLocksRef = useRef<Set<string> | null>(null);\n if (editableSoftLocksRef.current === null) {\n const ids = new Set<string>();\n for (const f of customFields) {\n if (f.lockedFromApi && f.editableIfMissing && !isValuePresent(formData[f.id])) {\n ids.add(f.id);\n }\n }\n editableSoftLocksRef.current = ids;\n }\n const editableSoftLocks = editableSoftLocksRef.current;\n\n const isLockedHidden = (f: CustomField): boolean => {\n if (!f.lockedFromApi) return false;\n if (!f.editableIfMissing) return true;\n // soft lock : visible seulement s'il était vide à l'ouverture du nœud\n return !editableSoftLocks.has(f.id);\n };\n\n const visibleFields = customFields.filter((f) => !isLockedHidden(f));\n\n return (\n <Fragment>\n {visibleFields.map((field) => (\n <div key={field.id} className=\"space-y-2\">\n <Label.Root\n htmlFor={field.id}\n className=\"block text-sm md:text-base font-semibold text-gray-900\"\n >\n {field.label}\n {field.required && <span className=\"text-red-500 ml-1\">*</span>}\n </Label.Root>\n\n {field.description && field.valueType !== \"boolean\" && (\n <p className=\"text-xs text-gray-500 -mt-1\">{field.description}</p>\n )}\n\n {renderField(field)}\n\n {(() => {\n const fieldCellErrs = cellErrors[field.id];\n if (fieldCellErrs && Object.keys(fieldCellErrs).length > 0) {\n return null;\n }\n const fieldErr = errors[field.id];\n if (!fieldErr) return null;\n const message =\n typeof fieldErr === \"string\"\n ? fieldErr\n : field.required && !formData[field.id]\n ? t(\"custom_form.required_field\")\n : t(\"custom_form.invalid_value\");\n return (\n <p className=\"text-red-600 text-sm flex items-center gap-1\">\n <span className=\"text-red-500\">⚠</span>\n {message}\n </p>\n );\n })()}\n </div>\n ))}\n </Fragment>\n );\n};\n\nexport default CustomFormFields;\n"],"names":["_jsx","_jsxs"],"mappings":"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"}
|
|
@@ -19,11 +19,11 @@ var UserInputForm = function (props) {
|
|
|
19
19
|
var t = useI18n().t;
|
|
20
20
|
var hasListCustomField = props.node.informationType === "custom" &&
|
|
21
21
|
(props.node.customFields || []).some(function (field) { return field.valueType === "list"; });
|
|
22
|
-
var _b = useUserInputForm(props), form = _b.form, errors = _b.errors, informationType = _b.informationType, requestedFields = _b.requestedFields, pageTitle = _b.pageTitle, pageDescription = _b.pageDescription, addressSuggestions = _b.addressSuggestions, showSuggestions = _b.showSuggestions, handleFieldChange = _b.handleFieldChange, handleAddressChange = _b.handleAddressChange, handleAddressFocus = _b.handleAddressFocus, handleAddressBlur = _b.handleAddressBlur, applyAddressSuggestion = _b.applyAddressSuggestion, goOnNextStep = _b.goOnNextStep, goOnPreviousStep = _b.goOnPreviousStep, customFormData = _b.customFormData, customFormErrors = _b.customFormErrors, customFormCellErrors = _b.customFormCellErrors, handleCustomFieldChange = _b.handleCustomFieldChange;
|
|
22
|
+
var _b = useUserInputForm(props), form = _b.form, errors = _b.errors, informationType = _b.informationType, requestedFields = _b.requestedFields, pageTitle = _b.pageTitle, pageDescription = _b.pageDescription, addressSuggestions = _b.addressSuggestions, showSuggestions = _b.showSuggestions, handleFieldChange = _b.handleFieldChange, handleAddressChange = _b.handleAddressChange, handleAddressFocus = _b.handleAddressFocus, handleAddressBlur = _b.handleAddressBlur, applyAddressSuggestion = _b.applyAddressSuggestion, goOnNextStep = _b.goOnNextStep, goOnPreviousStep = _b.goOnPreviousStep, customFormData = _b.customFormData, customFormErrors = _b.customFormErrors, customFormCellErrors = _b.customFormCellErrors, handleCustomFieldChange = _b.handleCustomFieldChange, customFields = _b.customFields;
|
|
23
23
|
return (jsxs(MobilePageLayout, { contentClassName: "overflow-y-auto", footerClassName: "md:sticky md:bottom-0 md:bg-white md:pt-4 md:z-20", footer: jsx(PageActions, { primary: jsx(Button, { onClick: goOnNextStep, children: t("user_input_form.buttons.continue") }), secondary: props.stepObject.canGoBack ? (jsx(Button, { variant: "secondary", onClick: goOnPreviousStep, children: t("user_input_form.buttons.back") })) : undefined }), children: [typeof process !== "undefined" &&
|
|
24
24
|
((_a = process.env) === null || _a === void 0 ? void 0 : _a.NODE_ENV) === "development" && (jsx("div", { className: "fixed right-0 top-0 z-50 bg-green-500 p-2 text-xs text-white", children: "UserInputForm Rendered \u2713" })), jsx("div", { className: "px-4 py-6 pt-11 md:px-8 md:py-8", children: jsxs("div", { className: "mx-auto w-full space-y-6 ".concat(hasListCustomField
|
|
25
25
|
? "max-w-[98vw] md:max-w-[1300px] lg:max-w-[1500px]"
|
|
26
|
-
: "max-w-md"), children: [jsxs("div", { className: "space-y-4 text-center", children: [jsx(Title, { className: "text-xl md:text-2xl lg:text-3xl", children: pageTitle }), jsx(Subtitle, { className: "text-sm leading-relaxed text-gray-600 md:text-base whitespace-pre-line", children: pageDescription })] }), jsxs("div", { className: "space-y-6 z-30", children: [informationType === "identity" && (jsx(IdentityFields, { form: form, errors: errors, requestedFields: requestedFields, onFieldChange: handleFieldChange })), informationType === "identity-legal-rep" && (jsx(LegalRepFields, { form: form, errors: errors, requestedFields: requestedFields, onFieldChange: handleFieldChange })), informationType === "identity-legal" && (jsxs(Fragment, { children: [jsx(LegalEntityFields, { form: form, errors: errors, requestedFields: requestedFields, onFieldChange: handleFieldChange }), requestedFields.has("adresse") && (jsxs("div", { className: "space-y-4", children: [jsx("h3", { className: "text-lg md:text-xl font-semibold text-gray-900", children: t("user_input_form.registered_office_address", "Adresse du siège social") }), jsx(AddressFields, { form: form, errors: errors, requestedFields: requestedFields, onFieldChange: handleFieldChange, addressSuggestions: addressSuggestions, showSuggestions: showSuggestions, onAddressChange: handleAddressChange, onAddressFocus: handleAddressFocus, onAddressBlur: handleAddressBlur, onApplySuggestion: applyAddressSuggestion })] }))] })), informationType === "contact" && (jsx(ContactFields, { form: form, errors: errors, requestedFields: requestedFields, onFieldChange: handleFieldChange })), informationType === "address" && (jsx(AddressFields, { form: form, errors: errors, requestedFields: requestedFields, onFieldChange: handleFieldChange, addressSuggestions: addressSuggestions, showSuggestions: showSuggestions, onAddressChange: handleAddressChange, onAddressFocus: handleAddressFocus, onAddressBlur: handleAddressBlur, onApplySuggestion: applyAddressSuggestion })), informationType === "nationality" && (jsx(NationalityField, { form: form, errors: errors, requestedFields: requestedFields, onFieldChange: handleFieldChange })), informationType === "custom" &&
|
|
26
|
+
: "max-w-md"), children: [jsxs("div", { className: "space-y-4 text-center", children: [jsx(Title, { className: "text-xl md:text-2xl lg:text-3xl", children: pageTitle }), jsx(Subtitle, { className: "text-sm leading-relaxed text-gray-600 md:text-base whitespace-pre-line", children: pageDescription })] }), jsxs("div", { className: "space-y-6 z-30", children: [informationType === "identity" && (jsx(IdentityFields, { form: form, errors: errors, requestedFields: requestedFields, onFieldChange: handleFieldChange })), informationType === "identity-legal-rep" && (jsx(LegalRepFields, { form: form, errors: errors, requestedFields: requestedFields, onFieldChange: handleFieldChange })), informationType === "identity-legal" && (jsxs(Fragment, { children: [jsx(LegalEntityFields, { form: form, errors: errors, requestedFields: requestedFields, onFieldChange: handleFieldChange }), requestedFields.has("adresse") && (jsxs("div", { className: "space-y-4", children: [jsx("h3", { className: "text-lg md:text-xl font-semibold text-gray-900", children: t("user_input_form.registered_office_address", "Adresse du siège social") }), jsx(AddressFields, { form: form, errors: errors, requestedFields: requestedFields, onFieldChange: handleFieldChange, addressSuggestions: addressSuggestions, showSuggestions: showSuggestions, onAddressChange: handleAddressChange, onAddressFocus: handleAddressFocus, onAddressBlur: handleAddressBlur, onApplySuggestion: applyAddressSuggestion })] }))] })), informationType === "contact" && (jsx(ContactFields, { form: form, errors: errors, requestedFields: requestedFields, onFieldChange: handleFieldChange })), informationType === "address" && (jsx(AddressFields, { form: form, errors: errors, requestedFields: requestedFields, onFieldChange: handleFieldChange, addressSuggestions: addressSuggestions, showSuggestions: showSuggestions, onAddressChange: handleAddressChange, onAddressFocus: handleAddressFocus, onAddressBlur: handleAddressBlur, onApplySuggestion: applyAddressSuggestion })), informationType === "nationality" && (jsx(NationalityField, { form: form, errors: errors, requestedFields: requestedFields, onFieldChange: handleFieldChange })), informationType === "custom" && customFields.length > 0 && (jsx(CustomFormFields, { customFields: customFields, formData: customFormData, errors: customFormErrors, cellErrors: customFormCellErrors, onFieldChange: handleCustomFieldChange, addressSuggestions: addressSuggestions, showSuggestions: showSuggestions, onAddressChange: function (fieldId, val) { return handleAddressChange(val); }, onAddressFocus: function (fieldId) { return handleAddressFocus(); }, onAddressBlur: function (fieldId) { return handleAddressBlur(); }, onApplySuggestion: function (fieldId, suggestion) {
|
|
27
27
|
return applyAddressSuggestion(suggestion);
|
|
28
28
|
} }))] })] }) })] }));
|
|
29
29
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UserInputForm.js","sources":["../../../../../src/components/session/UserInputForm.tsx"],"sourcesContent":["import type { UserInputFormProps } from \"../../types/userInput\";\nimport Button from \"../ui/Button\";\nimport PageActions from \"../ui/PageActions\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport { useUserInputForm } from \"../../hooks/useUserInputForm\";\nimport IdentityFields from \"./UserInputForm/IdentityFields\";\nimport LegalEntityFields from \"./UserInputForm/LegalEntityFields\";\nimport LegalRepFields from \"./UserInputForm/LegalRepFields\";\nimport ContactFields from \"./UserInputForm/ContactFields\";\nimport AddressFields from \"./UserInputForm/AddressFields\";\nimport NationalityField from \"./UserInputForm/NationalityField\";\nimport CustomFormFields from \"./UserInputForm/CustomFormFields\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\n\nconst UserInputForm = (props: UserInputFormProps) => {\n const { t } = useI18n();\n const hasListCustomField =\n props.node.informationType === \"custom\" &&\n (props.node.customFields || []).some((field) => field.valueType === \"list\");\n\n const {\n form,\n errors,\n informationType,\n requestedFields,\n pageTitle,\n pageDescription,\n addressSuggestions,\n showSuggestions,\n handleFieldChange,\n handleAddressChange,\n handleAddressFocus,\n handleAddressBlur,\n applyAddressSuggestion,\n goOnNextStep,\n goOnPreviousStep,\n customFormData,\n customFormErrors,\n customFormCellErrors,\n handleCustomFieldChange,\n } = useUserInputForm(props);\n\n return (\n <MobilePageLayout\n contentClassName=\"overflow-y-auto\"\n footerClassName=\"md:sticky md:bottom-0 md:bg-white md:pt-4 md:z-20\"\n footer={\n <PageActions\n primary={\n <Button onClick={goOnNextStep}>\n {t(\"user_input_form.buttons.continue\")}\n </Button>\n }\n secondary={props.stepObject.canGoBack ? (\n <Button variant=\"secondary\" onClick={goOnPreviousStep}>\n {t(\"user_input_form.buttons.back\")}\n </Button>\n ) : undefined}\n />\n }\n >\n {typeof process !== \"undefined\" &&\n process.env?.NODE_ENV === \"development\" && (\n <div className=\"fixed right-0 top-0 z-50 bg-green-500 p-2 text-xs text-white\">\n UserInputForm Rendered ✓\n </div>\n )}\n\n <div className=\"px-4 py-6 pt-11 md:px-8 md:py-8\">\n <div\n className={`mx-auto w-full space-y-6 ${\n hasListCustomField\n ? \"max-w-[98vw] md:max-w-[1300px] lg:max-w-[1500px]\"\n : \"max-w-md\"\n }`}\n >\n <div className=\"space-y-4 text-center\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl\">\n {pageTitle}\n </Title>\n <Subtitle className=\"text-sm leading-relaxed text-gray-600 md:text-base whitespace-pre-line\">\n {pageDescription}\n </Subtitle>\n </div>\n\n <div className=\"space-y-6 z-30\">\n {informationType === \"identity\" && (\n <IdentityFields\n form={form}\n errors={errors}\n requestedFields={requestedFields}\n onFieldChange={handleFieldChange}\n />\n )}\n\n {informationType === \"identity-legal-rep\" && (\n <LegalRepFields\n form={form}\n errors={errors}\n requestedFields={requestedFields}\n onFieldChange={handleFieldChange}\n />\n )}\n\n {informationType === \"identity-legal\" && (\n <>\n <LegalEntityFields\n form={form}\n errors={errors}\n requestedFields={requestedFields}\n onFieldChange={handleFieldChange}\n />\n {requestedFields.has(\"adresse\") && (\n <div className=\"space-y-4\">\n <h3 className=\"text-lg md:text-xl font-semibold text-gray-900\">\n {t(\n \"user_input_form.registered_office_address\",\n \"Adresse du siège social\",\n )}\n </h3>\n <AddressFields\n form={form}\n errors={errors}\n requestedFields={requestedFields}\n onFieldChange={handleFieldChange}\n addressSuggestions={addressSuggestions}\n showSuggestions={showSuggestions}\n onAddressChange={handleAddressChange}\n onAddressFocus={handleAddressFocus}\n onAddressBlur={handleAddressBlur}\n onApplySuggestion={applyAddressSuggestion}\n />\n </div>\n )}\n </>\n )}\n\n {informationType === \"contact\" && (\n <ContactFields\n form={form}\n errors={errors}\n requestedFields={requestedFields}\n onFieldChange={handleFieldChange}\n />\n )}\n\n {informationType === \"address\" && (\n <AddressFields\n form={form}\n errors={errors}\n requestedFields={requestedFields}\n onFieldChange={handleFieldChange}\n addressSuggestions={addressSuggestions}\n showSuggestions={showSuggestions}\n onAddressChange={handleAddressChange}\n onAddressFocus={handleAddressFocus}\n onAddressBlur={handleAddressBlur}\n onApplySuggestion={applyAddressSuggestion}\n />\n )}\n\n {informationType === \"nationality\" && (\n <NationalityField\n form={form}\n errors={errors}\n requestedFields={requestedFields}\n onFieldChange={handleFieldChange}\n />\n )}\n\n {informationType === \"custom\" && props.node.customFields && (\n <CustomFormFields\n customFields={props.node.customFields}\n formData={customFormData}\n errors={customFormErrors}\n cellErrors={customFormCellErrors}\n onFieldChange={handleCustomFieldChange}\n addressSuggestions={addressSuggestions}\n showSuggestions={showSuggestions}\n onAddressChange={(fieldId, val) => handleAddressChange(val)}\n onAddressFocus={(fieldId) => handleAddressFocus()}\n onAddressBlur={(fieldId) => handleAddressBlur()}\n onApplySuggestion={(fieldId, suggestion) =>\n applyAddressSuggestion(suggestion)\n }\n />\n )}\n </div>\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default UserInputForm;\n"],"names":["_jsxs","_jsx","_Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"UserInputForm.js","sources":["../../../../../src/components/session/UserInputForm.tsx"],"sourcesContent":["import type { UserInputFormProps } from \"../../types/userInput\";\nimport Button from \"../ui/Button\";\nimport PageActions from \"../ui/PageActions\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport { useUserInputForm } from \"../../hooks/useUserInputForm\";\nimport IdentityFields from \"./UserInputForm/IdentityFields\";\nimport LegalEntityFields from \"./UserInputForm/LegalEntityFields\";\nimport LegalRepFields from \"./UserInputForm/LegalRepFields\";\nimport ContactFields from \"./UserInputForm/ContactFields\";\nimport AddressFields from \"./UserInputForm/AddressFields\";\nimport NationalityField from \"./UserInputForm/NationalityField\";\nimport CustomFormFields from \"./UserInputForm/CustomFormFields\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\n\nconst UserInputForm = (props: UserInputFormProps) => {\n const { t } = useI18n();\n const hasListCustomField =\n props.node.informationType === \"custom\" &&\n (props.node.customFields || []).some((field) => field.valueType === \"list\");\n\n const {\n form,\n errors,\n informationType,\n requestedFields,\n pageTitle,\n pageDescription,\n addressSuggestions,\n showSuggestions,\n handleFieldChange,\n handleAddressChange,\n handleAddressFocus,\n handleAddressBlur,\n applyAddressSuggestion,\n goOnNextStep,\n goOnPreviousStep,\n customFormData,\n customFormErrors,\n customFormCellErrors,\n handleCustomFieldChange,\n customFields,\n } = useUserInputForm(props);\n\n return (\n <MobilePageLayout\n contentClassName=\"overflow-y-auto\"\n footerClassName=\"md:sticky md:bottom-0 md:bg-white md:pt-4 md:z-20\"\n footer={\n <PageActions\n primary={\n <Button onClick={goOnNextStep}>\n {t(\"user_input_form.buttons.continue\")}\n </Button>\n }\n secondary={props.stepObject.canGoBack ? (\n <Button variant=\"secondary\" onClick={goOnPreviousStep}>\n {t(\"user_input_form.buttons.back\")}\n </Button>\n ) : undefined}\n />\n }\n >\n {typeof process !== \"undefined\" &&\n process.env?.NODE_ENV === \"development\" && (\n <div className=\"fixed right-0 top-0 z-50 bg-green-500 p-2 text-xs text-white\">\n UserInputForm Rendered ✓\n </div>\n )}\n\n <div className=\"px-4 py-6 pt-11 md:px-8 md:py-8\">\n <div\n className={`mx-auto w-full space-y-6 ${\n hasListCustomField\n ? \"max-w-[98vw] md:max-w-[1300px] lg:max-w-[1500px]\"\n : \"max-w-md\"\n }`}\n >\n <div className=\"space-y-4 text-center\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl\">\n {pageTitle}\n </Title>\n <Subtitle className=\"text-sm leading-relaxed text-gray-600 md:text-base whitespace-pre-line\">\n {pageDescription}\n </Subtitle>\n </div>\n\n <div className=\"space-y-6 z-30\">\n {informationType === \"identity\" && (\n <IdentityFields\n form={form}\n errors={errors}\n requestedFields={requestedFields}\n onFieldChange={handleFieldChange}\n />\n )}\n\n {informationType === \"identity-legal-rep\" && (\n <LegalRepFields\n form={form}\n errors={errors}\n requestedFields={requestedFields}\n onFieldChange={handleFieldChange}\n />\n )}\n\n {informationType === \"identity-legal\" && (\n <>\n <LegalEntityFields\n form={form}\n errors={errors}\n requestedFields={requestedFields}\n onFieldChange={handleFieldChange}\n />\n {requestedFields.has(\"adresse\") && (\n <div className=\"space-y-4\">\n <h3 className=\"text-lg md:text-xl font-semibold text-gray-900\">\n {t(\n \"user_input_form.registered_office_address\",\n \"Adresse du siège social\",\n )}\n </h3>\n <AddressFields\n form={form}\n errors={errors}\n requestedFields={requestedFields}\n onFieldChange={handleFieldChange}\n addressSuggestions={addressSuggestions}\n showSuggestions={showSuggestions}\n onAddressChange={handleAddressChange}\n onAddressFocus={handleAddressFocus}\n onAddressBlur={handleAddressBlur}\n onApplySuggestion={applyAddressSuggestion}\n />\n </div>\n )}\n </>\n )}\n\n {informationType === \"contact\" && (\n <ContactFields\n form={form}\n errors={errors}\n requestedFields={requestedFields}\n onFieldChange={handleFieldChange}\n />\n )}\n\n {informationType === \"address\" && (\n <AddressFields\n form={form}\n errors={errors}\n requestedFields={requestedFields}\n onFieldChange={handleFieldChange}\n addressSuggestions={addressSuggestions}\n showSuggestions={showSuggestions}\n onAddressChange={handleAddressChange}\n onAddressFocus={handleAddressFocus}\n onAddressBlur={handleAddressBlur}\n onApplySuggestion={applyAddressSuggestion}\n />\n )}\n\n {informationType === \"nationality\" && (\n <NationalityField\n form={form}\n errors={errors}\n requestedFields={requestedFields}\n onFieldChange={handleFieldChange}\n />\n )}\n\n {informationType === \"custom\" && customFields.length > 0 && (\n <CustomFormFields\n customFields={customFields}\n formData={customFormData}\n errors={customFormErrors}\n cellErrors={customFormCellErrors}\n onFieldChange={handleCustomFieldChange}\n addressSuggestions={addressSuggestions}\n showSuggestions={showSuggestions}\n onAddressChange={(fieldId, val) => handleAddressChange(val)}\n onAddressFocus={(fieldId) => handleAddressFocus()}\n onAddressBlur={(fieldId) => handleAddressBlur()}\n onApplySuggestion={(fieldId, suggestion) =>\n applyAddressSuggestion(suggestion)\n }\n />\n )}\n </div>\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default UserInputForm;\n"],"names":["_jsxs","_jsx","_Fragment"],"mappings":"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"}
|
|
@@ -27,24 +27,20 @@ var SignedDocumentPreview = function (_a) {
|
|
|
27
27
|
useEffect(function () {
|
|
28
28
|
cancelledRef.current = false;
|
|
29
29
|
var attempts = 0;
|
|
30
|
+
var objectUrl;
|
|
30
31
|
var timer;
|
|
31
32
|
var fetchAccessLink = function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
32
|
-
var response,
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
case 0: return [4 /*yield*/, apiService.get("/session/sdk/".concat(sessionId, "/signed-document/").concat(nodeId, "/access-link"))];
|
|
33
|
+
var response, url;
|
|
34
|
+
return __generator(this, function (_a) {
|
|
35
|
+
switch (_a.label) {
|
|
36
|
+
case 0: return [4 /*yield*/, apiService.get("/session/sdk/".concat(sessionId, "/signed-document/").concat(nodeId, ".pdf"), { responseType: 'blob' })];
|
|
37
37
|
case 1:
|
|
38
|
-
response =
|
|
39
|
-
token = (_b = (_a = response.data) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.token;
|
|
40
|
-
if (!token) {
|
|
41
|
-
throw new Error("Missing signed document access token");
|
|
42
|
-
}
|
|
43
|
-
baseURL = (apiService.getRawClient().defaults.baseURL || "").replace(/\/+$/, "");
|
|
44
|
-
path = "/session/sdk/".concat(sessionId, "/signed-document/").concat(nodeId, "/view?token=").concat(token);
|
|
38
|
+
response = _a.sent();
|
|
45
39
|
if (!cancelledRef.current) {
|
|
46
|
-
|
|
47
|
-
|
|
40
|
+
url = URL.createObjectURL(response.data);
|
|
41
|
+
objectUrl = url;
|
|
42
|
+
setViewUrl(url);
|
|
43
|
+
setStatus('ready');
|
|
48
44
|
}
|
|
49
45
|
return [2 /*return*/];
|
|
50
46
|
}
|
|
@@ -111,6 +107,8 @@ var SignedDocumentPreview = function (_a) {
|
|
|
111
107
|
cancelledRef.current = true;
|
|
112
108
|
if (timer)
|
|
113
109
|
clearTimeout(timer);
|
|
110
|
+
if (objectUrl)
|
|
111
|
+
URL.revokeObjectURL(objectUrl);
|
|
114
112
|
};
|
|
115
113
|
}, [sessionId, nodeId]);
|
|
116
114
|
if (status === "polling") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SignedDocumentPreview.js","sources":["../../../../../src/components/signature-electronic/SignedDocumentPreview.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from \"react\";\nimport { PenTool } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\nimport sdkI18n from \"../../i18n\";\nimport { apiService } from \"../../services/api\";\nimport LoadingState from \"../states/LoadingState\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport PageActions from \"../ui/PageActions\";\nimport Button from \"../ui/Button\";\nimport Title from \"../ui/Title\";\n\ninterface SignedDocumentPreviewProps {\n sessionId: string;\n nodeId: string;\n nodeTitle: string;\n completedAt: string | null;\n logo?: string;\n title?: string;\n description?: string;\n downloadHint?: string;\n onContinue: () => void;\n}\n\nconst STATUS_POLL_INTERVAL_MS = 2000;\n// DocuSeal flags a submission \"completed\" before generating the flattened\n// signed PDF — 15 attempts (30s) leaves enough margin for that async step.\nconst MAX_STATUS_POLL_ATTEMPTS = 15;\n\nconst SignedDocumentPreview: React.FC<SignedDocumentPreviewProps> = ({\n sessionId,\n nodeId,\n nodeTitle,\n completedAt,\n logo,\n title: propTitle,\n description: propDescription,\n downloadHint: propDownloadHint,\n onContinue,\n}) => {\n const { t, i18n } = useTranslation(\"translation\", { i18n: sdkI18n });\n const title = propTitle?.trim() || t(\"signed_document.title\", \"Votre document est signé\");\n const description = propDescription?.trim() || t(\n \"signed_document.ready_text\",\n \"Merci d'avoir signé le document, vous pouvez le consulter en cliquant ci-dessous :\",\n );\n const downloadHint = propDownloadHint?.trim() || t(\n \"signed_document.download_hint\",\n \"Si vous souhaitez conserver ce document, vous pouvez le télécharger depuis cette page.\",\n );\n const [status, setStatus] = useState<\"polling\" | \"ready\" | \"error\" | \"declined\" | \"expired\">(\n \"polling\",\n );\n const [viewUrl, setViewUrl] = useState<string | null>(null);\n const cancelledRef = useRef(false);\n\n useEffect(() => {\n cancelledRef.current = false;\n let attempts = 0;\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const fetchAccessLink = async () => {\n const response = await apiService.get(\n `/session/sdk/${sessionId}/signed-document/${nodeId}/access-link`,\n );\n const token = response.data?.data?.token;\n if (!token) {\n throw new Error(\"Missing signed document access token\");\n }\n\n const baseURL = (apiService.getRawClient().defaults.baseURL || \"\").replace(\n /\\/+$/,\n \"\",\n );\n const path = `/session/sdk/${sessionId}/signed-document/${nodeId}/view?token=${token}`;\n\n if (!cancelledRef.current) {\n setViewUrl(baseURL ? `${baseURL}${path}` : path);\n setStatus(\"ready\");\n }\n };\n\n const poll = async () => {\n try {\n const statusResponse = await apiService.get(\n `/session/sdk/${sessionId}/signed-document/${nodeId}/status`,\n );\n const ready = !!statusResponse.data?.data?.ready;\n const error = statusResponse.data?.data?.error as\n | \"declined\"\n | \"expired\"\n | undefined;\n\n if (error === \"declined\" || error === \"expired\") {\n if (!cancelledRef.current) setStatus(error);\n return;\n }\n\n if (ready) {\n try {\n await fetchAccessLink();\n return;\n } catch (err) {\n // DocuSeal can report the submission \"completed\" before the\n // signed document is actually linked — treat like \"not ready\n // yet\" instead of failing permanently on the first miss.\n console.error(\n \"[SignedDocumentPreview] Failed to fetch access link:\",\n err,\n );\n }\n }\n\n attempts += 1;\n if (attempts >= MAX_STATUS_POLL_ATTEMPTS) {\n if (!cancelledRef.current) setStatus(\"error\");\n return;\n }\n timer = setTimeout(poll, STATUS_POLL_INTERVAL_MS);\n } catch (err) {\n console.error(\"[SignedDocumentPreview] Failed to poll signed document status:\", err);\n attempts += 1;\n if (attempts >= MAX_STATUS_POLL_ATTEMPTS) {\n if (!cancelledRef.current) setStatus(\"error\");\n return;\n }\n timer = setTimeout(poll, STATUS_POLL_INTERVAL_MS);\n }\n };\n\n poll();\n\n return () => {\n cancelledRef.current = true;\n if (timer) clearTimeout(timer);\n };\n }, [sessionId, nodeId]);\n\n if (status === \"polling\") {\n return (\n <LoadingState\n message={t(\"signed_document.loading\", \"Préparation du document signé...\")}\n subtitle=\"\"\n />\n );\n }\n\n const formattedDate = completedAt\n ? new Intl.DateTimeFormat(i18n.language || \"fr\", {\n day: \"numeric\",\n month: \"long\",\n year: \"numeric\",\n }).format(new Date(completedAt))\n : null;\n\n return (\n <MobilePageLayout\n footer={\n <PageActions\n primary={\n <Button onClick={onContinue} type=\"button\">\n {t(\"buttons.continue\", \"Continuer\")}\n </Button>\n }\n />\n }\n >\n <div className=\"flex flex-col items-center h-full px-4 py-8 md:px-8 text-center gap-6\">\n {logo && <img src={logo} alt=\"\" className=\"h-12 max-w-[200px] object-contain\" />}\n\n {status === \"ready\" && viewUrl && (\n <>\n <Title>{title}</Title>\n\n <div className=\"w-full max-w-md bg-gray-50 rounded-lg p-4 flex items-start gap-3 text-left\">\n <PenTool className=\"w-5 h-5 shrink-0 mt-0.5 text-gray-500\" />\n <div>\n <p className=\"font-semibold text-gray-900 break-all\">{nodeTitle}</p>\n {formattedDate && (\n <p className=\"text-xs text-gray-500 mt-1\">\n {t(\"signed_document.submitted_on\", \"Soumis le\")} {formattedDate}\n </p>\n )}\n </div>\n </div>\n\n <p className=\"text-sm text-gray-600 whitespace-pre-line\">\n {description}\n </p>\n\n <a\n href={viewUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary underline font-medium\"\n >\n {t(\"signed_document.view_link\", \"Consulter le document ↗\")}\n </a>\n\n <p className=\"text-sm text-gray-600 whitespace-pre-line\">\n {downloadHint}\n </p>\n </>\n )}\n\n {status === \"error\" && (\n <p className=\"text-sm text-gray-600 py-8\">\n {t(\n \"signed_document.error\",\n \"Le document n'a pas pu être chargé, mais votre signature est bien enregistrée. Vous pouvez continuer.\",\n )}\n </p>\n )}\n {status === \"declined\" && (\n <p className=\"text-sm text-gray-600 py-8\">\n {t(\"signed_document.declined\", \"Vous avez refusé de signer ce document.\")}\n </p>\n )}\n {status === \"expired\" && (\n <p className=\"text-sm text-gray-600 py-8\">\n {t(\"signed_document.expired\", \"Le lien de signature a expiré.\")}\n </p>\n )}\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default SignedDocumentPreview;\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":";;;;;;;;;;;;;AAuBA,IAAM,uBAAuB,GAAG,IAAI;AACpC;AACA;AACA,IAAM,wBAAwB,GAAG,EAAE;AAEnC,IAAM,qBAAqB,GAAyC,UAAC,EAUpE,EAAA;QATG,SAAS,GAAA,EAAA,CAAA,SAAA,EACT,MAAM,GAAA,EAAA,CAAA,MAAA,EACN,SAAS,GAAA,EAAA,CAAA,SAAA,EACT,WAAW,GAAA,EAAA,CAAA,WAAA,EACX,IAAI,UAAA,EACG,SAAS,GAAA,EAAA,CAAA,KAAA,EACH,eAAe,GAAA,EAAA,CAAA,WAAA,EACd,gBAAgB,GAAA,EAAA,CAAA,YAAA,EAC9B,UAAU,GAAA,EAAA,CAAA,UAAA;AAEJ,IAAA,IAAA,KAAc,cAAc,CAAC,aAAa,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAA5D,CAAC,OAAA,EAAE,IAAI,UAAqD;AACpE,IAAA,IAAM,KAAK,GAAG,CAAA,SAAS,KAAA,IAAA,IAAT,SAAS,uBAAT,SAAS,CAAE,IAAI,EAAE,KAAI,CAAC,CAAC,uBAAuB,EAAE,0BAA0B,CAAC;AACzF,IAAA,IAAM,WAAW,GAAG,CAAA,eAAe,KAAA,IAAA,IAAf,eAAe,uBAAf,eAAe,CAAE,IAAI,EAAE,KAAI,CAAC,CAC5C,4BAA4B,EAC5B,oFAAoF,CACvF;AACD,IAAA,IAAM,YAAY,GAAG,CAAA,gBAAgB,KAAA,IAAA,IAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,IAAI,EAAE,KAAI,CAAC,CAC9C,+BAA+B,EAC/B,wFAAwF,CAC3F;IACK,IAAA,EAAA,GAAsB,QAAQ,CAChC,SAAS,CACZ,EAFM,MAAM,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,SAAS,GAAA,EAAA,CAAA,CAAA,CAEvB;IACK,IAAA,EAAA,GAAwB,QAAQ,CAAgB,IAAI,CAAC,EAApD,OAAO,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,UAAU,GAAA,EAAA,CAAA,CAAA,CAAiC;AAC3D,IAAA,IAAM,YAAY,GAAG,MAAM,CAAC,KAAK,CAAC;AAElC,IAAA,SAAS,CAAC,YAAA;AACN,QAAA,YAAY,CAAC,OAAO,GAAG,KAAK;QAC5B,IAAI,QAAQ,GAAG,CAAC;AAChB,QAAA,IAAI,KAAgD;AAEpD,QAAA,IAAM,eAAe,GAAG,YAAA,EAAA,OAAA,SAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,YAAA;;;;;4BACH,OAAA,CAAA,CAAA,YAAM,UAAU,CAAC,GAAG,CACjC,eAAA,CAAA,MAAA,CAAgB,SAAS,EAAA,mBAAA,CAAA,CAAA,MAAA,CAAoB,MAAM,EAAA,cAAA,CAAc,CACpE,CAAA;;AAFK,wBAAA,QAAQ,GAAG,EAAA,CAAA,IAAA,EAEhB;wBACK,KAAK,GAAG,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,QAAQ,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,KAAK;wBACxC,IAAI,CAAC,KAAK,EAAE;AACR,4BAAA,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC;wBAC3D;wBAEM,OAAO,GAAG,CAAC,UAAU,CAAC,YAAY,EAAE,CAAC,QAAQ,CAAC,OAAO,IAAI,EAAE,EAAE,OAAO,CACtE,MAAM,EACN,EAAE,CACL;wBACK,IAAI,GAAG,uBAAgB,SAAS,EAAA,mBAAA,CAAA,CAAA,MAAA,CAAoB,MAAM,EAAA,cAAA,CAAA,CAAA,MAAA,CAAe,KAAK,CAAE;AAEtF,wBAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE;AACvB,4BAAA,UAAU,CAAC,OAAO,GAAG,EAAA,CAAA,MAAA,CAAG,OAAO,CAAA,CAAA,MAAA,CAAG,IAAI,CAAE,GAAG,IAAI,CAAC;4BAChD,SAAS,CAAC,OAAO,CAAC;wBACtB;;;;aACH;AAED,QAAA,IAAM,IAAI,GAAG,YAAA,EAAA,OAAA,SAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,YAAA;;;;;;;wBAEkB,OAAA,CAAA,CAAA,YAAM,UAAU,CAAC,GAAG,CACvC,eAAA,CAAA,MAAA,CAAgB,SAAS,EAAA,mBAAA,CAAA,CAAA,MAAA,CAAoB,MAAM,EAAA,SAAA,CAAS,CAC/D,CAAA;;AAFK,wBAAA,cAAc,GAAG,EAAA,CAAA,IAAA,EAEtB;AACK,wBAAA,KAAK,GAAG,CAAC,EAAC,MAAA,CAAA,EAAA,GAAA,cAAc,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,KAAK,CAAA;wBAC1C,KAAK,GAAG,CAAA,EAAA,GAAA,CAAA,EAAA,GAAA,cAAc,CAAC,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,IAAI,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,KAG1B;wBAEf,IAAI,KAAK,KAAK,UAAU,IAAI,KAAK,KAAK,SAAS,EAAE;4BAC7C,IAAI,CAAC,YAAY,CAAC,OAAO;gCAAE,SAAS,CAAC,KAAK,CAAC;4BAC3C,OAAA,CAAA,CAAA,YAAA;wBACJ;AAEI,wBAAA,IAAA,CAAA,KAAK,EAAL,OAAA,CAAA,CAAA,YAAA,CAAA,CAAA;;;;wBAEI,OAAA,CAAA,CAAA,YAAM,eAAe,EAAE,CAAA;;AAAvB,wBAAA,EAAA,CAAA,IAAA,EAAuB;wBACvB,OAAA,CAAA,CAAA,YAAA;;;;;;AAKA,wBAAA,OAAO,CAAC,KAAK,CACT,sDAAsD,EACtD,KAAG,CACN;;;wBAIT,QAAQ,IAAI,CAAC;AACb,wBAAA,IAAI,QAAQ,IAAI,wBAAwB,EAAE;4BACtC,IAAI,CAAC,YAAY,CAAC,OAAO;gCAAE,SAAS,CAAC,OAAO,CAAC;4BAC7C,OAAA,CAAA,CAAA,YAAA;wBACJ;AACA,wBAAA,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,uBAAuB,CAAC;;;;AAEjD,wBAAA,OAAO,CAAC,KAAK,CAAC,gEAAgE,EAAE,KAAG,CAAC;wBACpF,QAAQ,IAAI,CAAC;AACb,wBAAA,IAAI,QAAQ,IAAI,wBAAwB,EAAE;4BACtC,IAAI,CAAC,YAAY,CAAC,OAAO;gCAAE,SAAS,CAAC,OAAO,CAAC;4BAC7C,OAAA,CAAA,CAAA,YAAA;wBACJ;AACA,wBAAA,KAAK,GAAG,UAAU,CAAC,IAAI,EAAE,uBAAuB,CAAC;;;;;aAExD;AAED,QAAA,IAAI,EAAE;QAEN,OAAO,YAAA;AACH,YAAA,YAAY,CAAC,OAAO,GAAG,IAAI;AAC3B,YAAA,IAAI,KAAK;gBAAE,YAAY,CAAC,KAAK,CAAC;AAClC,QAAA,CAAC;AACL,IAAA,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AAEvB,IAAA,IAAI,MAAM,KAAK,SAAS,EAAE;AACtB,QAAA,QACIA,GAAA,CAAC,YAAY,IACT,OAAO,EAAE,CAAC,CAAC,yBAAyB,EAAE,kCAAkC,CAAC,EACzE,QAAQ,EAAC,EAAE,EAAA,CACb;IAEV;IAEA,IAAM,aAAa,GAAG;UAChB,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,EAAE;AAC3C,YAAA,GAAG,EAAE,SAAS;AACd,YAAA,KAAK,EAAE,MAAM;AACb,YAAA,IAAI,EAAE,SAAS;SAClB,CAAC,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,WAAW,CAAC;UAC/B,IAAI;IAEV,QACIA,IAAC,gBAAgB,EAAA,EACb,MAAM,EACFA,GAAA,CAAC,WAAW,EAAA,EACR,OAAO,EACHA,IAAC,MAAM,EAAA,EAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAC,QAAQ,EAAA,QAAA,EACrC,CAAC,CAAC,kBAAkB,EAAE,WAAW,CAAC,EAAA,CAC9B,EAAA,CAEf,YAGNC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,uEAAuE,EAAA,QAAA,EAAA,CACjF,IAAI,IAAID,GAAA,CAAA,KAAA,EAAA,EAAK,GAAG,EAAE,IAAI,EAAE,GAAG,EAAC,EAAE,EAAC,SAAS,EAAC,mCAAmC,EAAA,CAAG,EAE/E,MAAM,KAAK,OAAO,IAAI,OAAO,KAC1BC,IAAA,CAAAC,QAAA,EAAA,EAAA,QAAA,EAAA,CACIF,GAAA,CAAC,KAAK,EAAA,EAAA,QAAA,EAAE,KAAK,GAAS,EAEtBC,IAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,4EAA4E,EAAA,QAAA,EAAA,CACvFD,IAAC,OAAO,EAAA,EAAC,SAAS,EAAC,uCAAuC,EAAA,CAAG,EAC7DC,IAAA,CAAA,KAAA,EAAA,EAAA,QAAA,EAAA,CACID,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,uCAAuC,YAAE,SAAS,EAAA,CAAK,EACnE,aAAa,KACVC,YAAG,SAAS,EAAC,4BAA4B,EAAA,QAAA,EAAA,CACpC,CAAC,CAAC,8BAA8B,EAAE,WAAW,CAAC,EAAA,GAAA,EAAG,aAAa,CAAA,EAAA,CAC/D,CACP,CAAA,EAAA,CACC,CAAA,EAAA,CACJ,EAEND,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,2CAA2C,EAAA,QAAA,EACnD,WAAW,EAAA,CACZ,EAEJA,GAAA,CAAA,GAAA,EAAA,EACI,IAAI,EAAE,OAAO,EACb,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,qBAAqB,EACzB,SAAS,EAAC,oCAAoC,EAAA,QAAA,EAE7C,CAAC,CAAC,2BAA2B,EAAE,yBAAyB,CAAC,EAAA,CAC1D,EAEJA,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,2CAA2C,EAAA,QAAA,EACnD,YAAY,EAAA,CACb,CAAA,EAAA,CACL,CACN,EAEA,MAAM,KAAK,OAAO,KACfA,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,4BAA4B,EAAA,QAAA,EACpC,CAAC,CACE,uBAAuB,EACvB,uGAAuG,CAC1G,EAAA,CACD,CACP,EACA,MAAM,KAAK,UAAU,KAClBA,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,4BAA4B,EAAA,QAAA,EACpC,CAAC,CAAC,0BAA0B,EAAE,yCAAyC,CAAC,EAAA,CACzE,CACP,EACA,MAAM,KAAK,SAAS,KACjBA,GAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,4BAA4B,YACpC,CAAC,CAAC,yBAAyB,EAAE,gCAAgC,CAAC,GAC/D,CACP,CAAA,EAAA,CACC,EAAA,CACS;AAE3B;;;;"}
|
|
1
|
+
{"version":3,"file":"SignedDocumentPreview.js","sources":["../../../../../src/components/signature-electronic/SignedDocumentPreview.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from \"react\";\nimport { PenTool } from \"lucide-react\";\nimport { useTranslation } from \"react-i18next\";\nimport sdkI18n from \"../../i18n\";\nimport { apiService } from \"../../services/api\";\nimport LoadingState from \"../states/LoadingState\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport PageActions from \"../ui/PageActions\";\nimport Button from \"../ui/Button\";\nimport Title from \"../ui/Title\";\n\ninterface SignedDocumentPreviewProps {\n sessionId: string;\n nodeId: string;\n nodeTitle: string;\n completedAt: string | null;\n logo?: string;\n title?: string;\n description?: string;\n downloadHint?: string;\n onContinue: () => void;\n}\n\nconst STATUS_POLL_INTERVAL_MS = 2000;\n// DocuSeal flags a submission \"completed\" before generating the flattened\n// signed PDF — 15 attempts (30s) leaves enough margin for that async step.\nconst MAX_STATUS_POLL_ATTEMPTS = 15;\n\nconst SignedDocumentPreview: React.FC<SignedDocumentPreviewProps> = ({\n sessionId,\n nodeId,\n nodeTitle,\n completedAt,\n logo,\n title: propTitle,\n description: propDescription,\n downloadHint: propDownloadHint,\n onContinue,\n}) => {\n const { t, i18n } = useTranslation(\"translation\", { i18n: sdkI18n });\n const title = propTitle?.trim() || t(\"signed_document.title\", \"Votre document est signé\");\n const description = propDescription?.trim() || t(\n \"signed_document.ready_text\",\n \"Merci d'avoir signé le document, vous pouvez le consulter en cliquant ci-dessous :\",\n );\n const downloadHint = propDownloadHint?.trim() || t(\n \"signed_document.download_hint\",\n \"Si vous souhaitez conserver ce document, vous pouvez le télécharger depuis cette page.\",\n );\n const [status, setStatus] = useState<\"polling\" | \"ready\" | \"error\" | \"declined\" | \"expired\">(\n \"polling\",\n );\n const [viewUrl, setViewUrl] = useState<string | null>(null);\n const cancelledRef = useRef(false);\n\n useEffect(() => {\n cancelledRef.current = false;\n let attempts = 0;\n let objectUrl: string | undefined;\n let timer: ReturnType<typeof setTimeout> | undefined;\n\n const fetchAccessLink = async () => {\n const response = await apiService.get(\n `/session/sdk/${sessionId}/signed-document/${nodeId}.pdf`,\n { responseType: 'blob' },\n );\n if (!cancelledRef.current) {\n const url = URL.createObjectURL(response.data);\n objectUrl = url;\n setViewUrl(url);\n setStatus('ready');\n }\n };\n\n const poll = async () => {\n try {\n const statusResponse = await apiService.get(\n `/session/sdk/${sessionId}/signed-document/${nodeId}/status`,\n );\n const ready = !!statusResponse.data?.data?.ready;\n const error = statusResponse.data?.data?.error as\n | \"declined\"\n | \"expired\"\n | undefined;\n\n if (error === \"declined\" || error === \"expired\") {\n if (!cancelledRef.current) setStatus(error);\n return;\n }\n\n if (ready) {\n try {\n await fetchAccessLink();\n return;\n } catch (err) {\n // DocuSeal can report the submission \"completed\" before the\n // signed document is actually linked — treat like \"not ready\n // yet\" instead of failing permanently on the first miss.\n console.error(\n \"[SignedDocumentPreview] Failed to fetch access link:\",\n err,\n );\n }\n }\n\n attempts += 1;\n if (attempts >= MAX_STATUS_POLL_ATTEMPTS) {\n if (!cancelledRef.current) setStatus(\"error\");\n return;\n }\n timer = setTimeout(poll, STATUS_POLL_INTERVAL_MS);\n } catch (err) {\n console.error(\"[SignedDocumentPreview] Failed to poll signed document status:\", err);\n attempts += 1;\n if (attempts >= MAX_STATUS_POLL_ATTEMPTS) {\n if (!cancelledRef.current) setStatus(\"error\");\n return;\n }\n timer = setTimeout(poll, STATUS_POLL_INTERVAL_MS);\n }\n };\n\n poll();\n\n return () => {\n cancelledRef.current = true;\n if (timer) clearTimeout(timer);\n if (objectUrl) URL.revokeObjectURL(objectUrl);\n };\n }, [sessionId, nodeId]);\n\n if (status === \"polling\") {\n return (\n <LoadingState\n message={t(\"signed_document.loading\", \"Préparation du document signé...\")}\n subtitle=\"\"\n />\n );\n }\n\n const formattedDate = completedAt\n ? new Intl.DateTimeFormat(i18n.language || \"fr\", {\n day: \"numeric\",\n month: \"long\",\n year: \"numeric\",\n }).format(new Date(completedAt))\n : null;\n\n return (\n <MobilePageLayout\n footer={\n <PageActions\n primary={\n <Button onClick={onContinue} type=\"button\">\n {t(\"buttons.continue\", \"Continuer\")}\n </Button>\n }\n />\n }\n >\n <div className=\"flex flex-col items-center h-full px-4 py-8 md:px-8 text-center gap-6\">\n {logo && <img src={logo} alt=\"\" className=\"h-12 max-w-[200px] object-contain\" />}\n\n {status === \"ready\" && viewUrl && (\n <>\n <Title>{title}</Title>\n\n <div className=\"w-full max-w-md bg-gray-50 rounded-lg p-4 flex items-start gap-3 text-left\">\n <PenTool className=\"w-5 h-5 shrink-0 mt-0.5 text-gray-500\" />\n <div>\n <p className=\"font-semibold text-gray-900 break-all\">{nodeTitle}</p>\n {formattedDate && (\n <p className=\"text-xs text-gray-500 mt-1\">\n {t(\"signed_document.submitted_on\", \"Soumis le\")} {formattedDate}\n </p>\n )}\n </div>\n </div>\n\n <p className=\"text-sm text-gray-600 whitespace-pre-line\">\n {description}\n </p>\n\n <a\n href={viewUrl}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n className=\"text-primary underline font-medium\"\n >\n {t(\"signed_document.view_link\", \"Consulter le document ↗\")}\n </a>\n\n <p className=\"text-sm text-gray-600 whitespace-pre-line\">\n {downloadHint}\n </p>\n </>\n )}\n\n {status === \"error\" && (\n <p className=\"text-sm text-gray-600 py-8\">\n {t(\n \"signed_document.error\",\n \"Le document n'a pas pu être chargé, mais votre signature est bien enregistrée. Vous pouvez continuer.\",\n )}\n </p>\n )}\n {status === \"declined\" && (\n <p className=\"text-sm text-gray-600 py-8\">\n {t(\"signed_document.declined\", \"Vous avez refusé de signer ce document.\")}\n </p>\n )}\n {status === \"expired\" && (\n <p className=\"text-sm text-gray-600 py-8\">\n {t(\"signed_document.expired\", \"Le lien de signature a expiré.\")}\n </p>\n )}\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default SignedDocumentPreview;\n"],"names":["_jsx","_jsxs","_Fragment"],"mappings":"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"}
|