UNPKG

@woocommerce/data

Version:
280 lines (279 loc) 10.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.dismissRecommendedPlugins = exports.connectToJetpackWithFailureRedirect = exports.installJetpackAndConnect = exports.connectToJetpack = exports.installAndActivatePlugins = exports.activatePlugins = exports.installPlugins = exports.setRecommendedPlugins = exports.setPaypalOnboardingStatus = exports.createErrorNotice = exports.updateJetpackConnectUrl = exports.updateJetpackConnectionData = exports.updateIsJetpackConnected = exports.setError = exports.setIsRequesting = exports.updateInstalledPlugins = exports.updateActivePlugins = void 0; /** * External dependencies */ const data_controls_1 = require("@wordpress/data-controls"); const i18n_1 = require("@wordpress/i18n"); const data_1 = require("@wordpress/data"); const tracks_1 = require("@woocommerce/tracks"); /** * Internal dependencies */ const constants_1 = require("./constants"); const action_types_1 = require("./action-types"); const constants_2 = require("../constants"); const types_1 = require("../types"); // Can be removed in WP 5.9, wp.data is supported in >5.7. const dispatch = data_1.controls && data_1.controls.dispatch ? data_1.controls.dispatch : data_controls_1.dispatch; const resolveSelect = data_1.controls && data_1.controls.resolveSelect ? data_1.controls.resolveSelect : data_controls_1.select; class PluginError extends Error { constructor(message, data) { super(message); this.data = data; } } const isPluginResponseError = (plugins, error) => typeof error === 'object' && error !== null && plugins[0] in error; const formatErrorMessage = (actionType = 'install', plugins, rawErrorMessage) => { return (0, i18n_1.sprintf)( /* translators: %(actionType): install or activate (the plugin). %(pluginName): a plugin slug (e.g. woocommerce-services). %(error): a single error message or in plural a comma separated error message list.*/ (0, i18n_1._n)('Could not %(actionType)s %(pluginName)s plugin, %(error)s', 'Could not %(actionType)s the following plugins: %(pluginName)s with these Errors: %(error)s', Object.keys(plugins).length || 1, 'woocommerce'), { actionType, pluginName: plugins.join(', '), error: rawErrorMessage, }); }; function updateActivePlugins(active, replace = false) { return { type: action_types_1.ACTION_TYPES.UPDATE_ACTIVE_PLUGINS, active, replace, }; } exports.updateActivePlugins = updateActivePlugins; function updateInstalledPlugins(installed, replace = false) { return { type: action_types_1.ACTION_TYPES.UPDATE_INSTALLED_PLUGINS, installed, replace, }; } exports.updateInstalledPlugins = updateInstalledPlugins; function setIsRequesting(selector, isRequesting) { return { type: action_types_1.ACTION_TYPES.SET_IS_REQUESTING, selector, isRequesting, }; } exports.setIsRequesting = setIsRequesting; function setError(selector, error) { return { type: action_types_1.ACTION_TYPES.SET_ERROR, selector, error, }; } exports.setError = setError; function updateIsJetpackConnected(jetpackConnection) { return { type: action_types_1.ACTION_TYPES.UPDATE_JETPACK_CONNECTION, jetpackConnection, }; } exports.updateIsJetpackConnected = updateIsJetpackConnected; function updateJetpackConnectionData(results) { return { type: action_types_1.ACTION_TYPES.UPDATE_JETPACK_CONNECTION_DATA, results, }; } exports.updateJetpackConnectionData = updateJetpackConnectionData; function updateJetpackConnectUrl(redirectUrl, jetpackConnectUrl) { return { type: action_types_1.ACTION_TYPES.UPDATE_JETPACK_CONNECT_URL, jetpackConnectUrl, redirectUrl, }; } exports.updateJetpackConnectUrl = updateJetpackConnectUrl; const createErrorNotice = (errorMessage) => { return dispatch('core/notices', 'createNotice', 'error', errorMessage); }; exports.createErrorNotice = createErrorNotice; function setPaypalOnboardingStatus(status) { return { type: action_types_1.ACTION_TYPES.SET_PAYPAL_ONBOARDING_STATUS, paypalOnboardingStatus: status, }; } exports.setPaypalOnboardingStatus = setPaypalOnboardingStatus; function setRecommendedPlugins(type, plugins) { return { type: action_types_1.ACTION_TYPES.SET_RECOMMENDED_PLUGINS, recommendedType: type, plugins, }; } exports.setRecommendedPlugins = setRecommendedPlugins; function* handlePluginAPIError(actionType, plugins, error) { let rawErrorMessage; if (isPluginResponseError(plugins, error)) { // Backend error messages are in the form of { plugin-slug: [ error messages ] }. rawErrorMessage = Object.values(error).join(', \n'); } else { // Other error such as API connection errors. rawErrorMessage = (0, types_1.isRestApiError)(error) || error instanceof Error ? error.message : JSON.stringify(error); } // Track the error. switch (actionType) { case 'install': (0, tracks_1.recordEvent)('install_plugins_error', { plugins: plugins.join(', '), message: rawErrorMessage, }); break; case 'activate': (0, tracks_1.recordEvent)('activate_plugins_error', { plugins: plugins.join(', '), message: rawErrorMessage, }); } throw new PluginError(formatErrorMessage(actionType, plugins, rawErrorMessage), error); } // Action Creator Generators function* installPlugins(plugins, async = false) { var _a, _b; yield setIsRequesting('installPlugins', true); try { const results = yield (0, data_controls_1.apiFetch)({ path: `${constants_2.WC_ADMIN_NAMESPACE}/plugins/install`, method: 'POST', data: { plugins: plugins.join(','), async }, }); if ((_a = results.data.installed) === null || _a === void 0 ? void 0 : _a.length) { yield updateInstalledPlugins(results.data.installed); } if (((_b = results.errors) === null || _b === void 0 ? void 0 : _b.errors) && Object.keys(results.errors.errors).length) { throw results.errors.errors; } return results; } catch (error) { yield setError('installPlugins', error); yield handlePluginAPIError('install', plugins, error); } finally { yield setIsRequesting('installPlugins', false); } } exports.installPlugins = installPlugins; function* activatePlugins(plugins) { yield setIsRequesting('activatePlugins', true); try { const results = yield (0, data_controls_1.apiFetch)({ path: `${constants_2.WC_ADMIN_NAMESPACE}/plugins/activate`, method: 'POST', data: { plugins: plugins.join(',') }, }); if (results.data.activated.length) { yield updateActivePlugins(results.data.activated); } if (Object.keys(results.errors.errors).length) { throw results.errors.errors; } return results; } catch (error) { yield setError('activatePlugins', error); yield handlePluginAPIError('activate', plugins, error); } finally { yield setIsRequesting('activatePlugins', false); } } exports.activatePlugins = activatePlugins; function* installAndActivatePlugins(plugins) { try { const installations = yield dispatch(constants_1.STORE_NAME, 'installPlugins', plugins); const activations = yield dispatch(constants_1.STORE_NAME, 'activatePlugins', plugins); return { ...activations, data: { ...activations.data, ...installations.data, }, }; } catch (error) { throw error; } } exports.installAndActivatePlugins = installAndActivatePlugins; function* connectToJetpack(getAdminLink) { const url = yield resolveSelect(constants_1.STORE_NAME, 'getJetpackConnectUrl', { redirect_url: getAdminLink('admin.php?page=wc-admin'), }); const error = yield resolveSelect(constants_1.STORE_NAME, 'getPluginsError', 'getJetpackConnectUrl'); if (error) { throw new Error(error); } else { return url; } } exports.connectToJetpack = connectToJetpack; function* installJetpackAndConnect(errorAction, getAdminLink) { try { yield dispatch(constants_1.STORE_NAME, 'installPlugins', ['jetpack']); yield dispatch(constants_1.STORE_NAME, 'activatePlugins', ['jetpack']); const url = yield dispatch(constants_1.STORE_NAME, 'connectToJetpack', getAdminLink); window.location.href = url; } catch (error) { if (error instanceof Error) { yield errorAction(error.message); } else { throw error; } } } exports.installJetpackAndConnect = installJetpackAndConnect; function* connectToJetpackWithFailureRedirect(failureRedirect, errorAction, getAdminLink) { try { const url = yield dispatch(constants_1.STORE_NAME, 'connectToJetpack', getAdminLink); window.location.href = url; } catch (error) { if (error instanceof Error) { yield errorAction(error.message); } else { throw error; } window.location.href = failureRedirect; } } exports.connectToJetpackWithFailureRedirect = connectToJetpackWithFailureRedirect; const SUPPORTED_TYPES = ['payments']; function* dismissRecommendedPlugins(type) { if (!SUPPORTED_TYPES.includes(type)) { return []; } const plugins = yield resolveSelect(constants_1.STORE_NAME, 'getRecommendedPlugins', type); yield setRecommendedPlugins(type, []); let success; try { const url = constants_2.WC_ADMIN_NAMESPACE + '/payment-gateway-suggestions/dismiss'; success = yield (0, data_controls_1.apiFetch)({ path: url, method: 'POST', }); } catch (error) { success = false; } if (!success) { // Reset recommended plugins yield setRecommendedPlugins(type, plugins); } return success; } exports.dismissRecommendedPlugins = dismissRecommendedPlugins;