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 (
+
+ );
+};
+
+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 @@
-
-
+
+