datakeen-session-react 1.1.140-dev.96 → 1.1.140-oid4vp-demo.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.gitlab-ci.yml +37 -0
- package/dist/cjs/components/document-collection/DocumentCollection.js +132 -22
- package/dist/cjs/components/document-collection/DocumentCollection.js.map +1 -1
- package/dist/cjs/components/session/DocumentCheck.js +112 -15
- package/dist/cjs/components/session/DocumentCheck.js.map +1 -1
- package/dist/cjs/components/session/UserInputForm/LegalRepFields.js +45 -0
- package/dist/cjs/components/session/UserInputForm/LegalRepFields.js.map +1 -0
- package/dist/cjs/components/session/UserInputForm.js +2 -1
- package/dist/cjs/components/session/UserInputForm.js.map +1 -1
- package/dist/cjs/components/template/TemplateNodeRenderer.js +5 -1
- package/dist/cjs/components/template/TemplateNodeRenderer.js.map +1 -1
- package/dist/cjs/components/wallet/AgeControl.js +75 -0
- package/dist/cjs/components/wallet/AgeControl.js.map +1 -0
- package/dist/cjs/components/wallet/WalletProposal.js +27 -0
- package/dist/cjs/components/wallet/WalletProposal.js.map +1 -0
- package/dist/cjs/components/wallet/WalletSuccessAnimation.js +37 -0
- package/dist/cjs/components/wallet/WalletSuccessAnimation.js.map +1 -0
- package/dist/cjs/components/wallet/WalletVerificationStep.js +132 -0
- package/dist/cjs/components/wallet/WalletVerificationStep.js.map +1 -0
- package/dist/cjs/constants/userInputForm.js +2 -2
- package/dist/cjs/constants/userInputForm.js.map +1 -1
- package/dist/cjs/hooks/useUserInputForm.js +17 -1
- package/dist/cjs/hooks/useUserInputForm.js.map +1 -1
- package/dist/cjs/hooks/useWalletSseStatus.js +67 -0
- package/dist/cjs/hooks/useWalletSseStatus.js.map +1 -0
- package/dist/cjs/i18n/documents/documents.en.json.js +3 -0
- package/dist/cjs/i18n/documents/documents.en.json.js.map +1 -1
- package/dist/cjs/i18n/documents/documents.fr.json.js +3 -0
- package/dist/cjs/i18n/documents/documents.fr.json.js.map +1 -1
- package/dist/cjs/i18n/en.json.js +36 -2
- package/dist/cjs/i18n/en.json.js.map +1 -1
- package/dist/cjs/i18n/fr.json.js +36 -2
- package/dist/cjs/i18n/fr.json.js.map +1 -1
- package/dist/cjs/services/sessionService.js +57 -0
- package/dist/cjs/services/sessionService.js.map +1 -1
- package/dist/cjs/types/session.js.map +1 -1
- package/dist/cjs/utils/userInputForm.js +1 -0
- package/dist/cjs/utils/userInputForm.js.map +1 -1
- package/dist/esm/components/document-collection/DocumentCollection.js +132 -22
- package/dist/esm/components/document-collection/DocumentCollection.js.map +1 -1
- package/dist/esm/components/session/DocumentCheck.js +113 -16
- package/dist/esm/components/session/DocumentCheck.js.map +1 -1
- package/dist/esm/components/session/UserInputForm/LegalRepFields.js +22 -0
- package/dist/esm/components/session/UserInputForm/LegalRepFields.js.map +1 -0
- package/dist/esm/components/session/UserInputForm.js +2 -1
- package/dist/esm/components/session/UserInputForm.js.map +1 -1
- package/dist/esm/components/template/TemplateNodeRenderer.js +5 -1
- package/dist/esm/components/template/TemplateNodeRenderer.js.map +1 -1
- package/dist/esm/components/wallet/AgeControl.js +71 -0
- package/dist/esm/components/wallet/AgeControl.js.map +1 -0
- package/dist/esm/components/wallet/WalletProposal.js +23 -0
- package/dist/esm/components/wallet/WalletProposal.js.map +1 -0
- package/dist/esm/components/wallet/WalletSuccessAnimation.js +33 -0
- package/dist/esm/components/wallet/WalletSuccessAnimation.js.map +1 -0
- package/dist/esm/components/wallet/WalletVerificationStep.js +128 -0
- package/dist/esm/components/wallet/WalletVerificationStep.js.map +1 -0
- package/dist/esm/constants/userInputForm.js +2 -2
- package/dist/esm/constants/userInputForm.js.map +1 -1
- package/dist/esm/hooks/useUserInputForm.js +17 -1
- package/dist/esm/hooks/useUserInputForm.js.map +1 -1
- package/dist/esm/hooks/useWalletSseStatus.js +65 -0
- package/dist/esm/hooks/useWalletSseStatus.js.map +1 -0
- package/dist/esm/i18n/documents/documents.en.json.js +3 -1
- package/dist/esm/i18n/documents/documents.en.json.js.map +1 -1
- package/dist/esm/i18n/documents/documents.fr.json.js +3 -1
- package/dist/esm/i18n/documents/documents.fr.json.js.map +1 -1
- package/dist/esm/i18n/en.json.js +35 -3
- package/dist/esm/i18n/en.json.js.map +1 -1
- package/dist/esm/i18n/fr.json.js +35 -3
- package/dist/esm/i18n/fr.json.js.map +1 -1
- package/dist/esm/services/sessionService.js +55 -1
- package/dist/esm/services/sessionService.js.map +1 -1
- package/dist/esm/types/session.js.map +1 -1
- package/dist/esm/utils/userInputForm.js +1 -0
- package/dist/esm/utils/userInputForm.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var tslib_es6 = require('../../node_modules/tslib/tslib.es6.js');
|
|
6
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
7
|
+
var React = require('react');
|
|
8
|
+
var QRCode = require('qrcode');
|
|
9
|
+
var useI18n = require('../../hooks/useI18n.js');
|
|
10
|
+
var useWalletSseStatus = require('../../hooks/useWalletSseStatus.js');
|
|
11
|
+
var api = require('../../services/api.js');
|
|
12
|
+
var sessionService = require('../../services/sessionService.js');
|
|
13
|
+
var isMobileDevice = require('../../utils/isMobileDevice.js');
|
|
14
|
+
var MobilePageLayout = require('../ui/MobilePageLayout.js');
|
|
15
|
+
var Button = require('../ui/Button.js');
|
|
16
|
+
var Title = require('../ui/Title.js');
|
|
17
|
+
var Subtitle = require('../ui/Subtitle.js');
|
|
18
|
+
var WalletSuccessAnimation = require('./WalletSuccessAnimation.js');
|
|
19
|
+
|
|
20
|
+
var WalletVerificationStep = function (_a) {
|
|
21
|
+
var sessionId = _a.sessionId, nodeId = _a.nodeId, credentialType = _a.credentialType, walletMode = _a.walletMode, minimumAge = _a.minimumAge, onCompleted = _a.onCompleted, onFailedOrDeclined = _a.onFailedOrDeclined, pageTitle = _a.pageTitle, pageDescription = _a.pageDescription;
|
|
22
|
+
var t = useI18n.useI18n().t;
|
|
23
|
+
var canvasRef = React.useRef(null);
|
|
24
|
+
var _b = React.useState(null), qrError = _b[0], setQrError = _b[1];
|
|
25
|
+
var _c = React.useState(null), deepLink = _c[0], setDeepLink = _c[1];
|
|
26
|
+
var _d = React.useState(null), startError = _d[0], setStartError = _d[1];
|
|
27
|
+
var isMobile = React.useMemo(function () { return isMobileDevice.isMobileDevice(); }, []);
|
|
28
|
+
var apiBaseUrl = React.useMemo(function () { return api.getBaseURL(); }, []);
|
|
29
|
+
React.useEffect(function () {
|
|
30
|
+
var cancelled = false;
|
|
31
|
+
(function () { return tslib_es6.__awaiter(void 0, void 0, void 0, function () {
|
|
32
|
+
var result, error_1;
|
|
33
|
+
return tslib_es6.__generator(this, function (_a) {
|
|
34
|
+
switch (_a.label) {
|
|
35
|
+
case 0:
|
|
36
|
+
_a.trys.push([0, 2, , 3]);
|
|
37
|
+
return [4 /*yield*/, sessionService.startWalletVerification(sessionId, {
|
|
38
|
+
nodeId: nodeId,
|
|
39
|
+
credentialType: credentialType,
|
|
40
|
+
minimumAge: minimumAge,
|
|
41
|
+
})];
|
|
42
|
+
case 1:
|
|
43
|
+
result = _a.sent();
|
|
44
|
+
if (!cancelled)
|
|
45
|
+
setDeepLink(result.deepLink);
|
|
46
|
+
return [3 /*break*/, 3];
|
|
47
|
+
case 2:
|
|
48
|
+
error_1 = _a.sent();
|
|
49
|
+
console.error("Failed to start wallet verification:", error_1);
|
|
50
|
+
if (!cancelled) {
|
|
51
|
+
setStartError(t("wallet.verification.start_failed", "Impossible de démarrer la vérification par wallet."));
|
|
52
|
+
}
|
|
53
|
+
return [3 /*break*/, 3];
|
|
54
|
+
case 3: return [2 /*return*/];
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
}); })();
|
|
58
|
+
return function () {
|
|
59
|
+
cancelled = true;
|
|
60
|
+
};
|
|
61
|
+
}, [sessionId, nodeId, credentialType, minimumAge, t]);
|
|
62
|
+
var status = useWalletSseStatus.useWalletSseStatus({
|
|
63
|
+
sessionId: sessionId,
|
|
64
|
+
apiBaseUrl: apiBaseUrl,
|
|
65
|
+
onCompleted: onCompleted,
|
|
66
|
+
}).status;
|
|
67
|
+
// Sur mobile : ouvrir directement l'app wallet via le deep-link openid4vp://,
|
|
68
|
+
// une seule fois, tant que la vérification n'a pas progressé.
|
|
69
|
+
var hasRedirectedRef = React.useRef(false);
|
|
70
|
+
React.useEffect(function () {
|
|
71
|
+
if (!isMobile || !deepLink || status !== "pending" || hasRedirectedRef.current)
|
|
72
|
+
return;
|
|
73
|
+
hasRedirectedRef.current = true;
|
|
74
|
+
window.location.assign(deepLink);
|
|
75
|
+
}, [isMobile, deepLink, status]);
|
|
76
|
+
React.useEffect(function () {
|
|
77
|
+
if (isMobile)
|
|
78
|
+
return; // pas de QR sur mobile (redirection directe)
|
|
79
|
+
if (!deepLink || status !== "pending")
|
|
80
|
+
return;
|
|
81
|
+
var generate = function () { return tslib_es6.__awaiter(void 0, void 0, void 0, function () {
|
|
82
|
+
var dataUrl, canvas_1, ctx_1, img_1;
|
|
83
|
+
return tslib_es6.__generator(this, function (_b) {
|
|
84
|
+
switch (_b.label) {
|
|
85
|
+
case 0:
|
|
86
|
+
if (!canvasRef.current)
|
|
87
|
+
return [2 /*return*/];
|
|
88
|
+
setQrError(null);
|
|
89
|
+
_b.label = 1;
|
|
90
|
+
case 1:
|
|
91
|
+
_b.trys.push([1, 3, , 4]);
|
|
92
|
+
return [4 /*yield*/, QRCode.toDataURL(deepLink, {
|
|
93
|
+
width: 256,
|
|
94
|
+
margin: 2,
|
|
95
|
+
color: { dark: "#000000", light: "#FFFFFF" },
|
|
96
|
+
})];
|
|
97
|
+
case 2:
|
|
98
|
+
dataUrl = _b.sent();
|
|
99
|
+
canvas_1 = canvasRef.current;
|
|
100
|
+
ctx_1 = canvas_1.getContext("2d");
|
|
101
|
+
if (ctx_1) {
|
|
102
|
+
img_1 = new Image();
|
|
103
|
+
img_1.onload = function () {
|
|
104
|
+
canvas_1.width = img_1.width;
|
|
105
|
+
canvas_1.height = img_1.height;
|
|
106
|
+
ctx_1.drawImage(img_1, 0, 0);
|
|
107
|
+
};
|
|
108
|
+
img_1.src = dataUrl;
|
|
109
|
+
}
|
|
110
|
+
return [3 /*break*/, 4];
|
|
111
|
+
case 3:
|
|
112
|
+
_b.sent();
|
|
113
|
+
setQrError(t("qr_code.generation_failed", "Erreur de génération du QR code"));
|
|
114
|
+
return [3 /*break*/, 4];
|
|
115
|
+
case 4: return [2 /*return*/];
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
}); };
|
|
119
|
+
generate();
|
|
120
|
+
}, [deepLink, status, t, isMobile]);
|
|
121
|
+
var title = pageTitle || t("wallet.verification.page_title", "Identification par wallet");
|
|
122
|
+
var subtitle = pageDescription ||
|
|
123
|
+
t("wallet.verification.page_description", "Scannez le QR code ci-dessous avec votre wallet d'identité pour vous identifier en ligne.");
|
|
124
|
+
var declineLabel = walletMode === "walletOrPhoto"
|
|
125
|
+
? t("wallet.verification.continue_with_photo", "Continuer avec une photo")
|
|
126
|
+
: t("wallet.verification.skip", "Passer");
|
|
127
|
+
var footer = status === "failed" || startError ? (jsxRuntime.jsx(Button.default, { onClick: onFailedOrDeclined, children: declineLabel })) : null;
|
|
128
|
+
return (jsxRuntime.jsx(MobilePageLayout.default, { footer: footer, children: jsxRuntime.jsx("div", { className: "px-4 py-6 pt-11 md:px-8 md:py-8", children: jsxRuntime.jsxs("div", { className: "w-full max-w-md mx-auto space-y-6", children: [jsxRuntime.jsxs("div", { className: "text-center space-y-4 mt-16 md:mt-20", children: [jsxRuntime.jsx(Title.default, { className: "text-xl md:text-2xl lg:text-3xl", children: title }), jsxRuntime.jsx(Subtitle.default, { className: "text-sm md:text-base text-gray-600 leading-relaxed whitespace-pre-line", children: subtitle })] }), jsxRuntime.jsx("div", { className: "flex-1 flex justify-center items-center", children: startError ? (jsxRuntime.jsx("div", { className: "text-red-500 text-center p-4", "data-cy": "wallet-start-error", children: startError })) : status === "success" ? (jsxRuntime.jsx(WalletSuccessAnimation.default, {})) : status === "completed" ? (jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-4 p-8", children: [jsxRuntime.jsx("div", { className: "animate-spin w-10 h-10 border-2 border-gray-300 border-t-blue-500 rounded-full" }), jsxRuntime.jsx("p", { className: "text-sm text-gray-600", children: t("wallet.verification.verifying", "Vérification en cours…") })] })) : status === "failed" ? (jsxRuntime.jsx("div", { className: "w-full max-w-sm rounded-2xl border border-red-200 bg-red-50 p-6 text-center shadow-sm", "data-cy": "wallet-verification-failed", children: jsxRuntime.jsx("p", { className: "text-sm leading-relaxed text-red-700", children: t("wallet.verification.failed", "La vérification par wallet a échoué.") }) })) : qrError ? (jsxRuntime.jsx("div", { className: "text-red-500 text-center p-4", children: qrError })) : isMobile ? (jsxRuntime.jsxs("div", { className: "flex flex-col items-center gap-4 p-8 text-center", children: [jsxRuntime.jsx("div", { className: "animate-spin w-10 h-10 border-2 border-gray-300 border-t-blue-500 rounded-full" }), jsxRuntime.jsx("p", { className: "text-sm text-gray-600", children: t("wallet.verification.opening_app", "Ouverture du wallet…") }), deepLink && (jsxRuntime.jsx("a", { href: deepLink, className: "text-sm font-medium text-blue-600 underline", children: t("wallet.verification.open_app_link", "Ouvrir mon wallet") }))] })) : deepLink ? (jsxRuntime.jsx("div", { className: "bg-white p-4 rounded-lg shadow-lg border-2 border-gray-200", "data-cy": "wallet-qr-code", children: jsxRuntime.jsx("canvas", { ref: canvasRef }) })) : (jsxRuntime.jsx("div", { className: "flex flex-col items-center gap-4 p-8", children: jsxRuntime.jsx("div", { className: "animate-spin w-10 h-10 border-2 border-gray-300 border-t-blue-500 rounded-full" }) })) })] }) }) }));
|
|
129
|
+
};
|
|
130
|
+
|
|
131
|
+
exports.default = WalletVerificationStep;
|
|
132
|
+
//# sourceMappingURL=WalletVerificationStep.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WalletVerificationStep.js","sources":["../../../../../src/components/wallet/WalletVerificationStep.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport QRCode from \"qrcode\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport { useWalletSseStatus } from \"../../hooks/useWalletSseStatus\";\nimport { getBaseURL } from \"../../services/api\";\nimport { startWalletVerification } from \"../../services/sessionService\";\nimport { isMobileDevice } from \"../../utils/isMobileDevice\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport Button from \"../ui/Button\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport WalletSuccessAnimation from \"./WalletSuccessAnimation\";\n\nexport type WalletCredentialType =\n | \"pid\"\n | \"driving_license\"\n | \"vehicle_registration\"\n | \"age_verification\";\n\ninterface WalletVerificationStepProps {\n sessionId: string;\n nodeId: string;\n credentialType: WalletCredentialType;\n walletMode: \"walletOnly\" | \"walletOrPhoto\";\n minimumAge?: number;\n onCompleted: () => void;\n /** Échec de la vérification ou wallet non disponible — le parent décide de la\n * suite (fallback photo en walletOrPhoto, saut du nœud en walletOnly). */\n onFailedOrDeclined: () => void;\n pageTitle?: string;\n pageDescription?: string;\n}\n\nconst WalletVerificationStep: React.FC<WalletVerificationStepProps> = ({\n sessionId,\n nodeId,\n credentialType,\n walletMode,\n minimumAge,\n onCompleted,\n onFailedOrDeclined,\n pageTitle,\n pageDescription,\n}) => {\n const { t } = useI18n();\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [qrError, setQrError] = useState<string | null>(null);\n const [deepLink, setDeepLink] = useState<string | null>(null);\n const [startError, setStartError] = useState<string | null>(null);\n const isMobile = useMemo(() => isMobileDevice(), []);\n const apiBaseUrl = useMemo(() => getBaseURL(), []);\n\n useEffect(() => {\n let cancelled = false;\n (async () => {\n try {\n const result = await startWalletVerification(sessionId, {\n nodeId,\n credentialType,\n minimumAge,\n });\n if (!cancelled) setDeepLink(result.deepLink);\n } catch (error) {\n console.error(\"Failed to start wallet verification:\", error);\n if (!cancelled) {\n setStartError(\n t(\n \"wallet.verification.start_failed\",\n \"Impossible de démarrer la vérification par wallet.\",\n ),\n );\n }\n }\n })();\n return () => {\n cancelled = true;\n };\n }, [sessionId, nodeId, credentialType, minimumAge, t]);\n\n const { status } = useWalletSseStatus({\n sessionId,\n apiBaseUrl,\n onCompleted,\n });\n\n // Sur mobile : ouvrir directement l'app wallet via le deep-link openid4vp://,\n // une seule fois, tant que la vérification n'a pas progressé.\n const hasRedirectedRef = useRef(false);\n useEffect(() => {\n if (!isMobile || !deepLink || status !== \"pending\" || hasRedirectedRef.current) return;\n hasRedirectedRef.current = true;\n window.location.assign(deepLink);\n }, [isMobile, deepLink, status]);\n\n useEffect(() => {\n if (isMobile) return; // pas de QR sur mobile (redirection directe)\n if (!deepLink || status !== \"pending\") return;\n\n const generate = async () => {\n if (!canvasRef.current) return;\n setQrError(null);\n try {\n const dataUrl = await QRCode.toDataURL(deepLink, {\n width: 256,\n margin: 2,\n color: { dark: \"#000000\", light: \"#FFFFFF\" },\n });\n const canvas = canvasRef.current;\n const ctx = canvas.getContext(\"2d\");\n if (ctx) {\n const img = new Image();\n img.onload = () => {\n canvas.width = img.width;\n canvas.height = img.height;\n ctx.drawImage(img, 0, 0);\n };\n img.src = dataUrl;\n }\n } catch {\n setQrError(t(\"qr_code.generation_failed\", \"Erreur de génération du QR code\"));\n }\n };\n\n generate();\n }, [deepLink, status, t, isMobile]);\n\n const title = pageTitle || t(\"wallet.verification.page_title\", \"Identification par wallet\");\n const subtitle =\n pageDescription ||\n t(\n \"wallet.verification.page_description\",\n \"Scannez le QR code ci-dessous avec votre wallet d'identité pour vous identifier en ligne.\",\n );\n\n const declineLabel =\n walletMode === \"walletOrPhoto\"\n ? t(\"wallet.verification.continue_with_photo\", \"Continuer avec une photo\")\n : t(\"wallet.verification.skip\", \"Passer\");\n\n const footer =\n status === \"failed\" || startError ? (\n <Button onClick={onFailedOrDeclined}>\n {declineLabel}\n </Button>\n ) : null;\n\n return (\n <MobilePageLayout footer={footer}>\n <div className=\"px-4 py-6 pt-11 md:px-8 md:py-8\">\n <div className=\"w-full max-w-md mx-auto space-y-6\">\n <div className=\"text-center space-y-4 mt-16 md:mt-20\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl\">{title}</Title>\n <Subtitle className=\"text-sm md:text-base text-gray-600 leading-relaxed whitespace-pre-line\">\n {subtitle}\n </Subtitle>\n </div>\n\n <div className=\"flex-1 flex justify-center items-center\">\n {startError ? (\n <div className=\"text-red-500 text-center p-4\" data-cy=\"wallet-start-error\">\n {startError}\n </div>\n ) : status === \"success\" ? (\n <WalletSuccessAnimation />\n ) : status === \"completed\" ? (\n <div className=\"flex flex-col items-center gap-4 p-8\">\n <div className=\"animate-spin w-10 h-10 border-2 border-gray-300 border-t-blue-500 rounded-full\" />\n <p className=\"text-sm text-gray-600\">\n {t(\"wallet.verification.verifying\", \"Vérification en cours…\")}\n </p>\n </div>\n ) : status === \"failed\" ? (\n <div\n className=\"w-full max-w-sm rounded-2xl border border-red-200 bg-red-50 p-6 text-center shadow-sm\"\n data-cy=\"wallet-verification-failed\"\n >\n <p className=\"text-sm leading-relaxed text-red-700\">\n {t(\n \"wallet.verification.failed\",\n \"La vérification par wallet a échoué.\",\n )}\n </p>\n </div>\n ) : qrError ? (\n <div className=\"text-red-500 text-center p-4\">{qrError}</div>\n ) : isMobile ? (\n <div className=\"flex flex-col items-center gap-4 p-8 text-center\">\n <div className=\"animate-spin w-10 h-10 border-2 border-gray-300 border-t-blue-500 rounded-full\" />\n <p className=\"text-sm text-gray-600\">\n {t(\"wallet.verification.opening_app\", \"Ouverture du wallet…\")}\n </p>\n {deepLink && (\n <a href={deepLink} className=\"text-sm font-medium text-blue-600 underline\">\n {t(\"wallet.verification.open_app_link\", \"Ouvrir mon wallet\")}\n </a>\n )}\n </div>\n ) : deepLink ? (\n <div\n className=\"bg-white p-4 rounded-lg shadow-lg border-2 border-gray-200\"\n data-cy=\"wallet-qr-code\"\n >\n <canvas ref={canvasRef} />\n </div>\n ) : (\n <div className=\"flex flex-col items-center gap-4 p-8\">\n <div className=\"animate-spin w-10 h-10 border-2 border-gray-300 border-t-blue-500 rounded-full\" />\n </div>\n )}\n </div>\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default WalletVerificationStep;\n"],"names":["useI18n","useRef","useState","useMemo","isMobileDevice","getBaseURL","useEffect","__awaiter","startWalletVerification","useWalletSseStatus","_jsx","Button","MobilePageLayout","_jsxs","Title","Subtitle","WalletSuccessAnimation"],"mappings":"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"}
|
|
@@ -41,6 +41,7 @@ var ADDRESS_SUGGESTIONS = [
|
|
|
41
41
|
var DEFAULT_FIELDS = {
|
|
42
42
|
identity: ["nom", "prenom", "date_naissance"],
|
|
43
43
|
"identity-legal": ["nom", "registrationNumber", "siret", "tva", "adresse"],
|
|
44
|
+
"identity-legal-rep": ["legalRepresentativeNom", "legalRepresentativePrenom"],
|
|
44
45
|
contact: ["email", "sms"],
|
|
45
46
|
address: ["adresse"],
|
|
46
47
|
nationality: ["nationalite"],
|
|
@@ -56,8 +57,7 @@ var FIELD_LABELS = {
|
|
|
56
57
|
company: "user_input_form.fields.company_name",
|
|
57
58
|
siret: "user_input_form.fields.siret",
|
|
58
59
|
tva: "user_input_form.fields.vat_number",
|
|
59
|
-
registrationNumber: "user_input_form.fields.registration_number"
|
|
60
|
-
};
|
|
60
|
+
registrationNumber: "user_input_form.fields.registration_number"};
|
|
61
61
|
// Backend endpoint pour l'autocomplétion d'adresses (sécurisé)
|
|
62
62
|
var GEOCODING_AUTOCOMPLETE_ENDPOINT = "/geocoding/autocomplete";
|
|
63
63
|
var FALLBACK_ADDRESS_SUGGESTIONS = ADDRESS_SUGGESTIONS.map(function (label, index) { return ({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"userInputForm.js","sources":["../../../../src/constants/userInputForm.ts"],"sourcesContent":["import type {\n AddressSuggestion,\n InformationType,\n RequestedFieldKey,\n SelectOption,\n} from \"../types/userInputForm\";\n\nconst days = Array.from({ length: 31 }, (_, index) => index + 1);\nconst currentYear = new Date().getFullYear();\nconst years = Array.from({ length: 120 }, (_, index) => currentYear - index);\n\nconst monthLabels = [\n \"Janvier\",\n \"Février\",\n \"Mars\",\n \"Avril\",\n \"Mai\",\n \"Juin\",\n \"Juillet\",\n \"Août\",\n \"Septembre\",\n \"Octobre\",\n \"Novembre\",\n \"Décembre\",\n];\n\nexport const DAY_OPTIONS: SelectOption[] = days.map((value) => ({\n value: String(value).padStart(2, \"0\"),\n label: String(value).padStart(2, \"0\"),\n}));\n\nexport const MONTH_OPTIONS: SelectOption[] = monthLabels.map(\n (label, index) => ({\n value: String(index + 1).padStart(2, \"0\"),\n label,\n })\n);\n\nexport const YEAR_OPTIONS: SelectOption[] = years.map((value) => ({\n value: String(value),\n label: String(value),\n}));\n\n\nexport const ADDRESS_SUGGESTIONS: string[] = [\n \"10 Rue de Rivoli, 75001 Paris, France\",\n \"221B Baker Street, NW1 6XE Londres, Royaume-Uni\",\n \"1600 Amphitheatre Parkway, 94043 Mountain View, États-Unis\",\n \"55 Rue du Faubourg Saint-Honoré, 75008 Paris, France\",\n \"1 Place du Commerce, 44000 Nantes, France\",\n \"Piazza del Colosseo 1, 00184 Rome, Italie\",\n \"Av. Paulista 1578, 01310-200 São Paulo, Brésil\",\n];\n\nexport const DEFAULT_FIELDS: Record<InformationType, RequestedFieldKey[]> = {\n identity: [\"nom\", \"prenom\", \"date_naissance\"],\n \"identity-legal\": [\"nom\", \"registrationNumber\", \"siret\", \"tva\", \"adresse\"],\n contact: [\"email\", \"sms\"],\n address: [\"adresse\"],\n nationality: [\"nationalite\"],\n custom: [], // Custom forms use customFields instead\n};\n\nexport const FIELD_LABELS: Record<RequestedFieldKey, string> = {\n nom: \"user_input_form.fields.last_name\",\n prenom: \"user_input_form.fields.first_name\",\n date_naissance: \"user_input_form.fields.birth_date\",\n email: \"user_input_form.fields.email\",\n sms: \"user_input_form.fields.phone\",\n adresse: \"user_input_form.fields.address_line1\",\n nationalite: \"user_input_form.fields.nationality\",\n company: \"user_input_form.fields.company_name\",\n siret: \"user_input_form.fields.siret\",\n tva: \"user_input_form.fields.vat_number\",\n registrationNumber: \"user_input_form.fields.registration_number\",\n};\n\n// Backend endpoint pour l'autocomplétion d'adresses (sécurisé)\nexport const GEOCODING_AUTOCOMPLETE_ENDPOINT = \"/geocoding/autocomplete\";\n\nexport const FALLBACK_ADDRESS_SUGGESTIONS: AddressSuggestion[] =\n ADDRESS_SUGGESTIONS.map((label, index) => ({\n id: `fallback-${index}`,\n label,\n addressLine1: label,\n postalCode: \"\",\n city: \"\",\n country: \"\",\n }));\n"],"names":[],"mappings":";;AAOA,IAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,UAAC,CAAC,EAAE,KAAK,EAAA,EAAK,OAAA,KAAK,GAAG,CAAC,CAAA,CAAT,CAAS,CAAC;AAChE,IAAM,WAAW,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;AAC5C,IAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,UAAC,CAAC,EAAE,KAAK,EAAA,EAAK,OAAA,WAAW,GAAG,KAAK,CAAA,CAAnB,CAAmB,CAAC;AAE5E,IAAM,WAAW,GAAG;IAClB,SAAS;IACT,SAAS;IACT,MAAM;IACN,OAAO;IACP,KAAK;IACL,MAAM;IACN,SAAS;IACT,MAAM;IACN,WAAW;IACX,SAAS;IACT,UAAU;IACV,UAAU;CACX;AAEM,IAAM,WAAW,GAAmB,IAAI,CAAC,GAAG,CAAC,UAAC,KAAK,EAAA,EAAK,QAAC;IAC9D,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;IACrC,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;CACtC,EAAC,CAH6D,CAG7D;AAEK,IAAM,aAAa,GAAmB,WAAW,CAAC,GAAG,CAC1D,UAAC,KAAK,EAAE,KAAK,EAAA,EAAK,QAAC;AACjB,IAAA,KAAK,EAAE,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;AACzC,IAAA,KAAK,EAAA,KAAA;CACN,EAAC,CAHgB,CAGhB;AAGG,IAAM,YAAY,GAAmB,KAAK,CAAC,GAAG,CAAC,UAAC,KAAK,EAAA,EAAK,QAAC;AAChE,IAAA,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;AACpB,IAAA,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC;CACrB,EAAC,CAH+D,CAG/D;AAGK,IAAM,mBAAmB,GAAa;IAC3C,uCAAuC;IACvC,iDAAiD;IACjD,4DAA4D;IAC5D,sDAAsD;IACtD,2CAA2C;IAC3C,2CAA2C;IAC3C,gDAAgD;;AAG3C,IAAM,cAAc,GAAiD;AAC1E,IAAA,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,gBAAgB,CAAC;IAC7C,gBAAgB,EAAE,CAAC,KAAK,EAAE,oBAAoB,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC;AAC1E,IAAA,OAAO,EAAE,CAAC,OAAO,EAAE,KAAK,CAAC;IACzB,OAAO,EAAE,CAAC,SAAS,CAAC;IACpB,WAAW,EAAE,CAAC,aAAa,CAAC;IAC5B,MAAM,EAAE,EAAE;;AAGL,IAAM,YAAY,GAAsC;AAC7D,IAAA,GAAG,EAAE,kCAAkC;AACvC,IAAA,MAAM,EAAE,mCAAmC;AAC3C,IAAA,cAAc,EAAE,mCAAmC;AACnD,IAAA,KAAK,EAAE,8BAA8B;AACrC,IAAA,GAAG,EAAE,8BAA8B;AACnC,IACA,WAAW,EAAE,oCAAoC;AACjD,IAAA,OAAO,EAAE,qCAAqC;AAC9C,IAAA,KAAK,EAAE,8BAA8B;AACrC,IAAA,GAAG,EAAE,mCAAmC;AACxC,IAAA,kBAAkB,EAAE
|
|
1
|
+
{"version":3,"file":"userInputForm.js","sources":["../../../../src/constants/userInputForm.ts"],"sourcesContent":["import type {\n AddressSuggestion,\n InformationType,\n RequestedFieldKey,\n SelectOption,\n} from \"../types/userInputForm\";\n\nconst days = Array.from({ length: 31 }, (_, index) => index + 1);\nconst currentYear = new Date().getFullYear();\nconst years = Array.from({ length: 120 }, (_, index) => currentYear - index);\n\nconst monthLabels = [\n \"Janvier\",\n \"Février\",\n \"Mars\",\n \"Avril\",\n \"Mai\",\n \"Juin\",\n \"Juillet\",\n \"Août\",\n \"Septembre\",\n \"Octobre\",\n \"Novembre\",\n \"Décembre\",\n];\n\nexport const DAY_OPTIONS: SelectOption[] = days.map((value) => ({\n value: String(value).padStart(2, \"0\"),\n label: String(value).padStart(2, \"0\"),\n}));\n\nexport const MONTH_OPTIONS: SelectOption[] = monthLabels.map(\n (label, index) => ({\n value: String(index + 1).padStart(2, \"0\"),\n label,\n })\n);\n\nexport const YEAR_OPTIONS: SelectOption[] = years.map((value) => ({\n value: String(value),\n label: String(value),\n}));\n\n\nexport const ADDRESS_SUGGESTIONS: string[] = [\n \"10 Rue de Rivoli, 75001 Paris, France\",\n \"221B Baker Street, NW1 6XE Londres, Royaume-Uni\",\n \"1600 Amphitheatre Parkway, 94043 Mountain View, États-Unis\",\n \"55 Rue du Faubourg Saint-Honoré, 75008 Paris, France\",\n \"1 Place du Commerce, 44000 Nantes, France\",\n \"Piazza del Colosseo 1, 00184 Rome, Italie\",\n \"Av. Paulista 1578, 01310-200 São Paulo, Brésil\",\n];\n\nexport const DEFAULT_FIELDS: Record<InformationType, RequestedFieldKey[]> = {\n identity: [\"nom\", \"prenom\", \"date_naissance\"],\n \"identity-legal\": [\"nom\", \"registrationNumber\", \"siret\", \"tva\", \"adresse\"],\n \"identity-legal-rep\": [\"legalRepresentativeNom\", \"legalRepresentativePrenom\"],\n contact: [\"email\", \"sms\"],\n address: [\"adresse\"],\n nationality: [\"nationalite\"],\n custom: [], // Custom forms use customFields instead\n};\n\nexport const FIELD_LABELS: Record<RequestedFieldKey, string> = {\n nom: \"user_input_form.fields.last_name\",\n prenom: \"user_input_form.fields.first_name\",\n date_naissance: \"user_input_form.fields.birth_date\",\n email: \"user_input_form.fields.email\",\n sms: \"user_input_form.fields.phone\",\n adresse: \"user_input_form.fields.address_line1\",\n nationalite: \"user_input_form.fields.nationality\",\n company: \"user_input_form.fields.company_name\",\n siret: \"user_input_form.fields.siret\",\n tva: \"user_input_form.fields.vat_number\",\n registrationNumber: \"user_input_form.fields.registration_number\",\n legalRepresentativeNom:\n \"user_input_form.fields.legal_representative_last_name\",\n legalRepresentativePrenom:\n \"user_input_form.fields.legal_representative_first_name\",\n};\n\n// Backend endpoint pour l'autocomplétion d'adresses (sécurisé)\nexport const GEOCODING_AUTOCOMPLETE_ENDPOINT = \"/geocoding/autocomplete\";\n\nexport const FALLBACK_ADDRESS_SUGGESTIONS: AddressSuggestion[] =\n ADDRESS_SUGGESTIONS.map((label, index) => ({\n id: `fallback-${index}`,\n label,\n addressLine1: label,\n postalCode: \"\",\n city: \"\",\n country: \"\",\n }));\n"],"names":[],"mappings":"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"}
|
|
@@ -59,6 +59,8 @@ var useUserInputForm = function (_a) {
|
|
|
59
59
|
siret: (initialUserInput === null || initialUserInput === void 0 ? void 0 : initialUserInput.siret) || "",
|
|
60
60
|
tva: (initialUserInput === null || initialUserInput === void 0 ? void 0 : initialUserInput.tva) || "",
|
|
61
61
|
registrationNumber: (initialUserInput === null || initialUserInput === void 0 ? void 0 : initialUserInput.registrationNumber) || "",
|
|
62
|
+
legalRepresentativeLastName: (initialUserInput === null || initialUserInput === void 0 ? void 0 : initialUserInput.legalRepresentativeLastName) || "",
|
|
63
|
+
legalRepresentativeFirstName: (initialUserInput === null || initialUserInput === void 0 ? void 0 : initialUserInput.legalRepresentativeFirstName) || "",
|
|
62
64
|
}), form = _b[0], setForm = _b[1];
|
|
63
65
|
var _c = React.useState({}), errors = _c[0], setErrors = _c[1];
|
|
64
66
|
// Custom form state
|
|
@@ -367,6 +369,16 @@ var useUserInputForm = function (_a) {
|
|
|
367
369
|
markError("registrationNumber");
|
|
368
370
|
}
|
|
369
371
|
}
|
|
372
|
+
if (informationType === "identity-legal-rep") {
|
|
373
|
+
if (requestedFields.has("legalRepresentativeNom") &&
|
|
374
|
+
!form.legalRepresentativeLastName) {
|
|
375
|
+
markError("legalRepresentativeLastName");
|
|
376
|
+
}
|
|
377
|
+
if (requestedFields.has("legalRepresentativePrenom") &&
|
|
378
|
+
!form.legalRepresentativeFirstName) {
|
|
379
|
+
markError("legalRepresentativeFirstName");
|
|
380
|
+
}
|
|
381
|
+
}
|
|
370
382
|
if (informationType === "contact") {
|
|
371
383
|
if (requestedFields.has("email")) {
|
|
372
384
|
var emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
@@ -585,7 +597,7 @@ var useUserInputForm = function (_a) {
|
|
|
585
597
|
if (!validateForm()) {
|
|
586
598
|
return;
|
|
587
599
|
}
|
|
588
|
-
setUserInput(function (previous) { return (tslib_es6.__assign(tslib_es6.__assign(tslib_es6.__assign(tslib_es6.__assign(tslib_es6.__assign(tslib_es6.__assign(tslib_es6.__assign(tslib_es6.__assign(tslib_es6.__assign(tslib_es6.__assign(tslib_es6.__assign(tslib_es6.__assign({}, previous), (requestedFields.has("nom") && tslib_es6.__assign({}, (informationType === "identity-legal"
|
|
600
|
+
setUserInput(function (previous) { return (tslib_es6.__assign(tslib_es6.__assign(tslib_es6.__assign(tslib_es6.__assign(tslib_es6.__assign(tslib_es6.__assign(tslib_es6.__assign(tslib_es6.__assign(tslib_es6.__assign(tslib_es6.__assign(tslib_es6.__assign(tslib_es6.__assign(tslib_es6.__assign(tslib_es6.__assign({}, previous), (requestedFields.has("nom") && tslib_es6.__assign({}, (informationType === "identity-legal"
|
|
589
601
|
? { companyName: form.companyName }
|
|
590
602
|
: { lastName: form.lastName })))), (requestedFields.has("prenom") && { firstName: form.firstName })), (requestedFields.has("date_naissance") && {
|
|
591
603
|
birthDate: form.birthDate,
|
|
@@ -600,6 +612,10 @@ var useUserInputForm = function (_a) {
|
|
|
600
612
|
countryCode: form.countryCode,
|
|
601
613
|
})), (requestedFields.has("siret") && { siret: form.siret })), (requestedFields.has("tva") && { tva: form.tva })), (requestedFields.has("registrationNumber") && { registrationNumber: form.registrationNumber })), (requestedFields.has("siret") && !requestedFields.has("registrationNumber") && { registrationNumber: form.siret })), (requestedFields.has("nationalite") && {
|
|
602
614
|
nationality: form.nationality,
|
|
615
|
+
})), (requestedFields.has("legalRepresentativeNom") && {
|
|
616
|
+
legalRepresentativeLastName: form.legalRepresentativeLastName,
|
|
617
|
+
})), (requestedFields.has("legalRepresentativePrenom") && {
|
|
618
|
+
legalRepresentativeFirstName: form.legalRepresentativeFirstName,
|
|
603
619
|
}))); });
|
|
604
620
|
if (informationType === "contact" && setContactInfo) {
|
|
605
621
|
setContactInfo(function (previous) { return (tslib_es6.__assign(tslib_es6.__assign(tslib_es6.__assign({}, previous), (requestedFields.has("email") && { email: form.email })), (requestedFields.has("sms") && { phoneNumber: form.phoneNumber }))); });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useUserInputForm.js","sources":["../../../../src/hooks/useUserInputForm.ts"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from \"react\";\nimport type { UserInputFormProps } from \"../types/userInput\";\nimport type {\n AddressSuggestion,\n InformationType,\n RequestedFields,\n UserInputFormErrors,\n UserInputFormState,\n} from \"../types/userInputForm\";\nimport {\n DEFAULT_FIELDS,\n FALLBACK_ADDRESS_SUGGESTIONS,\n GEOCODING_AUTOCOMPLETE_ENDPOINT,\n} from \"../constants/userInputForm\";\nimport { API_BASE_URL } from \"../config/env\";\nimport {\n checkIsMajor,\n parseBirthDate,\n resolveInformationType,\n} from \"../utils/userInputForm\";\nimport {\n countNonEmptyListRows,\n getListFieldMinRows,\n normalizeListColumns,\n} from \"../utils/listFieldUtils\";\nimport {\n cellErrorKey,\n isDateValid,\n isEmailValid,\n isRegexMatch,\n} from \"../utils/customFieldValidation\";\nimport { labelToKey } from \"../utils/labelToKey\";\nimport { DEFAULT_DATE_DISPLAY_FORMAT } from \"../types/session\";\nimport { useI18n } from \"./useI18n\";\nimport { logFormValidated } from \"../services/auditTrailService\";\n\nexport type CustomFieldErrorValue = string | boolean;\n\ninterface UseUserInputFormResult {\n form: UserInputFormState;\n errors: UserInputFormErrors;\n informationType: InformationType;\n requestedFields: RequestedFields;\n pageTitle: string;\n pageDescription: string;\n addressSuggestions: AddressSuggestion[];\n showSuggestions: boolean;\n handleFieldChange: (key: keyof UserInputFormState, value: string) => void;\n handleAddressChange: (value: string) => void;\n handleAddressFocus: () => void;\n handleAddressBlur: () => void;\n applyAddressSuggestion: (suggestion: AddressSuggestion) => void;\n goOnNextStep: () => void;\n goOnPreviousStep: () => void;\n // Custom form fields\n customFormData: Record<string, any>;\n customFormErrors: Record<string, CustomFieldErrorValue>;\n customFormCellErrors: Record<string, Record<string, CustomFieldErrorValue>>;\n handleCustomFieldChange: (fieldId: string, value: any) => void;\n}\n\nexport const useUserInputForm = ({\n stepObject,\n setUserInput,\n initialUserInput,\n node,\n template,\n contactInfo,\n setContactInfo,\n onContinueCallback,\n sessionId,\n}: UserInputFormProps & { sessionId?: string }): UseUserInputFormResult => {\n const { setStep, goBack, goToNextStep, step } = stepObject;\n const { t } = useI18n();\n\n const informationType = useMemo<InformationType>(() => {\n const resolved = resolveInformationType(\n node.informationType as string,\n \"identity\",\n );\n console.log(\"🔍 [useUserInputForm] Resolving informationType:\", {\n nodeInformationType: node.informationType,\n resolved,\n hasCustomFields: !!node.customFields,\n customFieldsCount: node.customFields?.length,\n });\n return resolved;\n }, [node.informationType, node.customFields]);\n\n const requestedFields = useMemo<RequestedFields>(() => {\n const defaults = DEFAULT_FIELDS[informationType] || [];\n const optional =\n node.optionalFields && node.optionalFields.length > 0\n ? node.optionalFields\n : defaults;\n const merged = new Set<string>(optional);\n\n if (node.requiredFields) {\n node.requiredFields.forEach((field) => merged.add(field));\n }\n\n return merged;\n }, [node.optionalFields, node.requiredFields, informationType]);\n\n const birthDateParts = useMemo(\n () => parseBirthDate(initialUserInput?.birthDate || \"\"),\n [initialUserInput?.birthDate],\n );\n\n const [form, setForm] = useState<UserInputFormState>({\n lastName: initialUserInput?.lastName || \"\",\n firstName: initialUserInput?.firstName || \"\",\n birthDate: initialUserInput?.birthDate || \"\",\n day: birthDateParts.day,\n month: birthDateParts.month,\n year: birthDateParts.year,\n email: initialUserInput?.email || contactInfo?.email || \"\",\n phoneNumber:\n initialUserInput?.phoneNumber || contactInfo?.phoneNumber || \"\",\n sms: initialUserInput?.sms || \"\",\n addressLine1: initialUserInput?.addressLine1 || \"\",\n addressLine2: initialUserInput?.addressLine2 || \"\",\n postalCode: initialUserInput?.postalCode || \"\",\n city: initialUserInput?.city || \"\",\n countryCode: initialUserInput?.countryCode || \"\",\n nationality: initialUserInput?.nationality || \"\",\n companyName: initialUserInput?.companyName || \"\",\n siret: initialUserInput?.siret || \"\",\n tva: initialUserInput?.tva || \"\",\n registrationNumber: initialUserInput?.registrationNumber || \"\",\n });\n\n const [errors, setErrors] = useState<UserInputFormErrors>({});\n\n // Custom form state\n const [customFormData, setCustomFormData] = useState<Record<string, any>>(\n () => {\n if (informationType !== \"custom\" || !node.customFields) return {};\n\n const initial: Record<string, any> = {};\n node.customFields.forEach((field) => {\n const topLevelKey = field.userInputKey ?? labelToKey(field.label);\n // Priorité : top level (nouveau format) > customFormData[field.id] (ancien format)\n const savedValue =\n (initialUserInput as Record<string, any>)?.[topLevelKey] ??\n initialUserInput?.customFormData?.[field.id];\n if (field.valueType === \"list\") {\n initial[field.id] = Array.isArray(savedValue) ? savedValue : [];\n return;\n }\n\n initial[field.id] = savedValue || \"\";\n });\n return initial;\n },\n );\n const [customFormErrors, setCustomFormErrors] = useState<\n Record<string, CustomFieldErrorValue>\n >({});\n const [customFormCellErrors, setCustomFormCellErrors] = useState<\n Record<string, Record<string, CustomFieldErrorValue>>\n >({});\n\n const [addressSuggestions, setAddressSuggestions] = useState<\n AddressSuggestion[]\n >([]);\n const [showSuggestions, setShowSuggestions] = useState(false);\n const isFirstRender = useRef(true);\n const prevCustomNodeIdRef = useRef(node.id);\n const hideSuggestionTimeout = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n const addressRequestState = useRef<{\n debounce: ReturnType<typeof setTimeout> | null;\n controller: AbortController | null;\n }>({\n debounce: null,\n controller: null,\n });\n\n const formTitles = useMemo<Record<InformationType, string>>(\n () => ({\n identity: t(\"user_input_form.titles.identity\"),\n \"identity-legal\": t(\"user_input_form.titles.identity_legal\"),\n contact: t(\"user_input_form.titles.contact\"),\n address: t(\"user_input_form.titles.address\"),\n nationality: t(\"user_input_form.titles.nationality\"),\n custom: t(\"user_input_form.titles.custom\"),\n }),\n [t],\n );\n\n const formDescriptions = useMemo<Record<InformationType, string>>(\n () => ({\n identity: t(\"user_input_form.descriptions.identity\"),\n \"identity-legal\": t(\"user_input_form.descriptions.identity_legal\"),\n contact: t(\"user_input_form.descriptions.contact\"),\n address: t(\"user_input_form.descriptions.address\"),\n nationality: t(\"user_input_form.descriptions.nationality\"),\n custom: t(\"user_input_form.descriptions.custom\"),\n }),\n [t],\n );\n\n const applyAddressSuggestion = (suggestion: AddressSuggestion) => {\n const normalizedCountry =\n suggestion.countryCode?.toUpperCase() || suggestion.country || \"\";\n\n setForm((previous) => ({\n ...previous,\n addressLine1: suggestion.addressLine1 || suggestion.label,\n postalCode: suggestion.postalCode || previous.postalCode,\n city: suggestion.city || previous.city,\n countryCode: normalizedCountry || previous.countryCode,\n }));\n setErrors((previous) => ({\n ...previous,\n addressLine1: false,\n postalCode: false,\n city: false,\n country: false,\n }));\n setShowSuggestions(false);\n setAddressSuggestions([]);\n };\n\n const mapGeoapifyFeature = (feature: any): AddressSuggestion | null => {\n if (!feature || !feature.properties) {\n return null;\n }\n\n const { properties } = feature;\n const label: string =\n properties.formatted ||\n properties.address_line1 ||\n [properties.housenumber, properties.street]\n .filter(Boolean)\n .join(\" \")\n .trim();\n\n if (!label) {\n return null;\n }\n\n const addressLine1 =\n [properties.housenumber, properties.street]\n .filter(Boolean)\n .join(\" \")\n .trim() ||\n properties.address_line1 ||\n label;\n\n const city =\n properties.city ||\n properties.town ||\n properties.village ||\n properties.state ||\n \"\";\n\n return {\n id:\n (properties.place_id && String(properties.place_id)) ||\n feature.id ||\n `${properties.lon ?? \"\"}-${properties.lat ?? \"\"}-${label}`,\n label,\n addressLine1,\n postalCode: properties.postcode || \"\",\n city,\n country: properties.country || \"\",\n countryCode: properties.country_code || undefined,\n };\n };\n\n const requestAddressSuggestions = (\n query: string,\n { autoComplete }: { autoComplete: boolean },\n ) => {\n if (addressRequestState.current.debounce) {\n clearTimeout(addressRequestState.current.debounce);\n addressRequestState.current.debounce = null;\n }\n\n if (query.trim().length < 3) {\n if (addressRequestState.current.controller) {\n addressRequestState.current.controller.abort();\n addressRequestState.current.controller = null;\n }\n setAddressSuggestions([]);\n setShowSuggestions(false);\n return;\n }\n\n addressRequestState.current.debounce = setTimeout(async () => {\n if (addressRequestState.current.controller) {\n addressRequestState.current.controller.abort();\n }\n\n const controller = new AbortController();\n addressRequestState.current.controller = controller;\n\n try {\n const searchParams = new URLSearchParams({\n text: query,\n lang: \"fr\",\n });\n\n const response = await fetch(\n `${API_BASE_URL}${GEOCODING_AUTOCOMPLETE_ENDPOINT}?${searchParams.toString()}`,\n { signal: controller.signal },\n );\n\n if (!response.ok) {\n throw new Error(\n `Geocoding request failed with status ${response.status}`,\n );\n }\n\n const payload = await response.json();\n\n const suggestions: AddressSuggestion[] = Array.isArray(\n payload?.features,\n )\n ? payload.features\n .map((feature: any) => mapGeoapifyFeature(feature))\n .filter(\n (\n suggestion: AddressSuggestion | null,\n ): suggestion is AddressSuggestion => Boolean(suggestion),\n )\n : [];\n\n setAddressSuggestions(suggestions);\n setShowSuggestions(suggestions.length > 0);\n\n if (autoComplete && suggestions.length === 1) {\n const single = suggestions[0];\n const normalizedQuery = query.trim().toLowerCase();\n if (\n normalizedQuery.length >= 6 &&\n single.label.toLowerCase().startsWith(normalizedQuery)\n ) {\n applyAddressSuggestion(single);\n }\n }\n } catch (error) {\n if ((error as Error).name === \"AbortError\") {\n return;\n }\n\n const fallback = FALLBACK_ADDRESS_SUGGESTIONS.filter((suggestion) =>\n suggestion.label.toLowerCase().includes(query.toLowerCase()),\n );\n setAddressSuggestions(fallback);\n setShowSuggestions(fallback.length > 0);\n } finally {\n addressRequestState.current.controller = null;\n }\n }, 250);\n };\n\n useEffect(() => {\n if (!initialUserInput) {\n return;\n }\n\n if (\n isFirstRender.current ||\n (!form.firstName &&\n !form.lastName &&\n !form.email &&\n !form.phoneNumber &&\n !form.companyName)\n ) {\n const nextBirthParts = parseBirthDate(initialUserInput.birthDate || \"\");\n setForm((previous) => ({\n ...previous,\n lastName: initialUserInput.lastName || previous.lastName,\n firstName: initialUserInput.firstName || previous.firstName,\n birthDate: initialUserInput.birthDate || previous.birthDate,\n day: nextBirthParts.day,\n month: nextBirthParts.month,\n year: nextBirthParts.year,\n email: initialUserInput.email || previous.email,\n phoneNumber: initialUserInput.phoneNumber || previous.phoneNumber,\n sms: initialUserInput.sms || previous.sms,\n addressLine1: initialUserInput.addressLine1 || previous.addressLine1,\n addressLine2: initialUserInput.addressLine2 || previous.addressLine2,\n postalCode: initialUserInput.postalCode || previous.postalCode,\n city: initialUserInput.city || previous.city,\n countryCode: initialUserInput.countryCode || previous.countryCode,\n nationality: initialUserInput.nationality || previous.nationality,\n companyName: initialUserInput.companyName || previous.companyName,\n siret: initialUserInput.siret || previous.siret,\n tva: initialUserInput.tva || previous.tva,\n registrationNumber: initialUserInput.registrationNumber || previous.registrationNumber,\n }));\n\n isFirstRender.current = false;\n }\n }, [\n initialUserInput,\n form.firstName,\n form.lastName,\n form.email,\n form.phoneNumber,\n form.companyName,\n ]);\n\n // Re-synchronise customFormData depuis initialUserInput quand on (ré)affiche un\n // nœud DIFFÉRENT sur une instance réutilisée (retour arrière sans remount).\n // Le champ form standard a déjà son propre effet de re-sync ci-dessus ; le\n // customFormData n'en avait aucun → il restait périmé (formulaire perso vidé).\n // On garde sur node.id : sur le MÊME nœud (frappe en cours), on ne touche à rien.\n // Redondant avec le remount par key={node.id} côté renderer, mais sert de filet.\n useEffect(() => {\n if (prevCustomNodeIdRef.current === node.id) {\n return;\n }\n prevCustomNodeIdRef.current = node.id;\n\n if (informationType !== \"custom\" || !node.customFields) {\n setCustomFormData({});\n return;\n }\n\n const next: Record<string, any> = {};\n node.customFields.forEach((field) => {\n const topLevelKey = field.userInputKey ?? labelToKey(field.label);\n const savedValue =\n (initialUserInput as Record<string, any>)?.[topLevelKey] ??\n initialUserInput?.customFormData?.[field.id];\n if (field.valueType === \"list\") {\n next[field.id] = Array.isArray(savedValue) ? savedValue : [];\n return;\n }\n next[field.id] = savedValue || \"\";\n });\n setCustomFormData(next);\n }, [node.id, informationType, node.customFields, initialUserInput]);\n\n useEffect(() => {\n return () => {\n if (hideSuggestionTimeout.current) {\n clearTimeout(hideSuggestionTimeout.current);\n }\n if (addressRequestState.current.debounce) {\n clearTimeout(addressRequestState.current.debounce);\n }\n if (addressRequestState.current.controller) {\n addressRequestState.current.controller.abort();\n }\n };\n }, []);\n\n const handleFieldChange = (key: keyof UserInputFormState, value: string) => {\n setErrors((previous) => ({\n ...previous,\n [key]: false,\n notMajor: false,\n }));\n\n setForm((previous) => {\n const next = { ...previous, [key]: value };\n if (key === \"day\" || key === \"month\" || key === \"year\") {\n const { day, month, year } = next;\n if (day && month && year) {\n const paddedDay = day.padStart(2, \"0\");\n const paddedMonth = month.padStart(2, \"0\");\n next.birthDate = `${paddedDay}-${paddedMonth}-${year}`;\n } else {\n next.birthDate = \"\";\n }\n }\n return next;\n });\n };\n\n const handleAddressChange = (value: string) => {\n handleFieldChange(\"addressLine1\", value);\n requestAddressSuggestions(value, { autoComplete: true });\n };\n\n const handleAddressFocus = () => {\n requestAddressSuggestions(form.addressLine1, { autoComplete: false });\n };\n\n const handleAddressBlur = () => {\n if (hideSuggestionTimeout.current) {\n clearTimeout(hideSuggestionTimeout.current);\n }\n hideSuggestionTimeout.current = setTimeout(() => {\n setShowSuggestions(false);\n hideSuggestionTimeout.current = null;\n }, 150);\n };\n\n const validateForm = () => {\n const nextErrors: UserInputFormErrors = {};\n let hasError = false;\n\n const markError = (key: string) => {\n nextErrors[key] = true;\n hasError = true;\n };\n\n if (informationType === \"identity\") {\n if (requestedFields.has(\"prenom\") && !form.firstName) {\n markError(\"firstName\");\n }\n if (requestedFields.has(\"nom\") && !form.lastName) {\n markError(\"lastName\");\n }\n if (requestedFields.has(\"date_naissance\")) {\n if (!form.birthDate) {\n markError(\"birthDate\");\n } else if (!checkIsMajor(form.birthDate)) {\n nextErrors.notMajor = true;\n hasError = true;\n }\n }\n }\n\n if (informationType === \"identity-legal\") {\n if (requestedFields.has(\"nom\") && !form.companyName) {\n markError(\"companyName\");\n }\n if (requestedFields.has(\"siret\") && !form.siret) {\n markError(\"siret\");\n }\n if (requestedFields.has(\"tva\") && !form.tva) {\n markError(\"tva\");\n }\n if (requestedFields.has(\"registrationNumber\") && !form.registrationNumber) {\n markError(\"registrationNumber\");\n }\n }\n\n if (informationType === \"contact\") {\n if (requestedFields.has(\"email\")) {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!form.email || !emailRegex.test(form.email)) {\n markError(\"email\");\n }\n }\n if (requestedFields.has(\"sms\")) {\n if (\n !form.phoneNumber ||\n form.phoneNumber.replace(/\\D/g, \"\").length < 6\n ) {\n markError(\"phoneNumber\");\n }\n }\n }\n\n if (\n (informationType === \"address\" || informationType === \"identity-legal\") &&\n requestedFields.has(\"adresse\")\n ) {\n if (!form.addressLine1) {\n markError(\"addressLine1\");\n }\n if (!form.postalCode) {\n markError(\"postalCode\");\n }\n if (!form.city) {\n markError(\"city\");\n }\n if (!form.countryCode) {\n markError(\"country\");\n }\n }\n\n if (\n informationType === \"nationality\" &&\n requestedFields.has(\"nationalite\")\n ) {\n if (!form.nationality) {\n markError(\"nationality\");\n }\n }\n\n setErrors(nextErrors);\n return !hasError;\n };\n\n const validateCustomForm = () => {\n const errors: Record<string, CustomFieldErrorValue> = {};\n const cellErrors: Record<string, Record<string, CustomFieldErrorValue>> = {};\n let hasError = false;\n\n node.customFields?.forEach((field) => {\n const value = customFormData[field.id];\n\n if (field.valueType === \"list\") {\n const rows: Record<string, string>[] = Array.isArray(value) ? value : [];\n const minRows = getListFieldMinRows(field);\n const columns = normalizeListColumns(field.listColumns);\n const fieldCellErrors: Record<string, CustomFieldErrorValue> = {};\n let listFieldInvalid = false;\n\n if (field.required && countNonEmptyListRows(rows) < minRows) {\n errors[field.id] = true;\n hasError = true;\n listFieldInvalid = true;\n }\n\n rows.forEach((row, rowIndex) => {\n const rowIsEmpty = columns.every(\n (col) => !String(row?.[col.label] ?? \"\").trim(),\n );\n if (rowIsEmpty && !field.required) return;\n\n columns.forEach((col) => {\n const cellValue = String(row?.[col.label] ?? \"\").trim();\n const key = cellErrorKey(rowIndex, col.label);\n\n if (!cellValue) {\n if (field.required && !rowIsEmpty) {\n fieldCellErrors[key] = t(\"custom_form.required_field\");\n listFieldInvalid = true;\n }\n return;\n }\n\n switch (col.type) {\n case \"email\":\n if (!isEmailValid(cellValue)) {\n fieldCellErrors[key] = t(\"custom_form.invalid_email\");\n listFieldInvalid = true;\n }\n break;\n case \"date\": {\n const fmt = col.dateFormat ?? DEFAULT_DATE_DISPLAY_FORMAT;\n if (!isDateValid(cellValue, fmt)) {\n fieldCellErrors[key] = t(\"custom_form.invalid_date\", {\n format: fmt,\n });\n listFieldInvalid = true;\n }\n break;\n }\n case \"text\":\n if (col.regex && !isRegexMatch(cellValue, col.regex)) {\n fieldCellErrors[key] =\n col.regexErrorMessage ||\n t(\"custom_form.invalid_format\");\n listFieldInvalid = true;\n }\n break;\n }\n });\n });\n\n if (Object.keys(fieldCellErrors).length > 0) {\n cellErrors[field.id] = fieldCellErrors;\n }\n if (listFieldInvalid) {\n errors[field.id] = errors[field.id] ?? true;\n hasError = true;\n }\n return;\n }\n\n // Check if required field is missing\n if (field.required && !value) {\n errors[field.id] = true;\n hasError = true;\n return;\n }\n\n // Type-specific validation\n if (value) {\n switch (field.valueType) {\n case \"number\":\n if (isNaN(Number(value))) {\n errors[field.id] = true;\n hasError = true;\n }\n break;\n\n case \"email\":\n if (!isEmailValid(String(value))) {\n errors[field.id] = t(\"custom_form.invalid_email\");\n hasError = true;\n }\n break;\n\n case \"text\":\n if (field.regex && !isRegexMatch(String(value), field.regex)) {\n errors[field.id] =\n field.regexErrorMessage || t(\"custom_form.invalid_format\");\n hasError = true;\n }\n break;\n\n case \"date\": {\n const fmt = field.dateFormat ?? DEFAULT_DATE_DISPLAY_FORMAT;\n if (!isDateValid(String(value), fmt)) {\n errors[field.id] = t(\"custom_form.invalid_date\", {\n format: fmt,\n });\n hasError = true;\n }\n break;\n }\n\n case \"address\":\n // Validate address object if required\n if (field.required && typeof value === \"object\") {\n const addressValue = value as {\n addressLine1?: string;\n postalCode?: string;\n city?: string;\n countryCode?: string;\n };\n if (\n !addressValue.addressLine1 ||\n !addressValue.postalCode ||\n !addressValue.city ||\n !addressValue.countryCode\n ) {\n errors[field.id] = true;\n hasError = true;\n }\n }\n break;\n }\n }\n });\n\n setCustomFormErrors(errors);\n setCustomFormCellErrors(cellErrors);\n return !hasError;\n };\n\n const handleCustomFieldChange = (fieldId: string, value: any) => {\n setCustomFormData((prev) => ({ ...prev, [fieldId]: value }));\n setCustomFormErrors((prev) => ({ ...prev, [fieldId]: false }));\n setCustomFormCellErrors((prev) => {\n if (!(fieldId in prev)) return prev;\n const { [fieldId]: _removed, ...rest } = prev;\n return rest;\n });\n };\n\n const goOnNextStep = () => {\n // Handle custom form validation and submission\n if (informationType === \"custom\") {\n if (!validateCustomForm()) {\n return;\n }\n\n const topLevelEntries: Record<string, any> = {};\n const customFormDataEntries: Record<string, any> = {};\n node.customFields?.forEach((field) => {\n const key = field.userInputKey ?? labelToKey(field.label);\n topLevelEntries[key] = customFormData[field.id];\n customFormDataEntries[field.id] = customFormData[field.id];\n });\n\n setUserInput((prev) => ({\n ...prev,\n // Top level avec clé lisible dérivée du label (attendu par l'API cliente)\n ...topLevelEntries,\n // customFormData avec les field.id d'origine (rétrocompat : conditions, sessions existantes)\n customFormData: { ...(prev.customFormData ?? {}), ...customFormDataEntries },\n }));\n\n if (sessionId) logFormValidated(sessionId);\n if (onContinueCallback) {\n onContinueCallback();\n } else {\n goToNextStep(node.id, template);\n }\n return;\n }\n\n // Standard form validation\n if (!validateForm()) {\n return;\n }\n\n setUserInput((previous) => ({\n ...previous,\n ...(requestedFields.has(\"nom\") && {\n ...(informationType === \"identity-legal\"\n ? { companyName: form.companyName }\n : { lastName: form.lastName }),\n }),\n ...(requestedFields.has(\"prenom\") && { firstName: form.firstName }),\n ...(requestedFields.has(\"date_naissance\") && {\n birthDate: form.birthDate,\n }),\n ...(requestedFields.has(\"email\") && { email: form.email }),\n ...(requestedFields.has(\"sms\") && {\n phoneNumber: form.phoneNumber,\n sms: form.phoneNumber,\n }),\n ...(requestedFields.has(\"adresse\") && {\n addressLine1: form.addressLine1,\n addressLine2: form.addressLine2,\n postalCode: form.postalCode,\n city: form.city,\n countryCode: form.countryCode,\n }),\n ...(requestedFields.has(\"siret\") && { siret: form.siret }),\n ...(requestedFields.has(\"tva\") && { tva: form.tva }),\n ...(requestedFields.has(\"registrationNumber\") && { registrationNumber: form.registrationNumber }),\n ...(requestedFields.has(\"siret\") && !requestedFields.has(\"registrationNumber\") && { registrationNumber: form.siret }),\n ...(requestedFields.has(\"nationalite\") && {\n nationality: form.nationality,\n }),\n }));\n\n if (informationType === \"contact\" && setContactInfo) {\n setContactInfo((previous) => ({\n ...previous,\n ...(requestedFields.has(\"email\") && { email: form.email }),\n ...(requestedFields.has(\"sms\") && { phoneNumber: form.phoneNumber }),\n }));\n }\n\n if (sessionId) logFormValidated(sessionId);\n if (onContinueCallback) {\n onContinueCallback();\n } else {\n goToNextStep(node.id, template);\n }\n };\n\n const goOnPreviousStep = () => {\n console.log(\"[goOnPreviousStep] called — step:\", step, \"canGoBack:\", stepObject.canGoBack);\n goBack();\n };\n\n const pageTitle = node.pageTitle || formTitles[informationType];\n\n const pageDescription =\n node.pageDescription || formDescriptions[informationType];\n\n return {\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 };\n};\n"],"names":["useI18n","useMemo","resolveInformationType","DEFAULT_FIELDS","parseBirthDate","useState","labelToKey","useRef","__assign","__awaiter","API_BASE_URL","GEOCODING_AUTOCOMPLETE_ENDPOINT","FALLBACK_ADDRESS_SUGGESTIONS","useEffect","checkIsMajor","getListFieldMinRows","normalizeListColumns","countNonEmptyListRows","cellErrorKey","isEmailValid","DEFAULT_DATE_DISPLAY_FORMAT","isDateValid","isRegexMatch","__rest","logFormValidated"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useUserInputForm.js","sources":["../../../../src/hooks/useUserInputForm.ts"],"sourcesContent":["import { useEffect, useMemo, useRef, useState } from \"react\";\nimport type { UserInputFormProps } from \"../types/userInput\";\nimport type {\n AddressSuggestion,\n InformationType,\n RequestedFields,\n UserInputFormErrors,\n UserInputFormState,\n} from \"../types/userInputForm\";\nimport {\n DEFAULT_FIELDS,\n FALLBACK_ADDRESS_SUGGESTIONS,\n GEOCODING_AUTOCOMPLETE_ENDPOINT,\n} from \"../constants/userInputForm\";\nimport { API_BASE_URL } from \"../config/env\";\nimport {\n checkIsMajor,\n parseBirthDate,\n resolveInformationType,\n} from \"../utils/userInputForm\";\nimport {\n countNonEmptyListRows,\n getListFieldMinRows,\n normalizeListColumns,\n} from \"../utils/listFieldUtils\";\nimport {\n cellErrorKey,\n isDateValid,\n isEmailValid,\n isRegexMatch,\n} from \"../utils/customFieldValidation\";\nimport { labelToKey } from \"../utils/labelToKey\";\nimport { DEFAULT_DATE_DISPLAY_FORMAT } from \"../types/session\";\nimport { useI18n } from \"./useI18n\";\nimport { logFormValidated } from \"../services/auditTrailService\";\n\nexport type CustomFieldErrorValue = string | boolean;\n\ninterface UseUserInputFormResult {\n form: UserInputFormState;\n errors: UserInputFormErrors;\n informationType: InformationType;\n requestedFields: RequestedFields;\n pageTitle: string;\n pageDescription: string;\n addressSuggestions: AddressSuggestion[];\n showSuggestions: boolean;\n handleFieldChange: (key: keyof UserInputFormState, value: string) => void;\n handleAddressChange: (value: string) => void;\n handleAddressFocus: () => void;\n handleAddressBlur: () => void;\n applyAddressSuggestion: (suggestion: AddressSuggestion) => void;\n goOnNextStep: () => void;\n goOnPreviousStep: () => void;\n // Custom form fields\n customFormData: Record<string, any>;\n customFormErrors: Record<string, CustomFieldErrorValue>;\n customFormCellErrors: Record<string, Record<string, CustomFieldErrorValue>>;\n handleCustomFieldChange: (fieldId: string, value: any) => void;\n}\n\nexport const useUserInputForm = ({\n stepObject,\n setUserInput,\n initialUserInput,\n node,\n template,\n contactInfo,\n setContactInfo,\n onContinueCallback,\n sessionId,\n}: UserInputFormProps & { sessionId?: string }): UseUserInputFormResult => {\n const { setStep, goBack, goToNextStep, step } = stepObject;\n const { t } = useI18n();\n\n const informationType = useMemo<InformationType>(() => {\n const resolved = resolveInformationType(\n node.informationType as string,\n \"identity\",\n );\n console.log(\"🔍 [useUserInputForm] Resolving informationType:\", {\n nodeInformationType: node.informationType,\n resolved,\n hasCustomFields: !!node.customFields,\n customFieldsCount: node.customFields?.length,\n });\n return resolved;\n }, [node.informationType, node.customFields]);\n\n const requestedFields = useMemo<RequestedFields>(() => {\n const defaults = DEFAULT_FIELDS[informationType] || [];\n const optional =\n node.optionalFields && node.optionalFields.length > 0\n ? node.optionalFields\n : defaults;\n const merged = new Set<string>(optional);\n\n if (node.requiredFields) {\n node.requiredFields.forEach((field) => merged.add(field));\n }\n\n return merged;\n }, [node.optionalFields, node.requiredFields, informationType]);\n\n const birthDateParts = useMemo(\n () => parseBirthDate(initialUserInput?.birthDate || \"\"),\n [initialUserInput?.birthDate],\n );\n\n const [form, setForm] = useState<UserInputFormState>({\n lastName: initialUserInput?.lastName || \"\",\n firstName: initialUserInput?.firstName || \"\",\n birthDate: initialUserInput?.birthDate || \"\",\n day: birthDateParts.day,\n month: birthDateParts.month,\n year: birthDateParts.year,\n email: initialUserInput?.email || contactInfo?.email || \"\",\n phoneNumber:\n initialUserInput?.phoneNumber || contactInfo?.phoneNumber || \"\",\n sms: initialUserInput?.sms || \"\",\n addressLine1: initialUserInput?.addressLine1 || \"\",\n addressLine2: initialUserInput?.addressLine2 || \"\",\n postalCode: initialUserInput?.postalCode || \"\",\n city: initialUserInput?.city || \"\",\n countryCode: initialUserInput?.countryCode || \"\",\n nationality: initialUserInput?.nationality || \"\",\n companyName: initialUserInput?.companyName || \"\",\n siret: initialUserInput?.siret || \"\",\n tva: initialUserInput?.tva || \"\",\n registrationNumber: initialUserInput?.registrationNumber || \"\",\n legalRepresentativeLastName:\n initialUserInput?.legalRepresentativeLastName || \"\",\n legalRepresentativeFirstName:\n initialUserInput?.legalRepresentativeFirstName || \"\",\n });\n\n const [errors, setErrors] = useState<UserInputFormErrors>({});\n\n // Custom form state\n const [customFormData, setCustomFormData] = useState<Record<string, any>>(\n () => {\n if (informationType !== \"custom\" || !node.customFields) return {};\n\n const initial: Record<string, any> = {};\n node.customFields.forEach((field) => {\n const topLevelKey = field.userInputKey ?? labelToKey(field.label);\n // Priorité : top level (nouveau format) > customFormData[field.id] (ancien format)\n const savedValue =\n (initialUserInput as Record<string, any>)?.[topLevelKey] ??\n initialUserInput?.customFormData?.[field.id];\n if (field.valueType === \"list\") {\n initial[field.id] = Array.isArray(savedValue) ? savedValue : [];\n return;\n }\n\n initial[field.id] = savedValue || \"\";\n });\n return initial;\n },\n );\n const [customFormErrors, setCustomFormErrors] = useState<\n Record<string, CustomFieldErrorValue>\n >({});\n const [customFormCellErrors, setCustomFormCellErrors] = useState<\n Record<string, Record<string, CustomFieldErrorValue>>\n >({});\n\n const [addressSuggestions, setAddressSuggestions] = useState<\n AddressSuggestion[]\n >([]);\n const [showSuggestions, setShowSuggestions] = useState(false);\n const isFirstRender = useRef(true);\n const prevCustomNodeIdRef = useRef(node.id);\n const hideSuggestionTimeout = useRef<ReturnType<typeof setTimeout> | null>(\n null,\n );\n const addressRequestState = useRef<{\n debounce: ReturnType<typeof setTimeout> | null;\n controller: AbortController | null;\n }>({\n debounce: null,\n controller: null,\n });\n\n const formTitles = useMemo<Record<InformationType, string>>(\n () => ({\n identity: t(\"user_input_form.titles.identity\"),\n \"identity-legal\": t(\"user_input_form.titles.identity_legal\"),\n contact: t(\"user_input_form.titles.contact\"),\n address: t(\"user_input_form.titles.address\"),\n nationality: t(\"user_input_form.titles.nationality\"),\n custom: t(\"user_input_form.titles.custom\"),\n }),\n [t],\n );\n\n const formDescriptions = useMemo<Record<InformationType, string>>(\n () => ({\n identity: t(\"user_input_form.descriptions.identity\"),\n \"identity-legal\": t(\"user_input_form.descriptions.identity_legal\"),\n contact: t(\"user_input_form.descriptions.contact\"),\n address: t(\"user_input_form.descriptions.address\"),\n nationality: t(\"user_input_form.descriptions.nationality\"),\n custom: t(\"user_input_form.descriptions.custom\"),\n }),\n [t],\n );\n\n const applyAddressSuggestion = (suggestion: AddressSuggestion) => {\n const normalizedCountry =\n suggestion.countryCode?.toUpperCase() || suggestion.country || \"\";\n\n setForm((previous) => ({\n ...previous,\n addressLine1: suggestion.addressLine1 || suggestion.label,\n postalCode: suggestion.postalCode || previous.postalCode,\n city: suggestion.city || previous.city,\n countryCode: normalizedCountry || previous.countryCode,\n }));\n setErrors((previous) => ({\n ...previous,\n addressLine1: false,\n postalCode: false,\n city: false,\n country: false,\n }));\n setShowSuggestions(false);\n setAddressSuggestions([]);\n };\n\n const mapGeoapifyFeature = (feature: any): AddressSuggestion | null => {\n if (!feature || !feature.properties) {\n return null;\n }\n\n const { properties } = feature;\n const label: string =\n properties.formatted ||\n properties.address_line1 ||\n [properties.housenumber, properties.street]\n .filter(Boolean)\n .join(\" \")\n .trim();\n\n if (!label) {\n return null;\n }\n\n const addressLine1 =\n [properties.housenumber, properties.street]\n .filter(Boolean)\n .join(\" \")\n .trim() ||\n properties.address_line1 ||\n label;\n\n const city =\n properties.city ||\n properties.town ||\n properties.village ||\n properties.state ||\n \"\";\n\n return {\n id:\n (properties.place_id && String(properties.place_id)) ||\n feature.id ||\n `${properties.lon ?? \"\"}-${properties.lat ?? \"\"}-${label}`,\n label,\n addressLine1,\n postalCode: properties.postcode || \"\",\n city,\n country: properties.country || \"\",\n countryCode: properties.country_code || undefined,\n };\n };\n\n const requestAddressSuggestions = (\n query: string,\n { autoComplete }: { autoComplete: boolean },\n ) => {\n if (addressRequestState.current.debounce) {\n clearTimeout(addressRequestState.current.debounce);\n addressRequestState.current.debounce = null;\n }\n\n if (query.trim().length < 3) {\n if (addressRequestState.current.controller) {\n addressRequestState.current.controller.abort();\n addressRequestState.current.controller = null;\n }\n setAddressSuggestions([]);\n setShowSuggestions(false);\n return;\n }\n\n addressRequestState.current.debounce = setTimeout(async () => {\n if (addressRequestState.current.controller) {\n addressRequestState.current.controller.abort();\n }\n\n const controller = new AbortController();\n addressRequestState.current.controller = controller;\n\n try {\n const searchParams = new URLSearchParams({\n text: query,\n lang: \"fr\",\n });\n\n const response = await fetch(\n `${API_BASE_URL}${GEOCODING_AUTOCOMPLETE_ENDPOINT}?${searchParams.toString()}`,\n { signal: controller.signal },\n );\n\n if (!response.ok) {\n throw new Error(\n `Geocoding request failed with status ${response.status}`,\n );\n }\n\n const payload = await response.json();\n\n const suggestions: AddressSuggestion[] = Array.isArray(\n payload?.features,\n )\n ? payload.features\n .map((feature: any) => mapGeoapifyFeature(feature))\n .filter(\n (\n suggestion: AddressSuggestion | null,\n ): suggestion is AddressSuggestion => Boolean(suggestion),\n )\n : [];\n\n setAddressSuggestions(suggestions);\n setShowSuggestions(suggestions.length > 0);\n\n if (autoComplete && suggestions.length === 1) {\n const single = suggestions[0];\n const normalizedQuery = query.trim().toLowerCase();\n if (\n normalizedQuery.length >= 6 &&\n single.label.toLowerCase().startsWith(normalizedQuery)\n ) {\n applyAddressSuggestion(single);\n }\n }\n } catch (error) {\n if ((error as Error).name === \"AbortError\") {\n return;\n }\n\n const fallback = FALLBACK_ADDRESS_SUGGESTIONS.filter((suggestion) =>\n suggestion.label.toLowerCase().includes(query.toLowerCase()),\n );\n setAddressSuggestions(fallback);\n setShowSuggestions(fallback.length > 0);\n } finally {\n addressRequestState.current.controller = null;\n }\n }, 250);\n };\n\n useEffect(() => {\n if (!initialUserInput) {\n return;\n }\n\n if (\n isFirstRender.current ||\n (!form.firstName &&\n !form.lastName &&\n !form.email &&\n !form.phoneNumber &&\n !form.companyName)\n ) {\n const nextBirthParts = parseBirthDate(initialUserInput.birthDate || \"\");\n setForm((previous) => ({\n ...previous,\n lastName: initialUserInput.lastName || previous.lastName,\n firstName: initialUserInput.firstName || previous.firstName,\n birthDate: initialUserInput.birthDate || previous.birthDate,\n day: nextBirthParts.day,\n month: nextBirthParts.month,\n year: nextBirthParts.year,\n email: initialUserInput.email || previous.email,\n phoneNumber: initialUserInput.phoneNumber || previous.phoneNumber,\n sms: initialUserInput.sms || previous.sms,\n addressLine1: initialUserInput.addressLine1 || previous.addressLine1,\n addressLine2: initialUserInput.addressLine2 || previous.addressLine2,\n postalCode: initialUserInput.postalCode || previous.postalCode,\n city: initialUserInput.city || previous.city,\n countryCode: initialUserInput.countryCode || previous.countryCode,\n nationality: initialUserInput.nationality || previous.nationality,\n companyName: initialUserInput.companyName || previous.companyName,\n siret: initialUserInput.siret || previous.siret,\n tva: initialUserInput.tva || previous.tva,\n registrationNumber: initialUserInput.registrationNumber || previous.registrationNumber,\n }));\n\n isFirstRender.current = false;\n }\n }, [\n initialUserInput,\n form.firstName,\n form.lastName,\n form.email,\n form.phoneNumber,\n form.companyName,\n ]);\n\n // Re-synchronise customFormData depuis initialUserInput quand on (ré)affiche un\n // nœud DIFFÉRENT sur une instance réutilisée (retour arrière sans remount).\n // Le champ form standard a déjà son propre effet de re-sync ci-dessus ; le\n // customFormData n'en avait aucun → il restait périmé (formulaire perso vidé).\n // On garde sur node.id : sur le MÊME nœud (frappe en cours), on ne touche à rien.\n // Redondant avec le remount par key={node.id} côté renderer, mais sert de filet.\n useEffect(() => {\n if (prevCustomNodeIdRef.current === node.id) {\n return;\n }\n prevCustomNodeIdRef.current = node.id;\n\n if (informationType !== \"custom\" || !node.customFields) {\n setCustomFormData({});\n return;\n }\n\n const next: Record<string, any> = {};\n node.customFields.forEach((field) => {\n const topLevelKey = field.userInputKey ?? labelToKey(field.label);\n const savedValue =\n (initialUserInput as Record<string, any>)?.[topLevelKey] ??\n initialUserInput?.customFormData?.[field.id];\n if (field.valueType === \"list\") {\n next[field.id] = Array.isArray(savedValue) ? savedValue : [];\n return;\n }\n next[field.id] = savedValue || \"\";\n });\n setCustomFormData(next);\n }, [node.id, informationType, node.customFields, initialUserInput]);\n\n useEffect(() => {\n return () => {\n if (hideSuggestionTimeout.current) {\n clearTimeout(hideSuggestionTimeout.current);\n }\n if (addressRequestState.current.debounce) {\n clearTimeout(addressRequestState.current.debounce);\n }\n if (addressRequestState.current.controller) {\n addressRequestState.current.controller.abort();\n }\n };\n }, []);\n\n const handleFieldChange = (key: keyof UserInputFormState, value: string) => {\n setErrors((previous) => ({\n ...previous,\n [key]: false,\n notMajor: false,\n }));\n\n setForm((previous) => {\n const next = { ...previous, [key]: value };\n if (key === \"day\" || key === \"month\" || key === \"year\") {\n const { day, month, year } = next;\n if (day && month && year) {\n const paddedDay = day.padStart(2, \"0\");\n const paddedMonth = month.padStart(2, \"0\");\n next.birthDate = `${paddedDay}-${paddedMonth}-${year}`;\n } else {\n next.birthDate = \"\";\n }\n }\n return next;\n });\n };\n\n const handleAddressChange = (value: string) => {\n handleFieldChange(\"addressLine1\", value);\n requestAddressSuggestions(value, { autoComplete: true });\n };\n\n const handleAddressFocus = () => {\n requestAddressSuggestions(form.addressLine1, { autoComplete: false });\n };\n\n const handleAddressBlur = () => {\n if (hideSuggestionTimeout.current) {\n clearTimeout(hideSuggestionTimeout.current);\n }\n hideSuggestionTimeout.current = setTimeout(() => {\n setShowSuggestions(false);\n hideSuggestionTimeout.current = null;\n }, 150);\n };\n\n const validateForm = () => {\n const nextErrors: UserInputFormErrors = {};\n let hasError = false;\n\n const markError = (key: string) => {\n nextErrors[key] = true;\n hasError = true;\n };\n\n if (informationType === \"identity\") {\n if (requestedFields.has(\"prenom\") && !form.firstName) {\n markError(\"firstName\");\n }\n if (requestedFields.has(\"nom\") && !form.lastName) {\n markError(\"lastName\");\n }\n if (requestedFields.has(\"date_naissance\")) {\n if (!form.birthDate) {\n markError(\"birthDate\");\n } else if (!checkIsMajor(form.birthDate)) {\n nextErrors.notMajor = true;\n hasError = true;\n }\n }\n }\n\n if (informationType === \"identity-legal\") {\n if (requestedFields.has(\"nom\") && !form.companyName) {\n markError(\"companyName\");\n }\n if (requestedFields.has(\"siret\") && !form.siret) {\n markError(\"siret\");\n }\n if (requestedFields.has(\"tva\") && !form.tva) {\n markError(\"tva\");\n }\n if (requestedFields.has(\"registrationNumber\") && !form.registrationNumber) {\n markError(\"registrationNumber\");\n }\n }\n\n if (informationType === \"identity-legal-rep\") {\n if (\n requestedFields.has(\"legalRepresentativeNom\") &&\n !form.legalRepresentativeLastName\n ) {\n markError(\"legalRepresentativeLastName\");\n }\n if (\n requestedFields.has(\"legalRepresentativePrenom\") &&\n !form.legalRepresentativeFirstName\n ) {\n markError(\"legalRepresentativeFirstName\");\n }\n }\n\n if (informationType === \"contact\") {\n if (requestedFields.has(\"email\")) {\n const emailRegex = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/;\n if (!form.email || !emailRegex.test(form.email)) {\n markError(\"email\");\n }\n }\n if (requestedFields.has(\"sms\")) {\n if (\n !form.phoneNumber ||\n form.phoneNumber.replace(/\\D/g, \"\").length < 6\n ) {\n markError(\"phoneNumber\");\n }\n }\n }\n\n if (\n (informationType === \"address\" || informationType === \"identity-legal\") &&\n requestedFields.has(\"adresse\")\n ) {\n if (!form.addressLine1) {\n markError(\"addressLine1\");\n }\n if (!form.postalCode) {\n markError(\"postalCode\");\n }\n if (!form.city) {\n markError(\"city\");\n }\n if (!form.countryCode) {\n markError(\"country\");\n }\n }\n\n if (\n informationType === \"nationality\" &&\n requestedFields.has(\"nationalite\")\n ) {\n if (!form.nationality) {\n markError(\"nationality\");\n }\n }\n\n setErrors(nextErrors);\n return !hasError;\n };\n\n const validateCustomForm = () => {\n const errors: Record<string, CustomFieldErrorValue> = {};\n const cellErrors: Record<string, Record<string, CustomFieldErrorValue>> = {};\n let hasError = false;\n\n node.customFields?.forEach((field) => {\n const value = customFormData[field.id];\n\n if (field.valueType === \"list\") {\n const rows: Record<string, string>[] = Array.isArray(value) ? value : [];\n const minRows = getListFieldMinRows(field);\n const columns = normalizeListColumns(field.listColumns);\n const fieldCellErrors: Record<string, CustomFieldErrorValue> = {};\n let listFieldInvalid = false;\n\n if (field.required && countNonEmptyListRows(rows) < minRows) {\n errors[field.id] = true;\n hasError = true;\n listFieldInvalid = true;\n }\n\n rows.forEach((row, rowIndex) => {\n const rowIsEmpty = columns.every(\n (col) => !String(row?.[col.label] ?? \"\").trim(),\n );\n if (rowIsEmpty && !field.required) return;\n\n columns.forEach((col) => {\n const cellValue = String(row?.[col.label] ?? \"\").trim();\n const key = cellErrorKey(rowIndex, col.label);\n\n if (!cellValue) {\n if (field.required && !rowIsEmpty) {\n fieldCellErrors[key] = t(\"custom_form.required_field\");\n listFieldInvalid = true;\n }\n return;\n }\n\n switch (col.type) {\n case \"email\":\n if (!isEmailValid(cellValue)) {\n fieldCellErrors[key] = t(\"custom_form.invalid_email\");\n listFieldInvalid = true;\n }\n break;\n case \"date\": {\n const fmt = col.dateFormat ?? DEFAULT_DATE_DISPLAY_FORMAT;\n if (!isDateValid(cellValue, fmt)) {\n fieldCellErrors[key] = t(\"custom_form.invalid_date\", {\n format: fmt,\n });\n listFieldInvalid = true;\n }\n break;\n }\n case \"text\":\n if (col.regex && !isRegexMatch(cellValue, col.regex)) {\n fieldCellErrors[key] =\n col.regexErrorMessage ||\n t(\"custom_form.invalid_format\");\n listFieldInvalid = true;\n }\n break;\n }\n });\n });\n\n if (Object.keys(fieldCellErrors).length > 0) {\n cellErrors[field.id] = fieldCellErrors;\n }\n if (listFieldInvalid) {\n errors[field.id] = errors[field.id] ?? true;\n hasError = true;\n }\n return;\n }\n\n // Check if required field is missing\n if (field.required && !value) {\n errors[field.id] = true;\n hasError = true;\n return;\n }\n\n // Type-specific validation\n if (value) {\n switch (field.valueType) {\n case \"number\":\n if (isNaN(Number(value))) {\n errors[field.id] = true;\n hasError = true;\n }\n break;\n\n case \"email\":\n if (!isEmailValid(String(value))) {\n errors[field.id] = t(\"custom_form.invalid_email\");\n hasError = true;\n }\n break;\n\n case \"text\":\n if (field.regex && !isRegexMatch(String(value), field.regex)) {\n errors[field.id] =\n field.regexErrorMessage || t(\"custom_form.invalid_format\");\n hasError = true;\n }\n break;\n\n case \"date\": {\n const fmt = field.dateFormat ?? DEFAULT_DATE_DISPLAY_FORMAT;\n if (!isDateValid(String(value), fmt)) {\n errors[field.id] = t(\"custom_form.invalid_date\", {\n format: fmt,\n });\n hasError = true;\n }\n break;\n }\n\n case \"address\":\n // Validate address object if required\n if (field.required && typeof value === \"object\") {\n const addressValue = value as {\n addressLine1?: string;\n postalCode?: string;\n city?: string;\n countryCode?: string;\n };\n if (\n !addressValue.addressLine1 ||\n !addressValue.postalCode ||\n !addressValue.city ||\n !addressValue.countryCode\n ) {\n errors[field.id] = true;\n hasError = true;\n }\n }\n break;\n }\n }\n });\n\n setCustomFormErrors(errors);\n setCustomFormCellErrors(cellErrors);\n return !hasError;\n };\n\n const handleCustomFieldChange = (fieldId: string, value: any) => {\n setCustomFormData((prev) => ({ ...prev, [fieldId]: value }));\n setCustomFormErrors((prev) => ({ ...prev, [fieldId]: false }));\n setCustomFormCellErrors((prev) => {\n if (!(fieldId in prev)) return prev;\n const { [fieldId]: _removed, ...rest } = prev;\n return rest;\n });\n };\n\n const goOnNextStep = () => {\n // Handle custom form validation and submission\n if (informationType === \"custom\") {\n if (!validateCustomForm()) {\n return;\n }\n\n const topLevelEntries: Record<string, any> = {};\n const customFormDataEntries: Record<string, any> = {};\n node.customFields?.forEach((field) => {\n const key = field.userInputKey ?? labelToKey(field.label);\n topLevelEntries[key] = customFormData[field.id];\n customFormDataEntries[field.id] = customFormData[field.id];\n });\n\n setUserInput((prev) => ({\n ...prev,\n // Top level avec clé lisible dérivée du label (attendu par l'API cliente)\n ...topLevelEntries,\n // customFormData avec les field.id d'origine (rétrocompat : conditions, sessions existantes)\n customFormData: { ...(prev.customFormData ?? {}), ...customFormDataEntries },\n }));\n\n if (sessionId) logFormValidated(sessionId);\n if (onContinueCallback) {\n onContinueCallback();\n } else {\n goToNextStep(node.id, template);\n }\n return;\n }\n\n // Standard form validation\n if (!validateForm()) {\n return;\n }\n\n setUserInput((previous) => ({\n ...previous,\n ...(requestedFields.has(\"nom\") && {\n ...(informationType === \"identity-legal\"\n ? { companyName: form.companyName }\n : { lastName: form.lastName }),\n }),\n ...(requestedFields.has(\"prenom\") && { firstName: form.firstName }),\n ...(requestedFields.has(\"date_naissance\") && {\n birthDate: form.birthDate,\n }),\n ...(requestedFields.has(\"email\") && { email: form.email }),\n ...(requestedFields.has(\"sms\") && {\n phoneNumber: form.phoneNumber,\n sms: form.phoneNumber,\n }),\n ...(requestedFields.has(\"adresse\") && {\n addressLine1: form.addressLine1,\n addressLine2: form.addressLine2,\n postalCode: form.postalCode,\n city: form.city,\n countryCode: form.countryCode,\n }),\n ...(requestedFields.has(\"siret\") && { siret: form.siret }),\n ...(requestedFields.has(\"tva\") && { tva: form.tva }),\n ...(requestedFields.has(\"registrationNumber\") && { registrationNumber: form.registrationNumber }),\n ...(requestedFields.has(\"siret\") && !requestedFields.has(\"registrationNumber\") && { registrationNumber: form.siret }),\n ...(requestedFields.has(\"nationalite\") && {\n nationality: form.nationality,\n }),\n ...(requestedFields.has(\"legalRepresentativeNom\") && {\n legalRepresentativeLastName: form.legalRepresentativeLastName,\n }),\n ...(requestedFields.has(\"legalRepresentativePrenom\") && {\n legalRepresentativeFirstName: form.legalRepresentativeFirstName,\n }),\n }));\n\n if (informationType === \"contact\" && setContactInfo) {\n setContactInfo((previous) => ({\n ...previous,\n ...(requestedFields.has(\"email\") && { email: form.email }),\n ...(requestedFields.has(\"sms\") && { phoneNumber: form.phoneNumber }),\n }));\n }\n\n if (sessionId) logFormValidated(sessionId);\n if (onContinueCallback) {\n onContinueCallback();\n } else {\n goToNextStep(node.id, template);\n }\n };\n\n const goOnPreviousStep = () => {\n console.log(\"[goOnPreviousStep] called — step:\", step, \"canGoBack:\", stepObject.canGoBack);\n goBack();\n };\n\n const pageTitle = node.pageTitle || formTitles[informationType];\n\n const pageDescription =\n node.pageDescription || formDescriptions[informationType];\n\n return {\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 };\n};\n"],"names":["useI18n","useMemo","resolveInformationType","DEFAULT_FIELDS","parseBirthDate","useState","labelToKey","useRef","__assign","__awaiter","API_BASE_URL","GEOCODING_AUTOCOMPLETE_ENDPOINT","FALLBACK_ADDRESS_SUGGESTIONS","useEffect","checkIsMajor","getListFieldMinRows","normalizeListColumns","countNonEmptyListRows","cellErrorKey","isEmailValid","DEFAULT_DATE_DISPLAY_FORMAT","isDateValid","isRegexMatch","__rest","logFormValidated"],"mappings":";;;;;;;;;;;;;;AA6DO,IAAM,gBAAgB,GAAG,UAAC,EAUa,EAAA;QAT5C,UAAU,GAAA,EAAA,CAAA,UAAA,EACV,YAAY,GAAA,EAAA,CAAA,YAAA,EACZ,gBAAgB,GAAA,EAAA,CAAA,gBAAA,EAChB,IAAI,GAAA,EAAA,CAAA,IAAA,EACJ,QAAQ,cAAA,EACR,WAAW,GAAA,EAAA,CAAA,WAAA,EACX,cAAc,GAAA,EAAA,CAAA,cAAA,EACd,kBAAkB,GAAA,EAAA,CAAA,kBAAA,EAClB,SAAS,GAAA,EAAA,CAAA,SAAA;AAED,IAAwC,UAAU,QAA3C,CAAA,KAAE,MAAM,GAAyB,UAAU,CAAA,MAAnC,EAAE,YAAY,GAAW,UAAU,CAAA,YAArB,CAAA,CAAE,IAAI,GAAK,UAAU;AAClD,IAAA,IAAA,CAAC,GAAKA,eAAO,EAAE,EAAd;IAET,IAAM,eAAe,GAAGC,aAAO,CAAkB,YAAA;;QAC/C,IAAM,QAAQ,GAAGC,oCAAsB,CACrC,IAAI,CAAC,eAAyB,EAC9B,UAAU,CACX;AACD,QAAA,OAAO,CAAC,GAAG,CAAC,kDAAkD,EAAE;YAC9D,mBAAmB,EAAE,IAAI,CAAC,eAAe;AACzC,YAAA,QAAQ,EAAA,QAAA;AACR,YAAA,eAAe,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY;AACpC,YAAA,iBAAiB,EAAE,CAAA,EAAA,GAAA,IAAI,CAAC,YAAY,0CAAE,MAAM;AAC7C,SAAA,CAAC;AACF,QAAA,OAAO,QAAQ;IACjB,CAAC,EAAE,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,YAAY,CAAC,CAAC;IAE7C,IAAM,eAAe,GAAGD,aAAO,CAAkB,YAAA;QAC/C,IAAM,QAAQ,GAAGE,8BAAc,CAAC,eAAe,CAAC,IAAI,EAAE;AACtD,QAAA,IAAM,QAAQ,GACZ,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,cAAc,CAAC,MAAM,GAAG;cAChD,IAAI,CAAC;cACL,QAAQ;AACd,QAAA,IAAM,MAAM,GAAG,IAAI,GAAG,CAAS,QAAQ,CAAC;AAExC,QAAA,IAAI,IAAI,CAAC,cAAc,EAAE;AACvB,YAAA,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,UAAC,KAAK,EAAA,EAAK,OAAA,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAA,CAAjB,CAAiB,CAAC;QAC3D;AAEA,QAAA,OAAO,MAAM;AACf,IAAA,CAAC,EAAE,CAAC,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,eAAe,CAAC,CAAC;AAE/D,IAAA,IAAM,cAAc,GAAGF,aAAO,CAC5B,cAAM,OAAAG,4BAAc,CAAC,CAAA,gBAAgB,KAAA,IAAA,IAAhB,gBAAgB,KAAA,MAAA,GAAA,MAAA,GAAhB,gBAAgB,CAAE,SAAS,KAAI,EAAE,CAAC,CAAA,CAAjD,CAAiD,EACvD,CAAC,gBAAgB,KAAA,IAAA,IAAhB,gBAAgB,KAAA,MAAA,GAAA,MAAA,GAAhB,gBAAgB,CAAE,SAAS,CAAC,CAC9B;IAEK,IAAA,EAAA,GAAkBC,cAAQ,CAAqB;QACnD,QAAQ,EAAE,CAAA,gBAAgB,KAAA,IAAA,IAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,QAAQ,KAAI,EAAE;QAC1C,SAAS,EAAE,CAAA,gBAAgB,KAAA,IAAA,IAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,SAAS,KAAI,EAAE;QAC5C,SAAS,EAAE,CAAA,gBAAgB,KAAA,IAAA,IAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,SAAS,KAAI,EAAE;QAC5C,GAAG,EAAE,cAAc,CAAC,GAAG;QACvB,KAAK,EAAE,cAAc,CAAC,KAAK;QAC3B,IAAI,EAAE,cAAc,CAAC,IAAI;AACzB,QAAA,KAAK,EAAE,CAAA,gBAAgB,aAAhB,gBAAgB,KAAA,MAAA,GAAA,MAAA,GAAhB,gBAAgB,CAAE,KAAK,MAAI,WAAW,KAAA,IAAA,IAAX,WAAW,KAAA,MAAA,GAAA,MAAA,GAAX,WAAW,CAAE,KAAK,CAAA,IAAI,EAAE;AAC1D,QAAA,WAAW,EACT,CAAA,gBAAgB,aAAhB,gBAAgB,KAAA,MAAA,GAAA,MAAA,GAAhB,gBAAgB,CAAE,WAAW,MAAI,WAAW,KAAA,IAAA,IAAX,WAAW,KAAA,MAAA,GAAA,MAAA,GAAX,WAAW,CAAE,WAAW,CAAA,IAAI,EAAE;QACjE,GAAG,EAAE,CAAA,gBAAgB,KAAA,IAAA,IAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,GAAG,KAAI,EAAE;QAChC,YAAY,EAAE,CAAA,gBAAgB,KAAA,IAAA,IAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,YAAY,KAAI,EAAE;QAClD,YAAY,EAAE,CAAA,gBAAgB,KAAA,IAAA,IAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,YAAY,KAAI,EAAE;QAClD,UAAU,EAAE,CAAA,gBAAgB,KAAA,IAAA,IAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,UAAU,KAAI,EAAE;QAC9C,IAAI,EAAE,CAAA,gBAAgB,KAAA,IAAA,IAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,IAAI,KAAI,EAAE;QAClC,WAAW,EAAE,CAAA,gBAAgB,KAAA,IAAA,IAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,WAAW,KAAI,EAAE;QAChD,WAAW,EAAE,CAAA,gBAAgB,KAAA,IAAA,IAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,WAAW,KAAI,EAAE;QAChD,WAAW,EAAE,CAAA,gBAAgB,KAAA,IAAA,IAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,WAAW,KAAI,EAAE;QAChD,KAAK,EAAE,CAAA,gBAAgB,KAAA,IAAA,IAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,KAAK,KAAI,EAAE;QACpC,GAAG,EAAE,CAAA,gBAAgB,KAAA,IAAA,IAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,GAAG,KAAI,EAAE;QAChC,kBAAkB,EAAE,CAAA,gBAAgB,KAAA,IAAA,IAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,kBAAkB,KAAI,EAAE;QAC9D,2BAA2B,EACzB,CAAA,gBAAgB,KAAA,IAAA,IAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,2BAA2B,KAAI,EAAE;QACrD,4BAA4B,EAC1B,CAAA,gBAAgB,KAAA,IAAA,IAAhB,gBAAgB,uBAAhB,gBAAgB,CAAE,4BAA4B,KAAI,EAAE;AACvD,KAAA,CAAC,EAzBK,IAAI,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,OAAO,QAyBlB;IAEI,IAAA,EAAA,GAAsBA,cAAQ,CAAsB,EAAE,CAAC,EAAtD,MAAM,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,SAAS,GAAA,EAAA,CAAA,CAAA,CAAqC;;IAGvD,IAAA,EAAA,GAAsCA,cAAQ,CAClD,YAAA;AACE,QAAA,IAAI,eAAe,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,YAAY;AAAE,YAAA,OAAO,EAAE;QAEjE,IAAM,OAAO,GAAwB,EAAE;AACvC,QAAA,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,UAAC,KAAK,EAAA;;AAC9B,YAAA,IAAM,WAAW,GAAG,CAAA,EAAA,GAAA,KAAK,CAAC,YAAY,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAIC,qBAAU,CAAC,KAAK,CAAC,KAAK,CAAC;;YAEjE,IAAM,UAAU,GACd,CAAA,EAAA,GAAC,gBAAwC,KAAA,IAAA,IAAxC,gBAAgB,KAAA,MAAA,GAAA,MAAA,GAAhB,gBAAgB,CAA2B,WAAW,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GACxD,MAAA,gBAAgB,KAAA,IAAA,IAAhB,gBAAgB,KAAA,MAAA,GAAA,MAAA,GAAhB,gBAAgB,CAAE,cAAc,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAG,KAAK,CAAC,EAAE,CAAC;AAC9C,YAAA,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,EAAE;gBAC9B,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,GAAG,EAAE;gBAC/D;YACF;YAEA,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,UAAU,IAAI,EAAE;AACtC,QAAA,CAAC,CAAC;AACF,QAAA,OAAO,OAAO;AAChB,IAAA,CAAC,CACF,EApBM,cAAc,QAAA,EAAE,iBAAiB,QAoBvC;IACK,IAAA,EAAA,GAA0CD,cAAQ,CAEtD,EAAE,CAAC,EAFE,gBAAgB,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,mBAAmB,GAAA,EAAA,CAAA,CAAA,CAEvC;IACC,IAAA,EAAA,GAAkDA,cAAQ,CAE9D,EAAE,CAAC,EAFE,oBAAoB,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,uBAAuB,GAAA,EAAA,CAAA,CAAA,CAE/C;IAEC,IAAA,EAAA,GAA8CA,cAAQ,CAE1D,EAAE,CAAC,EAFE,kBAAkB,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,qBAAqB,GAAA,EAAA,CAAA,CAAA,CAE3C;IACC,IAAA,EAAA,GAAwCA,cAAQ,CAAC,KAAK,CAAC,EAAtD,eAAe,GAAA,EAAA,CAAA,CAAA,CAAA,EAAE,kBAAkB,GAAA,EAAA,CAAA,CAAA,CAAmB;AAC7D,IAAA,IAAM,aAAa,GAAGE,YAAM,CAAC,IAAI,CAAC;IAClC,IAAM,mBAAmB,GAAGA,YAAM,CAAC,IAAI,CAAC,EAAE,CAAC;AAC3C,IAAA,IAAM,qBAAqB,GAAGA,YAAM,CAClC,IAAI,CACL;IACD,IAAM,mBAAmB,GAAGA,YAAM,CAG/B;AACD,QAAA,QAAQ,EAAE,IAAI;AACd,QAAA,UAAU,EAAE,IAAI;AACjB,KAAA,CAAC;AAEF,IAAA,IAAM,UAAU,GAAGN,aAAO,CACxB,YAAA,EAAM,QAAC;AACL,QAAA,QAAQ,EAAE,CAAC,CAAC,iCAAiC,CAAC;AAC9C,QAAA,gBAAgB,EAAE,CAAC,CAAC,uCAAuC,CAAC;AAC5D,QAAA,OAAO,EAAE,CAAC,CAAC,gCAAgC,CAAC;AAC5C,QAAA,OAAO,EAAE,CAAC,CAAC,gCAAgC,CAAC;AAC5C,QAAA,WAAW,EAAE,CAAC,CAAC,oCAAoC,CAAC;AACpD,QAAA,MAAM,EAAE,CAAC,CAAC,+BAA+B,CAAC;AAC3C,KAAA,GAPK,CAOJ,EACF,CAAC,CAAC,CAAC,CACJ;AAED,IAAA,IAAM,gBAAgB,GAAGA,aAAO,CAC9B,YAAA,EAAM,QAAC;AACL,QAAA,QAAQ,EAAE,CAAC,CAAC,uCAAuC,CAAC;AACpD,QAAA,gBAAgB,EAAE,CAAC,CAAC,6CAA6C,CAAC;AAClE,QAAA,OAAO,EAAE,CAAC,CAAC,sCAAsC,CAAC;AAClD,QAAA,OAAO,EAAE,CAAC,CAAC,sCAAsC,CAAC;AAClD,QAAA,WAAW,EAAE,CAAC,CAAC,0CAA0C,CAAC;AAC1D,QAAA,MAAM,EAAE,CAAC,CAAC,qCAAqC,CAAC;AACjD,KAAA,GAPK,CAOJ,EACF,CAAC,CAAC,CAAC,CACJ;IAED,IAAM,sBAAsB,GAAG,UAAC,UAA6B,EAAA;;AAC3D,QAAA,IAAM,iBAAiB,GACrB,CAAA,CAAA,EAAA,GAAA,UAAU,CAAC,WAAW,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAE,WAAW,EAAE,KAAI,UAAU,CAAC,OAAO,IAAI,EAAE;QAEnE,OAAO,CAAC,UAAC,QAAQ,EAAA,EAAK,QAAAO,kBAAA,CAAAA,kBAAA,CAAA,EAAA,EACjB,QAAQ,CAAA,EAAA,EACX,YAAY,EAAE,UAAU,CAAC,YAAY,IAAI,UAAU,CAAC,KAAK,EACzD,UAAU,EAAE,UAAU,CAAC,UAAU,IAAI,QAAQ,CAAC,UAAU,EACxD,IAAI,EAAE,UAAU,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,EACtC,WAAW,EAAE,iBAAiB,IAAI,QAAQ,CAAC,WAAW,EAAA,CAAA,EACtD,CANoB,CAMpB,CAAC;QACH,SAAS,CAAC,UAAC,QAAQ,EAAA,EAAK,QAAAA,kBAAA,CAAAA,kBAAA,CAAA,EAAA,EACnB,QAAQ,CAAA,EAAA,EACX,YAAY,EAAE,KAAK,EACnB,UAAU,EAAE,KAAK,EACjB,IAAI,EAAE,KAAK,EACX,OAAO,EAAE,KAAK,EAAA,CAAA,EACd,CANsB,CAMtB,CAAC;QACH,kBAAkB,CAAC,KAAK,CAAC;QACzB,qBAAqB,CAAC,EAAE,CAAC;AAC3B,IAAA,CAAC;IAED,IAAM,kBAAkB,GAAG,UAAC,OAAY,EAAA;;QACtC,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;AACnC,YAAA,OAAO,IAAI;QACb;AAEQ,QAAA,IAAA,UAAU,GAAK,OAAO,CAAA,UAAZ;AAClB,QAAA,IAAM,KAAK,GACT,UAAU,CAAC,SAAS;AACpB,YAAA,UAAU,CAAC,aAAa;AACxB,YAAA,CAAC,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC,MAAM;iBACvC,MAAM,CAAC,OAAO;iBACd,IAAI,CAAC,GAAG;AACR,iBAAA,IAAI,EAAE;QAEX,IAAI,CAAC,KAAK,EAAE;AACV,YAAA,OAAO,IAAI;QACb;QAEA,IAAM,YAAY,GAChB,CAAC,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC,MAAM;aACvC,MAAM,CAAC,OAAO;aACd,IAAI,CAAC,GAAG;AACR,aAAA,IAAI,EAAE;AACT,YAAA,UAAU,CAAC,aAAa;AACxB,YAAA,KAAK;AAEP,QAAA,IAAM,IAAI,GACR,UAAU,CAAC,IAAI;AACf,YAAA,UAAU,CAAC,IAAI;AACf,YAAA,UAAU,CAAC,OAAO;AAClB,YAAA,UAAU,CAAC,KAAK;AAChB,YAAA,EAAE;QAEJ,OAAO;AACL,YAAA,EAAE,EACA,CAAC,UAAU,CAAC,QAAQ,IAAI,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC;AACnD,gBAAA,OAAO,CAAC,EAAE;AACV,gBAAA,EAAA,CAAA,MAAA,CAAG,CAAA,EAAA,GAAA,UAAU,CAAC,GAAG,mCAAI,EAAE,EAAA,GAAA,CAAA,CAAA,MAAA,CAAI,CAAA,EAAA,GAAA,UAAU,CAAC,GAAG,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,EAAE,EAAA,GAAA,CAAA,CAAA,MAAA,CAAI,KAAK,CAAE;AAC5D,YAAA,KAAK,EAAA,KAAA;AACL,YAAA,YAAY,EAAA,YAAA;AACZ,YAAA,UAAU,EAAE,UAAU,CAAC,QAAQ,IAAI,EAAE;AACrC,YAAA,IAAI,EAAA,IAAA;AACJ,YAAA,OAAO,EAAE,UAAU,CAAC,OAAO,IAAI,EAAE;AACjC,YAAA,WAAW,EAAE,UAAU,CAAC,YAAY,IAAI,SAAS;SAClD;AACH,IAAA,CAAC;AAED,IAAA,IAAM,yBAAyB,GAAG,UAChC,KAAa,EACb,EAA2C,EAAA;AAAzC,QAAA,IAAA,YAAY,GAAA,EAAA,CAAA,YAAA;AAEd,QAAA,IAAI,mBAAmB,CAAC,OAAO,CAAC,QAAQ,EAAE;AACxC,YAAA,YAAY,CAAC,mBAAmB,CAAC,OAAO,CAAC,QAAQ,CAAC;AAClD,YAAA,mBAAmB,CAAC,OAAO,CAAC,QAAQ,GAAG,IAAI;QAC7C;QAEA,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE;AAC3B,YAAA,IAAI,mBAAmB,CAAC,OAAO,CAAC,UAAU,EAAE;AAC1C,gBAAA,mBAAmB,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE;AAC9C,gBAAA,mBAAmB,CAAC,OAAO,CAAC,UAAU,GAAG,IAAI;YAC/C;YACA,qBAAqB,CAAC,EAAE,CAAC;YACzB,kBAAkB,CAAC,KAAK,CAAC;YACzB;QACF;AAEA,QAAA,mBAAmB,CAAC,OAAO,CAAC,QAAQ,GAAG,UAAU,CAAC,YAAA,EAAA,OAAAC,mBAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,YAAA;;;;;AAChD,wBAAA,IAAI,mBAAmB,CAAC,OAAO,CAAC,UAAU,EAAE;AAC1C,4BAAA,mBAAmB,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE;wBAChD;AAEM,wBAAA,UAAU,GAAG,IAAI,eAAe,EAAE;AACxC,wBAAA,mBAAmB,CAAC,OAAO,CAAC,UAAU,GAAG,UAAU;;;;wBAG3C,YAAY,GAAG,IAAI,eAAe,CAAC;AACvC,4BAAA,IAAI,EAAE,KAAK;AACX,4BAAA,IAAI,EAAE,IAAI;AACX,yBAAA,CAAC;wBAEe,OAAA,CAAA,CAAA,YAAM,KAAK,CAC1B,EAAA,CAAA,MAAA,CAAGC,gBAAY,SAAGC,+CAA+B,EAAA,GAAA,CAAA,CAAA,MAAA,CAAI,YAAY,CAAC,QAAQ,EAAE,CAAE,EAC9E,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAC9B,CAAA;;AAHK,wBAAA,QAAQ,GAAG,EAAA,CAAA,IAAA,EAGhB;AAED,wBAAA,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE;4BAChB,MAAM,IAAI,KAAK,CACb,uCAAA,CAAA,MAAA,CAAwC,QAAQ,CAAC,MAAM,CAAE,CAC1D;wBACH;AAEgB,wBAAA,OAAA,CAAA,CAAA,YAAM,QAAQ,CAAC,IAAI,EAAE,CAAA;;AAA/B,wBAAA,OAAO,GAAG,EAAA,CAAA,IAAA,EAAqB;AAE/B,wBAAA,WAAW,GAAwB,KAAK,CAAC,OAAO,CACpD,OAAO,KAAA,IAAA,IAAP,OAAO,KAAA,MAAA,GAAA,MAAA,GAAP,OAAO,CAAE,QAAQ;8BAEf,OAAO,CAAC;iCACP,GAAG,CAAC,UAAC,OAAY,EAAA,EAAK,OAAA,kBAAkB,CAAC,OAAO,CAAC,CAAA,CAA3B,CAA2B;iCACjD,MAAM,CACL,UACE,UAAoC,EAAA,EACA,OAAA,OAAO,CAAC,UAAU,CAAC,CAAA,CAAnB,CAAmB;8BAE3D,EAAE;wBAEN,qBAAqB,CAAC,WAAW,CAAC;AAClC,wBAAA,kBAAkB,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC;wBAE1C,IAAI,YAAY,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE;AACtC,4BAAA,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC;4BACvB,eAAe,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE;AAClD,4BAAA,IACE,eAAe,CAAC,MAAM,IAAI,CAAC;gCAC3B,MAAM,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EACtD;gCACA,sBAAsB,CAAC,MAAM,CAAC;4BAChC;wBACF;;;;AAEA,wBAAA,IAAK,OAAe,CAAC,IAAI,KAAK,YAAY,EAAE;4BAC1C,OAAA,CAAA,CAAA,YAAA;wBACF;AAEM,wBAAA,QAAQ,GAAGC,4CAA4B,CAAC,MAAM,CAAC,UAAC,UAAU,EAAA;AAC9D,4BAAA,OAAA,UAAU,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;AAA5D,wBAAA,CAA4D,CAC7D;wBACD,qBAAqB,CAAC,QAAQ,CAAC;AAC/B,wBAAA,kBAAkB,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;;;AAEvC,wBAAA,mBAAmB,CAAC,OAAO,CAAC,UAAU,GAAG,IAAI;;;;;aAEhD,EAAE,GAAG,CAAC;AACT,IAAA,CAAC;AAED,IAAAC,eAAS,CAAC,YAAA;QACR,IAAI,CAAC,gBAAgB,EAAE;YACrB;QACF;QAEA,IACE,aAAa,CAAC,OAAO;aACpB,CAAC,IAAI,CAAC,SAAS;gBACd,CAAC,IAAI,CAAC,QAAQ;gBACd,CAAC,IAAI,CAAC,KAAK;gBACX,CAAC,IAAI,CAAC,WAAW;AACjB,gBAAA,CAAC,IAAI,CAAC,WAAW,CAAC,EACpB;YACA,IAAM,gBAAc,GAAGT,4BAAc,CAAC,gBAAgB,CAAC,SAAS,IAAI,EAAE,CAAC;YACvE,OAAO,CAAC,UAAC,QAAQ,EAAA,EAAK,QAAAI,kBAAA,CAAAA,kBAAA,CAAA,EAAA,EACjB,QAAQ,KACX,QAAQ,EAAE,gBAAgB,CAAC,QAAQ,IAAI,QAAQ,CAAC,QAAQ,EACxD,SAAS,EAAE,gBAAgB,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS,EAC3D,SAAS,EAAE,gBAAgB,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS,EAC3D,GAAG,EAAE,gBAAc,CAAC,GAAG,EACvB,KAAK,EAAE,gBAAc,CAAC,KAAK,EAC3B,IAAI,EAAE,gBAAc,CAAC,IAAI,EACzB,KAAK,EAAE,gBAAgB,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,EAC/C,WAAW,EAAE,gBAAgB,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW,EACjE,GAAG,EAAE,gBAAgB,CAAC,GAAG,IAAI,QAAQ,CAAC,GAAG,EACzC,YAAY,EAAE,gBAAgB,CAAC,YAAY,IAAI,QAAQ,CAAC,YAAY,EACpE,YAAY,EAAE,gBAAgB,CAAC,YAAY,IAAI,QAAQ,CAAC,YAAY,EACpE,UAAU,EAAE,gBAAgB,CAAC,UAAU,IAAI,QAAQ,CAAC,UAAU,EAC9D,IAAI,EAAE,gBAAgB,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI,EAC5C,WAAW,EAAE,gBAAgB,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW,EACjE,WAAW,EAAE,gBAAgB,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW,EACjE,WAAW,EAAE,gBAAgB,CAAC,WAAW,IAAI,QAAQ,CAAC,WAAW,EACjE,KAAK,EAAE,gBAAgB,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,EAC/C,GAAG,EAAE,gBAAgB,CAAC,GAAG,IAAI,QAAQ,CAAC,GAAG,EACzC,kBAAkB,EAAE,gBAAgB,CAAC,kBAAkB,IAAI,QAAQ,CAAC,kBAAkB,EAAA,CAAA,EACtF,CArBoB,CAqBpB,CAAC;AAEH,YAAA,aAAa,CAAC,OAAO,GAAG,KAAK;QAC/B;AACF,IAAA,CAAC,EAAE;QACD,gBAAgB;AAChB,QAAA,IAAI,CAAC,SAAS;AACd,QAAA,IAAI,CAAC,QAAQ;AACb,QAAA,IAAI,CAAC,KAAK;AACV,QAAA,IAAI,CAAC,WAAW;AAChB,QAAA,IAAI,CAAC,WAAW;AACjB,KAAA,CAAC;;;;;;;AAQF,IAAAK,eAAS,CAAC,YAAA;QACR,IAAI,mBAAmB,CAAC,OAAO,KAAK,IAAI,CAAC,EAAE,EAAE;YAC3C;QACF;AACA,QAAA,mBAAmB,CAAC,OAAO,GAAG,IAAI,CAAC,EAAE;QAErC,IAAI,eAAe,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;YACtD,iBAAiB,CAAC,EAAE,CAAC;YACrB;QACF;QAEA,IAAM,IAAI,GAAwB,EAAE;AACpC,QAAA,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,UAAC,KAAK,EAAA;;AAC9B,YAAA,IAAM,WAAW,GAAG,CAAA,EAAA,GAAA,KAAK,CAAC,YAAY,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAIP,qBAAU,CAAC,KAAK,CAAC,KAAK,CAAC;YACjE,IAAM,UAAU,GACd,CAAA,EAAA,GAAC,gBAAwC,KAAA,IAAA,IAAxC,gBAAgB,KAAA,MAAA,GAAA,MAAA,GAAhB,gBAAgB,CAA2B,WAAW,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GACxD,MAAA,gBAAgB,KAAA,IAAA,IAAhB,gBAAgB,KAAA,MAAA,GAAA,MAAA,GAAhB,gBAAgB,CAAE,cAAc,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,MAAA,GAAA,EAAA,CAAG,KAAK,CAAC,EAAE,CAAC;AAC9C,YAAA,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,EAAE;gBAC9B,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,UAAU,GAAG,EAAE;gBAC5D;YACF;YACA,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,UAAU,IAAI,EAAE;AACnC,QAAA,CAAC,CAAC;QACF,iBAAiB,CAAC,IAAI,CAAC;AACzB,IAAA,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,EAAE,eAAe,EAAE,IAAI,CAAC,YAAY,EAAE,gBAAgB,CAAC,CAAC;AAEnE,IAAAO,eAAS,CAAC,YAAA;QACR,OAAO,YAAA;AACL,YAAA,IAAI,qBAAqB,CAAC,OAAO,EAAE;AACjC,gBAAA,YAAY,CAAC,qBAAqB,CAAC,OAAO,CAAC;YAC7C;AACA,YAAA,IAAI,mBAAmB,CAAC,OAAO,CAAC,QAAQ,EAAE;AACxC,gBAAA,YAAY,CAAC,mBAAmB,CAAC,OAAO,CAAC,QAAQ,CAAC;YACpD;AACA,YAAA,IAAI,mBAAmB,CAAC,OAAO,CAAC,UAAU,EAAE;AAC1C,gBAAA,mBAAmB,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE;YAChD;AACF,QAAA,CAAC;IACH,CAAC,EAAE,EAAE,CAAC;AAEN,IAAA,IAAM,iBAAiB,GAAG,UAAC,GAA6B,EAAE,KAAa,EAAA;QACrE,SAAS,CAAC,UAAC,QAAQ,EAAA;;YAAK,QAAAL,kBAAA,CAAAA,kBAAA,CAAA,EAAA,EACnB,QAAQ,CAAA,GAAA,EAAA,GAAA,EAAA,EAAA,EAAA,CACV,GAAG,CAAA,GAAG,KAAK,EACZ,EAAA,CAAA,QAAQ,GAAE,KAAK,EAAA,EAAA,EAAA;AAHO,QAAA,CAItB,CAAC;QAEH,OAAO,CAAC,UAAC,QAAQ,EAAA;;YACf,IAAM,IAAI,6CAAQ,QAAQ,CAAA,GAAA,EAAA,GAAA,EAAA,EAAA,EAAA,CAAG,GAAG,CAAA,GAAG,KAAK,MAAE;AAC1C,YAAA,IAAI,GAAG,KAAK,KAAK,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,KAAK,MAAM,EAAE;AAC9C,gBAAA,IAAA,GAAG,GAAkB,IAAI,CAAA,GAAtB,EAAE,KAAK,GAAW,IAAI,CAAA,KAAf,EAAE,IAAI,GAAK,IAAI,KAAT;AACxB,gBAAA,IAAI,GAAG,IAAI,KAAK,IAAI,IAAI,EAAE;oBACxB,IAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;oBACtC,IAAM,WAAW,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;oBAC1C,IAAI,CAAC,SAAS,GAAG,EAAA,CAAA,MAAA,CAAG,SAAS,cAAI,WAAW,EAAA,GAAA,CAAA,CAAA,MAAA,CAAI,IAAI,CAAE;gBACxD;qBAAO;AACL,oBAAA,IAAI,CAAC,SAAS,GAAG,EAAE;gBACrB;YACF;AACA,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;IAED,IAAM,mBAAmB,GAAG,UAAC,KAAa,EAAA;AACxC,QAAA,iBAAiB,CAAC,cAAc,EAAE,KAAK,CAAC;QACxC,yBAAyB,CAAC,KAAK,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC;AAC1D,IAAA,CAAC;AAED,IAAA,IAAM,kBAAkB,GAAG,YAAA;QACzB,yBAAyB,CAAC,IAAI,CAAC,YAAY,EAAE,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;AACvE,IAAA,CAAC;AAED,IAAA,IAAM,iBAAiB,GAAG,YAAA;AACxB,QAAA,IAAI,qBAAqB,CAAC,OAAO,EAAE;AACjC,YAAA,YAAY,CAAC,qBAAqB,CAAC,OAAO,CAAC;QAC7C;AACA,QAAA,qBAAqB,CAAC,OAAO,GAAG,UAAU,CAAC,YAAA;YACzC,kBAAkB,CAAC,KAAK,CAAC;AACzB,YAAA,qBAAqB,CAAC,OAAO,GAAG,IAAI;QACtC,CAAC,EAAE,GAAG,CAAC;AACT,IAAA,CAAC;AAED,IAAA,IAAM,YAAY,GAAG,YAAA;QACnB,IAAM,UAAU,GAAwB,EAAE;QAC1C,IAAI,QAAQ,GAAG,KAAK;QAEpB,IAAM,SAAS,GAAG,UAAC,GAAW,EAAA;AAC5B,YAAA,UAAU,CAAC,GAAG,CAAC,GAAG,IAAI;YACtB,QAAQ,GAAG,IAAI;AACjB,QAAA,CAAC;AAED,QAAA,IAAI,eAAe,KAAK,UAAU,EAAE;AAClC,YAAA,IAAI,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;gBACpD,SAAS,CAAC,WAAW,CAAC;YACxB;AACA,YAAA,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;gBAChD,SAAS,CAAC,UAAU,CAAC;YACvB;AACA,YAAA,IAAI,eAAe,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE;AACzC,gBAAA,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;oBACnB,SAAS,CAAC,WAAW,CAAC;gBACxB;qBAAO,IAAI,CAACM,0BAAY,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE;AACxC,oBAAA,UAAU,CAAC,QAAQ,GAAG,IAAI;oBAC1B,QAAQ,GAAG,IAAI;gBACjB;YACF;QACF;AAEA,QAAA,IAAI,eAAe,KAAK,gBAAgB,EAAE;AACxC,YAAA,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;gBACnD,SAAS,CAAC,aAAa,CAAC;YAC1B;AACA,YAAA,IAAI,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE;gBAC/C,SAAS,CAAC,OAAO,CAAC;YACpB;AACA,YAAA,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;gBAC3C,SAAS,CAAC,KAAK,CAAC;YAClB;AACA,YAAA,IAAI,eAAe,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE;gBACzE,SAAS,CAAC,oBAAoB,CAAC;YACjC;QACF;AAEA,QAAA,IAAI,eAAe,KAAK,oBAAoB,EAAE;AAC5C,YAAA,IACE,eAAe,CAAC,GAAG,CAAC,wBAAwB,CAAC;AAC7C,gBAAA,CAAC,IAAI,CAAC,2BAA2B,EACjC;gBACA,SAAS,CAAC,6BAA6B,CAAC;YAC1C;AACA,YAAA,IACE,eAAe,CAAC,GAAG,CAAC,2BAA2B,CAAC;AAChD,gBAAA,CAAC,IAAI,CAAC,4BAA4B,EAClC;gBACA,SAAS,CAAC,8BAA8B,CAAC;YAC3C;QACF;AAEA,QAAA,IAAI,eAAe,KAAK,SAAS,EAAE;AACjC,YAAA,IAAI,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;gBAChC,IAAM,UAAU,GAAG,4BAA4B;AAC/C,gBAAA,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;oBAC/C,SAAS,CAAC,OAAO,CAAC;gBACpB;YACF;AACA,YAAA,IAAI,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;gBAC9B,IACE,CAAC,IAAI,CAAC,WAAW;AACjB,oBAAA,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EAC9C;oBACA,SAAS,CAAC,aAAa,CAAC;gBAC1B;YACF;QACF;QAEA,IACE,CAAC,eAAe,KAAK,SAAS,IAAI,eAAe,KAAK,gBAAgB;AACtE,YAAA,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,EAC9B;AACA,YAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;gBACtB,SAAS,CAAC,cAAc,CAAC;YAC3B;AACA,YAAA,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;gBACpB,SAAS,CAAC,YAAY,CAAC;YACzB;AACA,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;gBACd,SAAS,CAAC,MAAM,CAAC;YACnB;AACA,YAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;gBACrB,SAAS,CAAC,SAAS,CAAC;YACtB;QACF;QAEA,IACE,eAAe,KAAK,aAAa;AACjC,YAAA,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,EAClC;AACA,YAAA,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE;gBACrB,SAAS,CAAC,aAAa,CAAC;YAC1B;QACF;QAEA,SAAS,CAAC,UAAU,CAAC;QACrB,OAAO,CAAC,QAAQ;AAClB,IAAA,CAAC;AAED,IAAA,IAAM,kBAAkB,GAAG,YAAA;;QACzB,IAAM,MAAM,GAA0C,EAAE;QACxD,IAAM,UAAU,GAA0D,EAAE;QAC5E,IAAI,QAAQ,GAAG,KAAK;AAEpB,QAAA,CAAA,EAAA,GAAA,IAAI,CAAC,YAAY,0CAAE,OAAO,CAAC,UAAC,KAAK,EAAA;;YAC/B,IAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;AAEtC,YAAA,IAAI,KAAK,CAAC,SAAS,KAAK,MAAM,EAAE;AAC9B,gBAAA,IAAM,IAAI,GAA6B,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,EAAE;AACxE,gBAAA,IAAM,OAAO,GAAGC,kCAAmB,CAAC,KAAK,CAAC;gBAC1C,IAAM,SAAO,GAAGC,mCAAoB,CAAC,KAAK,CAAC,WAAW,CAAC;gBACvD,IAAM,iBAAe,GAA0C,EAAE;gBACjE,IAAI,kBAAgB,GAAG,KAAK;gBAE5B,IAAI,KAAK,CAAC,QAAQ,IAAIC,oCAAqB,CAAC,IAAI,CAAC,GAAG,OAAO,EAAE;AAC3D,oBAAA,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI;oBACvB,QAAQ,GAAG,IAAI;oBACf,kBAAgB,GAAG,IAAI;gBACzB;AAEA,gBAAA,IAAI,CAAC,OAAO,CAAC,UAAC,GAAG,EAAE,QAAQ,EAAA;AACzB,oBAAA,IAAM,UAAU,GAAG,SAAO,CAAC,KAAK,CAC9B,UAAC,GAAG,EAAA,EAAA,IAAA,EAAA,CAAA,CAAK,OAAA,CAAC,MAAM,CAAC,MAAA,GAAG,KAAA,IAAA,IAAH,GAAG,KAAA,MAAA,GAAA,MAAA,GAAH,GAAG,CAAG,GAAG,CAAC,KAAK,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAA,CAAA,CAAA,CAChD;AACD,oBAAA,IAAI,UAAU,IAAI,CAAC,KAAK,CAAC,QAAQ;wBAAE;AAEnC,oBAAA,SAAO,CAAC,OAAO,CAAC,UAAC,GAAG,EAAA;;wBAClB,IAAM,SAAS,GAAG,MAAM,CAAC,MAAA,GAAG,KAAA,IAAA,IAAH,GAAG,KAAA,MAAA,GAAA,MAAA,GAAH,GAAG,CAAG,GAAG,CAAC,KAAK,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,EAAE,CAAC,CAAC,IAAI,EAAE;wBACvD,IAAM,GAAG,GAAGC,kCAAY,CAAC,QAAQ,EAAE,GAAG,CAAC,KAAK,CAAC;wBAE7C,IAAI,CAAC,SAAS,EAAE;AACd,4BAAA,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,UAAU,EAAE;gCACjC,iBAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,4BAA4B,CAAC;gCACtD,kBAAgB,GAAG,IAAI;4BACzB;4BACA;wBACF;AAEA,wBAAA,QAAQ,GAAG,CAAC,IAAI;AACd,4BAAA,KAAK,OAAO;AACV,gCAAA,IAAI,CAACC,kCAAY,CAAC,SAAS,CAAC,EAAE;oCAC5B,iBAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,2BAA2B,CAAC;oCACrD,kBAAgB,GAAG,IAAI;gCACzB;gCACA;4BACF,KAAK,MAAM,EAAE;gCACX,IAAM,GAAG,GAAG,CAAA,EAAA,GAAA,GAAG,CAAC,UAAU,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAIC,mCAA2B;gCACzD,IAAI,CAACC,iCAAW,CAAC,SAAS,EAAE,GAAG,CAAC,EAAE;AAChC,oCAAA,iBAAe,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,0BAA0B,EAAE;AACnD,wCAAA,MAAM,EAAE,GAAG;AACZ,qCAAA,CAAC;oCACF,kBAAgB,GAAG,IAAI;gCACzB;gCACA;4BACF;AACA,4BAAA,KAAK,MAAM;AACT,gCAAA,IAAI,GAAG,CAAC,KAAK,IAAI,CAACC,kCAAY,CAAC,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,EAAE;oCACpD,iBAAe,CAAC,GAAG,CAAC;AAClB,wCAAA,GAAG,CAAC,iBAAiB;4CACrB,CAAC,CAAC,4BAA4B,CAAC;oCACjC,kBAAgB,GAAG,IAAI;gCACzB;gCACA;;AAEN,oBAAA,CAAC,CAAC;AACJ,gBAAA,CAAC,CAAC;gBAEF,IAAI,MAAM,CAAC,IAAI,CAAC,iBAAe,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;AAC3C,oBAAA,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,iBAAe;gBACxC;gBACA,IAAI,kBAAgB,EAAE;AACpB,oBAAA,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAA,EAAA,GAAA,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,IAAI;oBAC3C,QAAQ,GAAG,IAAI;gBACjB;gBACA;YACF;;AAGA,YAAA,IAAI,KAAK,CAAC,QAAQ,IAAI,CAAC,KAAK,EAAE;AAC5B,gBAAA,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI;gBACvB,QAAQ,GAAG,IAAI;gBACf;YACF;;YAGA,IAAI,KAAK,EAAE;AACT,gBAAA,QAAQ,KAAK,CAAC,SAAS;AACrB,oBAAA,KAAK,QAAQ;wBACX,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE;AACxB,4BAAA,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI;4BACvB,QAAQ,GAAG,IAAI;wBACjB;wBACA;AAEF,oBAAA,KAAK,OAAO;wBACV,IAAI,CAACH,kCAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE;4BAChC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,2BAA2B,CAAC;4BACjD,QAAQ,GAAG,IAAI;wBACjB;wBACA;AAEF,oBAAA,KAAK,MAAM;AACT,wBAAA,IAAI,KAAK,CAAC,KAAK,IAAI,CAACG,kCAAY,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE;AAC5D,4BAAA,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AACd,gCAAA,KAAK,CAAC,iBAAiB,IAAI,CAAC,CAAC,4BAA4B,CAAC;4BAC5D,QAAQ,GAAG,IAAI;wBACjB;wBACA;oBAEF,KAAK,MAAM,EAAE;wBACX,IAAM,GAAG,GAAG,CAAA,EAAA,GAAA,KAAK,CAAC,UAAU,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAIF,mCAA2B;wBAC3D,IAAI,CAACC,iCAAW,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,EAAE;4BACpC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,0BAA0B,EAAE;AAC/C,gCAAA,MAAM,EAAE,GAAG;AACZ,6BAAA,CAAC;4BACF,QAAQ,GAAG,IAAI;wBACjB;wBACA;oBACF;AAEA,oBAAA,KAAK,SAAS;;wBAEZ,IAAI,KAAK,CAAC,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;4BAC/C,IAAM,YAAY,GAAG,KAKpB;4BACD,IACE,CAAC,YAAY,CAAC,YAAY;gCAC1B,CAAC,YAAY,CAAC,UAAU;gCACxB,CAAC,YAAY,CAAC,IAAI;AAClB,gCAAA,CAAC,YAAY,CAAC,WAAW,EACzB;AACA,gCAAA,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI;gCACvB,QAAQ,GAAG,IAAI;4BACjB;wBACF;wBACA;;YAEN;AACF,QAAA,CAAC,CAAC;QAEF,mBAAmB,CAAC,MAAM,CAAC;QAC3B,uBAAuB,CAAC,UAAU,CAAC;QACnC,OAAO,CAAC,QAAQ;AAClB,IAAA,CAAC;AAED,IAAA,IAAM,uBAAuB,GAAG,UAAC,OAAe,EAAE,KAAU,EAAA;QAC1D,iBAAiB,CAAC,UAAC,IAAI,EAAA;;AAAK,YAAA,kDAAM,IAAI,CAAA,GAAA,EAAA,GAAA,EAAA,EAAA,EAAA,CAAG,OAAO,CAAA,GAAG,KAAK,EAAA,EAAA,EAAA;AAA5B,QAAA,CAA+B,CAAC;QAC5D,mBAAmB,CAAC,UAAC,IAAI,EAAA;;AAAK,YAAA,kDAAM,IAAI,CAAA,GAAA,EAAA,GAAA,EAAA,EAAA,EAAA,CAAG,OAAO,CAAA,GAAG,KAAK,EAAA,EAAA,EAAA;AAA5B,QAAA,CAA+B,CAAC;QAC9D,uBAAuB,CAAC,UAAC,IAAI,EAAA;AAC3B,YAAA,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC;AAAE,gBAAA,OAAO,IAAI;AACnC,YAAA,IAAyC,EAAA,GAAA,IAAI,CAAA,CAArC,EAAA,GAAC,OAAQ,CAAA,CAAU,EAAA,CAAA,EAAA,CAAA,CAAA,KAAK,IAAI,GAAAE,gBAAA,CAAA,EAAA,EAA9B,CAAA,OAAA,EAAA,KAAA,QAAA,GAAA,EAAA,GAAA,EAAA,GAAA,EAAA,CAAgC;AACtC,YAAA,OAAO,IAAI;AACb,QAAA,CAAC,CAAC;AACJ,IAAA,CAAC;AAED,IAAA,IAAM,YAAY,GAAG,YAAA;;;AAEnB,QAAA,IAAI,eAAe,KAAK,QAAQ,EAAE;AAChC,YAAA,IAAI,CAAC,kBAAkB,EAAE,EAAE;gBACzB;YACF;YAEA,IAAM,iBAAe,GAAwB,EAAE;YAC/C,IAAM,uBAAqB,GAAwB,EAAE;AACrD,YAAA,CAAA,EAAA,GAAA,IAAI,CAAC,YAAY,0CAAE,OAAO,CAAC,UAAC,KAAK,EAAA;;AAC/B,gBAAA,IAAM,GAAG,GAAG,CAAA,EAAA,GAAA,KAAK,CAAC,YAAY,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAIjB,qBAAU,CAAC,KAAK,CAAC,KAAK,CAAC;gBACzD,iBAAe,CAAC,GAAG,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;AAC/C,gBAAA,uBAAqB,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;AAC5D,YAAA,CAAC,CAAC;YAEF,YAAY,CAAC,UAAC,IAAI,EAAA;;gBAAK,QAAAE,kBAAA,CAAAA,kBAAA,CAAAA,kBAAA,CAAA,EAAA,EAClB,IAAI,CAAA,EAEJ,iBAAe,CAAA,EAAA;;AAElB,oBAAA,cAAc,EAAAA,kBAAA,CAAAA,kBAAA,CAAA,EAAA,GAAQ,CAAA,EAAA,GAAA,IAAI,CAAC,cAAc,MAAA,IAAA,IAAA,EAAA,KAAA,MAAA,GAAA,EAAA,GAAI,EAAE,EAAC,EAAK,uBAAqB,CAAA,EAAA,CAAA;AAC1E,YAAA,CAAA,CAAC;AAEH,YAAA,IAAI,SAAS;gBAAEgB,kCAAgB,CAAC,SAAS,CAAC;YAC1C,IAAI,kBAAkB,EAAE;AACtB,gBAAA,kBAAkB,EAAE;YACtB;iBAAO;AACL,gBAAA,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC;YACjC;YACA;QACF;;AAGA,QAAA,IAAI,CAAC,YAAY,EAAE,EAAE;YACnB;QACF;AAEA,QAAA,YAAY,CAAC,UAAC,QAAQ,IAAK,QAAAhB,kBAAA,CAAAA,kBAAA,CAAAA,kBAAA,CAAAA,kBAAA,CAAAA,kBAAA,CAAAA,kBAAA,CAAAA,kBAAA,CAAAA,kBAAA,CAAAA,kBAAA,CAAAA,kBAAA,CAAAA,kBAAA,CAAAA,kBAAA,CAAAA,kBAAA,CAAAA,kBAAA,CAAA,EAAA,EACtB,QAAQ,CAAA,GACP,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,4BACxB,eAAe,KAAK;AACtB,cAAE,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW;AACjC,cAAE,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAChC,EAAC,GACE,eAAe,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,EAAC,GAC/D,eAAe,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI;YAC3C,SAAS,EAAE,IAAI,CAAC,SAAS;SAC1B,EAAC,GACE,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAC,GACtD,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI;YAChC,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,GAAG,EAAE,IAAI,CAAC,WAAW;SACtB,EAAC,GACE,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI;YACpC,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,WAAW,EAAE,IAAI,CAAC,WAAW;AAC9B,SAAA,KACG,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KACrD,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAAC,GAChD,eAAe,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,EAAE,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,EAAE,EAAC,GAC7F,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,EAAE,kBAAkB,EAAE,IAAI,CAAC,KAAK,EAAE,EAAC,GACjH,eAAe,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI;YACxC,WAAW,EAAE,IAAI,CAAC,WAAW;SAC9B,EAAC,GACE,eAAe,CAAC,GAAG,CAAC,wBAAwB,CAAC,IAAI;YACnD,2BAA2B,EAAE,IAAI,CAAC,2BAA2B;SAC9D,EAAC,GACE,eAAe,CAAC,GAAG,CAAC,2BAA2B,CAAC,IAAI;YACtD,4BAA4B,EAAE,IAAI,CAAC,4BAA4B;AAChE,SAAA,EAAC,EACF,CApCyB,CAoCzB,CAAC;AAEH,QAAA,IAAI,eAAe,KAAK,SAAS,IAAI,cAAc,EAAE;YACnD,cAAc,CAAC,UAAC,QAAQ,EAAA,EAAK,QAAAA,kBAAA,CAAAA,kBAAA,CAAAA,kBAAA,CAAA,EAAA,EACxB,QAAQ,IACP,eAAe,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EAAC,GACtD,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,EAAC,EACpE,CAJ2B,CAI3B,CAAC;QACL;AAEA,QAAA,IAAI,SAAS;YAAEgB,kCAAgB,CAAC,SAAS,CAAC;QAC1C,IAAI,kBAAkB,EAAE;AACtB,YAAA,kBAAkB,EAAE;QACtB;aAAO;AACL,YAAA,YAAY,CAAC,IAAI,CAAC,EAAE,EAAE,QAAQ,CAAC;QACjC;AACF,IAAA,CAAC;AAED,IAAA,IAAM,gBAAgB,GAAG,YAAA;AACvB,QAAA,OAAO,CAAC,GAAG,CAAC,mCAAmC,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,CAAC,SAAS,CAAC;AAC1F,QAAA,MAAM,EAAE;AACV,IAAA,CAAC;IAED,IAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,UAAU,CAAC,eAAe,CAAC;IAE/D,IAAM,eAAe,GACnB,IAAI,CAAC,eAAe,IAAI,gBAAgB,CAAC,eAAe,CAAC;IAE3D,OAAO;AACL,QAAA,IAAI,EAAA,IAAA;AACJ,QAAA,MAAM,EAAA,MAAA;AACN,QAAA,eAAe,EAAA,eAAA;AACf,QAAA,eAAe,EAAA,eAAA;AACf,QAAA,SAAS,EAAA,SAAA;AACT,QAAA,eAAe,EAAA,eAAA;AACf,QAAA,kBAAkB,EAAA,kBAAA;AAClB,QAAA,eAAe,EAAA,eAAA;AACf,QAAA,iBAAiB,EAAA,iBAAA;AACjB,QAAA,mBAAmB,EAAA,mBAAA;AACnB,QAAA,kBAAkB,EAAA,kBAAA;AAClB,QAAA,iBAAiB,EAAA,iBAAA;AACjB,QAAA,sBAAsB,EAAA,sBAAA;AACtB,QAAA,YAAY,EAAA,YAAA;AACZ,QAAA,gBAAgB,EAAA,gBAAA;AAChB,QAAA,cAAc,EAAA,cAAA;AACd,QAAA,gBAAgB,EAAA,gBAAA;AAChB,QAAA,oBAAoB,EAAA,oBAAA;AACpB,QAAA,uBAAuB,EAAA,uBAAA;KACxB;AACH;;;;"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var React = require('react');
|
|
4
|
+
|
|
5
|
+
var SUCCESS_DISPLAY_DURATION_MS = 2500;
|
|
6
|
+
/**
|
|
7
|
+
* Polls the wallet (OID4VP) verification status via SSE — symmetric to
|
|
8
|
+
* useNfcSseStatus. The backend learns about the wallet response by polling
|
|
9
|
+
* Oid4vpService.getStatus() internally (cf.
|
|
10
|
+
* docs/WALLET_OID4VP_IMPLEMENTATION_PLAN.md §5.2/§7), so from the SDK's point
|
|
11
|
+
* of view this is the same "connect once, react to status pushes" contract.
|
|
12
|
+
*/
|
|
13
|
+
function useWalletSseStatus(_a) {
|
|
14
|
+
var sessionId = _a.sessionId, apiBaseUrl = _a.apiBaseUrl, onCompleted = _a.onCompleted;
|
|
15
|
+
var _b = React.useState("pending"), status = _b[0], setStatus = _b[1];
|
|
16
|
+
var onCompletedRef = React.useRef(onCompleted);
|
|
17
|
+
onCompletedRef.current = onCompleted;
|
|
18
|
+
React.useEffect(function () {
|
|
19
|
+
if (!sessionId || !apiBaseUrl)
|
|
20
|
+
return;
|
|
21
|
+
var url = "".concat(apiBaseUrl, "/session/sdk/").concat(sessionId, "/wallet-status");
|
|
22
|
+
var source = new EventSource(url);
|
|
23
|
+
source.onmessage = function (event) {
|
|
24
|
+
try {
|
|
25
|
+
var data = JSON.parse(event.data);
|
|
26
|
+
if (data.status === "verified") {
|
|
27
|
+
source.close();
|
|
28
|
+
setStatus("success");
|
|
29
|
+
setTimeout(function () {
|
|
30
|
+
setStatus("completed");
|
|
31
|
+
onCompletedRef.current();
|
|
32
|
+
}, SUCCESS_DISPLAY_DURATION_MS);
|
|
33
|
+
}
|
|
34
|
+
else if (data.status === "failed" ||
|
|
35
|
+
data.status === "skipped" ||
|
|
36
|
+
data.status === "pending") {
|
|
37
|
+
setStatus(data.status);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
catch (_a) {
|
|
41
|
+
// message malformé, on ignore
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
source.onerror = function () {
|
|
45
|
+
// EventSource reconnecte automatiquement — pas d'action requise
|
|
46
|
+
};
|
|
47
|
+
// Fermer le flux quand l'onglet/app se ferme ou passe en arrière-plan, sinon le SSE reste
|
|
48
|
+
// ouvert côté serveur (heartbeat + listener qui fuient). `pagehide` couvre la fermeture
|
|
49
|
+
// (plus fiable que `beforeunload` sur mobile) ; `visibilitychange` couvre le passage en fond.
|
|
50
|
+
var closeSource = function () { return source.close(); };
|
|
51
|
+
var closeOnHide = function () {
|
|
52
|
+
if (document.visibilityState === "hidden")
|
|
53
|
+
source.close();
|
|
54
|
+
};
|
|
55
|
+
window.addEventListener("pagehide", closeSource);
|
|
56
|
+
document.addEventListener("visibilitychange", closeOnHide);
|
|
57
|
+
return function () {
|
|
58
|
+
window.removeEventListener("pagehide", closeSource);
|
|
59
|
+
document.removeEventListener("visibilitychange", closeOnHide);
|
|
60
|
+
source.close();
|
|
61
|
+
};
|
|
62
|
+
}, [sessionId, apiBaseUrl]);
|
|
63
|
+
return { status: status };
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
exports.useWalletSseStatus = useWalletSseStatus;
|
|
67
|
+
//# sourceMappingURL=useWalletSseStatus.js.map
|