Skip to content

Commit e49eee4

Browse files
committed
fix(payment): address PR review comments
1 parent 6852900 commit e49eee4

2 files changed

Lines changed: 28 additions & 17 deletions

File tree

src/server/plugins/engine/pageControllers/QuestionPageController.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -185,11 +185,8 @@ export class QuestionPageController extends PageController {
185185
}
186186
}
187187

188-
// Check if any PaymentField component needs payment to be added
189-
// If so, hide the submit button until payment is ready
190188
const hasIncompletePayment = components.some(({ model }) => {
191-
// Check if this is a PaymentField by looking for paymentState in model
192-
if ('paymentState' in model && 'amount' in model) {
189+
if ('paymentState' in model) {
193190
const paymentState = model.paymentState as
194191
| { preAuth?: { status?: string } }
195192
| undefined

src/server/plugins/engine/routes/index.ts

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@ import {
1010
EXTERNAL_STATE_PAYLOAD
1111
} from '~/src/server/constants.js'
1212
import { 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'
1417
import {
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

158172
export function makeLoadFormPreHandler(server: Server, options: PluginOptions) {

0 commit comments

Comments
 (0)