@movalib/movalib-commons 1.59.39 → 1.60.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/devIndex.tsx CHANGED
@@ -26,7 +26,6 @@ import GaragePLV from './src/GaragePLV';
26
26
  import AddressFields from './src/AddressFields';
27
27
  import IbanInput from './src/IbanInput';
28
28
  import GenderSelector from './src/GenderSelector';
29
- import {VehicleTire} from "./index";
30
29
  import MovaVehicleTireField from "./src/MovaVehicleTireField";
31
30
 
32
31
  const App = () => {
@@ -27,7 +27,9 @@ var DialogForgotPassword = function (_a) {
27
27
  return ((0, jsx_runtime_1.jsxs)(material_1.Dialog, __assign({ open: openForgotPassword, onClose: handleOnClose, "aria-labelledby": "forgot-password-dialog-title", "aria-describedby": "forgot-password-dialog-description" }, { children: [(0, jsx_runtime_1.jsx)(material_1.DialogTitle, __assign({ id: "forgot-password-title" }, { children: "R\u00E9cup\u00E9ration du mot de passe" })), (0, jsx_runtime_1.jsxs)(material_1.DialogContent, { children: [(0, jsx_runtime_1.jsx)(material_1.DialogContentText, __assign({ id: "forgot-password-dialog-description", sx: { mb: 2 } }, { children: movaAppType === Enums_1.MovaAppType.GARAGE ?
28
28
  "Saisissez votre email pour procéder à la réinitialisation de votre mot de passe."
29
29
  :
30
- "Saisissez votre n° de téléphone ou votre email pour procéder à la réinitialisation de votre mot de passe." })), (0, jsx_runtime_1.jsx)(material_1.TextField, { margin: "normal", autoFocus: true, required: true, fullWidth: true, id: movaAppType === Enums_1.MovaAppType.GARAGE ? "email" : "phoneNumberEmail", label: movaAppType === Enums_1.MovaAppType.GARAGE ? "Adresse email" : "N° de téléphone ou adresse email", name: movaAppType === Enums_1.MovaAppType.GARAGE ? "email" : "phoneNumberEmail", autoComplete: "email", onChange: function (e) { return handleInputChange(e); }, value: movaAppType === Enums_1.MovaAppType.GARAGE ? form.email.value : form.phoneNumberEmail.value, error: movaAppType === Enums_1.MovaAppType.GARAGE ? !form.email.isValid : !form.phoneNumberEmail.isValid, helperText: movaAppType === Enums_1.MovaAppType.GARAGE ? form.email.error : form.phoneNumberEmail.error })] }), (0, jsx_runtime_1.jsx)(material_1.DialogActions, { children: (0, jsx_runtime_1.jsx)(material_1.Button, __assign({ onClick: function (e) { return handleSubmitForgotPassword(e); }, color: "primary", disabled: movaAppType === Enums_1.MovaAppType.GARAGE ? !(form.email.value && (0, Validator_1.validateEmail)(form.email.value))
30
+ "Saisissez votre n° de téléphone ou votre email pour procéder à la réinitialisation de votre mot de passe." })), (0, jsx_runtime_1.jsx)(material_1.TextField, { margin: "normal", autoFocus: true, required: true, fullWidth: true, id: movaAppType === Enums_1.MovaAppType.GARAGE ? "email" : "phoneNumberEmail", label: movaAppType === Enums_1.MovaAppType.GARAGE ? "Adresse email" : "N° de téléphone ou adresse email", name: movaAppType === Enums_1.MovaAppType.GARAGE ? "email" : "phoneNumberEmail", autoComplete: "email", onChange: function (e) { return handleInputChange(e); }, value: movaAppType === Enums_1.MovaAppType.GARAGE ? form.email.value : form.phoneNumberEmail.value, error: movaAppType === Enums_1.MovaAppType.GARAGE ? !form.email.isValid : !form.phoneNumberEmail.isValid, helperText: movaAppType === Enums_1.MovaAppType.GARAGE
31
+ ? form.email.error
32
+ : form.phoneNumberEmail.error || "Saisir l’indicatif pour un numéro étranger (ex : +32 …)" })] }), (0, jsx_runtime_1.jsx)(material_1.DialogActions, { children: (0, jsx_runtime_1.jsx)(material_1.Button, __assign({ onClick: function (e) { return handleSubmitForgotPassword(e); }, color: "primary", disabled: movaAppType === Enums_1.MovaAppType.GARAGE ? !(form.email.value && (0, Validator_1.validateEmail)(form.email.value))
31
33
  : !(form.phoneNumberEmail.value), sx: { ml: 1 } }, { children: "Envoyer ma demande" })) })] })));
32
34
  };
33
35
  exports.default = DialogForgotPassword;
@@ -70,6 +70,7 @@ var InputAdornment_1 = __importDefault(require("@mui/material/InputAdornment"));
70
70
  var Visibility_1 = __importDefault(require("@mui/icons-material/Visibility"));
71
71
  var VisibilityOff_1 = __importDefault(require("@mui/icons-material/VisibilityOff"));
72
72
  var DialogForgotPassword_1 = __importDefault(require("./DialogForgotPassword"));
73
+ var libphonenumber_js_1 = require("libphonenumber-js");
73
74
  // Permet de centrer le contenu de l'application
74
75
  var styles = {
75
76
  display: 'flex',
@@ -125,8 +126,23 @@ var MovaLogin = function (_a) {
125
126
  // Validator pour l'email
126
127
  newForm.email = (0, Tools_1.validateField)(form.email, Validator_1.validateEmail, 'Adresse email invalide');
127
128
  }
129
+ /* if(movaAppType === MovaAppType.INDIVIDUAL){
130
+ newForm.phoneNumberEmail = validateField(form.phoneNumberEmail, value => !!value, 'Champ obligatoire');
131
+ } */
128
132
  if (movaAppType === Enums_1.MovaAppType.INDIVIDUAL) {
129
- newForm.phoneNumberEmail = (0, Tools_1.validateField)(form.phoneNumberEmail, function (value) { return !!value; }, 'Champ obligatoire');
133
+ newForm.phoneNumberEmail = (0, Tools_1.validateField)(form.phoneNumberEmail, function (value) {
134
+ var _a;
135
+ if (!value)
136
+ return false;
137
+ // Si c’est un email valide => OK
138
+ if ((0, Validator_1.validateEmail)(value))
139
+ return true;
140
+ // Remplace 00 par + si le numéro commence par 00 (pour compatibilité avec libphonenumber-js)
141
+ var normalizedValue = value.startsWith('00') ? value.replace(/^00/, '+') : value;
142
+ // Si le numéro commence par + ou 00, tentative de parsing direct. Format local, Pays par défaut : FR
143
+ var phoneNumber = (0, libphonenumber_js_1.parsePhoneNumberFromString)(normalizedValue, normalizedValue.startsWith('+') || normalizedValue.startsWith('00') ? undefined : 'FR');
144
+ return (_a = phoneNumber === null || phoneNumber === void 0 ? void 0 : phoneNumber.isValid()) !== null && _a !== void 0 ? _a : false;
145
+ }, 'Email ou numéro de téléphone invalide');
130
146
  }
131
147
  newForm.password = (0, Tools_1.validateField)(form.password, function (value) { return !!value; }, 'Champ obligatoire');
132
148
  // Validator pour le mot de passe
@@ -230,7 +246,8 @@ var MovaLogin = function (_a) {
230
246
  flexDirection: 'column',
231
247
  alignItems: 'center',
232
248
  } }, { children: [(0, jsx_runtime_1.jsx)("img", { src: getMovaLogo(), style: { width: '80%' } }), headerText && (0, jsx_runtime_1.jsx)(material_1.Typography, __assign({ variant: "button", sx: { pt: 3, width: '100%' } }, { children: headerText })), (0, jsx_runtime_1.jsx)("br", {})] })), (0, jsx_runtime_1.jsxs)(material_1.Box, __assign({ component: "form", onSubmit: handleSubmit, noValidate: true, sx: { mt: 1 } }, { children: [movaAppType === Enums_1.MovaAppType.INDIVIDUAL &&
233
- (0, jsx_runtime_1.jsx)(material_1.TextField, { margin: "normal", required: true, fullWidth: true, id: "phoneNumberEmail", label: "N\u00B0 de t\u00E9l\u00E9phone ou adresse email", name: "phoneNumberEmail", autoFocus: true, onChange: function (e) { return handleInputChange(e); }, value: form.phoneNumberEmail.value, error: !form.phoneNumberEmail.isValid, helperText: form.phoneNumberEmail.error, sx: {
249
+ (0, jsx_runtime_1.jsx)(material_1.TextField, { margin: "normal", required: true, fullWidth: true, id: "phoneNumberEmail", label: "N\u00B0 de t\u00E9l\u00E9phone ou adresse email", name: "phoneNumberEmail", autoFocus: true, onChange: function (e) { return handleInputChange(e); }, value: form.phoneNumberEmail.value, error: !form.phoneNumberEmail.isValid, helperText: form.phoneNumberEmail.error ||
250
+ "Saisir l’indicatif pour un numéro étranger (ex : +32 …)", sx: {
234
251
  '& .MuiOutlinedInput-notchedOutline': {
235
252
  borderColor: darkMode ? 'white' : 'default', // Couleur de la bordure
236
253
  }
@@ -70,6 +70,7 @@ var Visibility_1 = __importDefault(require("@mui/icons-material/Visibility"));
70
70
  var VisibilityOff_1 = __importDefault(require("@mui/icons-material/VisibilityOff"));
71
71
  var Info_1 = __importDefault(require("@mui/icons-material/Info"));
72
72
  var UserService_1 = __importDefault(require("./services/UserService"));
73
+ var libphonenumber_js_1 = require("libphonenumber-js");
73
74
  // ATTENTION : s'assurer de la présence des documents suivants à la racine du composant porteur (dossier 'public')
74
75
  var CGUPath = "https://s3.eu-west-3.amazonaws.com/legal.movalib.com/Movalib_CGU.pdf";
75
76
  // Permet de centrer le contenu de l'application
@@ -119,13 +120,20 @@ var MovaSignUp = function (_a) {
119
120
  var fieldValue = e.target.value;
120
121
  // On autorise uniquement les chiffre pour le n° de téléphone
121
122
  if (fieldName == "phoneNumber") {
122
- fieldValue = fieldValue.replace(/[^0-9]/g, '');
123
- // Limiter la longueur à 10 caractères
124
- if (fieldValue.length > 10) {
125
- fieldValue = fieldValue.substring(0, 10);
123
+ // Nettoyage : on autorise chiffres + éventuellement un "+" en début
124
+ var cleaned = fieldValue.trim().replace(/[^\d+]/g, '');
125
+ // Normalisation : 0033... → +33...
126
+ if (cleaned.startsWith('00')) {
127
+ cleaned = cleaned.replace(/^00/, '+');
126
128
  }
127
- if (fieldValue.length === 10) {
128
- UserService_1.default.existsByPhoneNumber(fieldValue).then(function (response) {
129
+ // Parsing avec FR par défaut si local
130
+ var parsed = (0, libphonenumber_js_1.parsePhoneNumberFromString)(cleaned, cleaned.startsWith('+') ? undefined : 'FR');
131
+ // Mise à jour du champ
132
+ if (parsed === null || parsed === void 0 ? void 0 : parsed.isValid()) {
133
+ var e164 = parsed.number; // format +33...
134
+ //fieldValue = e164;
135
+ // Vérification de l'existence du compte
136
+ UserService_1.default.existsByPhoneNumber(e164).then(function (response) {
129
137
  if (response && response.data) {
130
138
  if (response.data.isActive === false) {
131
139
  setUserExist(true);
@@ -143,6 +151,7 @@ var MovaSignUp = function (_a) {
143
151
  });
144
152
  }
145
153
  else {
154
+ // Si numéro invalide ou incomplet, on réinitialise les flags
146
155
  setUserExist(false);
147
156
  setUserIsAlreadyActive(false);
148
157
  }
@@ -254,7 +263,8 @@ var MovaSignUp = function (_a) {
254
263
  '& .MuiOutlinedInput-notchedOutline': {
255
264
  borderColor: darkMode ? 'white' : 'default', // Couleur de la bordure
256
265
  }
257
- } }), usePhoneNumber && (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(material_1.TextField, { type: "tel", margin: "normal", required: true, fullWidth: true, id: "phoneNumber", label: "N\u00B0 de t\u00E9l\u00E9phone", name: "phoneNumber", autoComplete: "tel", disabled: userToEdit && userToEdit.phoneNumber ? true : false, onChange: function (e) { return handleInputChange(e); }, value: userForm.phoneNumber.value, error: Boolean(userForm.phoneNumber.error), helperText: userForm.phoneNumber.error, InputProps: {
266
+ } }), usePhoneNumber && (0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(material_1.TextField, { type: "tel", margin: "normal", required: true, fullWidth: true, id: "phoneNumber", label: "N\u00B0 de t\u00E9l\u00E9phone", name: "phoneNumber", autoComplete: "tel", disabled: userToEdit && userToEdit.phoneNumber ? true : false, onChange: function (e) { return handleInputChange(e); }, value: userForm.phoneNumber.value, error: Boolean(userForm.phoneNumber.error), helperText: userForm.phoneNumber.error ||
267
+ "Saisir l’indicatif pour un numéro étranger (ex : +32 …)", InputProps: {
258
268
  endAdornment: ((0, jsx_runtime_1.jsx)(InputAdornment_1.default, __assign({ position: "end" }, { children: !userExist && (0, jsx_runtime_1.jsx)(material_1.IconButton, __assign({ edge: "end", onClick: function () { return setOpenPhoneNumberInfo(!openPhoneNumberInfo); } }, { children: (0, jsx_runtime_1.jsx)(Info_1.default, {}) })) }))),
259
269
  } }), openPhoneNumberInfo && !userExist && (0, jsx_runtime_1.jsx)(material_1.Alert, __assign({ severity: "info", variant: 'standard' }, { children: "Entrez le num\u00E9ro de t\u00E9l\u00E9phone que vous avez utilis\u00E9 pour r\u00E9server, afin de suivre facilement vos rendez-vous." })), userExist && (0, jsx_runtime_1.jsx)(material_1.Alert, __assign({ severity: "success", variant: 'standard' }, { children: "Rendez-vous trouv\u00E9(s) pour ce num\u00E9ro ! Vous pourrez le(s) consulter apr\u00E8s avoir cr\u00E9\u00E9 votre compte." })), userIsAlreadyActive && (0, jsx_runtime_1.jsx)(material_1.Alert, __assign({ severity: "error", sx: { marginTop: '5px' }, variant: 'standard' }, { children: "Il semble qu\u2019un compte existe d\u00E9j\u00E0 avec ce num\u00E9ro. Connectez-vous ou utilisez \"Mot de passe oubli\u00E9\" pour y acc\u00E9der facilement." }))] }), (0, jsx_runtime_1.jsx)(material_1.TextField, { margin: "normal", required: true, fullWidth: true, id: "email", label: "Adresse email", name: "email", autoComplete: "email", disabled: userToEdit && userToEdit.email ? true : false, onChange: function (e) { return handleInputChange(e); }, value: userForm.email.value, error: !userForm.email.isValid, helperText: userForm.email.error, sx: {
260
270
  '& .MuiOutlinedInput-notchedOutline': {
package/index.ts CHANGED
@@ -31,7 +31,7 @@ export { default as ActivateAccount } from './src/components/singup/ActivateAcco
31
31
  export { QrCodePLVContainer } from './src/components/QrCodePLVContainer/QrCodePLVContainer';
32
32
  export { PLVComponent, PrintSize } from './src/components/QrCodePLVContainer/PLVComponent';
33
33
  export {LinkedDocumentDialog} from './src/components/LinkedDocumentDialog';
34
- export { default as MovaTable } from './src/components/MovaTable/MovaTable'
34
+ export { default as MovaTable } from './src/components/MovaTable/MovaTable';
35
35
 
36
36
  // Export des classes
37
37
  export { default as Subscription } from './src/models/Subscription';
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@movalib/movalib-commons",
3
- "version": "1.59.39",
3
+ "version": "1.60.0",
4
4
  "description": "Bibliothèque d'objets communs à l'ensemble des projets React de Movalib",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "private": false,
8
8
  "scripts": {
9
- "start": "webpack-dev-server --entry ./devIndex.tsx --open --https",
9
+ "start": "webpack-dev-server --entry ./devIndex.tsx --open",
10
10
  "build": "rm -rf dist && tsc && npm run copy-assets",
11
11
  "copy-assets": "cp -r src/assets/ dist/src/assets/ && cp -r src/style/. dist/src/style/",
12
12
  "test": "echo \"Error: no test specified\" && exit 1",
@@ -50,12 +50,16 @@
50
50
  "react-app"
51
51
  ]
52
52
  },
53
+ "peerDependencies": {
54
+ "libphonenumber-js": "1.9.52"
55
+ },
53
56
  "devDependencies": {
54
57
  "@types/js-cookie": "^3.0.4",
55
58
  "@types/lodash": "^4.17.17",
56
59
  "@types/pdfjs-dist": "^2.10.377",
57
60
  "@types/react-input-mask": "^3.0.5",
58
61
  "html-webpack-plugin": "^5.5.3",
62
+ "libphonenumber-js": "1.9.52",
59
63
  "ts-loader": "^9.4.4",
60
64
  "webpack-cli": "^5.1.4"
61
65
  }
@@ -49,7 +49,11 @@ const DialogForgotPassword: React.FC<{
49
49
  onChange={e => handleInputChange(e)}
50
50
  value={movaAppType === MovaAppType.GARAGE ? form.email.value : form.phoneNumberEmail.value}
51
51
  error={movaAppType === MovaAppType.GARAGE ? !form.email.isValid : !form.phoneNumberEmail.isValid}
52
- helperText={movaAppType === MovaAppType.GARAGE ? form.email.error : form.phoneNumberEmail.error}
52
+ helperText={
53
+ movaAppType === MovaAppType.GARAGE
54
+ ? form.email.error
55
+ : form.phoneNumberEmail.error || "Saisir l’indicatif pour un numéro étranger (ex : +32 …)"
56
+ }
53
57
  />
54
58
  </DialogContent>
55
59
  <DialogActions>
package/src/MovaLogin.tsx CHANGED
@@ -19,6 +19,7 @@ import InputAdornment from '@mui/material/InputAdornment';
19
19
  import Visibility from '@mui/icons-material/Visibility';
20
20
  import VisibilityOff from '@mui/icons-material/VisibilityOff';
21
21
  import DialogForgotPassword from "./DialogForgotPassword";
22
+ import { parsePhoneNumberFromString, isValidPhoneNumber } from 'libphonenumber-js';
22
23
 
23
24
  // Permet de centrer le contenu de l'application
24
25
  const styles: CSSProperties = {
@@ -100,9 +101,30 @@ const MovaLogin: FunctionComponent<MovaLoginProps> = ({ loading, movaAppType, on
100
101
  newForm.email = validateField(form.email, validateEmail, 'Adresse email invalide');
101
102
  }
102
103
 
103
- if(movaAppType === MovaAppType.INDIVIDUAL){
104
+ /* if(movaAppType === MovaAppType.INDIVIDUAL){
104
105
  newForm.phoneNumberEmail = validateField(form.phoneNumberEmail, value => !!value, 'Champ obligatoire');
105
- }
106
+ } */
107
+
108
+ if (movaAppType === MovaAppType.INDIVIDUAL) {
109
+ newForm.phoneNumberEmail = validateField(
110
+ form.phoneNumberEmail,
111
+ (value) => {
112
+ if (!value) return false;
113
+
114
+ // Si c’est un email valide => OK
115
+ if (validateEmail(value)) return true;
116
+
117
+ // Remplace 00 par + si le numéro commence par 00 (pour compatibilité avec libphonenumber-js)
118
+ const normalizedValue = value.startsWith('00') ? value.replace(/^00/, '+') : value;
119
+
120
+ // Si le numéro commence par + ou 00, tentative de parsing direct. Format local, Pays par défaut : FR
121
+ const phoneNumber = parsePhoneNumberFromString(normalizedValue, normalizedValue.startsWith('+') || normalizedValue.startsWith('00') ? undefined : 'FR');
122
+
123
+ return phoneNumber?.isValid() ?? false;
124
+ },
125
+ 'Email ou numéro de téléphone invalide'
126
+ );
127
+ }
106
128
 
107
129
  newForm.password = validateField(form.password, value => !!value, 'Champ obligatoire');
108
130
 
@@ -245,7 +267,10 @@ const MovaLogin: FunctionComponent<MovaLoginProps> = ({ loading, movaAppType, on
245
267
  onChange={e => handleInputChange(e)}
246
268
  value={form.phoneNumberEmail.value}
247
269
  error={!form.phoneNumberEmail.isValid}
248
- helperText={form.phoneNumberEmail.error}
270
+ helperText={
271
+ form.phoneNumberEmail.error ||
272
+ "Saisir l’indicatif pour un numéro étranger (ex : +32 …)"
273
+ }
249
274
  sx={{
250
275
  '& .MuiOutlinedInput-notchedOutline': {
251
276
  borderColor: darkMode ? 'white' : 'default', // Couleur de la bordure
@@ -24,6 +24,7 @@ import isValid from 'date-fns/isValid';
24
24
  import Logger from "./helpers/Logger";
25
25
  import User from "./models/User";
26
26
  import UserService from "./services/UserService";
27
+ import { parsePhoneNumberFromString } from 'libphonenumber-js';
27
28
 
28
29
  // ATTENTION : s'assurer de la présence des documents suivants à la racine du composant porteur (dossier 'public')
29
30
  const CGUPath:string = "https://s3.eu-west-3.amazonaws.com/legal.movalib.com/Movalib_CGU.pdf";
@@ -105,18 +106,29 @@ const MovaSignUp: FunctionComponent<MovaSignUpProps> = ({ loading, movaAppType,
105
106
 
106
107
  // On autorise uniquement les chiffre pour le n° de téléphone
107
108
  if (fieldName == "phoneNumber"){
108
- fieldValue= fieldValue.replace(/[^0-9]/g, '');
109
- // Limiter la longueur à 10 caractères
110
- if (fieldValue.length > 10) {
111
- fieldValue = fieldValue.substring(0, 10);
109
+ // Nettoyage : on autorise chiffres + éventuellement un "+" en début
110
+ let cleaned = fieldValue.trim().replace(/[^\d+]/g, '');
111
+
112
+ // Normalisation : 0033... → +33...
113
+ if (cleaned.startsWith('00')) {
114
+ cleaned = cleaned.replace(/^00/, '+');
112
115
  }
113
- if (fieldValue.length === 10){
114
- UserService.existsByPhoneNumber(fieldValue).then((response) => {
115
- if(response && response.data){
116
- if(response.data.isActive === false){
117
- setUserExist(true);
118
- setUserIsAlreadyActive(false);
119
- } else if (response.data.isActive === true){
116
+
117
+ // Parsing avec FR par défaut si local
118
+ const parsed = parsePhoneNumberFromString(cleaned, cleaned.startsWith('+') ? undefined : 'FR');
119
+
120
+ // Mise à jour du champ
121
+ if (parsed?.isValid()) {
122
+ const e164 = parsed.number; // format +33...
123
+ //fieldValue = e164;
124
+
125
+ // Vérification de l'existence du compte
126
+ UserService.existsByPhoneNumber(e164).then((response) => {
127
+ if (response && response.data) {
128
+ if (response.data.isActive === false) {
129
+ setUserExist(true);
130
+ setUserIsAlreadyActive(false);
131
+ } else if (response.data.isActive === true) {
120
132
  setUserIsAlreadyActive(true);
121
133
  setUserExist(false);
122
134
  } else {
@@ -124,8 +136,9 @@ const MovaSignUp: FunctionComponent<MovaSignUpProps> = ({ loading, movaAppType,
124
136
  setUserIsAlreadyActive(false);
125
137
  }
126
138
  }
127
- })
139
+ });
128
140
  } else {
141
+ // Si numéro invalide ou incomplet, on réinitialise les flags
129
142
  setUserExist(false);
130
143
  setUserIsAlreadyActive(false);
131
144
  }
@@ -313,7 +326,10 @@ const MovaSignUp: FunctionComponent<MovaSignUpProps> = ({ loading, movaAppType,
313
326
  onChange={e => handleInputChange(e)}
314
327
  value={userForm.phoneNumber.value}
315
328
  error={Boolean(userForm.phoneNumber.error)}
316
- helperText={userForm.phoneNumber.error}
329
+ helperText={
330
+ userForm.phoneNumber.error ||
331
+ "Saisir l’indicatif pour un numéro étranger (ex : +32 …)"
332
+ }
317
333
  InputProps={{
318
334
  endAdornment: (
319
335
  <InputAdornment position="end">
@@ -109,7 +109,7 @@ export const QrCodePLVContainer = ({ data }: { data: string }) => {
109
109
  const qrCodeBlob = await qrCode.getRawData("png");
110
110
 
111
111
  // Convertir l'image QR code en un tableau de bytes
112
- const qrImageBytes = await qrCodeBlob?.arrayBuffer();
112
+ const qrImageBytes = await (qrCodeBlob as Blob)?.arrayBuffer();
113
113
  // Intégrer l'image du QR code dans le PDF
114
114
  const qrImage = await pdfDoc.embedPng(qrImageBytes!);
115
115