diff --git a/assets/js/theme/common/product-details.js b/assets/js/theme/common/product-details.js index dcc665c87f..073b1ab861 100644 --- a/assets/js/theme/common/product-details.js +++ b/assets/js/theme/common/product-details.js @@ -56,6 +56,29 @@ export default class ProductDetails { this.previewModal = modalFactory('#previewModal')[0]; } + /** + * https://stackoverflow.com/questions/49672992/ajax-request-fails-when-sending-formdata-including-empty-file-input-in-safari + * Safari browser with jquery 3.3.1 has an issue uploading empty file parameters. This function removes any empty files from the form params + * @param form: FormData object + * @returns FormData object + */ + filterEmptyFilesFromForm(form) { + try { + for (const pair of form.entries()) { + const key = pair[0]; + const val = pair[1]; + if (val instanceof File) { + if (val.name === '' && val.size === 0) { + form.delete(key); + } + } + } + } catch (e) { + console.error(e); + } + return form; + } + /** * Since $productView can be dynamically inserted using render_with, * We have to retrieve the respective elements @@ -234,7 +257,7 @@ export default class ProductDetails { this.$overlay.show(); // Add item to cart - utils.api.cart.itemAdd(new FormData(form), (err, response) => { + utils.api.cart.itemAdd(this.filterEmptyFilesFromForm(new FormData(form)), (err, response) => { const errorMessage = err || response.data.error; $addToCartBtn