generated from boboko/starter
autosave issue in checkout - pt1
This commit is contained in:
@@ -101,6 +101,15 @@ export default class extends Controller {
|
|||||||
this.saveTimer = setTimeout(() => this.save(), 700)
|
this.saveTimer = setTimeout(() => this.save(), 700)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Called by bbk-payment right before place-order — a debounced save (and
|
||||||
|
// the shipping-option auto-select that happens as part of it) might still
|
||||||
|
// be pending when the shopper clicks "place order"; this guarantees the
|
||||||
|
// server has processed the current form state first.
|
||||||
|
async flush() {
|
||||||
|
clearTimeout(this.saveTimer)
|
||||||
|
await this.save()
|
||||||
|
}
|
||||||
|
|
||||||
async save() {
|
async save() {
|
||||||
this.saveController?.abort()
|
this.saveController?.abort()
|
||||||
this.saveController = new AbortController()
|
this.saveController = new AbortController()
|
||||||
|
|||||||
@@ -123,6 +123,11 @@ export default class extends Controller {
|
|||||||
amount: Math.max(this.amountValue, 1),
|
amount: Math.max(this.amountValue, 1),
|
||||||
currency: this.currencyValue,
|
currency: this.currencyValue,
|
||||||
paymentMethodCreation: 'manual',
|
paymentMethodCreation: 'manual',
|
||||||
|
// Card only — matches the server confirming with
|
||||||
|
// automatic_payment_methods.allow_redirects = 'never' (no
|
||||||
|
// return_url in our flow: 3-D Secure resolves in-page via
|
||||||
|
// handleNextAction, never a full-page redirect).
|
||||||
|
paymentMethodTypes: ['card'],
|
||||||
})
|
})
|
||||||
this.paymentElement = this.elements.create('payment')
|
this.paymentElement = this.elements.create('payment')
|
||||||
this.paymentElement.mount(this.elementTarget)
|
this.paymentElement.mount(this.elementTarget)
|
||||||
@@ -142,22 +147,34 @@ export default class extends Controller {
|
|||||||
|
|
||||||
// ── Place order ──────────────────────────────────────────────────
|
// ── Place order ──────────────────────────────────────────────────
|
||||||
|
|
||||||
|
// Sibling controller on the same element (.bbk-checkout-main) — used to
|
||||||
|
// flush a pending debounced address autosave before placing the order.
|
||||||
|
get checkoutForm() {
|
||||||
|
return this.application.getControllerForElementAndIdentifier(this.element, 'bbk-checkout-form')
|
||||||
|
}
|
||||||
|
|
||||||
async placeOrder() {
|
async placeOrder() {
|
||||||
this.clearError()
|
this.clearError()
|
||||||
|
this.submitTarget.disabled = true
|
||||||
|
|
||||||
|
// A debounced address save (and the shipping-option auto-select that
|
||||||
|
// happens as part of it) might still be pending — make sure the
|
||||||
|
// server has the latest state before we ask it to place the order.
|
||||||
|
await this.checkoutForm?.flush()
|
||||||
|
|
||||||
if (!this.termsTarget.checked) {
|
if (!this.termsTarget.checked) {
|
||||||
|
this.submitTarget.disabled = false
|
||||||
this.showError(this.termsRequiredValue)
|
this.showError(this.termsRequiredValue)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const radio = this.selectedRadio()
|
const radio = this.selectedRadio()
|
||||||
if (!radio) {
|
if (!radio) {
|
||||||
|
this.submitTarget.disabled = false
|
||||||
this.showError(this.chooseMethodValue)
|
this.showError(this.chooseMethodValue)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
this.submitTarget.disabled = true
|
|
||||||
|
|
||||||
let paymentMethodId = null
|
let paymentMethodId = null
|
||||||
if (radio.dataset.paymentDriver === 'stripe') {
|
if (radio.dataset.paymentDriver === 'stripe') {
|
||||||
const { error: submitError } = await this.elements.submit()
|
const { error: submitError } = await this.elements.submit()
|
||||||
|
|||||||
Reference in New Issue
Block a user