The liquid-ajax-cart:request-start event is fired at the document a moment before a Shopify Cart API Ajax request is performed.
You can read, modify or cancel the request.
The event’s detail property contains a Request state object
of the current Shopify Cart API Ajax request.
Since the event is fired before the request is performed,
the Request state object won’t have the responseData, extraResponseData and fetchError properties:
document.addEventListener("liquid-ajax-cart:request-start", function(event) {
const {requestState} = event.detail;
// Print the requestState before the request is performed
console.log(requestState);
});
Result:
{
"endpoint": "/cart/add.js",
"requestBody": {…},
"requestType": "add",
"info": {…}
}
The requestState.requestBody and requestState.info are objects you can mutate to change the request.
The requestState.requestBody and requestState.info properties are references to the objects that will be used in the request.
So you can mutate the objects if you want to change the request before it is performed.
But if you assign a new object to the requestState.requestBody and requestState.info properties it won’t work:
document.addEventListener("liquid-ajax-cart:request-start", function(event) {
const {requestState} = event.detail;
if (requestState.requestType === 'change') {
if (requestState.requestBody instanceof FormData || requestState.requestBody instanceof URLSearchParams) {
// Mutating the "requestBody" object is allowed
requestState.requestBody.set('quantity', 2);
} else {
// Mutating the "requestBody" object is allowed
requestState.requestBody.quantity = 2;
}
}
// Mutating the "requestBody" object is allowed
requestState.info.myCustomData = 'value';
});
document.addEventListener("liquid-ajax-cart:request-start", function(event) {
const {requestState} = event.detail;
if (requestState.requestType === 'change') {
// Assigning another object to the "requestBody" won't work
requestState.requestBody = newRequestObject;
}
// Assigning another object to the "info" won't work
requestState.info = {myCustomData: 'value'};
});
You can cancel the request by mutating the requestState.info object and setting the requestState.info.cancel to true.
The request won’t be performed but the liquid-ajax-cart:request-end event will be fired anyway.
document.addEventListener("liquid-ajax-cart:request-start", function(event) {
const {requestState} = event.detail;
// Cancel the request
requestState.info.cancel = true;
})