@@ -19,6 +19,7 @@ import { AddressCandidate, GeocodeSuggestion } from "src/Common/Types/arcgis";
19
19
import GiftIcon from "public/assets/icons/GiftIcon" ;
20
20
import { euCountries } from "src/Utils/countryUtils" ;
21
21
import { isEmailValid } from "src/Utils/isEmailValid" ;
22
+ // import { DevTool } from "@hookform/devtools";
22
23
23
24
interface FormData extends ContactDetails {
24
25
isPackageWanted : boolean ;
@@ -81,7 +82,7 @@ function ContactsForm(): ReactElement {
81
82
setValue,
82
83
formState : { errors } ,
83
84
} = useForm < FormData > ( {
84
- mode : "all " ,
85
+ mode : "onTouched " ,
85
86
defaultValues : contactDetails ,
86
87
} ) ;
87
88
@@ -227,49 +228,61 @@ function ContactsForm(): ReactElement {
227
228
< Controller
228
229
name = "firstname"
229
230
control = { control }
230
- rules = { { required : true , minLength : 1 } }
231
- render = { ( { field : { onChange, value } } ) => (
231
+ rules = { {
232
+ required : t ( "firstNameRequired" ) ,
233
+ maxLength : {
234
+ value : 50 ,
235
+ message : t ( "max50Chars" ) ,
236
+ } ,
237
+ pattern : {
238
+ value : / ^ [ \p{ L} \p{ N} \s ß . ' - ] + $ / u,
239
+ message : t ( "firstNameInvalid" ) ,
240
+ } ,
241
+ } }
242
+ render = { ( { field : { onChange, value, onBlur } } ) => (
232
243
< MaterialTextField
233
244
onChange = { onChange }
245
+ onBlur = { onBlur }
234
246
value = { value }
235
247
label = { t ( "firstName" ) }
236
248
variant = "outlined"
237
249
data-test-id = "test-firstName"
238
250
/>
239
251
) }
240
252
/>
241
- { errors . firstname && errors . firstname . type === "required" && (
242
- < span className = { "form-errors" } > { t ( "firstNameRequired" ) } </ span >
243
- ) }
244
- { errors . firstname && errors . firstname . type === "minLength" && (
245
- < span className = { "form-errors" } >
246
- { t ( "atLeast3LettersRequired" ) }
247
- </ span >
253
+ { errors . firstname !== undefined && (
254
+ < div className = { "form-errors" } > { errors . firstname . message } </ div >
248
255
) }
249
256
</ div >
250
257
< div style = { { width : "20px" } } />
251
258
< div className = { "form-field mt-20 flex-1" } >
252
259
< Controller
253
260
name = "lastname"
254
261
control = { control }
255
- rules = { { required : true , minLength : 1 } }
256
- render = { ( { field : { onChange, value } } ) => (
262
+ rules = { {
263
+ required : t ( "lastNameRequired" ) ,
264
+ maxLength : {
265
+ value : 50 ,
266
+ message : t ( "max50Chars" ) ,
267
+ } ,
268
+ pattern : {
269
+ value : / ^ [ \p{ L} \p{ N} \s ß ' - ] + $ / u,
270
+ message : t ( "lastNameInvalid" ) ,
271
+ } ,
272
+ } }
273
+ render = { ( { field : { onChange, value, onBlur } } ) => (
257
274
< MaterialTextField
258
275
onChange = { onChange }
276
+ onBlur = { onBlur }
259
277
value = { value }
260
278
label = { t ( "lastName" ) }
261
279
variant = "outlined"
262
280
data-test-id = "test-lastName"
263
281
/>
264
282
) }
265
283
/>
266
- { errors . lastname && errors . lastname . type === "required" && (
267
- < span className = { "form-errors" } > { t ( "lastNameRequired" ) } </ span >
268
- ) }
269
- { errors . lastname && errors . lastname . type === "minLength" && (
270
- < span className = { "form-errors" } >
271
- { t ( "atLeast3LettersRequired" ) }
272
- </ span >
284
+ { errors . lastname !== undefined && (
285
+ < div className = { "form-errors" } > { errors . lastname . message } </ div >
273
286
) }
274
287
</ div >
275
288
</ div >
@@ -279,18 +292,18 @@ function ContactsForm(): ReactElement {
279
292
name = "email"
280
293
control = { control }
281
294
rules = { {
282
- required : {
283
- value : true ,
284
- message : t ( "emailRequired" ) ,
285
- } ,
295
+ required : t ( "emailRequired" ) ,
286
296
validate : {
287
297
emailInvalid : ( value ) =>
288
- value . length === 0 || isEmailValid ( value ) ,
298
+ value . length === 0 ||
299
+ isEmailValid ( value ) ||
300
+ t ( "enterValidEmail" ) ,
289
301
} ,
290
302
} }
291
- render = { ( { field : { onChange, value } } ) => (
303
+ render = { ( { field : { onChange, value, onBlur } } ) => (
292
304
< MaterialTextField
293
305
onChange = { onChange }
306
+ onBlur = { onBlur }
294
307
value = { value }
295
308
label = { t ( "email" ) }
296
309
variant = "outlined"
@@ -299,23 +312,22 @@ function ContactsForm(): ReactElement {
299
312
/>
300
313
) }
301
314
/>
302
- { errors . email && (
303
- < span className = { "form-errors" } >
304
- { errors . email . type === "required"
305
- ? t ( "emailRequired" )
306
- : t ( "enterValidEmail" ) }
307
- </ span >
315
+ { errors . email !== undefined && (
316
+ < div className = { "form-errors" } > { errors . email . message } </ div >
308
317
) }
309
- { /* {errors.email && errors.email.type === "validate" && (
310
- <span className={"form-errors"}>{t("useSameEmail")}</span>
311
- )} */ }
312
318
</ div >
313
319
314
320
< div className = { "form-field mt-30" } style = { { position : "relative" } } >
315
321
< Controller
316
322
name = "address"
317
323
control = { control }
318
- rules = { { required : true } }
324
+ rules = { {
325
+ required : t ( "addressRequired" ) ,
326
+ pattern : {
327
+ value : / ^ [ \p{ L} \p{ N} \s ß . , # - / ] + $ / u,
328
+ message : t ( "addressInvalid" ) ,
329
+ } ,
330
+ } }
319
331
render = { ( { field : { onChange, onBlur, value } } ) => (
320
332
< MaterialTextField
321
333
onChange = { ( event ) => {
@@ -352,8 +364,8 @@ function ContactsForm(): ReactElement {
352
364
</ div >
353
365
)
354
366
: null }
355
- { errors . address && (
356
- < span className = { "form-errors" } > { t ( "addressRequired" ) } </ span >
367
+ { errors . address !== undefined && (
368
+ < div className = { "form-errors" } > { errors . address . message } </ div >
357
369
) }
358
370
</ div >
359
371
@@ -363,20 +375,28 @@ function ContactsForm(): ReactElement {
363
375
name = "city"
364
376
control = { control }
365
377
rules = { {
366
- required : true ,
378
+ required : {
379
+ value : true ,
380
+ message : t ( "cityRequired" ) ,
381
+ } ,
382
+ pattern : {
383
+ value : / ^ [ \p{ L} \s ß . , ( ) - ] + $ / u,
384
+ message : t ( "cityInvalid" ) ,
385
+ } ,
367
386
} }
368
- render = { ( { field : { onChange, value } } ) => (
387
+ render = { ( { field : { onChange, value, onBlur } } ) => (
369
388
< MaterialTextField
370
389
onChange = { onChange }
390
+ onBlur = { onBlur }
371
391
value = { value }
372
392
label = { t ( "city" ) }
373
393
variant = "outlined"
374
394
data-test-id = "test-city"
375
395
/>
376
396
) }
377
397
/>
378
- { errors . city && (
379
- < span className = { "form-errors" } > { t ( "cityRequired" ) } </ span >
398
+ { errors . city !== undefined && (
399
+ < div className = { "form-errors" } > { errors . city . message } </ div >
380
400
) }
381
401
</ div >
382
402
< div style = { { width : "20px" } } />
@@ -386,12 +406,16 @@ function ContactsForm(): ReactElement {
386
406
name = "zipCode"
387
407
control = { control }
388
408
rules = { {
389
- required : true ,
390
- pattern : postalRegex ,
409
+ required : t ( "zipCodeRequired" ) ,
410
+ pattern : {
411
+ value : postalRegex as RegExp ,
412
+ message : t ( "zipCodeInvalid" ) ,
413
+ } ,
391
414
} }
392
- render = { ( { field : { onChange, value } } ) => (
415
+ render = { ( { field : { onChange, value, onBlur } } ) => (
393
416
< MaterialTextField
394
417
onChange = { onChange }
418
+ onBlur = { onBlur }
395
419
value = { value }
396
420
label = { t ( "zipCode" ) }
397
421
variant = "outlined"
@@ -400,24 +424,19 @@ function ContactsForm(): ReactElement {
400
424
) }
401
425
/>
402
426
) }
403
- { errors . zipCode && (
404
- < span className = { "form-errors" } >
405
- { t ( "zipCodeAlphaNumValidation" ) }
406
- </ span >
427
+ { errors . zipCode !== undefined && (
428
+ < div className = { "form-errors" } > { errors . zipCode . message } </ div >
407
429
) }
408
430
</ div >
409
431
</ div >
410
432
411
433
< div className = { "form-field mt-30" } >
412
434
< Controller
435
+ name = "country"
413
436
control = { control }
414
437
rules = { {
415
- required : {
416
- value : true ,
417
- message : t ( "countryRequired" ) ,
418
- } ,
438
+ required : t ( "countryRequired" ) ,
419
439
} }
420
- name = "country"
421
440
defaultValue = {
422
441
contactDetails . country ? contactDetails . country : country
423
442
}
@@ -431,9 +450,8 @@ function ContactsForm(): ReactElement {
431
450
/>
432
451
) }
433
452
/>
434
-
435
453
{ errors . country && (
436
- < span className = { "form-errors" } > { t ( "countryRequired" ) } </ span >
454
+ < div className = { "form-errors" } > { errors . country . message } </ div >
437
455
) }
438
456
</ div >
439
457
@@ -446,18 +464,19 @@ function ContactsForm(): ReactElement {
446
464
< Controller
447
465
name = "tin"
448
466
control = { control }
449
- rules = { { required : true } }
450
- render = { ( { field : { onChange, value } } ) => (
467
+ rules = { { required : t ( "tinRequired" ) } }
468
+ render = { ( { field : { onChange, value, onBlur } } ) => (
451
469
< MaterialTextField
452
470
onChange = { onChange }
471
+ onBlur = { onBlur }
453
472
value = { value }
454
473
label = { t ( "taxIdentificationNumber" ) }
455
474
variant = "outlined"
456
475
/>
457
476
) }
458
477
/>
459
- { errors . tin && errors . tin . type !== "validate" && (
460
- < span className = { "form-errors" } > { t ( "tinRequired" ) } </ span >
478
+ { errors . tin !== undefined && (
479
+ < div className = { "form-errors" } > { errors . tin . message } </ div >
461
480
) }
462
481
</ div >
463
482
) : (
@@ -518,10 +537,17 @@ function ContactsForm(): ReactElement {
518
537
< Controller
519
538
name = "companyname"
520
539
control = { control }
521
- rules = { { required : true } }
522
- render = { ( { field : { onChange, value } } ) => (
540
+ rules = { {
541
+ required : t ( "companyRequired" ) ,
542
+ pattern : {
543
+ value : / ^ [ \p{ L} \p{ N} \s ß . , ' & ( ) ! - ] + $ / u,
544
+ message : t ( "firstNameInvalid" ) ,
545
+ } ,
546
+ } }
547
+ render = { ( { field : { onChange, value, onBlur } } ) => (
523
548
< MaterialTextField
524
549
onChange = { onChange }
550
+ onBlur = { onBlur }
525
551
value = { value }
526
552
label = { t ( "companyName" ) }
527
553
variant = "outlined"
@@ -533,8 +559,10 @@ function ContactsForm(): ReactElement {
533
559
/>
534
560
) }
535
561
/>
536
- { errors . companyname && (
537
- < span className = { "form-errors" } > { t ( "companyRequired" ) } </ span >
562
+ { errors . companyname !== undefined && (
563
+ < div className = { "form-errors" } >
564
+ { errors . companyname . message }
565
+ </ div >
538
566
) }
539
567
</ div >
540
568
) : null }
@@ -571,6 +599,7 @@ function ContactsForm(): ReactElement {
571
599
</ button >
572
600
) }
573
601
</ form >
602
+ { /* <DevTool control={control} /> */ }
574
603
</ div >
575
604
</ div >
576
605
) ;
0 commit comments