@@ -23,6 +23,7 @@ import { HttpStatusCodes } from '~/errors/http-status-codes';
23
23
import { getTranslation } from '~/i18n-config.server' ;
24
24
import { handle as parentHandle } from '~/routes/protected/person-case/layout' ;
25
25
import { getTabIdOrRedirect , loadMachineActorOrRedirect } from '~/routes/protected/person-case/route-helpers.server' ;
26
+ import type { CurrentNameData } from '~/routes/protected/person-case/state-machine-models' ;
26
27
import { getStateRoute } from '~/routes/protected/person-case/state-machine.server' ;
27
28
import { currentNameSchema } from '~/routes/protected/person-case/validation.server' ;
28
29
import { getSingleKey } from '~/utils/i18n-utils' ;
@@ -57,7 +58,7 @@ export async function action({ context, params, request }: Route.ActionArgs) {
57
58
}
58
59
59
60
case 'next' : {
60
- const parseResult = v . safeParse ( currentNameSchema , {
61
+ const formValues = {
61
62
preferredSameAsDocumentName : formData . get ( 'same-name' )
62
63
? formData . get ( 'same-name' ) === REQUIRE_OPTIONS . yes //
63
64
: undefined ,
@@ -70,13 +71,23 @@ export async function action({ context, params, request }: Route.ActionArgs) {
70
71
: undefined ,
71
72
documentTypes : formData . getAll ( 'doc-type' ) . map ( String ) ,
72
73
} ,
73
- } ) ;
74
+ } ;
75
+ const parseResult = v . safeParse ( currentNameSchema , formValues ) ;
74
76
75
77
if ( ! parseResult . success ) {
76
- return data (
77
- { errors : v . flatten < typeof currentNameSchema > ( parseResult . issues ) . nested } ,
78
- { status : HttpStatusCodes . BAD_REQUEST } ,
79
- ) ;
78
+ const formErrors = v . flatten ( parseResult . issues ) . nested ;
79
+
80
+ machineActor . send ( {
81
+ type : 'setFormData' ,
82
+ data : {
83
+ currentNameInfo : {
84
+ values : formValues as CurrentNameData ,
85
+ errors : formErrors ,
86
+ } ,
87
+ } ,
88
+ } ) ;
89
+
90
+ return data ( { formValues : formValues , formErrors : formErrors } , { status : HttpStatusCodes . BAD_REQUEST } ) ;
80
91
}
81
92
82
93
machineActor . send ( { type : 'submitCurrentName' , data : parseResult . output } ) ;
@@ -96,33 +107,31 @@ export async function loader({ context, request }: Route.LoaderArgs) {
96
107
97
108
const tabId = getTabIdOrRedirect ( request ) ;
98
109
const machineActor = loadMachineActorOrRedirect ( context . session , request , tabId , { stateName : 'name-info' } ) ;
99
- const { currentNameInfo , primaryDocuments } = machineActor . getSnapshot ( ) . context ;
110
+ const { formData , currentNameInfo } = machineActor . getSnapshot ( ) . context ;
100
111
101
112
const { lang, t } = await getTranslation ( request , handle . i18nNamespace ) ;
102
113
103
114
return {
104
115
documentTitle : t ( 'protected:primary-identity-document.page-title' ) ,
105
- defaultFormValues : currentNameInfo ,
106
116
localizedSupportingDocTypes : getLocalizedApplicantSupportingDocumentType ( lang ) ,
107
- primaryDocName : {
108
- firstName : primaryDocuments ?. givenName ,
109
- lastName : primaryDocuments ?. lastName ,
110
- middleName : '' , // primaryDocuments?.middleName
111
- } ,
117
+ formValues : formData ?. currentNameInfo ?. values ?? currentNameInfo ,
118
+ formErrors : formData ?. currentNameInfo ?. errors ,
112
119
} ;
113
120
}
114
121
115
122
export default function CurrentName ( { loaderData, actionData, params } : Route . ComponentProps ) {
116
123
const { t } = useTranslation ( handle . i18nNamespace ) ;
117
124
118
- const [ sameName , setSameName ] = useState ( loaderData . defaultFormValues ?. preferredSameAsDocumentName ) ;
119
- const [ requireDoc , setRequireDoc ] = useState ( loaderData . defaultFormValues ?. supportingDocuments ?. required ) ;
120
-
121
125
const fetcherKey = useId ( ) ;
122
126
const fetcher = useFetcher < Info [ 'actionData' ] > ( { key : fetcherKey } ) ;
123
127
124
128
const isSubmitting = fetcher . state !== 'idle' ;
125
- const errors = fetcher . data ?. errors ;
129
+
130
+ const formValues = fetcher . data ?. formValues ?? loaderData . formValues ;
131
+ const formErrors = fetcher . data ?. formErrors ?? loaderData . formErrors ;
132
+
133
+ const [ sameName , setSameName ] = useState ( formValues ?. preferredSameAsDocumentName ) ;
134
+ const [ requireDoc , setRequireDoc ] = useState ( formValues ?. supportingDocuments ?. required ) ;
126
135
127
136
const nameOptions : InputRadiosProps [ 'options' ] = [
128
137
{
@@ -157,7 +166,7 @@ export default function CurrentName({ loaderData, actionData, params }: Route.Co
157
166
const docTypes = loaderData . localizedSupportingDocTypes . map ( ( doc ) => ( {
158
167
value : doc . id ,
159
168
children : doc . name ,
160
- defaultChecked : loaderData . defaultFormValues ?. supportingDocuments ?. documentTypes ?. includes ( doc . id ) ?? false ,
169
+ defaultChecked : formValues ?. supportingDocuments ?. documentTypes ?. includes ( doc . id ) ?? false ,
161
170
} ) ) ;
162
171
163
172
return (
@@ -169,23 +178,23 @@ export default function CurrentName({ loaderData, actionData, params }: Route.Co
169
178
< dl >
170
179
< div className = "flex flex-col gap-1 sm:flex-row sm:gap-2" >
171
180
< dt className = "font-bold" > { t ( 'protected:current-name.recorded-name.first-name' ) } </ dt >
172
- < dd > { loaderData . primaryDocName . firstName } </ dd >
181
+ < dd > { formValues ? .firstName } </ dd >
173
182
</ div >
174
183
< div className = "flex flex-col gap-1 sm:flex-row sm:gap-2" >
175
184
< dt className = "font-bold" > { t ( 'protected:current-name.recorded-name.middle-name' ) } </ dt >
176
- < dd > { loaderData . primaryDocName . middleName } </ dd >
185
+ < dd > { formValues ? .middleName } </ dd >
177
186
</ div >
178
187
< div className = "flex flex-col gap-1 sm:flex-row sm:gap-2" >
179
188
< dt className = "font-bold" > { t ( 'protected:current-name.recorded-name.last-name' ) } </ dt >
180
- < dd > { loaderData . primaryDocName . lastName } </ dd >
189
+ < dd > { formValues ? .lastName } </ dd >
181
190
</ div >
182
191
</ dl >
183
192
</ div >
184
193
< FetcherErrorSummary fetcherKey = { fetcherKey } >
185
194
< fetcher . Form method = "post" noValidate >
186
195
< div className = "space-y-6" >
187
196
< InputRadios
188
- errorMessage = { t ( getSingleKey ( errors ?. preferredSameAsDocumentName ) ) }
197
+ errorMessage = { t ( getSingleKey ( formErrors ?. preferredSameAsDocumentName ) ) }
189
198
id = "same-name-id"
190
199
legend = { t ( 'protected:current-name.preferred-name.description' ) }
191
200
name = "same-name"
@@ -195,25 +204,25 @@ export default function CurrentName({ loaderData, actionData, params }: Route.Co
195
204
{ sameName === false && (
196
205
< >
197
206
< InputField
198
- errorMessage = { t ( getSingleKey ( errors ?. firstName ) , { maximum : 100 } ) }
207
+ errorMessage = { t ( getSingleKey ( formErrors ?. firstName ) , { maximum : 100 } ) }
199
208
label = { t ( 'protected:current-name.preferred-name.first-name' ) }
200
209
name = "first-name"
201
- defaultValue = { loaderData . defaultFormValues ?. firstName }
210
+ defaultValue = { formValues ?. firstName }
202
211
required
203
212
className = "w-full"
204
213
/>
205
214
< InputField
206
- errorMessage = { t ( getSingleKey ( errors ?. middleName ) , { maximum : 100 } ) }
215
+ errorMessage = { t ( getSingleKey ( formErrors ?. middleName ) , { maximum : 100 } ) }
207
216
label = { t ( 'protected:current-name.preferred-name.middle-name' ) }
208
217
name = "middle-name"
209
- defaultValue = { loaderData . defaultFormValues ?. middleName }
218
+ defaultValue = { formValues ?. middleName }
210
219
className = "w-full"
211
220
/>
212
221
< InputField
213
- errorMessage = { t ( getSingleKey ( errors ?. lastName ) , { maximum : 100 } ) }
222
+ errorMessage = { t ( getSingleKey ( formErrors ?. lastName ) , { maximum : 100 } ) }
214
223
label = { t ( 'protected:current-name.preferred-name.last-name' ) }
215
224
name = "last-name"
216
- defaultValue = { loaderData . defaultFormValues ?. lastName }
225
+ defaultValue = { formValues ?. lastName }
217
226
required
218
227
className = "w-full"
219
228
/>
@@ -224,7 +233,7 @@ export default function CurrentName({ loaderData, actionData, params }: Route.Co
224
233
< p > { t ( 'protected:current-name.supporting-docs.description' ) } </ p >
225
234
< InputRadios
226
235
id = "docs-required-id"
227
- errorMessage = { t ( getSingleKey ( errors ?. [ 'supportingDocuments.required' ] ) ) }
236
+ errorMessage = { t ( getSingleKey ( formErrors ?. [ 'supportingDocuments.required' ] ) ) }
228
237
legend = { t ( 'protected:current-name.supporting-docs.docs-required' ) }
229
238
name = "docs-required"
230
239
options = { requireOptions }
@@ -233,7 +242,7 @@ export default function CurrentName({ loaderData, actionData, params }: Route.Co
233
242
{ requireDoc === true && (
234
243
< InputCheckboxes
235
244
id = "doc-type-id"
236
- errorMessage = { t ( getSingleKey ( errors ?. [ 'supportingDocuments.documentTypes' ] ) ) }
245
+ errorMessage = { t ( getSingleKey ( formErrors ?. [ 'supportingDocuments.documentTypes' ] ) ) }
237
246
legend = { t ( 'protected:current-name.supporting-docs.doc-type' ) }
238
247
name = "doc-type"
239
248
options = { docTypes }
0 commit comments