Skip to content

Commit 908f303

Browse files
committed
add formValues and formErrors to /current-name
1 parent fe6930b commit 908f303

File tree

2 files changed

+40
-30
lines changed

2 files changed

+40
-30
lines changed

frontend/app/routes/protected/person-case/current-name.tsx

+39-30
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import { HttpStatusCodes } from '~/errors/http-status-codes';
2323
import { getTranslation } from '~/i18n-config.server';
2424
import { handle as parentHandle } from '~/routes/protected/person-case/layout';
2525
import { getTabIdOrRedirect, loadMachineActorOrRedirect } from '~/routes/protected/person-case/route-helpers.server';
26+
import type { CurrentNameData } from '~/routes/protected/person-case/state-machine-models';
2627
import { getStateRoute } from '~/routes/protected/person-case/state-machine.server';
2728
import { currentNameSchema } from '~/routes/protected/person-case/validation.server';
2829
import { getSingleKey } from '~/utils/i18n-utils';
@@ -57,7 +58,7 @@ export async function action({ context, params, request }: Route.ActionArgs) {
5758
}
5859

5960
case 'next': {
60-
const parseResult = v.safeParse(currentNameSchema, {
61+
const formValues = {
6162
preferredSameAsDocumentName: formData.get('same-name')
6263
? formData.get('same-name') === REQUIRE_OPTIONS.yes //
6364
: undefined,
@@ -70,13 +71,23 @@ export async function action({ context, params, request }: Route.ActionArgs) {
7071
: undefined,
7172
documentTypes: formData.getAll('doc-type').map(String),
7273
},
73-
});
74+
};
75+
const parseResult = v.safeParse(currentNameSchema, formValues);
7476

7577
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 });
8091
}
8192

8293
machineActor.send({ type: 'submitCurrentName', data: parseResult.output });
@@ -96,33 +107,31 @@ export async function loader({ context, request }: Route.LoaderArgs) {
96107

97108
const tabId = getTabIdOrRedirect(request);
98109
const machineActor = loadMachineActorOrRedirect(context.session, request, tabId, { stateName: 'name-info' });
99-
const { currentNameInfo, primaryDocuments } = machineActor.getSnapshot().context;
110+
const { formData, currentNameInfo } = machineActor.getSnapshot().context;
100111

101112
const { lang, t } = await getTranslation(request, handle.i18nNamespace);
102113

103114
return {
104115
documentTitle: t('protected:primary-identity-document.page-title'),
105-
defaultFormValues: currentNameInfo,
106116
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,
112119
};
113120
}
114121

115122
export default function CurrentName({ loaderData, actionData, params }: Route.ComponentProps) {
116123
const { t } = useTranslation(handle.i18nNamespace);
117124

118-
const [sameName, setSameName] = useState(loaderData.defaultFormValues?.preferredSameAsDocumentName);
119-
const [requireDoc, setRequireDoc] = useState(loaderData.defaultFormValues?.supportingDocuments?.required);
120-
121125
const fetcherKey = useId();
122126
const fetcher = useFetcher<Info['actionData']>({ key: fetcherKey });
123127

124128
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);
126135

127136
const nameOptions: InputRadiosProps['options'] = [
128137
{
@@ -157,7 +166,7 @@ export default function CurrentName({ loaderData, actionData, params }: Route.Co
157166
const docTypes = loaderData.localizedSupportingDocTypes.map((doc) => ({
158167
value: doc.id,
159168
children: doc.name,
160-
defaultChecked: loaderData.defaultFormValues?.supportingDocuments?.documentTypes?.includes(doc.id) ?? false,
169+
defaultChecked: formValues?.supportingDocuments?.documentTypes?.includes(doc.id) ?? false,
161170
}));
162171

163172
return (
@@ -169,23 +178,23 @@ export default function CurrentName({ loaderData, actionData, params }: Route.Co
169178
<dl>
170179
<div className="flex flex-col gap-1 sm:flex-row sm:gap-2">
171180
<dt className="font-bold">{t('protected:current-name.recorded-name.first-name')}</dt>
172-
<dd>{loaderData.primaryDocName.firstName}</dd>
181+
<dd>{formValues?.firstName}</dd>
173182
</div>
174183
<div className="flex flex-col gap-1 sm:flex-row sm:gap-2">
175184
<dt className="font-bold">{t('protected:current-name.recorded-name.middle-name')}</dt>
176-
<dd>{loaderData.primaryDocName.middleName}</dd>
185+
<dd>{formValues?.middleName}</dd>
177186
</div>
178187
<div className="flex flex-col gap-1 sm:flex-row sm:gap-2">
179188
<dt className="font-bold">{t('protected:current-name.recorded-name.last-name')}</dt>
180-
<dd>{loaderData.primaryDocName.lastName}</dd>
189+
<dd>{formValues?.lastName}</dd>
181190
</div>
182191
</dl>
183192
</div>
184193
<FetcherErrorSummary fetcherKey={fetcherKey}>
185194
<fetcher.Form method="post" noValidate>
186195
<div className="space-y-6">
187196
<InputRadios
188-
errorMessage={t(getSingleKey(errors?.preferredSameAsDocumentName))}
197+
errorMessage={t(getSingleKey(formErrors?.preferredSameAsDocumentName))}
189198
id="same-name-id"
190199
legend={t('protected:current-name.preferred-name.description')}
191200
name="same-name"
@@ -195,25 +204,25 @@ export default function CurrentName({ loaderData, actionData, params }: Route.Co
195204
{sameName === false && (
196205
<>
197206
<InputField
198-
errorMessage={t(getSingleKey(errors?.firstName), { maximum: 100 })}
207+
errorMessage={t(getSingleKey(formErrors?.firstName), { maximum: 100 })}
199208
label={t('protected:current-name.preferred-name.first-name')}
200209
name="first-name"
201-
defaultValue={loaderData.defaultFormValues?.firstName}
210+
defaultValue={formValues?.firstName}
202211
required
203212
className="w-full"
204213
/>
205214
<InputField
206-
errorMessage={t(getSingleKey(errors?.middleName), { maximum: 100 })}
215+
errorMessage={t(getSingleKey(formErrors?.middleName), { maximum: 100 })}
207216
label={t('protected:current-name.preferred-name.middle-name')}
208217
name="middle-name"
209-
defaultValue={loaderData.defaultFormValues?.middleName}
218+
defaultValue={formValues?.middleName}
210219
className="w-full"
211220
/>
212221
<InputField
213-
errorMessage={t(getSingleKey(errors?.lastName), { maximum: 100 })}
222+
errorMessage={t(getSingleKey(formErrors?.lastName), { maximum: 100 })}
214223
label={t('protected:current-name.preferred-name.last-name')}
215224
name="last-name"
216-
defaultValue={loaderData.defaultFormValues?.lastName}
225+
defaultValue={formValues?.lastName}
217226
required
218227
className="w-full"
219228
/>
@@ -224,7 +233,7 @@ export default function CurrentName({ loaderData, actionData, params }: Route.Co
224233
<p>{t('protected:current-name.supporting-docs.description')}</p>
225234
<InputRadios
226235
id="docs-required-id"
227-
errorMessage={t(getSingleKey(errors?.['supportingDocuments.required']))}
236+
errorMessage={t(getSingleKey(formErrors?.['supportingDocuments.required']))}
228237
legend={t('protected:current-name.supporting-docs.docs-required')}
229238
name="docs-required"
230239
options={requireOptions}
@@ -233,7 +242,7 @@ export default function CurrentName({ loaderData, actionData, params }: Route.Co
233242
{requireDoc === true && (
234243
<InputCheckboxes
235244
id="doc-type-id"
236-
errorMessage={t(getSingleKey(errors?.['supportingDocuments.documentTypes']))}
245+
errorMessage={t(getSingleKey(formErrors?.['supportingDocuments.documentTypes']))}
237246
legend={t('protected:current-name.supporting-docs.doc-type')}
238247
name="doc-type"
239248
options={docTypes}

frontend/app/routes/protected/person-case/state-machine.server.ts

+1
Original file line numberDiff line numberDiff line change
@@ -178,6 +178,7 @@ export const machine = setup({
178178
submitCurrentName: {
179179
target: 'personal-info',
180180
actions: assign(({ context, event }) => ({
181+
formData: { ...context.formData, currentNameInfo: undefined },
181182
currentNameInfo: event.data,
182183
})),
183184
},

0 commit comments

Comments
 (0)