From e569a90ad8dfb63ea31e1e5ee468ba8ff8f3b966 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Jakes=CC=8C?= Date: Tue, 10 Dec 2019 15:10:14 +0100 Subject: [PATCH] Implement automatic premium installation/activation [MAILPOET-2431] --- .../src/settings/premium_tab/premium_tab.jsx | 56 +++++++++++++++++-- views/settings/premium.html | 2 + 2 files changed, 54 insertions(+), 4 deletions(-) diff --git a/assets/js/src/settings/premium_tab/premium_tab.jsx b/assets/js/src/settings/premium_tab/premium_tab.jsx index eab3ea1de0..a1b8b99475 100644 --- a/assets/js/src/settings/premium_tab/premium_tab.jsx +++ b/assets/js/src/settings/premium_tab/premium_tab.jsx @@ -6,6 +6,15 @@ import MssMessages from 'settings/premium_tab/messages/mss_messages.jsx'; import { PremiumStatus, PremiumMessages } from 'settings/premium_tab/messages/premium_messages.jsx'; import { PremiumInstallationStatus } from 'settings/premium_tab/messages/premium_installation_messages.jsx'; +const request = async (url) => { + try { + const response = await fetch(url); + return response.ok; + } catch (error) { + return false; + } +}; + const requestServicesApi = async (key, action) => MailPoet.Ajax.post({ api_version: window.mailpoet_api_version, endpoint: 'services', @@ -21,6 +30,40 @@ const PremiumTab = (props) => { const [mssKeyValid, setMssKeyValid] = useState(key ? props.mssKeyValid : null); const [mssKeyMessage, setMssKeyMessage] = useState(null); + let premiumActivateUrl = props.premiumActivateUrl; + + const activatePremiumPlugin = async (isAfterInstall = false) => { + const status = PremiumInstallationStatus; + const activateStatus = isAfterInstall ? status.INSTALL_ACTIVATING : status.ACTIVATE_ACTIVATING; + const doneStatus = isAfterInstall ? status.INSTALL_DONE : status.ACTIVATE_DONE; + const errorStatus = isAfterInstall ? status.INSTALL_ACTIVATING_ERROR : status.ACTIVATE_ERROR; + + setPremiumInstallationStatus(activateStatus); + if (!await request(premiumActivateUrl)) { + setPremiumInstallationStatus(errorStatus); + return; + } + setPremiumInstallationStatus(doneStatus); + }; + + const installPremiumPlugin = async () => { + setPremiumInstallationStatus(PremiumInstallationStatus.INSTALL_INSTALLING); + if (!await request(props.premiumInstallUrl)) { + setPremiumInstallationStatus(PremiumInstallationStatus.INSTALL_INSTALLING_ERROR); + return; + } + + // refetch 'plugin_activate_url' since it's only set after installation + try { + const response = await requestServicesApi(key, 'checkPremiumKey'); + premiumActivateUrl = response.meta.premium_activate_url; + } catch (error) { + setPremiumInstallationStatus(PremiumInstallationStatus.INSTALL_INSTALLING_ERROR); + return; + } + await activatePremiumPlugin(true); + }; + const verifyMailPoetPremiumKey = async () => { try { const response = await requestServicesApi(key, 'checkPremiumKey'); @@ -29,10 +72,10 @@ const PremiumTab = (props) => { // install/activate Premium plugin if (!response.meta.premium_plugin_installed) { setPremiumStatus(PremiumStatus.KEY_VALID_PREMIUM_PLUGIN_BEING_INSTALLED); - //TODO + await installPremiumPlugin(); } else if (!response.meta.premium_plugin_active) { setPremiumStatus(PremiumStatus.KEY_VALID_PREMIUM_PLUGIN_BEING_ACTIVATED); - //TODO + await activatePremiumPlugin(); } else { setPremiumStatus(PremiumStatus.KEY_VALID_PREMIUM_PLUGIN_ACTIVE); } @@ -125,8 +168,8 @@ const PremiumTab = (props) => { keyStatus={premiumStatus} keyMessage={premiumMessage} installationStatus={premiumInstallationStatus} - installationCallback="" //TODO - activationCallback="" //TODO + installationCallback={installPremiumPlugin} + activationCallback={() => activatePremiumPlugin()} /> )} @@ -141,10 +184,13 @@ PremiumTab.propTypes = { premiumStatus: PropTypes.number.isRequired, mssKeyValid: PropTypes.bool.isRequired, premiumPluginActive: PropTypes.bool.isRequired, + premiumInstallUrl: PropTypes.string.isRequired, + premiumActivateUrl: PropTypes.string, }; PremiumTab.defaultProps = { activationKey: null, + premiumActivateUrl: null, }; const container = document.getElementById('settings-premium-tab'); @@ -170,6 +216,8 @@ if (container) { premiumStatus={getPremiumStatus()} mssKeyValid={window.mailpoet_mss_key_valid} premiumPluginActive={!!window.mailpoet_premium_version} + premiumInstallUrl={window.mailpoet_premium_install_url} + premiumActivateUrl={window.mailpoet_premium_activate_url || null} />, container ); diff --git a/views/settings/premium.html b/views/settings/premium.html index 3a617788c8..81f27d7f4a 100644 --- a/views/settings/premium.html +++ b/views/settings/premium.html @@ -4,6 +4,8 @@ var mailpoet_premium_key_valid = <%= json_encode(premium_key_valid) %>; var mailpoet_premium_plugin_installed = <%= json_encode(premium_plugin_installed) %>; var mailpoet_mss_key_valid = <%= json_encode(mss_key_valid) %>; + var mailpoet_premium_install_url = <%= json_encode(premium_install_url) %>; + var mailpoet_premium_activate_url = <%= json_encode(premium_activate_url) %>; <% endautoescape %>