diff --git a/assets/js/src/settings/premium_tab/messages/mss_messages.jsx b/assets/js/src/settings/premium_tab/messages/mss_messages.jsx new file mode 100644 index 0000000000..2e3e7744a9 --- /dev/null +++ b/assets/js/src/settings/premium_tab/messages/mss_messages.jsx @@ -0,0 +1,33 @@ +import PropTypes from 'prop-types'; +import React from 'react'; +import MailPoet from 'mailpoet'; + +const validMessage = ( +
+ {MailPoet.I18n.t('premiumTabMssValidMessage')} +
+); + +const notValidMessage = (message) => ( +
+ {message || MailPoet.I18n.t('premiumTabMssNotValidMessage')} +
+); + +const MssMessages = (props) => { + if (props.keyValid) { + return validMessage; + } + return notValidMessage(props.keyMessage); +}; + +MssMessages.propTypes = { + keyValid: PropTypes.bool.isRequired, + keyMessage: PropTypes.string, +}; + +MssMessages.defaultProps = { + keyMessage: null, +}; + +export default MssMessages; diff --git a/assets/js/src/settings/premium_tab/messages/premium_messages.jsx b/assets/js/src/settings/premium_tab/messages/premium_messages.jsx new file mode 100644 index 0000000000..6d8f5b1e85 --- /dev/null +++ b/assets/js/src/settings/premium_tab/messages/premium_messages.jsx @@ -0,0 +1,33 @@ +import PropTypes from 'prop-types'; +import React from 'react'; +import MailPoet from 'mailpoet'; + +const validMessage = ( +
+ {MailPoet.I18n.t('premiumTabPremiumValidMessage')} +
+); + +const notValidMessage = (message) => ( +
+ {message || MailPoet.I18n.t('premiumTabPremiumNotValidMessage')} +
+); + +const PremiumMessages = (props) => { + if (props.keyValid) { + return validMessage; + } + return notValidMessage(props.keyMessage); +}; + +PremiumMessages.propTypes = { + keyValid: PropTypes.bool.isRequired, + keyMessage: PropTypes.string, +}; + +PremiumMessages.defaultProps = { + keyMessage: null, +}; + +export default PremiumMessages; diff --git a/assets/js/src/settings/premium_tab/premium_tab.jsx b/assets/js/src/settings/premium_tab/premium_tab.jsx new file mode 100644 index 0000000000..9e5c01470c --- /dev/null +++ b/assets/js/src/settings/premium_tab/premium_tab.jsx @@ -0,0 +1,144 @@ +import PropTypes from 'prop-types'; +import React, { useState } from 'react'; +import ReactDOM from 'react-dom'; +import MailPoet from 'mailpoet'; +import PremiumMessages from 'settings/premium_tab/messages/premium_messages.jsx'; +import MssMessages from 'settings/premium_tab/messages/mss_messages.jsx'; + +const requestServicesApi = async (key, action) => MailPoet.Ajax.post({ + api_version: window.mailpoet_api_version, + endpoint: 'services', + action, + data: { key }, +}); + +const PremiumTab = (props) => { + const [key, setKey] = useState(props.activationKey); + const [premiumKeyValid, setPremiumKeyValid] = useState(key ? props.premiumKeyValid : null); + const [mssKeyValid, setMssKeyValid] = useState(key ? props.mssKeyValid : null); + const [premiumKeyMessage, setPremiumKeyMessage] = useState(null); + const [mssKeyMessage, setMssKeyMessage] = useState(null); + + const verifyMailPoetPremiumKey = async () => { + try { + const response = await requestServicesApi(key, 'checkPremiumKey'); + setPremiumKeyMessage(null); + MailPoet.trackEvent( + 'User has validated a Premium key', + { + 'MailPoet Free version': window.mailpoet_version, + 'Premium plugin is active': response.meta.premium_plugin_active, + } + ); + } catch (error) { + setPremiumKeyValid(false); + setPremiumKeyMessage(error.errors.map((e) => e.message).join(' ') || null); + MailPoet.trackEvent( + 'User has failed to validate a Premium key', + { + 'MailPoet Free version': window.mailpoet_version, + 'Premium plugin is active': props.premiumPluginActive, + } + ); + } + }; + + async function verifyMailPoetSendingServiceKey() { + try { + const response = await requestServicesApi(key, 'checkMSSKey'); + setMssKeyValid(true); + setMssKeyMessage(response.data.message || null); + } catch (error) { + setMssKeyValid(false); + setMssKeyMessage(error.errors.map((e) => e.message).join(' ') || null); + } + window.updateMSSActivationUI(); + } + + return ( + + + + + + + +
+ +

+ {MailPoet.I18n.t('premiumTabDescription')} +

+
+
+ setKey(event.target.value.trim() || null)} + /> + {' '} + +
+ {premiumKeyValid !== null && ( + + )} + {mssKeyValid !== null && ( + + )} +
+ ); +}; + +PremiumTab.propTypes = { + activationKey: PropTypes.string, + premiumKeyValid: PropTypes.bool.isRequired, + mssKeyValid: PropTypes.bool.isRequired, + premiumPluginActive: PropTypes.bool.isRequired, +}; + +PremiumTab.defaultProps = { + activationKey: null, +}; + +const container = document.getElementById('settings-premium-tab'); +if (container) { + ReactDOM.render( + , + container + ); +} diff --git a/assets/js/src/webpack_admin_index.jsx b/assets/js/src/webpack_admin_index.jsx index cad76783e4..021761aad3 100644 --- a/assets/js/src/webpack_admin_index.jsx +++ b/assets/js/src/webpack_admin_index.jsx @@ -12,6 +12,7 @@ import 'dynamic_segments/dynamic_segments.jsx'; // side effect - renders ReactDO import 'settings/settings.jsx'; // side effect - renders ReactDOM to document import 'forms/forms.jsx'; // side effect - renders ReactDOM to document import 'settings/tabs.js'; // side effect - assigns to MailPoet.Router, executes code on doc ready +import 'settings/premium_tab/premium_tab.jsx'; // side effect - renders ReactDOM to document import 'help/help.jsx'; // side effect - renders ReactDOM to document import 'poll.jsx'; // side effect - assigns to MailPoet.Poll import 'settings/reinstall_from_scratch.js'; // side effect - adds event handler to document diff --git a/views/settings.html b/views/settings.html index 39fb9dc3ab..37d39edb3b 100644 --- a/views/settings.html +++ b/views/settings.html @@ -297,5 +297,14 @@ 'yourName': __('Your name'), 'from': __('From'), 'replyTo': __('Reply-to'), + + 'premiumTabActivationKeyLabel': __('Activation Key', 'mailpoet'), + 'premiumTabDescription': __('This key is used to validate your free or paid subscription. Paying customers will enjoy automatic upgrades of their Premium plugin and access to faster support.', 'mailpoet'), + 'premiumTabNoKeyNotice': __('Please specify a license key before validating it.', 'mailpoet'), + 'premiumTabVerifyButton': __('Verify', 'mailpoet'), + 'premiumTabPremiumValidMessage': __('Your Premium key has been successfully validated.', 'mailpoet'), + 'premiumTabPremiumNotValidMessage': __('Your key is not valid for the Premium plugin.', 'mailpoet'), + 'premiumTabMssValidMessage': __('Your MailPoet Sending Service key has been successfully validated.', 'mailpoet'), + 'premiumTabMssNotValidMessage': __('Your key is not valid for the MailPoet Sending Service.', 'mailpoet'), }) %> <% endblock %> diff --git a/views/settings/premium.html b/views/settings/premium.html index 62712dbf61..786ea4b567 100644 --- a/views/settings/premium.html +++ b/views/settings/premium.html @@ -1,217 +1,9 @@ - - - - - - - - -
- -

- <%= __('This key is used to validate your free or paid subscription. Paying customers will enjoy automatic upgrades of their Premium plugin and access to faster support.') %> -

-
- -
- <%= __('Your Premium key has been successfully validated.') %> -
-
- <%= __('Your key is not valid for the Premium plugin.') %> -
-
- <%= __('Your MailPoet Sending Service key has been successfully validated.') %> -
-
- <%= __('Your key is not valid for the MailPoet Sending Service.') %> -
-
- style="display: none;" - <% endif %> - > - <%= __('Install Premium now.') %> - - - <%= __('[link]Read guide[/link] on how to install Premium.') - |replaceLinkTags('https://kb.mailpoet.com/article/194-instructions-to-install-the-premium-plugin', {'target': '_blank', 'data-beacon-article': '59020a2d2c7d3a057f889e8f'}) - |raw - %> - -
-
- style="display: none;" - <% endif %> - > - <%= __('You need to activate the MailPoet Premium plugin.') %> - <%= __('Activate Premium.') %> -
-
- style="display: none;" - <% endif %> - > - - <%= __("Don't forget to activate the MailPoet Sending Service in the [link]Send with...[/link] tab above.") - |replaceLinkTags('#mta') - |raw - %> - -
-
- + +