/* global tb_remove, JSON */ window.wp = window.wp || {}; (function ($, wp) { 'use strict' wp.envato = {} /** * User nonce for ajax calls. * * @since 1.0.0 * * @var string */ wp.envato.ajaxNonce = window._wpUpdatesSettings.ajax_nonce /** * Whether filesystem credentials need to be requested from the user. * * @since 1.0.0 * * @var bool */ wp.envato.shouldRequestFilesystemCredentials = null /** * Filesystem credentials to be packaged along with the request. * * @since 1.0.0 * * @var object */ wp.envato.filesystemCredentials = { ftp: { host: null, username: null, password: null, connectionType: null }, ssh: { publicKey: null, privateKey: null } } /** * Flag if we're waiting for an update to complete. * * @since 1.0.0 * * @var bool */ wp.envato.updateLock = false /** * * Flag if we've done an update successfully. * * @since 1.0.0 * * @var bool */ wp.envato.updateDoneSuccessfully = false /** * If the user tries to update a plugin while an update is * already happening, it can be placed in this queue to perform later. * * @since 1.0.0 * * @var array */ wp.envato.updateQueue = [] /** * Store a jQuery reference to return focus to when exiting the request credentials modal. * * @since 1.0.0 * * @var jQuery object */ wp.envato.$elToReturnFocusToFromCredentialsModal = null /** * Decrement update counts throughout the various menus. * * @since 3.9.0 * * @param {string} upgradeType */ wp.envato.decrementCount = function (upgradeType) { var count var pluginCount const $adminBarUpdateCount = $('#wp-admin-bar-updates .ab-label') const $dashboardNavMenuUpdateCount = $('a[href="update-core.php"] .update-plugins') const $pluginsMenuItem = $('#menu-plugins') count = $adminBarUpdateCount.text() count = parseInt(count, 10) - 1 if (count < 0 || isNaN(count)) { return } $('#wp-admin-bar-updates .ab-item').removeAttr('title') $adminBarUpdateCount.text(count) $dashboardNavMenuUpdateCount.each(function (index, elem) { elem.className = elem.className.replace(/count-\d+/, 'count-' + count) }) $dashboardNavMenuUpdateCount.removeAttr('title') $dashboardNavMenuUpdateCount.find('.update-count').text(count) if (upgradeType === 'plugin') { pluginCount = $pluginsMenuItem.find('.plugin-count').eq(0).text() pluginCount = parseInt(pluginCount, 10) - 1 if (pluginCount < 0 || isNaN(pluginCount)) { return } $pluginsMenuItem.find('.plugin-count').text(pluginCount) $pluginsMenuItem.find('.update-plugins').each(function (index, elem) { elem.className = elem.className.replace(/count-\d+/, 'count-' + pluginCount) }) if (pluginCount > 0) { $('.subsubsub .upgrade .count').text('(' + pluginCount + ')') } else { $('.subsubsub .upgrade').remove() } } } /** * Send an Ajax request to the server to update a plugin. * * @since 1.0.0 * * @param {string} plugin * @param {string} slug */ wp.envato.updatePlugin = function (plugin, slug) { let data const $message = $('.envato-card-' + slug).find('.update-now') const name = $message.data('name') const updatingMessage = wp.i18n.sprintf(wp.i18n.__('Updating %s...', 'envato-market'), name) $message.attr('aria-label', updatingMessage) $message.addClass('updating-message') if ($message.html() !== updatingMessage) { $message.data('originaltext', $message.html()) } $message.text(updatingMessage) if (wp.envato.updateLock) { wp.envato.updateQueue.push({ type: 'update-plugin', data: { plugin, slug } }) return } wp.envato.updateLock = true data = { _ajax_nonce: wp.envato.ajaxNonce, plugin, slug, username: wp.envato.filesystemCredentials.ftp.username, password: wp.envato.filesystemCredentials.ftp.password, hostname: wp.envato.filesystemCredentials.ftp.hostname, connection_type: wp.envato.filesystemCredentials.ftp.connectionType, public_key: wp.envato.filesystemCredentials.ssh.publicKey, private_key: wp.envato.filesystemCredentials.ssh.privateKey } wp.ajax.post('update-plugin', data) .done(wp.envato.updateSuccess) .fail(wp.envato.updateError) } /** * Send an Ajax request to the server to update a theme. * * @since 1.0.0 * * @param {string} plugin * @param {string} slug */ wp.envato.updateTheme = function (slug) { let data const $message = $('.envato-card-' + slug).find('.update-now') const name = $message.data('name') const updatingMessage = wp.i18n.sprintf(wp.i18n.__('Updating %s...', 'envato-market'), name) $message.attr('aria-label', updatingMessage) $message.addClass('updating-message') if ($message.html() !== updatingMessage) { $message.data('originaltext', $message.html()) } $message.text(updatingMessage) if (wp.envato.updateLock) { wp.envato.updateQueue.push({ type: 'update-theme', data: { theme: slug } }) return } wp.envato.updateLock = true data = { _ajax_nonce: wp.envato.ajaxNonce, theme: slug, slug, username: wp.envato.filesystemCredentials.ftp.username, password: wp.envato.filesystemCredentials.ftp.password, hostname: wp.envato.filesystemCredentials.ftp.hostname, connection_type: wp.envato.filesystemCredentials.ftp.connectionType, public_key: wp.envato.filesystemCredentials.ssh.publicKey, private_key: wp.envato.filesystemCredentials.ssh.privateKey } wp.ajax.post('update-theme', data) .done(wp.envato.updateSuccess) .fail(wp.envato.updateError) } /** * On a successful plugin update, update the UI with the result. * * @since 1.0.0 * * @param {object} response */ wp.envato.updateSuccess = function (response) { let $card, $updateColumn, $updateMessage, $updateVersion, name, version, versionText $card = $('.envato-card-' + response.slug) $updateColumn = $card.find('.column-update') $updateMessage = $card.find('.update-now') $updateVersion = $card.find('.version') name = $updateMessage.data('name') version = $updateMessage.data('version') versionText = $updateVersion.attr('aria-label').replace('%s', version) $updateMessage.addClass('disabled') const updateMessage = wp.i18n.sprintf(wp.i18n.__('Updating %s...', 'envato-market'), name) $updateMessage.attr('aria-label', updateMessage) $updateVersion.text(versionText) $updateMessage.removeClass('updating-message').addClass('updated-message') $updateMessage.text(wp.i18n.__('Updated!', 'envato-market')) wp.a11y.speak(updateMessage) $updateColumn.addClass('update-complete').delay(1000).fadeOut() wp.envato.decrementCount('plugin') wp.envato.updateDoneSuccessfully = true /* * The lock can be released since the update was successful, * and any other updates can commence. */ wp.envato.updateLock = false $(document).trigger('envato-update-success', response) wp.envato.queueChecker() } /** * On a plugin update error, update the UI appropriately. * * @since 1.0.0 * * @param {object} response */ wp.envato.updateError = function (response) { let $message, name wp.envato.updateDoneSuccessfully = false if (response.errorCode && response.errorCode === 'unable_to_connect_to_filesystem' && wp.envato.shouldRequestFilesystemCredentials) { wp.envato.credentialError(response, 'update-plugin') return } $message = $('.envato-card-' + response.slug).find('.update-now') name = $message.data('name') $message.attr('aria-label', wp.i18n.__('Updating failed', 'envato-market')) $message.removeClass('updating-message') $message.html(wp.i18n.sprintf(wp.i18n.__('Updating failed %s...', 'envato-market'), typeof 'undefined' !== response.errorMessage ? response.errorMessage : response.error)) /* * The lock can be released since this failure was * after the credentials form. */ wp.envato.updateLock = false $(document).trigger('envato-update-error', response) wp.envato.queueChecker() } /** * Show an error message in the request for credentials form. * * @param {string} message * @since 1.0.0 */ wp.envato.showErrorInCredentialsForm = function (message) { const $modal = $('.notification-dialog') // Remove any existing error. $modal.find('.error').remove() $modal.find('h3').after('