File: /var/www/shoetique/wp-content/plugins/facebook-for-woocommerce/assets/js/admin/settings-sync.js
/**
 * Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved
 *
 * This source code is licensed under the license found in the
 * LICENSE file in the root directory of this source tree.
 *
 * @package FacebookCommerce
 */
jQuery( document ).ready( function( $ ) {
	/**
	 * Gets any new excluded categories being added.
	 *
	 * @return {string[]}
	 */
	function getExcludedCategoriesAdded() {
		const newCategoryIDs = $( '#wc_facebook_excluded_product_category_ids' ).val();
		let oldCategoryIDs   = [];
		if ( window.facebook_for_woocommerce_settings_sync && window.facebook_for_woocommerce_settings_sync.excluded_category_ids ) {
			oldCategoryIDs = window.facebook_for_woocommerce_settings_sync.excluded_category_ids;
		}
		// return IDs that are in the new value that were not in the saved value
		return $( newCategoryIDs ).not( oldCategoryIDs ).get();
	}
	/**
	 * Gets any new excluded tags being added.
	 *
	 * @return {string[]}
	 */
	function getExcludedTagsAdded() {
		const newTagIDs = $( '#wc_facebook_excluded_product_tag_ids' ).val();
		let oldTagIDs   = [];
		if ( window.facebook_for_woocommerce_settings_sync && window.facebook_for_woocommerce_settings_sync.excluded_tag_ids ) {
			oldTagIDs = window.facebook_for_woocommerce_settings_sync.excluded_tag_ids;
		}
		// return IDs that are in the new value that were not in the saved value
		return $( newTagIDs ).not( oldTagIDs ).get();
	}
	/**
	 * Toggles availability of input in setting groups.
	 *
	 * @param {boolean} enable whether fields in this group should be enabled or not
	 */
	function toggleSettingOptions( enable ) {
		$( '.product-sync-field' ).each( function() {
			let $element = $( this );
			if ( $( this ).hasClass( 'wc-enhanced-select' ) ) {
				$element = $( this ).next( 'span.select2-container' );
			}
			if ( enable ) {
				$element.css( 'pointer-events', 'all' ).css( 'opacity', '1.0' );
			} else {
				$element.css( 'pointer-events', 'none' ).css( 'opacity', '0.4' );
			}
		} );
	}
	$( '.woocommerce-help-tip' ).tipTip( {
		'attribute': 'data-tip',
		'fadeIn': 50,
		'fadeOut': 50,
		'delay': 200
	} );
	if ( $( 'form.wc-facebook-settings' ).hasClass( 'disconnected' ) ) {
		toggleSettingOptions( false );
	}
	// toggle availability of options within field groups
	$( 'input#wc_facebook_enable_product_sync' ).on( 'change', function ( e ) {
		if ( $( 'form.wc-facebook-settings' ).hasClass( 'disconnected' ) ) {
			$( this ).css( 'pointer-events', 'none' ).css( 'opacity', '0.4' );
			return;
		}
		toggleSettingOptions( $( this ).is( ':checked' ) );
	} ).trigger( 'change' );
	let submitSettingsSave = false;
	$( 'input[name="save_product_sync_settings"]' ).on( 'click', function ( e ) {
		if ( ! submitSettingsSave ) {
			e.preventDefault();
		} else {
			return true;
		}
		const $submitButton   = $( this ),
		      categoriesAdded = getExcludedCategoriesAdded(),
		      tagsAdded       = getExcludedTagsAdded();
		if ( categoriesAdded.length > 0 || tagsAdded.length > 0 ) {
			$.post( facebook_for_woocommerce_settings_sync.ajax_url, {
				action:     'facebook_for_woocommerce_set_excluded_terms_prompt',
				security:   facebook_for_woocommerce_settings_sync.set_excluded_terms_prompt_nonce,
				categories: categoriesAdded,
				tags:       tagsAdded,
			}, function ( response ) {
				if ( response && ! response.success ) {
					// close existing modals
					$( '#wc-backbone-modal-dialog .modal-close' ).trigger( 'click' );
					// open new modal, populate template with AJAX response data
					new $.WCBackboneModal.View( {
						target: 'facebook-for-woocommerce-modal',
						string: response.data,
					} );
					// exclude products: submit form as normal
					$( '.facebook-for-woocommerce-confirm-settings-change' ).on( 'click', function () {
						blockModal();
						submitSettingsSave = true;
						$submitButton.trigger( 'click' );
					} );
				} else {
					// no modal displayed: submit form as normal
					submitSettingsSave = true;
					$submitButton.trigger( 'click' );
				}
			} );
		} else {
			// no terms added: submit form as normal
			submitSettingsSave = true;
			$submitButton.trigger( 'click' );
		}
	} );
	// mark as in-progress if syncing when the page is loaded
	if ( facebook_for_woocommerce_settings_sync.sync_in_progress ) {
		syncInProgress();
	}
	// handle the sync button click
	$( '#woocommerce-facebook-settings-sync-products' ).click( function( event ) {
		event.preventDefault();
		if ( confirm( facebook_for_woocommerce_settings_sync.i18n.confirm_sync ) ) {
			setProductSyncStatus();
			let startTime = Date.now();
			$.post( facebook_for_woocommerce_settings_sync.ajax_url, {
				action: 'wc_facebook_sync_products',
				nonce:  facebook_for_woocommerce_settings_sync.sync_products_nonce,
			}, function ( response ) {
				console.log( response );
				if ( ! response.success ) {
					let error = facebook_for_woocommerce_settings_sync.i18n.general_error;
					if ( response.data && response.data.length > 0 ) {
						error = response.data;
					}
					clearSyncInProgress( error );
				} else {
					// get the current sync status after a successful response but make sure to wait at least 10 seconds since the button was pressed
					setTimeout( getSyncStatus, Math.max( 0, 10000 - ( Date.now() - startTime ) ) );
				}
			} ).fail( function() {
				clearSyncInProgress( facebook_for_woocommerce_settings_sync.i18n.general_error );
			} );
		}
	} );
	/**
	 * Sets the UI as sync in progress and starts an interval to check the background sync status.
	 *
	 * @since 2.0.0
	 *
	 * @param count number of items remaining
	 */
	function syncInProgress( count = null ) {
		setProductSyncStatus( count );
		if ( ! window.syncStatusInterval ) {
			window.syncStatusInterval = setInterval( getSyncStatus, 10000 );
		}
	}
	/**
	 * Sets the UI as sync in progress.
	 *
	 * @since 2.0.0
	 *
	 * @param count number of items remaining
	 */
	function setProductSyncStatus( count = null ) {
		toggleSettingOptions( false );
		$( 'input#wc_facebook_enable_product_sync, input[name="save_product_sync_settings"]' ).css( 'pointer-events', 'none' ).css( 'opacity', '0.4' );
		let message = facebook_for_woocommerce_settings_sync.i18n.sync_in_progress;
		if ( count ) {
			if ( count > 1 ) {
				message = message + facebook_for_woocommerce_settings_sync.i18n.sync_remaining_items_plural;
			} else {
				message = message + facebook_for_woocommerce_settings_sync.i18n.sync_remaining_items_singular
			}
			message = message.replace( '{count}', count );
		}
		// set products sync status
		$( '#sync_progress' ).show().html( message ).css( 'color', 'inherit' );
		facebook_for_woocommerce_settings_sync.sync_in_progress = true;
	}
	/**
	 * Clears any UI for sync in progress.
	 *
	 * @since 2.0.0
	 *
	 * @param error message to display
	 */
	function clearSyncInProgress( error = '' ) {
		facebook_for_woocommerce_settings_sync.sync_in_progress = false;
		clearInterval( window.syncStatusInterval );
		window.syncStatusInterval = null;
		toggleSettingOptions( true );
		$( 'input#wc_facebook_enable_product_sync, input[name="save_product_sync_settings"]' ).css( 'pointer-events', 'all' ).css( 'opacity', '1' );
		if ( error ) {
			$( '#sync_progress' ).show().html( error ).css( 'color', '#DC3232' );
		} else {
			$( '#sync_progress' ).hide();
		}
	}
	/**
	 * Gets the current sync status.
	 *
	 * @since 2.0.0
	 */
	function getSyncStatus() {
		if ( ! facebook_for_woocommerce_settings_sync.sync_in_progress ) {
			return;
		}
		$.post( facebook_for_woocommerce_settings_sync.ajax_url, {
			action: 'wc_facebook_get_sync_status',
			nonce:  facebook_for_woocommerce_settings_sync.sync_status_nonce,
		}, function ( response ) {
			console.log( response );
			if ( response.success ) {
				// the returned data represents the number of products remaining
				if ( response.data > 0 ) {
					syncInProgress( response.data );
				} else {
					clearSyncInProgress();
				}
			}
		} );
	}
} );