jQuery(document).ready(function($) { const { __ } = wp.i18n; let draft_cart_data = {}; // Show loading indicator function showLoadingIndicator(form) { form.parent().siblings('.mpa-loading').show(); } // Hide loading indicator function hideLoadingIndicator(form) { form.parent().siblings('.mpa-loading').hide(); } // Trigger reload drafts function reloadDrafts(reloadcondition) { wp.hooks.addFilter('mpa_booking_reload_drafts', 'mpacf', (initialValue) => reloadcondition); } // Reset input file fields function resetFileInputs(form) { form.find('.mpa-file_upload-control input[type="file"]').each(function() { const $input = $(this); $input.siblings('.mpa-upload-status').text(''); $input.data('uploaded', false).removeData('reset-attached').val(''); }); } // Handle file input changes function handleFileInputChange($input) { $input.data('changed', true); $input.siblings('.mpa-upload-status').text(''); if ($input.data('uploaded')) { $input.data('uploaded', false); } if (!$input.val()) { $input.data('uploaded', false); } reloadDrafts(true); } // Prepare form data for file upload function prepareFormData(form) { let formData = new FormData(); let fileCount = 0; form.find('.mpa-file_upload-control input[type=file]').each(function() { const $input = $(this); const files = $input.prop('files'); if (!$input.data('reset-attached')) { draft_cart_data = {}; $input.data('reset-attached', true); wp.hooks.addAction('mpa_step_checkout_reset', 'mpacf', resetFileInputs); } $input.on('change', function() { handleFileInputChange($input); }); if (!$input.val()) { wp.hooks.addFilter('mpa_booking_draft_data', 'mpacf', (cart_data) => { if (!cart_data.hasOwnProperty('checkout_fields')) { cart_data.checkout_fields = {}; } cart_data.checkout_fields[$input.prop('name')] = null; return cart_data; }); reloadDrafts(false); } if ($input.data('uploaded')) { reloadDrafts(false); return; } const fileFields = $input.data('changed') === true ? $input : files; for (let i = 0; i < fileFields.length; i++) { formData.append($input.attr('name'), files[i]); fileCount++; } // Reset input data changed flag if it was true if ($input.data('changed') === true) { $input.data('changed', false); } }); if (draft_cart_data.payment_details) { formData.append('booking_id', draft_cart_data.payment_details.booking_id); } formData.append('action', 'mpa_cf_uploadFile'); return { formData, fileCount }; } // Handle AJAX success response function handleSuccess(response, form, resolve, reject) { if (response.success && !response.data.error) { let checkoutFields = {}; reloadDrafts(true); Object.keys(response.data).forEach(function(key) { if (key !== 'confirmation_mode') { let $input = form.find('input[name="' + key + '"]'); $input.siblings('.mpa-upload-status').text( __('Upload successful', 'mpa-checkout-fields') ).removeClass('mpa-error'); if (!$input.data('uploaded')) { checkoutFields[key] = response.data[key]; $input.data('uploaded', true); } } }); if (response.data.confirmation_mode === 'auto') { wp.hooks.addFilter('mpa_booking_cart_data', 'mpacf', (cart_data) => { if (!cart_data.hasOwnProperty('checkout_fields')) { cart_data.checkout_fields = {}; } Object.assign(cart_data.checkout_fields, checkoutFields); return cart_data; }); } else { wp.hooks.addFilter('mpa_booking_draft_data', 'mpacf', (cart_data) => { draft_cart_data = cart_data; if (!cart_data.hasOwnProperty('checkout_fields')) { cart_data.checkout_fields = {}; } Object.assign(cart_data.checkout_fields, checkoutFields); return cart_data; }); } resolve(response); } else { form.find('input[name="' + response.data.fieldWithError + '"]').siblings('.mpa-upload-status').addClass('mpa-error').text(response.data.message); reject(); } } // Handle AJAX error response function handleError(xhr, status, error, form, reject) { form.find('.mpa-file_upload-control input[type=file]').each(function() { $(this).siblings('.mpa-upload-status').addClass('mpa-error').text(error); }); reject(error); } // Main file upload handler wp.hooks.addFilter('mpa_step_checkout_maybe_submit', 'mpacf', function(promise, form) { return new Promise((resolve, reject) => { const { formData, fileCount } = prepareFormData(form); if (fileCount > 0) { showLoadingIndicator(form); formData.append('file_upload_nonce', MPAFileUploadData.fileUploadNonce); $.ajax({ url: MPAFileUploadData.ajax_url, type: 'POST', data: formData, processData: false, contentType: false, success: function(response) { handleSuccess(response, form, resolve, reject); }, error: function(xhr, status, error) { handleError(xhr, status, error, form, reject); }, complete: function() { hideLoadingIndicator(form); } }); } else { resolve(); } }); }); });