11'use client' ;
22
3- import { FC , useActionState } from 'react' ;
3+ import { FC , useActionState , useState } from 'react' ;
44import {
55 TextInput ,
66 HintText ,
@@ -16,6 +16,7 @@ import {
1616 alphabeticalLanguageList ,
1717 alphabeticalLetterTypeList ,
1818 CreateLetterTemplate ,
19+ FormErrorState ,
1920 PageComponentProps ,
2021} from 'nhs-notify-web-template-management-utils' ;
2122import content from '@content/content' ;
@@ -24,6 +25,7 @@ import { NHSNotifyMain } from '@atoms/NHSNotifyMain/NHSNotifyMain';
2425import { NHSNotifyButton } from '@atoms/NHSNotifyButton/NHSNotifyButton' ;
2526import FileUpload from '@atoms/FileUpload/FileUpload' ;
2627import { getBasePath } from '@utils/get-base-path' ;
28+ import { $CreateLetterTemplateSchema } from './form-schema' ;
2729
2830export const LetterTemplateForm : FC <
2931 PageComponentProps < CreateLetterTemplate >
@@ -50,6 +52,9 @@ export const LetterTemplateForm: FC<
5052 } = content . components . templateFormLetter ;
5153
5254 const [ state , action ] = useActionState ( processFormActions , initialState ) ;
55+ const [ validationError , setValidationError ] = useState <
56+ FormErrorState | undefined
57+ > ( state . validationError ) ;
5358
5459 const [ letterTemplateName , letterTemplateNameHandler ] =
5560 useTextInput < HTMLInputElement > ( state . name ) ;
@@ -61,19 +66,29 @@ export const LetterTemplateForm: FC<
6166 useTextInput < HTMLSelectElement > ( state . language ) ;
6267
6368 const templateNameError =
64- state . validationError ?. fieldErrors . letterTemplateName ?. join ( ', ' ) ;
69+ validationError ?. fieldErrors . letterTemplateName ?. join ( ', ' ) ;
6570
6671 const templateLetterTypeError =
67- state . validationError ?. fieldErrors . letterTemplateLetterType ?. join ( ', ' ) ;
72+ validationError ?. fieldErrors . letterTemplateLetterType ?. join ( ', ' ) ;
6873
6974 const templateLanguageError =
70- state . validationError ?. fieldErrors . letterTemplateLanguage ?. join ( ', ' ) ;
75+ validationError ?. fieldErrors . letterTemplateLanguage ?. join ( ', ' ) ;
7176
7277 const templatePdfError =
73- state . validationError ?. fieldErrors . letterTemplatePdf ?. join ( ', ' ) ;
78+ validationError ?. fieldErrors . letterTemplatePdf ?. join ( ', ' ) ;
7479
7580 const templateCsvError =
76- state . validationError ?. fieldErrors . letterTemplateCsv ?. join ( ', ' ) ;
81+ validationError ?. fieldErrors . letterTemplateCsv ?. join ( ', ' ) ;
82+
83+ const validateForm = ( event : React . FormEvent < HTMLFormElement > ) => {
84+ const formData = new FormData ( event . currentTarget ) ;
85+ const data = Object . fromEntries ( formData ) ;
86+ const validationResult = $CreateLetterTemplateSchema . safeParse ( data ) ;
87+ if ( ! validationResult . success ) {
88+ event . preventDefault ( ) ;
89+ setValidationError ( validationResult . error . flatten ( ) ) ;
90+ }
91+ } ;
7792
7893 return (
7994 < >
@@ -87,6 +102,7 @@ export const LetterTemplateForm: FC<
87102 < NHSNotifyFormWrapper
88103 action = { action }
89104 formId = 'create-letter-template'
105+ formAttributes = { { onSubmit : validateForm } }
90106 >
91107 < h1 className = 'nhsuk-heading-xl' data-testid = 'page-heading' >
92108 { pageHeading }
0 commit comments