datakeen-session-react 1.1.140-dev.91 → 1.1.140-dev.92
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/jdi/JDIDocumentSelection.js +9 -6
- package/dist/cjs/components/jdi/JDIDocumentSelection.js.map +1 -1
- package/dist/cjs/components/nfc-scan/BiometricSymbol.js +22 -0
- package/dist/cjs/components/nfc-scan/BiometricSymbol.js.map +1 -0
- package/dist/cjs/components/nfc-scan/NfcChipGate.js +36 -0
- package/dist/cjs/components/nfc-scan/NfcChipGate.js.map +1 -0
- package/dist/cjs/components/nfc-scan/NfcFallbackSurvey.js +70 -0
- package/dist/cjs/components/nfc-scan/NfcFallbackSurvey.js.map +1 -0
- package/dist/cjs/components/nfc-scan/NfcOnboardingNotice.js +44 -0
- package/dist/cjs/components/nfc-scan/NfcOnboardingNotice.js.map +1 -0
- package/dist/cjs/components/nfc-scan/NfcScanNode.js +2 -2
- package/dist/cjs/components/nfc-scan/NfcScanNode.js.map +1 -1
- package/dist/cjs/components/nfc-scan/PuceCniSymbol.js +22 -0
- package/dist/cjs/components/nfc-scan/PuceCniSymbol.js.map +1 -0
- package/dist/cjs/components/session/DocumentCheck.js +123 -35
- package/dist/cjs/components/session/DocumentCheck.js.map +1 -1
- package/dist/cjs/i18n/en.json.js +37 -4
- package/dist/cjs/i18n/en.json.js.map +1 -1
- package/dist/cjs/i18n/fr.json.js +37 -4
- package/dist/cjs/i18n/fr.json.js.map +1 -1
- package/dist/cjs/index.css.js +1 -1
- package/dist/cjs/services/sessionService.js +19 -0
- package/dist/cjs/services/sessionService.js.map +1 -1
- package/dist/cjs/types/session.js.map +1 -1
- package/dist/esm/components/jdi/JDIDocumentSelection.js +9 -6
- package/dist/esm/components/jdi/JDIDocumentSelection.js.map +1 -1
- package/dist/esm/components/nfc-scan/BiometricSymbol.js +18 -0
- package/dist/esm/components/nfc-scan/BiometricSymbol.js.map +1 -0
- package/dist/esm/components/nfc-scan/NfcChipGate.js +32 -0
- package/dist/esm/components/nfc-scan/NfcChipGate.js.map +1 -0
- package/dist/esm/components/nfc-scan/NfcFallbackSurvey.js +66 -0
- package/dist/esm/components/nfc-scan/NfcFallbackSurvey.js.map +1 -0
- package/dist/esm/components/nfc-scan/NfcOnboardingNotice.js +40 -0
- package/dist/esm/components/nfc-scan/NfcOnboardingNotice.js.map +1 -0
- package/dist/esm/components/nfc-scan/NfcScanNode.js +2 -2
- package/dist/esm/components/nfc-scan/NfcScanNode.js.map +1 -1
- package/dist/esm/components/nfc-scan/PuceCniSymbol.js +18 -0
- package/dist/esm/components/nfc-scan/PuceCniSymbol.js.map +1 -0
- package/dist/esm/components/session/DocumentCheck.js +124 -36
- package/dist/esm/components/session/DocumentCheck.js.map +1 -1
- package/dist/esm/i18n/en.json.js +37 -4
- package/dist/esm/i18n/en.json.js.map +1 -1
- package/dist/esm/i18n/fr.json.js +37 -4
- package/dist/esm/i18n/fr.json.js.map +1 -1
- package/dist/esm/index.css.js +1 -1
- package/dist/esm/services/sessionService.js +19 -1
- package/dist/esm/services/sessionService.js.map +1 -1
- package/dist/esm/types/session.js.map +1 -1
- package/package.json +1 -1
|
@@ -11,6 +11,7 @@ var PageActions = require('../ui/PageActions.js');
|
|
|
11
11
|
var SelectComponent = require('../ui/SelectComponent.js');
|
|
12
12
|
var useI18n = require('../../hooks/useI18n.js');
|
|
13
13
|
var MobilePageLayout = require('../ui/MobilePageLayout.js');
|
|
14
|
+
var NfcOnboardingNotice = require('../nfc-scan/NfcOnboardingNotice.js');
|
|
14
15
|
|
|
15
16
|
var DOCUMENT_KEYS = [
|
|
16
17
|
{
|
|
@@ -45,10 +46,10 @@ var DOCUMENT_KEYS = [
|
|
|
45
46
|
},
|
|
46
47
|
];
|
|
47
48
|
var JDIDocumentSelection = function (_a) {
|
|
48
|
-
var onDocumentSelect = _a.onDocumentSelect, onBack = _a.onBack, documentTypeId = _a.documentTypeId, sessionId = _a.sessionId, chosenCountry = _a.chosenCountry, documentSelectionTitle = _a.documentSelectionTitle, documentSelectionDescription = _a.documentSelectionDescription;
|
|
49
|
-
var
|
|
50
|
-
var
|
|
51
|
-
var
|
|
49
|
+
var onDocumentSelect = _a.onDocumentSelect, onBack = _a.onBack, documentTypeId = _a.documentTypeId, sessionId = _a.sessionId, chosenCountry = _a.chosenCountry, documentSelectionTitle = _a.documentSelectionTitle, documentSelectionDescription = _a.documentSelectionDescription, _b = _a.nfcEnabled, nfcEnabled = _b === void 0 ? false : _b;
|
|
50
|
+
var _c = React.useState(""), selectedDocument = _c[0], setSelectedDocument = _c[1];
|
|
51
|
+
var _d = React.useState(""), error = _d[0], setError = _d[1];
|
|
52
|
+
var _e = React.useState([]), documentOptions = _e[0], setDocumentOptions = _e[1];
|
|
52
53
|
var t = useI18n.useI18n().t;
|
|
53
54
|
// Récupérer les options de documents spécifiques à la session
|
|
54
55
|
React.useEffect(function () {
|
|
@@ -107,7 +108,9 @@ var JDIDocumentSelection = function (_a) {
|
|
|
107
108
|
case "income-proof":
|
|
108
109
|
return t("jdi.document_selection.subtitle_income_proof");
|
|
109
110
|
default:
|
|
110
|
-
return
|
|
111
|
+
return nfcEnabled
|
|
112
|
+
? t("jdi.document_selection.subtitle_identity_nfc")
|
|
113
|
+
: t("jdi.document_selection.subtitle_identity");
|
|
111
114
|
}
|
|
112
115
|
};
|
|
113
116
|
var getLabel = function () {
|
|
@@ -173,7 +176,7 @@ var JDIDocumentSelection = function (_a) {
|
|
|
173
176
|
return (jsxRuntime.jsx(MobilePageLayout.default, { contentClassName: "h-full", footer: jsxRuntime.jsx(PageActions.default, { primary: jsxRuntime.jsx(Button.default, { onClick: handleContinue, disabled: !selectedDocument, children: t("jdi.document_selection.continue") }), secondary: jsxRuntime.jsx(Button.default, { variant: "secondary", onClick: onBack, children: t("jdi.document_selection.back") }) }), 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", children: [jsxRuntime.jsx(Title.default, { className: "text-xl md:text-2xl lg:text-3xl", children: documentSelectionTitle || getTitle() }), jsxRuntime.jsx(Subtitle.default, { className: "text-sm text-gray-600 leading-relaxed whitespace-pre-line", children: documentSelectionDescription || getSubtitle() })] }), jsxRuntime.jsxs("div", { className: "space-y-4", children: [jsxRuntime.jsxs("div", { children: [jsxRuntime.jsxs("label", { className: "block text-sm font-medium text-gray-700 mb-2", children: [getLabel(), " *"] }), jsxRuntime.jsx(SelectComponent.Select, { options: documentOptions, value: selectedDocument, onValueChange: function (value) {
|
|
174
177
|
setSelectedDocument(value);
|
|
175
178
|
setError("");
|
|
176
|
-
}, placeholder: getPlaceholder() }), error && (jsxRuntime.jsxs("p", { className: "mt-1 text-sm text-red-600 flex items-center", children: [jsxRuntime.jsx("span", { className: "mr-1", children: "\u26A0" }), error] }))] }), selectedDocument && (jsxRuntime.jsxs("div", { className: "bg-gray-50 border border-gray-200 rounded-lg p-4", children: [jsxRuntime.jsx("h3", { className: "font-medium text-gray-900 mb-2", children: t("jdi.document_selection.info_title") }), jsxRuntime.jsx("div", { className: "text-sm text-gray-700 space-y-1", children: getInstructions().map(function (instruction, index) { return (jsxRuntime.jsx("p", { children: instruction }, index)); }) })] }))] })] }) }) }));
|
|
179
|
+
}, placeholder: getPlaceholder() }), error && (jsxRuntime.jsxs("p", { className: "mt-1 text-sm text-red-600 flex items-center", children: [jsxRuntime.jsx("span", { className: "mr-1", children: "\u26A0" }), error] }))] }), selectedDocument && !nfcEnabled && (jsxRuntime.jsxs("div", { className: "bg-gray-50 border border-gray-200 rounded-lg p-4", children: [jsxRuntime.jsx("h3", { className: "font-medium text-gray-900 mb-2", children: t("jdi.document_selection.info_title") }), jsxRuntime.jsx("div", { className: "text-sm text-gray-700 space-y-1", children: getInstructions().map(function (instruction, index) { return (jsxRuntime.jsx("p", { children: instruction }, index)); }) })] })), nfcEnabled && jsxRuntime.jsx(NfcOnboardingNotice.default, {})] })] }) }) }));
|
|
177
180
|
};
|
|
178
181
|
|
|
179
182
|
exports.default = JDIDocumentSelection;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"JDIDocumentSelection.js","sources":["../../../../../src/components/jdi/JDIDocumentSelection.tsx"],"sourcesContent":["import { useState, useEffect } from \"react\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport Button from \"../ui/Button\";\nimport PageActions from \"../ui/PageActions\";\nimport { Select } from \"../ui/SelectComponent\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport { AcceptedCountry } from \"../../types/session\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\n\nconst DOCUMENT_KEYS: Array<{\n key: keyof AcceptedCountry[\"documents\"];\n value: string;\n translationKey: string;\n fallbackLabel: string;\n}> = [\n {\n key: \"passport\",\n value: \"passport\",\n translationKey: \"documentTypes.Passport\",\n fallbackLabel: \"Passeport\",\n },\n {\n key: \"idCard\",\n value: \"idCard\",\n translationKey: \"documentTypes.IdCard\",\n fallbackLabel: \"Carte nationale d'identité\",\n },\n {\n key: \"driverLicense\",\n value: \"driverLicense\",\n translationKey: \"documentTypes.Driving_license\",\n fallbackLabel: \"Permis de conduire\",\n },\n {\n key: \"residencePermit\",\n value: \"residencePermit\",\n translationKey: \"documentTypes.Residence_permit\",\n fallbackLabel: \"Titre de séjour\",\n },\n {\n key: \"pinkDriverLicense\",\n value: \"pinkDriverLicense\",\n translationKey: \"documentTypes.Pink_driving_license\",\n fallbackLabel: \"Permis de conduire rose (ancien format)\",\n },\n ];\n\ninterface JDIDocumentSelectionProps {\n onDocumentSelect: (documentType: string) => void;\n onBack: () => void;\n documentTypeId?: string; // ID du type de document (jdd, income-proof, etc.)\n sessionId?: string; // Session ID pour récupérer les options stockées\n chosenCountry?: AcceptedCountry; // Pays choisi par l'utilisateur\n documentSelectionTitle?: string;\n documentSelectionDescription?: string;\n}\n\nconst JDIDocumentSelection = ({\n onDocumentSelect,\n onBack,\n documentTypeId,\n sessionId,\n chosenCountry,\n documentSelectionTitle,\n documentSelectionDescription,\n}: JDIDocumentSelectionProps) => {\n const [selectedDocument, setSelectedDocument] = useState<string>(\"\");\n const [error, setError] = useState<string>(\"\");\n const [documentOptions, setDocumentOptions] = useState<\n { value: string; label: string }[]\n >([]);\n\n const { t } = useI18n();\n\n // Récupérer les options de documents spécifiques à la session\n useEffect(() => {\n console.log(\"Retrieving document options for session:\", sessionId);\n console.log(\"Chosen country:\", chosenCountry);\n if (chosenCountry?.documents) {\n const options = DOCUMENT_KEYS.filter(({ key }) => {\n const docs = chosenCountry.documents[key];\n return Array.isArray(docs) && docs.length > 0;\n }).map(({ value, translationKey, fallbackLabel }) => ({\n value,\n label: t(translationKey, fallbackLabel),\n }));\n console.log(\"Available document options:\", options);\n setDocumentOptions(options);\n } else {\n setDocumentOptions([]);\n }\n }, []);\n\n // SKIPPED if only one option, select it by default and skip to next step\n // useEffect(() => {\n // if (documentOptions.length === 1) {\n // setSelectedDocument(documentOptions[0].value);\n // setError(\"\");\n // onDocumentSelect(documentOptions[0].value);\n // }\n // }, [documentOptions, onDocumentSelect]);\n\n const handleContinue = () => {\n if (!selectedDocument) {\n setError(t(\"jdi.document_selection.error_select_document\"));\n return;\n }\n setError(\"\");\n\n onDocumentSelect(selectedDocument);\n };\n\n // Déterminer le titre en fonction du type de document\n const getTitle = () => {\n switch (documentTypeId) {\n case \"jdd\":\n return t(\"jdi.document_selection.title_jdd\");\n case \"income-proof\":\n return t(\"jdi.document_selection.title_income_proof\");\n default:\n return t(\"jdi.document_selection.title_identity\");\n }\n };\n\n const getSubtitle = () => {\n switch (documentTypeId) {\n case \"jdd\":\n return t(\"jdi.document_selection.subtitle_jdd\");\n case \"income-proof\":\n return t(\"jdi.document_selection.subtitle_income_proof\");\n default:\n return t(\"jdi.document_selection.subtitle_identity\");\n }\n };\n\n const getLabel = () => {\n switch (documentTypeId) {\n case \"jdd\":\n return t(\"jdi.document_selection.label_jdd\");\n case \"income-proof\":\n return t(\"jdi.document_selection.label_income_proof\");\n default:\n return t(\"jdi.document_selection.label_identity\");\n }\n };\n\n const getPlaceholder = () => {\n switch (documentTypeId) {\n case \"jdd\":\n return t(\"jdi.document_selection.placeholder_jdd\");\n case \"income-proof\":\n return t(\"jdi.document_selection.placeholder_income_proof\");\n default:\n return t(\"jdi.document_selection.placeholder_identity\");\n }\n };\n\n const getInstructions = () => {\n // Identity documents\n switch (selectedDocument) {\n case \"idCard\":\n return [\n t(\"jdi.document_selection.instructions.idCard.recto_verso\"),\n t(\"jdi.document_selection.instructions.idCard.readable\"),\n t(\"jdi.document_selection.instructions.idCard.valid\"),\n ];\n case \"passport\":\n return [\n t(\"jdi.document_selection.instructions.passport.photo_page\"),\n t(\"jdi.document_selection.instructions.passport.valid\"),\n t(\"jdi.document_selection.instructions.passport.readable\"),\n ];\n case \"driverLicense\":\n return [\n t(\"jdi.document_selection.instructions.driverLicense.recto_verso\"),\n t(\"jdi.document_selection.instructions.driverLicense.not_expired\"),\n t(\"jdi.document_selection.instructions.driverLicense.all_visible\"),\n ];\n case \"pinkDriverLicense\":\n return [\n t(\n \"jdi.document_selection.instructions.pinkDriverLicense.recto_verso\",\n \"Assurez-vous que le document soit visible\",\n ),\n t(\n \"jdi.document_selection.instructions.pinkDriverLicense.not_expired\",\n \"Vérifiez que le permis n'est pas expiré\",\n ),\n t(\n \"jdi.document_selection.instructions.pinkDriverLicense.all_visible\",\n \"Toutes les informations doivent être lisibles\",\n ),\n ];\n case \"residencePermit\":\n return [\n t(\"jdi.document_selection.instructions.residencePermit.recto_verso\"),\n t(\"jdi.document_selection.instructions.residencePermit.valid\"),\n t(\"jdi.document_selection.instructions.residencePermit.readable\"),\n ];\n default:\n return [\n t(\"jdi.document_selection.instructions.default.valid\"),\n t(\"jdi.document_selection.instructions.default.readable\"),\n ];\n }\n };\n\n return (\n <MobilePageLayout\n contentClassName=\"h-full\"\n footer={\n <PageActions\n primary={\n <Button onClick={handleContinue} disabled={!selectedDocument}>\n {t(\"jdi.document_selection.continue\")}\n </Button>\n }\n secondary={\n <Button variant=\"secondary\" onClick={onBack}>\n {t(\"jdi.document_selection.back\")}\n </Button>\n }\n />\n }\n >\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 {/* Header */}\n <div className=\"text-center space-y-4\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl\">\n {documentSelectionTitle || getTitle()}\n </Title>\n <Subtitle className=\"text-sm text-gray-600 leading-relaxed whitespace-pre-line\">\n {documentSelectionDescription || getSubtitle()}\n </Subtitle>\n </div>\n\n {/* Document selection */}\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n {getLabel()} *\n </label>\n <Select\n options={documentOptions}\n value={selectedDocument}\n onValueChange={(value) => {\n setSelectedDocument(value);\n setError(\"\");\n }}\n placeholder={getPlaceholder()}\n />\n {error && (\n <p className=\"mt-1 text-sm text-red-600 flex items-center\">\n <span className=\"mr-1\">⚠</span>\n {error}\n </p>\n )}\n </div>\n\n {/* Information about selected document */}\n {selectedDocument && (\n <div className=\"bg-gray-50 border border-gray-200 rounded-lg p-4\">\n <h3 className=\"font-medium text-gray-900 mb-2\">\n {t(\"jdi.document_selection.info_title\")}\n </h3>\n <div className=\"text-sm text-gray-700 space-y-1\">\n {getInstructions().map((instruction, index) => (\n <p key={index}>{instruction}</p>\n ))}\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default JDIDocumentSelection;\n"],"names":["useState","useI18n","useEffect","_jsx","MobilePageLayout","PageActions","Button","_jsxs","Title","Subtitle","Select"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"JDIDocumentSelection.js","sources":["../../../../../src/components/jdi/JDIDocumentSelection.tsx"],"sourcesContent":["import { useState, useEffect } from \"react\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport Button from \"../ui/Button\";\nimport PageActions from \"../ui/PageActions\";\nimport { Select } from \"../ui/SelectComponent\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport { AcceptedCountry } from \"../../types/session\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport NfcOnboardingNotice from \"../nfc-scan/NfcOnboardingNotice\";\n\nconst DOCUMENT_KEYS: Array<{\n key: keyof AcceptedCountry[\"documents\"];\n value: string;\n translationKey: string;\n fallbackLabel: string;\n}> = [\n {\n key: \"passport\",\n value: \"passport\",\n translationKey: \"documentTypes.Passport\",\n fallbackLabel: \"Passeport\",\n },\n {\n key: \"idCard\",\n value: \"idCard\",\n translationKey: \"documentTypes.IdCard\",\n fallbackLabel: \"Carte nationale d'identité\",\n },\n {\n key: \"driverLicense\",\n value: \"driverLicense\",\n translationKey: \"documentTypes.Driving_license\",\n fallbackLabel: \"Permis de conduire\",\n },\n {\n key: \"residencePermit\",\n value: \"residencePermit\",\n translationKey: \"documentTypes.Residence_permit\",\n fallbackLabel: \"Titre de séjour\",\n },\n {\n key: \"pinkDriverLicense\",\n value: \"pinkDriverLicense\",\n translationKey: \"documentTypes.Pink_driving_license\",\n fallbackLabel: \"Permis de conduire rose (ancien format)\",\n },\n ];\n\ninterface JDIDocumentSelectionProps {\n onDocumentSelect: (documentType: string) => void;\n onBack: () => void;\n documentTypeId?: string; // ID du type de document (jdd, income-proof, etc.)\n sessionId?: string; // Session ID pour récupérer les options stockées\n chosenCountry?: AcceptedCountry; // Pays choisi par l'utilisateur\n documentSelectionTitle?: string;\n documentSelectionDescription?: string;\n nfcEnabled?: boolean; // Affiche l'onboarding NFC quand le parcours utilise la lecture sans contact\n}\n\nconst JDIDocumentSelection = ({\n onDocumentSelect,\n onBack,\n documentTypeId,\n sessionId,\n chosenCountry,\n documentSelectionTitle,\n documentSelectionDescription,\n nfcEnabled = false,\n}: JDIDocumentSelectionProps) => {\n const [selectedDocument, setSelectedDocument] = useState<string>(\"\");\n const [error, setError] = useState<string>(\"\");\n const [documentOptions, setDocumentOptions] = useState<\n { value: string; label: string }[]\n >([]);\n\n const { t } = useI18n();\n\n // Récupérer les options de documents spécifiques à la session\n useEffect(() => {\n console.log(\"Retrieving document options for session:\", sessionId);\n console.log(\"Chosen country:\", chosenCountry);\n if (chosenCountry?.documents) {\n const options = DOCUMENT_KEYS.filter(({ key }) => {\n const docs = chosenCountry.documents[key];\n return Array.isArray(docs) && docs.length > 0;\n }).map(({ value, translationKey, fallbackLabel }) => ({\n value,\n label: t(translationKey, fallbackLabel),\n }));\n console.log(\"Available document options:\", options);\n setDocumentOptions(options);\n } else {\n setDocumentOptions([]);\n }\n }, []);\n\n // SKIPPED if only one option, select it by default and skip to next step\n // useEffect(() => {\n // if (documentOptions.length === 1) {\n // setSelectedDocument(documentOptions[0].value);\n // setError(\"\");\n // onDocumentSelect(documentOptions[0].value);\n // }\n // }, [documentOptions, onDocumentSelect]);\n\n const handleContinue = () => {\n if (!selectedDocument) {\n setError(t(\"jdi.document_selection.error_select_document\"));\n return;\n }\n setError(\"\");\n\n onDocumentSelect(selectedDocument);\n };\n\n // Déterminer le titre en fonction du type de document\n const getTitle = () => {\n switch (documentTypeId) {\n case \"jdd\":\n return t(\"jdi.document_selection.title_jdd\");\n case \"income-proof\":\n return t(\"jdi.document_selection.title_income_proof\");\n default:\n return t(\"jdi.document_selection.title_identity\");\n }\n };\n\n const getSubtitle = () => {\n switch (documentTypeId) {\n case \"jdd\":\n return t(\"jdi.document_selection.subtitle_jdd\");\n case \"income-proof\":\n return t(\"jdi.document_selection.subtitle_income_proof\");\n default:\n return nfcEnabled\n ? t(\"jdi.document_selection.subtitle_identity_nfc\")\n : t(\"jdi.document_selection.subtitle_identity\");\n }\n };\n\n const getLabel = () => {\n switch (documentTypeId) {\n case \"jdd\":\n return t(\"jdi.document_selection.label_jdd\");\n case \"income-proof\":\n return t(\"jdi.document_selection.label_income_proof\");\n default:\n return t(\"jdi.document_selection.label_identity\");\n }\n };\n\n const getPlaceholder = () => {\n switch (documentTypeId) {\n case \"jdd\":\n return t(\"jdi.document_selection.placeholder_jdd\");\n case \"income-proof\":\n return t(\"jdi.document_selection.placeholder_income_proof\");\n default:\n return t(\"jdi.document_selection.placeholder_identity\");\n }\n };\n\n const getInstructions = () => {\n // Identity documents\n switch (selectedDocument) {\n case \"idCard\":\n return [\n t(\"jdi.document_selection.instructions.idCard.recto_verso\"),\n t(\"jdi.document_selection.instructions.idCard.readable\"),\n t(\"jdi.document_selection.instructions.idCard.valid\"),\n ];\n case \"passport\":\n return [\n t(\"jdi.document_selection.instructions.passport.photo_page\"),\n t(\"jdi.document_selection.instructions.passport.valid\"),\n t(\"jdi.document_selection.instructions.passport.readable\"),\n ];\n case \"driverLicense\":\n return [\n t(\"jdi.document_selection.instructions.driverLicense.recto_verso\"),\n t(\"jdi.document_selection.instructions.driverLicense.not_expired\"),\n t(\"jdi.document_selection.instructions.driverLicense.all_visible\"),\n ];\n case \"pinkDriverLicense\":\n return [\n t(\n \"jdi.document_selection.instructions.pinkDriverLicense.recto_verso\",\n \"Assurez-vous que le document soit visible\",\n ),\n t(\n \"jdi.document_selection.instructions.pinkDriverLicense.not_expired\",\n \"Vérifiez que le permis n'est pas expiré\",\n ),\n t(\n \"jdi.document_selection.instructions.pinkDriverLicense.all_visible\",\n \"Toutes les informations doivent être lisibles\",\n ),\n ];\n case \"residencePermit\":\n return [\n t(\"jdi.document_selection.instructions.residencePermit.recto_verso\"),\n t(\"jdi.document_selection.instructions.residencePermit.valid\"),\n t(\"jdi.document_selection.instructions.residencePermit.readable\"),\n ];\n default:\n return [\n t(\"jdi.document_selection.instructions.default.valid\"),\n t(\"jdi.document_selection.instructions.default.readable\"),\n ];\n }\n };\n\n return (\n <MobilePageLayout\n contentClassName=\"h-full\"\n footer={\n <PageActions\n primary={\n <Button onClick={handleContinue} disabled={!selectedDocument}>\n {t(\"jdi.document_selection.continue\")}\n </Button>\n }\n secondary={\n <Button variant=\"secondary\" onClick={onBack}>\n {t(\"jdi.document_selection.back\")}\n </Button>\n }\n />\n }\n >\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 {/* Header */}\n <div className=\"text-center space-y-4\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl\">\n {documentSelectionTitle || getTitle()}\n </Title>\n <Subtitle className=\"text-sm text-gray-600 leading-relaxed whitespace-pre-line\">\n {documentSelectionDescription || getSubtitle()}\n </Subtitle>\n </div>\n\n {/* Document selection */}\n <div className=\"space-y-4\">\n <div>\n <label className=\"block text-sm font-medium text-gray-700 mb-2\">\n {getLabel()} *\n </label>\n <Select\n options={documentOptions}\n value={selectedDocument}\n onValueChange={(value) => {\n setSelectedDocument(value);\n setError(\"\");\n }}\n placeholder={getPlaceholder()}\n />\n {error && (\n <p className=\"mt-1 text-sm text-red-600 flex items-center\">\n <span className=\"mr-1\">⚠</span>\n {error}\n </p>\n )}\n </div>\n\n {/* Information about selected document — masqué en NFC (les instructions\n de téléversement ne s'appliquent pas, l'onboarding NFC les remplace) */}\n {selectedDocument && !nfcEnabled && (\n <div className=\"bg-gray-50 border border-gray-200 rounded-lg p-4\">\n <h3 className=\"font-medium text-gray-900 mb-2\">\n {t(\"jdi.document_selection.info_title\")}\n </h3>\n <div className=\"text-sm text-gray-700 space-y-1\">\n {getInstructions().map((instruction, index) => (\n <p key={index}>{instruction}</p>\n ))}\n </div>\n </div>\n )}\n\n {/* NFC onboarding — affiché uniquement quand le parcours utilise la lecture sans contact */}\n {nfcEnabled && <NfcOnboardingNotice />}\n </div>\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default JDIDocumentSelection;\n"],"names":["useState","useI18n","useEffect","_jsx","MobilePageLayout","PageActions","Button","_jsxs","Title","Subtitle","Select","NfcOnboardingNotice"],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Symbole international du document biométrique (puce électronique), repris de
|
|
9
|
+
* assets/biometric.svg mais teinté avec la couleur primaire du SDK
|
|
10
|
+
* (var(--uni-primary-color)) au lieu du violet d'origine, pour rester aligné
|
|
11
|
+
* sur l'identité visuelle du parcours.
|
|
12
|
+
*
|
|
13
|
+
* C'est le pictogramme que l'utilisateur doit retrouver sur la couverture de son
|
|
14
|
+
* passeport ou sur sa carte d'identité pour confirmer la présence de la puce.
|
|
15
|
+
*/
|
|
16
|
+
var BiometricSymbol = function (_a) {
|
|
17
|
+
var className = _a.className;
|
|
18
|
+
return (jsxRuntime.jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 120 80", className: className, role: "img", "aria-label": "Symbole du document biom\u00E9trique", children: [jsxRuntime.jsx("defs", { children: jsxRuntime.jsxs("mask", { id: "biometric-symbol-mask", children: [jsxRuntime.jsx("rect", { x: "0", y: "0", width: "120", height: "80", fill: "white" }), jsxRuntime.jsx("rect", { x: "0", y: "36", width: "120", height: "8", fill: "black" }), jsxRuntime.jsx("circle", { cx: "60", cy: "40", r: "16", fill: "black" })] }) }), jsxRuntime.jsxs("g", { fill: "var(--uni-primary-color, #11e5c5)", children: [jsxRuntime.jsx("rect", { x: "10", y: "15", width: "100", height: "50", rx: "3", mask: "url(#biometric-symbol-mask)" }), jsxRuntime.jsx("circle", { cx: "60", cy: "40", r: "9" })] })] }));
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
exports.default = BiometricSymbol;
|
|
22
|
+
//# sourceMappingURL=BiometricSymbol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BiometricSymbol.js","sources":["../../../../../src/components/nfc-scan/BiometricSymbol.tsx"],"sourcesContent":["interface BiometricSymbolProps {\n className?: string;\n}\n\n/**\n * Symbole international du document biométrique (puce électronique), repris de\n * assets/biometric.svg mais teinté avec la couleur primaire du SDK\n * (var(--uni-primary-color)) au lieu du violet d'origine, pour rester aligné\n * sur l'identité visuelle du parcours.\n *\n * C'est le pictogramme que l'utilisateur doit retrouver sur la couverture de son\n * passeport ou sur sa carte d'identité pour confirmer la présence de la puce.\n */\nconst BiometricSymbol = ({ className }: BiometricSymbolProps) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 120 80\"\n className={className}\n role=\"img\"\n aria-label=\"Symbole du document biométrique\"\n >\n <defs>\n <mask id=\"biometric-symbol-mask\">\n <rect x=\"0\" y=\"0\" width=\"120\" height=\"80\" fill=\"white\" />\n <rect x=\"0\" y=\"36\" width=\"120\" height=\"8\" fill=\"black\" />\n <circle cx=\"60\" cy=\"40\" r=\"16\" fill=\"black\" />\n </mask>\n </defs>\n\n <g fill=\"var(--uni-primary-color, #11e5c5)\">\n <rect\n x=\"10\"\n y=\"15\"\n width=\"100\"\n height=\"50\"\n rx=\"3\"\n mask=\"url(#biometric-symbol-mask)\"\n />\n <circle cx=\"60\" cy=\"40\" r=\"9\" />\n </g>\n </svg>\n );\n};\n\nexport default BiometricSymbol;\n"],"names":["_jsxs","_jsx"],"mappings":";;;;;;AAIA;;;;;;;;AAQG;AACH,IAAM,eAAe,GAAG,UAAC,EAAmC,EAAA;AAAjC,IAAA,IAAA,SAAS,GAAA,EAAA,CAAA,SAAA;AAClC,IAAA,QACEA,eAAA,CAAA,KAAA,EAAA,EACE,KAAK,EAAC,4BAA4B,EAClC,OAAO,EAAC,YAAY,EACpB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAC,KAAK,EAAA,YAAA,EACC,sCAAiC,EAAA,QAAA,EAAA,CAE5CC,cAAA,CAAA,MAAA,EAAA,EAAA,QAAA,EACED,0BAAM,EAAE,EAAC,uBAAuB,EAAA,QAAA,EAAA,CAC9BC,cAAA,CAAA,MAAA,EAAA,EAAM,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,GAAG,EAAC,KAAK,EAAC,KAAK,EAAC,MAAM,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAA,CAAG,EACzDA,cAAA,CAAA,MAAA,EAAA,EAAM,CAAC,EAAC,GAAG,EAAC,CAAC,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,MAAM,EAAC,GAAG,EAAC,IAAI,EAAC,OAAO,EAAA,CAAG,EACzDA,cAAA,CAAA,QAAA,EAAA,EAAQ,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,IAAI,EAAC,IAAI,EAAC,OAAO,EAAA,CAAG,CAAA,EAAA,CACzC,EAAA,CACF,EAEPD,eAAA,CAAA,GAAA,EAAA,EAAG,IAAI,EAAC,mCAAmC,EAAA,QAAA,EAAA,CACzCC,cAAA,CAAA,MAAA,EAAA,EACE,CAAC,EAAC,IAAI,EACN,CAAC,EAAC,IAAI,EACN,KAAK,EAAC,KAAK,EACX,MAAM,EAAC,IAAI,EACX,EAAE,EAAC,GAAG,EACN,IAAI,EAAC,6BAA6B,EAAA,CAClC,EACFA,cAAA,CAAA,QAAA,EAAA,EAAQ,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,GAAG,EAAA,CAAG,CAAA,EAAA,CAC9B,CAAA,EAAA,CACA;AAEV;;;;"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
var Title = require('../ui/Title.js');
|
|
7
|
+
var Subtitle = require('../ui/Subtitle.js');
|
|
8
|
+
var Button = require('../ui/Button.js');
|
|
9
|
+
var PageActions = require('../ui/PageActions.js');
|
|
10
|
+
var MobilePageLayout = require('../ui/MobilePageLayout.js');
|
|
11
|
+
var useI18n = require('../../hooks/useI18n.js');
|
|
12
|
+
var BiometricSymbol = require('./BiometricSymbol.js');
|
|
13
|
+
var PuceCniSymbol = require('./PuceCniSymbol.js');
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Écran d'entrée du nœud NFC, façon "persona".
|
|
17
|
+
*
|
|
18
|
+
* Affiche le symbole du document biométrique (teinté à la couleur primaire) et
|
|
19
|
+
* demande à l'utilisateur s'il figure sur son passeport (couverture) ou sa carte
|
|
20
|
+
* d'identité (recto/verso). Cela évite d'engager dans un parcours NFC un
|
|
21
|
+
* utilisateur dont le document n'a pas de puce.
|
|
22
|
+
*
|
|
23
|
+
* - Oui → on poursuit le parcours NFC (onConfirm)
|
|
24
|
+
* - Non → on passe au nœud suivant (onNoChip)
|
|
25
|
+
*/
|
|
26
|
+
var NfcChipGate = function (_a) {
|
|
27
|
+
var onConfirm = _a.onConfirm, onNoChip = _a.onNoChip;
|
|
28
|
+
var t = useI18n.useI18n().t;
|
|
29
|
+
return (jsxRuntime.jsx(MobilePageLayout.default, { footer: jsxRuntime.jsx(PageActions.default, { className: "flex-wrap justify-center!", primary: jsxRuntime.jsx(Button.default, { onClick: onConfirm, children: t("nfc_scan.chip_gate.confirm", "Oui") }), secondary: jsxRuntime.jsx(Button.default, { variant: "secondary", onClick: onNoChip, className: "whitespace-nowrap", children: t("nfc_scan.chip_gate.no_chip", "Non, je n'ai ni symbole ni puce") }) }), 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-8", children: [jsxRuntime.jsxs("div", { className: "text-center space-y-4", children: [jsxRuntime.jsx(Title.default, { className: "text-xl md:text-2xl lg:text-3xl", children: t("nfc_scan.chip_gate.title", "Votre document possède-t-il ce symbole et/ou une puce électronique ?") }), jsxRuntime.jsx(Subtitle.default, { className: "text-sm text-gray-600 leading-relaxed whitespace-pre-line", children: t("nfc_scan.chip_gate.subtitle", "Ce parcours lit la puce électronique sans contact de votre pièce d'identité. Repérez ce symbole ou une puce électronique sur votre document.") })] }), jsxRuntime.jsxs("div", { className: "flex items-center justify-center gap-6", children: [jsxRuntime.jsx(BiometricSymbol.default, { className: "h-auto w-50 md:w-32" }), jsxRuntime.jsx(PuceCniSymbol.default, { className: "h-auto w-50 md:w-32" })] }), jsxRuntime.jsxs("div", { className: "rounded-2xl border p-4 text-sm leading-relaxed text-gray-700", style: {
|
|
30
|
+
borderColor: "var(--uni-light-color-variant-2, #b2ece5)",
|
|
31
|
+
backgroundColor: "var(--uni-light-color-variant-1, #d0f7f2)",
|
|
32
|
+
}, children: [jsxRuntime.jsx("p", { className: "mb-1", children: t("nfc_scan.chip_gate.hint_passport", "Sur un passeport, ce symbole figure sur la couverture.") }), jsxRuntime.jsx("p", { children: t("nfc_scan.chip_gate.hint_card", "Sur une carte d'identité ou un titre de séjour, repérez ce symbole ou une puce électronique au recto ou au verso.") })] })] }) }) }));
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
exports.default = NfcChipGate;
|
|
36
|
+
//# sourceMappingURL=NfcChipGate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NfcChipGate.js","sources":["../../../../../src/components/nfc-scan/NfcChipGate.tsx"],"sourcesContent":["import React from \"react\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport Button from \"../ui/Button\";\nimport PageActions from \"../ui/PageActions\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport BiometricSymbol from \"./BiometricSymbol\";\nimport PuceCniSymbol from \"./PuceCniSymbol\";\n\ninterface NfcChipGateProps {\n /** L'utilisateur confirme que son document porte le symbole → flux NFC */\n onConfirm: () => void;\n /** L'utilisateur n'a pas ce symbole → on saute le nœud (nœud suivant) */\n onNoChip: () => void;\n}\n\n/**\n * Écran d'entrée du nœud NFC, façon \"persona\".\n *\n * Affiche le symbole du document biométrique (teinté à la couleur primaire) et\n * demande à l'utilisateur s'il figure sur son passeport (couverture) ou sa carte\n * d'identité (recto/verso). Cela évite d'engager dans un parcours NFC un\n * utilisateur dont le document n'a pas de puce.\n *\n * - Oui → on poursuit le parcours NFC (onConfirm)\n * - Non → on passe au nœud suivant (onNoChip)\n */\nconst NfcChipGate = ({ onConfirm, onNoChip }: NfcChipGateProps) => {\n const { t } = useI18n();\n\n return (\n <MobilePageLayout\n footer={\n <PageActions\n className=\"flex-wrap justify-center!\"\n primary={\n <Button onClick={onConfirm}>\n {t(\"nfc_scan.chip_gate.confirm\", \"Oui\")}\n </Button>\n }\n secondary={\n <Button\n variant=\"secondary\"\n onClick={onNoChip}\n className=\"whitespace-nowrap\"\n >\n {t(\"nfc_scan.chip_gate.no_chip\", \"Non, je n'ai ni symbole ni puce\")}\n </Button>\n }\n />\n }\n >\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-8\">\n <div className=\"text-center space-y-4\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl\">\n {t(\n \"nfc_scan.chip_gate.title\",\n \"Votre document possède-t-il ce symbole et/ou une puce électronique ?\",\n )}\n </Title>\n <Subtitle className=\"text-sm text-gray-600 leading-relaxed whitespace-pre-line\">\n {t(\n \"nfc_scan.chip_gate.subtitle\",\n \"Ce parcours lit la puce électronique sans contact de votre pièce d'identité. Repérez ce symbole ou une puce électronique sur votre document.\",\n )}\n </Subtitle>\n </div>\n\n {/* Symbole biométrique + puce CNI, côte à côte, aux couleurs du SDK */}\n <div className=\"flex items-center justify-center gap-6\">\n <BiometricSymbol className=\"h-auto w-50 md:w-32\" />\n <PuceCniSymbol className=\"h-auto w-50 md:w-32\" />\n </div>\n\n {/* Où chercher le symbole */}\n <div\n className=\"rounded-2xl border p-4 text-sm leading-relaxed text-gray-700\"\n style={{\n borderColor: \"var(--uni-light-color-variant-2, #b2ece5)\",\n backgroundColor: \"var(--uni-light-color-variant-1, #d0f7f2)\",\n }}\n >\n <p className=\"mb-1\">\n {t(\n \"nfc_scan.chip_gate.hint_passport\",\n \"Sur un passeport, ce symbole figure sur la couverture.\",\n )}\n </p>\n <p>\n {t(\n \"nfc_scan.chip_gate.hint_card\",\n \"Sur une carte d'identité ou un titre de séjour, repérez ce symbole ou une puce électronique au recto ou au verso.\",\n )}\n </p>\n </div>\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default NfcChipGate;\n"],"names":["useI18n","_jsx","MobilePageLayout","PageActions","Button","_jsxs","Title","Subtitle","BiometricSymbol","PuceCniSymbol"],"mappings":";;;;;;;;;;;;;;AAiBA;;;;;;;;;;AAUG;AACH,IAAM,WAAW,GAAG,UAAC,EAAyC,EAAA;QAAvC,SAAS,GAAA,EAAA,CAAA,SAAA,EAAE,QAAQ,GAAA,EAAA,CAAA,QAAA;AAChC,IAAA,IAAA,CAAC,GAAKA,eAAO,EAAE,EAAd;AAET,IAAA,QACEC,cAAA,CAACC,wBAAgB,EAAA,EACf,MAAM,EACJD,cAAA,CAACE,mBAAW,EAAA,EACV,SAAS,EAAC,2BAA2B,EACrC,OAAO,EACLF,cAAA,CAACG,cAAM,EAAA,EAAC,OAAO,EAAE,SAAS,EAAA,QAAA,EACvB,CAAC,CAAC,4BAA4B,EAAE,KAAK,CAAC,GAChC,EAEX,SAAS,EACPH,cAAA,CAACG,cAAM,EAAA,EACL,OAAO,EAAC,WAAW,EACnB,OAAO,EAAE,QAAQ,EACjB,SAAS,EAAC,mBAAmB,EAAA,QAAA,EAE5B,CAAC,CAAC,4BAA4B,EAAE,iCAAiC,CAAC,EAAA,CAC5D,EAAA,CAEX,EAAA,QAAA,EAGJH,cAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,iCAAiC,EAAA,QAAA,EAC9CI,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,mCAAmC,EAAA,QAAA,EAAA,CAChDA,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,uBAAuB,EAAA,QAAA,EAAA,CACpCJ,cAAA,CAACK,aAAK,EAAA,EAAC,SAAS,EAAC,iCAAiC,EAAA,QAAA,EAC/C,CAAC,CACA,0BAA0B,EAC1B,sEAAsE,CACvE,EAAA,CACK,EACRL,cAAA,CAACM,gBAAQ,EAAA,EAAC,SAAS,EAAC,2DAA2D,EAAA,QAAA,EAC5E,CAAC,CACA,6BAA6B,EAC7B,8IAA8I,CAC/I,EAAA,CACQ,CAAA,EAAA,CACP,EAGNF,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,wCAAwC,EAAA,QAAA,EAAA,CACrDJ,cAAA,CAACO,uBAAe,EAAA,EAAC,SAAS,EAAC,qBAAqB,EAAA,CAAG,EACnDP,cAAA,CAACQ,qBAAa,EAAA,EAAC,SAAS,EAAC,qBAAqB,EAAA,CAAG,CAAA,EAAA,CAC7C,EAGNJ,eAAA,CAAA,KAAA,EAAA,EACE,SAAS,EAAC,8DAA8D,EACxE,KAAK,EAAE;AACL,4BAAA,WAAW,EAAE,2CAA2C;AACxD,4BAAA,eAAe,EAAE,2CAA2C;yBAC7D,EAAA,QAAA,EAAA,CAEDJ,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,MAAM,EAAA,QAAA,EAChB,CAAC,CACA,kCAAkC,EAClC,wDAAwD,CACzD,EAAA,CACC,EACJA,gCACG,CAAC,CACA,8BAA8B,EAC9B,mHAAmH,CACpH,EAAA,CACC,CAAA,EAAA,CACA,CAAA,EAAA,CACF,EAAA,CACF,EAAA,CACW;AAEvB;;;;"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
var React = require('react');
|
|
7
|
+
var Title = require('../ui/Title.js');
|
|
8
|
+
var Subtitle = require('../ui/Subtitle.js');
|
|
9
|
+
var Button = require('../ui/Button.js');
|
|
10
|
+
var PageActions = require('../ui/PageActions.js');
|
|
11
|
+
var MobilePageLayout = require('../ui/MobilePageLayout.js');
|
|
12
|
+
var useI18n = require('../../hooks/useI18n.js');
|
|
13
|
+
|
|
14
|
+
var REASON_KEYS = [
|
|
15
|
+
"reason_no_id",
|
|
16
|
+
"reason_no_nfc",
|
|
17
|
+
"reason_unknown_nfc",
|
|
18
|
+
"reason_not_comfortable",
|
|
19
|
+
"reason_other",
|
|
20
|
+
];
|
|
21
|
+
var REASON_FALLBACKS = {
|
|
22
|
+
reason_no_id: "Je n'ai pas ma pièce d'identité avec moi",
|
|
23
|
+
reason_no_nfc: "Ma pièce d'identité n'a pas de puce",
|
|
24
|
+
reason_unknown_nfc: "Je ne sais pas si ma pièce a une puce",
|
|
25
|
+
reason_not_comfortable: "Je ne souhaite pas utiliser le scan sans contact",
|
|
26
|
+
reason_other: "Autre raison",
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Questionnaire de fallback affiché lorsqu'un utilisateur déclare ne pas pouvoir
|
|
30
|
+
* utiliser le scan NFC (écran NfcChipGate → "Non"). À la manière de Persona, on
|
|
31
|
+
* recueille la raison pour aider les reviewers côté backoffice avant de poursuivre.
|
|
32
|
+
*
|
|
33
|
+
* La sélection d'une raison est obligatoire ; un commentaire libre optionnel
|
|
34
|
+
* apparaît lorsque "Autre raison" est choisi.
|
|
35
|
+
*/
|
|
36
|
+
var NfcFallbackSurvey = function (_a) {
|
|
37
|
+
var onSubmit = _a.onSubmit;
|
|
38
|
+
var t = useI18n.useI18n().t;
|
|
39
|
+
var _b = React.useState(null), selectedReason = _b[0], setSelectedReason = _b[1];
|
|
40
|
+
var _c = React.useState(""), comment = _c[0], setComment = _c[1];
|
|
41
|
+
var handleSubmit = function () {
|
|
42
|
+
if (!selectedReason)
|
|
43
|
+
return;
|
|
44
|
+
var label = t("nfc_scan.fallback.".concat(selectedReason), REASON_FALLBACKS[selectedReason]);
|
|
45
|
+
var trimmedComment = comment.trim();
|
|
46
|
+
onSubmit(selectedReason, label, selectedReason === "reason_other" && trimmedComment
|
|
47
|
+
? trimmedComment
|
|
48
|
+
: undefined);
|
|
49
|
+
};
|
|
50
|
+
return (jsxRuntime.jsx(MobilePageLayout.default, { footer: jsxRuntime.jsx(PageActions.default, { primary: jsxRuntime.jsx(Button.default, { onClick: handleSubmit, disabled: !selectedReason, children: t("nfc_scan.fallback.continue", "Continuer") }) }), 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", children: [jsxRuntime.jsx(Title.default, { className: "text-xl md:text-2xl lg:text-3xl", children: t("nfc_scan.fallback.title", "Aidez-nous à comprendre") }), jsxRuntime.jsx(Subtitle.default, { className: "text-sm text-gray-600 leading-relaxed whitespace-pre-line", children: t("nfc_scan.fallback.subtitle", "Pour quelle raison ne pouvez-vous pas utiliser le scan sans contact ?") })] }), jsxRuntime.jsx("div", { className: "space-y-3", children: REASON_KEYS.map(function (reasonKey) {
|
|
51
|
+
var isSelected = selectedReason === reasonKey;
|
|
52
|
+
return (jsxRuntime.jsxs("button", { type: "button", onClick: function () { return setSelectedReason(reasonKey); }, "aria-pressed": isSelected, className: "flex w-full items-center gap-3 rounded-xl border-2 p-4 text-left transition-colors", style: {
|
|
53
|
+
borderColor: isSelected
|
|
54
|
+
? "var(--uni-primary-color, #11e5c5)"
|
|
55
|
+
: "#e5e7eb",
|
|
56
|
+
backgroundColor: isSelected
|
|
57
|
+
? "var(--uni-light-color-variant-1, #d0f7f2)"
|
|
58
|
+
: "#ffffff",
|
|
59
|
+
}, children: [jsxRuntime.jsx("span", { className: "flex h-5 w-5 shrink-0 items-center justify-center rounded-full border-2", style: {
|
|
60
|
+
borderColor: isSelected
|
|
61
|
+
? "var(--uni-primary-color, #11e5c5)"
|
|
62
|
+
: "#d1d5db",
|
|
63
|
+
}, children: isSelected && (jsxRuntime.jsx("span", { className: "h-2.5 w-2.5 rounded-full", style: {
|
|
64
|
+
backgroundColor: "var(--uni-primary-color, #11e5c5)",
|
|
65
|
+
} })) }), jsxRuntime.jsx("span", { className: "text-sm font-medium text-gray-900", children: t("nfc_scan.fallback.".concat(reasonKey), REASON_FALLBACKS[reasonKey]) })] }, reasonKey));
|
|
66
|
+
}) }), selectedReason === "reason_other" && (jsxRuntime.jsx("textarea", { value: comment, onChange: function (e) { return setComment(e.target.value); }, maxLength: 1000, rows: 3, placeholder: t("nfc_scan.fallback.comment_placeholder", "Précisez votre raison (optionnel)"), className: "w-full resize-none rounded-xl border-2 border-gray-200 p-3 text-sm text-gray-900 focus:outline-none" }))] }) }) }));
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
exports.default = NfcFallbackSurvey;
|
|
70
|
+
//# sourceMappingURL=NfcFallbackSurvey.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NfcFallbackSurvey.js","sources":["../../../../../src/components/nfc-scan/NfcFallbackSurvey.tsx"],"sourcesContent":["import React, { useState } from \"react\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport Button from \"../ui/Button\";\nimport PageActions from \"../ui/PageActions\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport { useI18n } from \"../../hooks/useI18n\";\n\ninterface NfcFallbackSurveyProps {\n /**\n * Validation du questionnaire.\n * @param reason clé technique de la raison sélectionnée\n * @param label libellé lisible (traduit) — stocké tel quel côté backoffice\n * @param comment commentaire libre optionnel (uniquement si \"autre\")\n */\n onSubmit: (reason: string, label: string, comment?: string) => void;\n}\n\nconst REASON_KEYS = [\n \"reason_no_id\",\n \"reason_no_nfc\",\n \"reason_unknown_nfc\",\n \"reason_not_comfortable\",\n \"reason_other\",\n] as const;\n\ntype ReasonKey = (typeof REASON_KEYS)[number];\n\nconst REASON_FALLBACKS: Record<ReasonKey, string> = {\n reason_no_id: \"Je n'ai pas ma pièce d'identité avec moi\",\n reason_no_nfc: \"Ma pièce d'identité n'a pas de puce\",\n reason_unknown_nfc: \"Je ne sais pas si ma pièce a une puce\",\n reason_not_comfortable: \"Je ne souhaite pas utiliser le scan sans contact\",\n reason_other: \"Autre raison\",\n};\n\n/**\n * Questionnaire de fallback affiché lorsqu'un utilisateur déclare ne pas pouvoir\n * utiliser le scan NFC (écran NfcChipGate → \"Non\"). À la manière de Persona, on\n * recueille la raison pour aider les reviewers côté backoffice avant de poursuivre.\n *\n * La sélection d'une raison est obligatoire ; un commentaire libre optionnel\n * apparaît lorsque \"Autre raison\" est choisi.\n */\nconst NfcFallbackSurvey = ({ onSubmit }: NfcFallbackSurveyProps) => {\n const { t } = useI18n();\n const [selectedReason, setSelectedReason] = useState<ReasonKey | null>(null);\n const [comment, setComment] = useState(\"\");\n\n const handleSubmit = () => {\n if (!selectedReason) return;\n const label = t(\n `nfc_scan.fallback.${selectedReason}`,\n REASON_FALLBACKS[selectedReason],\n );\n const trimmedComment = comment.trim();\n onSubmit(\n selectedReason,\n label,\n selectedReason === \"reason_other\" && trimmedComment\n ? trimmedComment\n : undefined,\n );\n };\n\n return (\n <MobilePageLayout\n footer={\n <PageActions\n primary={\n <Button onClick={handleSubmit} disabled={!selectedReason}>\n {t(\"nfc_scan.fallback.continue\", \"Continuer\")}\n </Button>\n }\n />\n }\n >\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\">\n <Title className=\"text-xl md:text-2xl lg:text-3xl\">\n {t(\"nfc_scan.fallback.title\", \"Aidez-nous à comprendre\")}\n </Title>\n <Subtitle className=\"text-sm text-gray-600 leading-relaxed whitespace-pre-line\">\n {t(\n \"nfc_scan.fallback.subtitle\",\n \"Pour quelle raison ne pouvez-vous pas utiliser le scan sans contact ?\",\n )}\n </Subtitle>\n </div>\n\n <div className=\"space-y-3\">\n {REASON_KEYS.map((reasonKey) => {\n const isSelected = selectedReason === reasonKey;\n return (\n <button\n key={reasonKey}\n type=\"button\"\n onClick={() => setSelectedReason(reasonKey)}\n aria-pressed={isSelected}\n className=\"flex w-full items-center gap-3 rounded-xl border-2 p-4 text-left transition-colors\"\n style={{\n borderColor: isSelected\n ? \"var(--uni-primary-color, #11e5c5)\"\n : \"#e5e7eb\",\n backgroundColor: isSelected\n ? \"var(--uni-light-color-variant-1, #d0f7f2)\"\n : \"#ffffff\",\n }}\n >\n <span\n className=\"flex h-5 w-5 shrink-0 items-center justify-center rounded-full border-2\"\n style={{\n borderColor: isSelected\n ? \"var(--uni-primary-color, #11e5c5)\"\n : \"#d1d5db\",\n }}\n >\n {isSelected && (\n <span\n className=\"h-2.5 w-2.5 rounded-full\"\n style={{\n backgroundColor: \"var(--uni-primary-color, #11e5c5)\",\n }}\n />\n )}\n </span>\n <span className=\"text-sm font-medium text-gray-900\">\n {t(\n `nfc_scan.fallback.${reasonKey}`,\n REASON_FALLBACKS[reasonKey],\n )}\n </span>\n </button>\n );\n })}\n </div>\n\n {selectedReason === \"reason_other\" && (\n <textarea\n value={comment}\n onChange={(e) => setComment(e.target.value)}\n maxLength={1000}\n rows={3}\n placeholder={t(\n \"nfc_scan.fallback.comment_placeholder\",\n \"Précisez votre raison (optionnel)\",\n )}\n className=\"w-full resize-none rounded-xl border-2 border-gray-200 p-3 text-sm text-gray-900 focus:outline-none\"\n />\n )}\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default NfcFallbackSurvey;\n"],"names":["useI18n","useState","_jsx","MobilePageLayout","PageActions","Button","_jsxs","Title","Subtitle"],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
var lucideReact = require('lucide-react');
|
|
7
|
+
var useI18n = require('../../hooks/useI18n.js');
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Encart pédagogique affiché sur la page de choix de document lorsque le parcours
|
|
11
|
+
* utilise l'option NFC. Il prépare l'utilisateur aux étapes inhabituelles à venir
|
|
12
|
+
* (document physique en main, scan d'un QR code, ouverture d'une application externe)
|
|
13
|
+
* afin de limiter la rupture de flux et l'abandon.
|
|
14
|
+
*
|
|
15
|
+
* Affiché uniquement quand `nfcEnabled` est vrai côté nœud — sinon la page de choix
|
|
16
|
+
* de document conserve son affichage classique.
|
|
17
|
+
*/
|
|
18
|
+
var NfcOnboardingNotice = function () {
|
|
19
|
+
var t = useI18n.useI18n().t;
|
|
20
|
+
var steps = [
|
|
21
|
+
{
|
|
22
|
+
Icon: lucideReact.Wallet,
|
|
23
|
+
title: t("nfc_scan.onboarding.step_document_title", "Préparez votre document"),
|
|
24
|
+
description: t("nfc_scan.onboarding.step_document_description", "Sortez votre document d'identité physique, vous en aurez besoin pour la lecture de la puce électronique."),
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
Icon: lucideReact.QrCode,
|
|
28
|
+
title: t("nfc_scan.onboarding.step_qr_title", "Scannez un QR code"),
|
|
29
|
+
description: t("nfc_scan.onboarding.step_qr_description", "Après votre choix, un QR code s'affichera : scannez-le avec votre smartphone."),
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
Icon: lucideReact.Smartphone,
|
|
33
|
+
title: t("nfc_scan.onboarding.step_app_title", "Ouvrez l'application sécurisée"),
|
|
34
|
+
description: t("nfc_scan.onboarding.step_app_description", "Le QR code ouvre une application externe dédiée pour scanner et lire la puce électronique de votre document."),
|
|
35
|
+
},
|
|
36
|
+
];
|
|
37
|
+
return (jsxRuntime.jsxs("div", { className: "rounded-2xl border border-teal-200 bg-teal-50 p-4 md:p-5", children: [jsxRuntime.jsxs("h3", { className: "mb-3 flex items-center gap-2 text-sm font-semibold text-teal-900", children: [jsxRuntime.jsx(lucideReact.QrCode, { size: 18, "aria-hidden": "true", className: "shrink-0" }), t("nfc_scan.onboarding.title", "Lecture sans contact (NFC)")] }), jsxRuntime.jsx("p", { className: "mb-4 text-sm leading-relaxed text-teal-800", children: t("nfc_scan.onboarding.intro", "Ce parcours utilise la lecture sans contact de la puce électronique de votre document. Voici les étapes à venir :") }), jsxRuntime.jsx("ol", { className: "space-y-3", children: steps.map(function (_a, index) {
|
|
38
|
+
var Icon = _a.Icon, title = _a.title, description = _a.description;
|
|
39
|
+
return (jsxRuntime.jsxs("li", { className: "flex items-start gap-3", children: [jsxRuntime.jsx("span", { className: "mt-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-white text-teal-600 shadow-sm", children: jsxRuntime.jsx(Icon, { size: 18, "aria-hidden": "true" }) }), jsxRuntime.jsxs("div", { className: "min-w-0", children: [jsxRuntime.jsx("p", { className: "text-sm font-medium text-gray-900", children: title }), jsxRuntime.jsx("p", { className: "text-sm leading-relaxed text-gray-600", children: description })] })] }, index));
|
|
40
|
+
}) })] }));
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
exports.default = NfcOnboardingNotice;
|
|
44
|
+
//# sourceMappingURL=NfcOnboardingNotice.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NfcOnboardingNotice.js","sources":["../../../../../src/components/nfc-scan/NfcOnboardingNotice.tsx"],"sourcesContent":["import React from \"react\";\nimport { Wallet, QrCode, Smartphone } from \"lucide-react\";\nimport { useI18n } from \"../../hooks/useI18n\";\n\n/**\n * Encart pédagogique affiché sur la page de choix de document lorsque le parcours\n * utilise l'option NFC. Il prépare l'utilisateur aux étapes inhabituelles à venir\n * (document physique en main, scan d'un QR code, ouverture d'une application externe)\n * afin de limiter la rupture de flux et l'abandon.\n *\n * Affiché uniquement quand `nfcEnabled` est vrai côté nœud — sinon la page de choix\n * de document conserve son affichage classique.\n */\nconst NfcOnboardingNotice: React.FC = () => {\n const { t } = useI18n();\n\n const steps = [\n {\n Icon: Wallet,\n title: t(\n \"nfc_scan.onboarding.step_document_title\",\n \"Préparez votre document\",\n ),\n description: t(\n \"nfc_scan.onboarding.step_document_description\",\n \"Sortez votre document d'identité physique, vous en aurez besoin pour la lecture de la puce électronique.\",\n ),\n },\n {\n Icon: QrCode,\n title: t(\"nfc_scan.onboarding.step_qr_title\", \"Scannez un QR code\"),\n description: t(\n \"nfc_scan.onboarding.step_qr_description\",\n \"Après votre choix, un QR code s'affichera : scannez-le avec votre smartphone.\",\n ),\n },\n {\n Icon: Smartphone,\n title: t(\n \"nfc_scan.onboarding.step_app_title\",\n \"Ouvrez l'application sécurisée\",\n ),\n description: t(\n \"nfc_scan.onboarding.step_app_description\",\n \"Le QR code ouvre une application externe dédiée pour scanner et lire la puce électronique de votre document.\",\n ),\n },\n ];\n\n return (\n <div className=\"rounded-2xl border border-teal-200 bg-teal-50 p-4 md:p-5\">\n <h3 className=\"mb-3 flex items-center gap-2 text-sm font-semibold text-teal-900\">\n <QrCode size={18} aria-hidden=\"true\" className=\"shrink-0\" />\n {t(\"nfc_scan.onboarding.title\", \"Lecture sans contact (NFC)\")}\n </h3>\n <p className=\"mb-4 text-sm leading-relaxed text-teal-800\">\n {t(\n \"nfc_scan.onboarding.intro\",\n \"Ce parcours utilise la lecture sans contact de la puce électronique de votre document. Voici les étapes à venir :\",\n )}\n </p>\n <ol className=\"space-y-3\">\n {steps.map(({ Icon, title, description }, index) => (\n <li key={index} className=\"flex items-start gap-3\">\n <span className=\"mt-0.5 flex h-9 w-9 shrink-0 items-center justify-center rounded-full bg-white text-teal-600 shadow-sm\">\n <Icon size={18} aria-hidden=\"true\" />\n </span>\n <div className=\"min-w-0\">\n <p className=\"text-sm font-medium text-gray-900\">{title}</p>\n <p className=\"text-sm leading-relaxed text-gray-600\">\n {description}\n </p>\n </div>\n </li>\n ))}\n </ol>\n </div>\n );\n};\n\nexport default NfcOnboardingNotice;\n"],"names":["useI18n","Wallet","QrCode","Smartphone","_jsxs","_jsx"],"mappings":";;;;;;;;AAIA;;;;;;;;AAQG;AACH,IAAM,mBAAmB,GAAa,YAAA;AAC5B,IAAA,IAAA,CAAC,GAAKA,eAAO,EAAE,EAAd;AAET,IAAA,IAAM,KAAK,GAAG;AACZ,QAAA;AACE,YAAA,IAAI,EAAEC,kBAAM;AACZ,YAAA,KAAK,EAAE,CAAC,CACN,yCAAyC,EACzC,yBAAyB,CAC1B;AACD,YAAA,WAAW,EAAE,CAAC,CACZ,+CAA+C,EAC/C,0GAA0G,CAC3G;AACF,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAEC,kBAAM;AACZ,YAAA,KAAK,EAAE,CAAC,CAAC,mCAAmC,EAAE,oBAAoB,CAAC;AACnE,YAAA,WAAW,EAAE,CAAC,CACZ,yCAAyC,EACzC,+EAA+E,CAChF;AACF,SAAA;AACD,QAAA;AACE,YAAA,IAAI,EAAEC,sBAAU;AAChB,YAAA,KAAK,EAAE,CAAC,CACN,oCAAoC,EACpC,gCAAgC,CACjC;AACD,YAAA,WAAW,EAAE,CAAC,CACZ,0CAA0C,EAC1C,8GAA8G,CAC/G;AACF,SAAA;KACF;IAED,QACEC,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,0DAA0D,EAAA,QAAA,EAAA,CACvEA,eAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,kEAAkE,EAAA,QAAA,EAAA,CAC9EC,cAAA,CAACH,kBAAM,EAAA,EAAC,IAAI,EAAE,EAAE,EAAA,aAAA,EAAc,MAAM,EAAC,SAAS,EAAC,UAAU,EAAA,CAAG,EAC3D,CAAC,CAAC,2BAA2B,EAAE,4BAA4B,CAAC,CAAA,EAAA,CAC1D,EACLG,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,4CAA4C,EAAA,QAAA,EACtD,CAAC,CACA,2BAA2B,EAC3B,mHAAmH,CACpH,EAAA,CACC,EACJA,cAAA,CAAA,IAAA,EAAA,EAAI,SAAS,EAAC,WAAW,EAAA,QAAA,EACtB,KAAK,CAAC,GAAG,CAAC,UAAC,EAA4B,EAAE,KAAK,EAAA;AAAjC,oBAAA,IAAA,IAAI,UAAA,EAAE,KAAK,GAAA,EAAA,CAAA,KAAA,EAAE,WAAW,GAAA,EAAA,CAAA,WAAA;oBAAc,QAClDD,wBAAgB,SAAS,EAAC,wBAAwB,EAAA,QAAA,EAAA,CAChDC,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,wGAAwG,YACtHA,cAAA,CAAC,IAAI,IAAC,IAAI,EAAE,EAAE,EAAA,aAAA,EAAc,MAAM,EAAA,CAAG,EAAA,CAChC,EACPD,eAAA,CAAA,KAAA,EAAA,EAAK,SAAS,EAAC,SAAS,aACtBC,cAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,mCAAmC,EAAA,QAAA,EAAE,KAAK,EAAA,CAAK,EAC5DA,sBAAG,SAAS,EAAC,uCAAuC,EAAA,QAAA,EACjD,WAAW,GACV,CAAA,EAAA,CACA,CAAA,EAAA,EATC,KAAK,CAUT;AAX6C,gBAAA,CAYnD,CAAC,EAAA,CACC,CAAA,EAAA,CACD;AAEV;;;;"}
|
|
@@ -38,7 +38,7 @@ var NfcScanStep = function (_a) {
|
|
|
38
38
|
}).status;
|
|
39
39
|
var title = pageTitle || t("nfc_scan.page_title", "Scan NFC de votre document");
|
|
40
40
|
var subtitle = pageDescription ||
|
|
41
|
-
t("nfc_scan.page_description", "Scannez le QR code ci-dessous avec votre
|
|
41
|
+
t("nfc_scan.page_description", "Scannez le QR code ci-dessous avec votre smartphone pour lire la puce électronique de votre document d'identité.");
|
|
42
42
|
React.useEffect(function () {
|
|
43
43
|
if (status !== "pending")
|
|
44
44
|
return;
|
|
@@ -82,7 +82,7 @@ var NfcScanStep = function (_a) {
|
|
|
82
82
|
}); };
|
|
83
83
|
generate();
|
|
84
84
|
}, [nfcUrl, status, t]);
|
|
85
|
-
return (jsxRuntime.jsx(MobilePageLayout.default, { footer: null, 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: status === "success" ? (jsxRuntime.jsx(NfcSuccessAnimation.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("nfc_scan.verifying", "Vérification en cours…") })] })) : status === "opened" ? (jsxRuntime.jsxs("div", { className: "w-full max-w-sm rounded-2xl border border-emerald-200 bg-emerald-50 p-6 text-center shadow-sm", children: [jsxRuntime.jsx("div", { className: "mx-auto mb-4 flex h-14 w-14 items-center justify-center rounded-full bg-emerald-500 text-white shadow-md shadow-emerald-200", children: jsxRuntime.jsx("svg", { "aria-hidden": "true", viewBox: "0 0 24 24", className: "h-7 w-7", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: jsxRuntime.jsx("path", { d: "M20 6 9 17l-5-5" }) }) }), jsxRuntime.jsx("p", { className: "text-base font-semibold text-gray-900", children: t("nfc_scan.qr_opened_title", "QR code scanné") }), jsxRuntime.jsx("p", { className: "mt-2 text-sm leading-relaxed text-gray-600", children: t("nfc_scan.qr_opened_description", "L'expérience NFC est ouverte sur
|
|
85
|
+
return (jsxRuntime.jsx(MobilePageLayout.default, { footer: null, 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: status === "success" ? (jsxRuntime.jsx(NfcSuccessAnimation.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("nfc_scan.verifying", "Vérification en cours…") })] })) : status === "opened" ? (jsxRuntime.jsxs("div", { className: "w-full max-w-sm rounded-2xl border border-emerald-200 bg-emerald-50 p-6 text-center shadow-sm", children: [jsxRuntime.jsx("div", { className: "mx-auto mb-4 flex h-14 w-14 items-center justify-center rounded-full bg-emerald-500 text-white shadow-md shadow-emerald-200", children: jsxRuntime.jsx("svg", { "aria-hidden": "true", viewBox: "0 0 24 24", className: "h-7 w-7", fill: "none", stroke: "currentColor", strokeWidth: "2.5", strokeLinecap: "round", strokeLinejoin: "round", children: jsxRuntime.jsx("path", { d: "M20 6 9 17l-5-5" }) }) }), jsxRuntime.jsx("p", { className: "text-base font-semibold text-gray-900", children: t("nfc_scan.qr_opened_title", "QR code scanné") }), jsxRuntime.jsx("p", { className: "mt-2 text-sm leading-relaxed text-gray-600", children: t("nfc_scan.qr_opened_description", "L'expérience NFC est ouverte sur votre smartphone. Continuez le scan sur votre téléphone.") }), jsxRuntime.jsxs("div", { className: "mt-5 flex items-center justify-center gap-2 text-xs font-medium text-emerald-700", children: [jsxRuntime.jsx("span", { className: "h-2 w-2 animate-pulse rounded-full bg-emerald-500" }), t("nfc_scan.waiting_completion", "En attente de la lecture NFC")] })] })) : qrError ? (jsxRuntime.jsx("div", { className: "text-red-500 text-center p-4", children: qrError })) : (jsxRuntime.jsx("div", { className: "bg-white p-4 rounded-lg shadow-lg border-2 border-gray-200", children: jsxRuntime.jsx("canvas", { ref: canvasRef }) })) })] }) }) }));
|
|
86
86
|
};
|
|
87
87
|
|
|
88
88
|
exports.default = NfcScanStep;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NfcScanNode.js","sources":["../../../../../src/components/nfc-scan/NfcScanNode.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport QRCode from \"qrcode\";\nimport type { SessionTemplate, stepObject } from \"../../types/session\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport { useNfcSseStatus } from \"../../hooks/useNfcSseStatus\";\nimport { getBaseURL } from \"../../services/api\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport NfcSuccessAnimation from \"./NfcSuccessAnimation\";\n\ninterface NfcScanStepProps {\n sessionId: string;\n nodeId: string;\n stepObject: stepObject;\n template?: SessionTemplate;\n pageTitle?: string;\n pageDescription?: string;\n}\n\nconst NfcScanStep: React.FC<NfcScanStepProps> = ({\n sessionId,\n nodeId,\n stepObject,\n template,\n pageTitle,\n pageDescription,\n}) => {\n const { t } = useI18n();\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [qrError, setQrError] = useState<string | null>(null);\n\n const nfcUrl = useMemo(() => {\n const origin = typeof window !== \"undefined\" ? window.location.origin : \"\";\n return `${origin}/scan/${sessionId}`;\n }, [sessionId]);\n\n const apiBaseUrl = useMemo(() => getBaseURL(), []);\n\n const { status } = useNfcSseStatus({\n sessionId,\n apiBaseUrl,\n onCompleted: () => {\n if (template) {\n stepObject.goToNextStep(nodeId, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n },\n });\n\n const title =\n pageTitle || t(\"nfc_scan.page_title\", \"Scan NFC de votre document\");\n const subtitle =\n pageDescription ||\n t(\n \"nfc_scan.page_description\",\n \"Scannez le QR code ci-dessous avec votre iPhone pour lire la puce NFC de votre document d'identité.\"\n );\n\n useEffect(() => {\n if (status !== \"pending\") return;\n\n const generate = async () => {\n if (!canvasRef.current) return;\n setQrError(null);\n\n try {\n const dataUrl = await QRCode.toDataURL(nfcUrl, {\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 }, [nfcUrl, status, t]);\n\n return (\n <MobilePageLayout footer={null}>\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 {status === \"success\" ? (\n <NfcSuccessAnimation />\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(\"nfc_scan.verifying\", \"Vérification en cours…\")}\n </p>\n </div>\n ) : status === \"opened\" ? (\n <div className=\"w-full max-w-sm rounded-2xl border border-emerald-200 bg-emerald-50 p-6 text-center shadow-sm\">\n <div className=\"mx-auto mb-4 flex h-14 w-14 items-center justify-center rounded-full bg-emerald-500 text-white shadow-md shadow-emerald-200\">\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n className=\"h-7 w-7\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n </div>\n <p className=\"text-base font-semibold text-gray-900\">\n {t(\"nfc_scan.qr_opened_title\", \"QR code scanné\")}\n </p>\n <p className=\"mt-2 text-sm leading-relaxed text-gray-600\">\n {t(\n \"nfc_scan.qr_opened_description\",\n \"L'expérience NFC est ouverte sur l'iPhone. Continuez le scan sur le téléphone.\"\n )}\n </p>\n <div className=\"mt-5 flex items-center justify-center gap-2 text-xs font-medium text-emerald-700\">\n <span className=\"h-2 w-2 animate-pulse rounded-full bg-emerald-500\" />\n {t(\"nfc_scan.waiting_completion\", \"En attente de la lecture NFC\")}\n </div>\n </div>\n ) : qrError ? (\n <div className=\"text-red-500 text-center p-4\">{qrError}</div>\n ) : (\n <div className=\"bg-white p-4 rounded-lg shadow-lg border-2 border-gray-200\">\n <canvas ref={canvasRef} />\n </div>\n )}\n </div>\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default NfcScanStep;\n"],"names":["useI18n","useRef","useState","useMemo","getBaseURL","useNfcSseStatus","useEffect","__awaiter","_jsx","MobilePageLayout","_jsxs","Title","Subtitle","NfcSuccessAnimation"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"NfcScanNode.js","sources":["../../../../../src/components/nfc-scan/NfcScanNode.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport QRCode from \"qrcode\";\nimport type { SessionTemplate, stepObject } from \"../../types/session\";\nimport { useI18n } from \"../../hooks/useI18n\";\nimport { useNfcSseStatus } from \"../../hooks/useNfcSseStatus\";\nimport { getBaseURL } from \"../../services/api\";\nimport MobilePageLayout from \"../ui/MobilePageLayout\";\nimport Title from \"../ui/Title\";\nimport Subtitle from \"../ui/Subtitle\";\nimport NfcSuccessAnimation from \"./NfcSuccessAnimation\";\n\ninterface NfcScanStepProps {\n sessionId: string;\n nodeId: string;\n stepObject: stepObject;\n template?: SessionTemplate;\n pageTitle?: string;\n pageDescription?: string;\n}\n\nconst NfcScanStep: React.FC<NfcScanStepProps> = ({\n sessionId,\n nodeId,\n stepObject,\n template,\n pageTitle,\n pageDescription,\n}) => {\n const { t } = useI18n();\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const [qrError, setQrError] = useState<string | null>(null);\n\n const nfcUrl = useMemo(() => {\n const origin = typeof window !== \"undefined\" ? window.location.origin : \"\";\n return `${origin}/scan/${sessionId}`;\n }, [sessionId]);\n\n const apiBaseUrl = useMemo(() => getBaseURL(), []);\n\n const { status } = useNfcSseStatus({\n sessionId,\n apiBaseUrl,\n onCompleted: () => {\n if (template) {\n stepObject.goToNextStep(nodeId, template);\n } else {\n stepObject.setStep(stepObject.step + 1);\n }\n },\n });\n\n const title =\n pageTitle || t(\"nfc_scan.page_title\", \"Scan NFC de votre document\");\n const subtitle =\n pageDescription ||\n t(\n \"nfc_scan.page_description\",\n \"Scannez le QR code ci-dessous avec votre smartphone pour lire la puce électronique de votre document d'identité.\"\n );\n\n useEffect(() => {\n if (status !== \"pending\") return;\n\n const generate = async () => {\n if (!canvasRef.current) return;\n setQrError(null);\n\n try {\n const dataUrl = await QRCode.toDataURL(nfcUrl, {\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 }, [nfcUrl, status, t]);\n\n return (\n <MobilePageLayout footer={null}>\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 {status === \"success\" ? (\n <NfcSuccessAnimation />\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(\"nfc_scan.verifying\", \"Vérification en cours…\")}\n </p>\n </div>\n ) : status === \"opened\" ? (\n <div className=\"w-full max-w-sm rounded-2xl border border-emerald-200 bg-emerald-50 p-6 text-center shadow-sm\">\n <div className=\"mx-auto mb-4 flex h-14 w-14 items-center justify-center rounded-full bg-emerald-500 text-white shadow-md shadow-emerald-200\">\n <svg\n aria-hidden=\"true\"\n viewBox=\"0 0 24 24\"\n className=\"h-7 w-7\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n </div>\n <p className=\"text-base font-semibold text-gray-900\">\n {t(\"nfc_scan.qr_opened_title\", \"QR code scanné\")}\n </p>\n <p className=\"mt-2 text-sm leading-relaxed text-gray-600\">\n {t(\n \"nfc_scan.qr_opened_description\",\n \"L'expérience NFC est ouverte sur votre smartphone. Continuez le scan sur votre téléphone.\"\n )}\n </p>\n <div className=\"mt-5 flex items-center justify-center gap-2 text-xs font-medium text-emerald-700\">\n <span className=\"h-2 w-2 animate-pulse rounded-full bg-emerald-500\" />\n {t(\"nfc_scan.waiting_completion\", \"En attente de la lecture NFC\")}\n </div>\n </div>\n ) : qrError ? (\n <div className=\"text-red-500 text-center p-4\">{qrError}</div>\n ) : (\n <div className=\"bg-white p-4 rounded-lg shadow-lg border-2 border-gray-200\">\n <canvas ref={canvasRef} />\n </div>\n )}\n </div>\n </div>\n </div>\n </MobilePageLayout>\n );\n};\n\nexport default NfcScanStep;\n"],"names":["useI18n","useRef","useState","useMemo","getBaseURL","useNfcSseStatus","useEffect","__awaiter","_jsx","MobilePageLayout","_jsxs","Title","Subtitle","NfcSuccessAnimation"],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Pictogramme de la puce de contact d'une carte d'identité (contacts dorés type
|
|
9
|
+
* carte bancaire), repris de assets/puce-cni.svg mais teinté avec la couleur
|
|
10
|
+
* primaire du SDK (var(--uni-primary-color)) pour rester aligné sur l'identité
|
|
11
|
+
* visuelle, en cohérence avec BiometricSymbol.
|
|
12
|
+
*
|
|
13
|
+
* Affiché à côté du symbole biométrique pour aider l'utilisateur à reconnaître la
|
|
14
|
+
* puce sur sa carte d'identité.
|
|
15
|
+
*/
|
|
16
|
+
var PuceCniSymbol = function (_a) {
|
|
17
|
+
var className = _a.className;
|
|
18
|
+
return (jsxRuntime.jsxs("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 200 125", className: className, role: "img", "aria-label": "Puce d'une carte d'identit\u00E9", fill: "none", stroke: "var(--uni-primary-color, #11e5c5)", strokeWidth: "4", children: [jsxRuntime.jsx("rect", { x: "10", y: "10", width: "180", height: "105", rx: "10", ry: "10" }), jsxRuntime.jsxs("g", { transform: "translate(30, 45)", children: [jsxRuntime.jsx("rect", { width: "35", height: "30", rx: "4", ry: "4", fill: "var(--uni-primary-color, #11e5c5)", fillOpacity: "0.12", strokeWidth: "2.5" }), jsxRuntime.jsx("path", { d: "M0 10h35M0 20h35M12 0v30M23 0v30", strokeWidth: "1", strokeOpacity: "0.6" })] })] }));
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
exports.default = PuceCniSymbol;
|
|
22
|
+
//# sourceMappingURL=PuceCniSymbol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PuceCniSymbol.js","sources":["../../../../../src/components/nfc-scan/PuceCniSymbol.tsx"],"sourcesContent":["interface PuceCniSymbolProps {\n className?: string;\n}\n\n/**\n * Pictogramme de la puce de contact d'une carte d'identité (contacts dorés type\n * carte bancaire), repris de assets/puce-cni.svg mais teinté avec la couleur\n * primaire du SDK (var(--uni-primary-color)) pour rester aligné sur l'identité\n * visuelle, en cohérence avec BiometricSymbol.\n *\n * Affiché à côté du symbole biométrique pour aider l'utilisateur à reconnaître la\n * puce sur sa carte d'identité.\n */\nconst PuceCniSymbol = ({ className }: PuceCniSymbolProps) => {\n return (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 200 125\"\n className={className}\n role=\"img\"\n aria-label=\"Puce d'une carte d'identité\"\n fill=\"none\"\n stroke=\"var(--uni-primary-color, #11e5c5)\"\n strokeWidth=\"4\"\n >\n <rect x=\"10\" y=\"10\" width=\"180\" height=\"105\" rx=\"10\" ry=\"10\" />\n\n <g transform=\"translate(30, 45)\">\n <rect\n width=\"35\"\n height=\"30\"\n rx=\"4\"\n ry=\"4\"\n fill=\"var(--uni-primary-color, #11e5c5)\"\n fillOpacity=\"0.12\"\n strokeWidth=\"2.5\"\n />\n <path\n d=\"M0 10h35M0 20h35M12 0v30M23 0v30\"\n strokeWidth=\"1\"\n strokeOpacity=\"0.6\"\n />\n </g>\n </svg>\n );\n};\n\nexport default PuceCniSymbol;\n"],"names":["_jsxs","_jsx"],"mappings":";;;;;;AAIA;;;;;;;;AAQG;AACH,IAAM,aAAa,GAAG,UAAC,EAAiC,EAAA;AAA/B,IAAA,IAAA,SAAS,GAAA,EAAA,CAAA,SAAA;IAChC,QACEA,eAAA,CAAA,KAAA,EAAA,EACE,KAAK,EAAC,4BAA4B,EAClC,OAAO,EAAC,aAAa,EACrB,SAAS,EAAE,SAAS,EACpB,IAAI,EAAC,KAAK,EAAA,YAAA,EACC,kCAA6B,EACxC,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,mCAAmC,EAC1C,WAAW,EAAC,GAAG,EAAA,QAAA,EAAA,CAEfC,cAAA,CAAA,MAAA,EAAA,EAAM,CAAC,EAAC,IAAI,EAAC,CAAC,EAAC,IAAI,EAAC,KAAK,EAAC,KAAK,EAAC,MAAM,EAAC,KAAK,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAA,CAAG,EAE/DD,eAAA,CAAA,GAAA,EAAA,EAAG,SAAS,EAAC,mBAAmB,EAAA,QAAA,EAAA,CAC9BC,cAAA,CAAA,MAAA,EAAA,EACE,KAAK,EAAC,IAAI,EACV,MAAM,EAAC,IAAI,EACX,EAAE,EAAC,GAAG,EACN,EAAE,EAAC,GAAG,EACN,IAAI,EAAC,mCAAmC,EACxC,WAAW,EAAC,MAAM,EAClB,WAAW,EAAC,KAAK,EAAA,CACjB,EACFA,cAAA,CAAA,MAAA,EAAA,EACE,CAAC,EAAC,kCAAkC,EACpC,WAAW,EAAC,GAAG,EACf,aAAa,EAAC,KAAK,EAAA,CACnB,CAAA,EAAA,CACA,CAAA,EAAA,CACA;AAEV;;;;"}
|