@@ -10,7 +10,10 @@ import {
1010 EXTERNAL_STATE_PAYLOAD
1111} from '~/src/server/constants.js'
1212import { resolveFormModel } from '~/src/server/plugins/engine/beta/form-context.js'
13- import { FormComponent } from '~/src/server/plugins/engine/components/FormComponent.js'
13+ import {
14+ FormComponent ,
15+ isFormState
16+ } from '~/src/server/plugins/engine/components/FormComponent.js'
1417import {
1518 checkFormStatus ,
1619 findPage ,
@@ -135,24 +138,35 @@ async function importExternalComponentState(
135138 throw new Error ( `State for component ${ componentName } is invalid` )
136139 }
137140
138- // Store component state under the component name
139- const componentState = { [ componentName ] : stateAppendage }
140-
141- // Save the external component state directly (already has correct key format)
142- const savedState = await page . mergeState ( request , state , componentState )
141+ // Components with a collection (e.g. UkAddressField) need flattened keys
142+ // Components without a collection (e.g. PaymentField) store state as nested object
143+ const componentState =
144+ component . collection && isFormState ( stateAppendage )
145+ ? Object . fromEntries (
146+ Object . entries ( stateAppendage ) . map ( ( [ key , value ] ) => [
147+ `${ componentName } __${ key } ` ,
148+ value
149+ ] )
150+ )
151+ : { [ componentName ] : stateAppendage }
152+
153+ const pageState = page . getStateFromValidForm (
154+ request ,
155+ state ,
156+ componentState as FormPayload
157+ )
158+ const savedState = await page . mergeState ( request , state , pageState )
143159
144160 // Merge any stashed payload into the local state
145161 const payload = request . yar . flash ( EXTERNAL_STATE_PAYLOAD )
146162 const stashedPayload = Array . isArray ( payload ) ? { } : ( payload as FormPayload )
147163
148- if ( Object . keys ( stashedPayload ) . length ) {
149- const localState = page . getStateFromValidForm ( request , savedState , {
150- ...stashedPayload
151- } as FormPayload )
152- return { ...savedState , ...localState }
153- }
164+ const localState = page . getStateFromValidForm ( request , savedState , {
165+ ...stashedPayload ,
166+ ...componentState
167+ } as FormPayload )
154168
155- return savedState
169+ return { ... savedState , ... localState }
156170}
157171
158172export function makeLoadFormPreHandler ( server : Server , options : PluginOptions ) {
0 commit comments