Add pending approval message and functionality to send page

Show a message to user about their pending approval and
allow them to update the status in place via ajax

[MAILPOET-4633]
This commit is contained in:
Sam Najian
2022-12-19 22:13:14 +01:00
committed by Aschepikov
parent a48b725c7d
commit 0aceab5a2e
3 changed files with 39 additions and 28 deletions

View File

@@ -25,6 +25,8 @@ import { extractEmailDomain } from 'common/functions';
import { mapFilterType } from '../analytics'; import { mapFilterType } from '../analytics';
import { PremiumModal } from '../common/premium_modal'; import { PremiumModal } from '../common/premium_modal';
import { NewsLetter, NewsletterType } from './models'; import { NewsLetter, NewsletterType } from './models';
import { initStore as initSettingsStore } from '../settings/store';
import { PendingNewsletterMessage } from './send/pending_newsletter_message';
const automaticEmails = window.mailpoet_woocommerce_automatic_emails || {}; const automaticEmails = window.mailpoet_woocommerce_automatic_emails || {};
@@ -50,6 +52,7 @@ type NewsletterSendComponentState = {
thumbnailPromise?: Promise<unknown>; thumbnailPromise?: Promise<unknown>;
showPremiumModal: boolean; showPremiumModal: boolean;
validationError?: string | JSX.Element; validationError?: string | JSX.Element;
mssKeyPendingApproval: boolean;
}; };
const getTimingValueForTracking = (emailOpts: NewsLetter['options']) => const getTimingValueForTracking = (emailOpts: NewsLetter['options']) =>
emailOpts.afterTimeType === 'immediate' emailOpts.afterTimeType === 'immediate'
@@ -136,11 +139,10 @@ class NewsletterSendComponent extends Component<
loading: true, loading: true,
thumbnailPromise: null, thumbnailPromise: null,
showPremiumModal: false, showPremiumModal: false,
mssKeyPendingApproval: window.mailpoet_mss_key_pending_approval,
}; };
} }
displayName: 'NewsletterSend';
componentDidMount() { componentDidMount() {
// safe to ignore since even on rejection the state is updated // safe to ignore since even on rejection the state is updated
void this.loadItem(this.props.match.params.id).always(() => { void this.loadItem(this.props.match.params.id).always(() => {
@@ -687,10 +689,16 @@ class NewsletterSendComponent extends Component<
closePremiumModal = () => this.setState({ showPremiumModal: false }); closePremiumModal = () => this.setState({ showPremiumModal: false });
toggleLoadingState = (loading: boolean): void => this.setState({ loading });
updatePendingApprovalState = (mssKeyPendingApproval: boolean): void =>
this.setState({ mssKeyPendingApproval });
render() { render() {
const { const {
showPremiumModal, showPremiumModal,
item: { status, queue, type, options }, item: { status, queue, type, options },
mssKeyPendingApproval,
} = this.state; } = this.state;
const isPaused = status === 'sending' && queue && queue.status === 'paused'; const isPaused = status === 'sending' && queue && queue.status === 'paused';
const sendButtonOptions = this.getSendButtonOptions(); const sendButtonOptions = this.getSendButtonOptions();
@@ -698,7 +706,7 @@ class NewsletterSendComponent extends Component<
const sendingDisabled = !!( const sendingDisabled = !!(
window.mailpoet_subscribers_limit_reached || window.mailpoet_subscribers_limit_reached ||
window.mailpoet_mss_key_pending_approval || mssKeyPendingApproval ||
this.state.validationError !== undefined this.state.validationError !== undefined
); );
@@ -773,23 +781,12 @@ class NewsletterSendComponent extends Component<
</a> </a>
. .
</p> </p>
{window.mailpoet_mss_key_pending_approval && (
<div className="mailpoet_error"> {mssKeyPendingApproval && (
{ReactStringReplace( <PendingNewsletterMessage
MailPoet.I18n.t('pendingKeyApprovalNotice'), toggleLoadingState={this.toggleLoadingState}
/\[link\](.*?)\[\/link\]/g, updatePendingState={this.updatePendingApprovalState}
(match) => ( />
<a
key="pendingKeyApprovalNoticeLink"
href="https://account.mailpoet.com/authorization"
target="_blank"
rel="noopener noreferrer"
>
{match}
</a>
),
)}
</div>
)} )}
{showPremiumModal && ( {showPremiumModal && (
@@ -805,4 +802,6 @@ class NewsletterSendComponent extends Component<
} }
NewsletterSendComponent.contextType = GlobalContext; NewsletterSendComponent.contextType = GlobalContext;
initSettingsStore(window);
export const NewsletterSend = withRouter(NewsletterSendComponent); export const NewsletterSend = withRouter(NewsletterSendComponent);

View File

@@ -1,21 +1,23 @@
import { useAction, useSelector } from '../../settings/store/hooks'; import { MouseEvent, useState } from 'react';
import ReactStringReplace from 'react-string-replace'; import ReactStringReplace from 'react-string-replace';
import { getLinkRegex, t } from 'common'; import { getLinkRegex, t, withBoundary } from 'common';
import { useState } from '@wordpress/element'; import { useAction, useSelector } from '../../settings/store/hooks';
export const PendingNewsletterMessage = ({ function PendingNewsletterMessage({
toggleLoadingState, toggleLoadingState,
updatePendingState, updatePendingState,
}: { }: {
toggleLoadingState: (loading: boolean) => void; toggleLoadingState: (loading: boolean) => void;
updatePendingState: (approved: boolean) => void; updatePendingState: (approved: boolean) => void;
}) => { }) {
const getKeyActivationState = useSelector('getKeyActivationState'); const getKeyActivationState = useSelector('getKeyActivationState');
const getSettings = useSelector('getSettings'); const getSettings = useSelector('getSettings');
const [showRefreshButton, keepShowingRefresh] = useState(true); const [showRefreshButton, keepShowingRefresh] = useState(true);
// //
const verifyMssKey = useAction('verifyMssKey'); const verifyMssKey = useAction('verifyMssKey') as unknown as (
const recheckKey = async (e) => { key: string,
) => PromiseLike<void>;
const recheckKey = async (e: MouseEvent<HTMLAnchorElement>) => {
e.preventDefault(); e.preventDefault();
const state = getKeyActivationState(); const state = getKeyActivationState();
toggleLoadingState(true); toggleLoadingState(true);
@@ -54,4 +56,11 @@ export const PendingNewsletterMessage = ({
)} )}
</div> </div>
); );
}; }
PendingNewsletterMessage.displayName = 'PendingNewsletterMessage';
const PendingNewsletterMessageWithBoundary = withBoundary(
PendingNewsletterMessage,
);
export { PendingNewsletterMessageWithBoundary as PendingNewsletterMessage };

View File

@@ -49,6 +49,7 @@
var mailpoet_authorized_emails = <%= json_encode(authorized_emails) %>; var mailpoet_authorized_emails = <%= json_encode(authorized_emails) %>;
var mailpoet_verified_sender_domains = <%= json_encode(verified_sender_domains) %>; var mailpoet_verified_sender_domains = <%= json_encode(verified_sender_domains) %>;
var mailpoet_all_sender_domains = <%= json_encode(all_sender_domains) %>; var mailpoet_all_sender_domains = <%= json_encode(all_sender_domains) %>;
var mailpoet_settings = <%= json_encode(settings) %>;
<% endautoescape %> <% endautoescape %>
var mailpoet_beacon_articles = [ var mailpoet_beacon_articles = [
'57fdc312c697911f2d324fd7', '57fdc312c697911f2d324fd7',
@@ -59,6 +60,7 @@
]; ];
var mailpoet_newsletters_templates_recently_sent_count = <%= json_decode(newsletters_templates_recently_sent_count) %>; var mailpoet_newsletters_templates_recently_sent_count = <%= json_decode(newsletters_templates_recently_sent_count) %>;
</script> </script>
<% endblock %> <% endblock %>
@@ -306,6 +308,7 @@
'finalNewsletterStep': __('Final Step: Last Details'), 'finalNewsletterStep': __('Final Step: Last Details'),
'saveDraftAndClose': __('Save as draft and close'), 'saveDraftAndClose': __('Save as draft and close'),
'pendingKeyApprovalNotice': __('Youll soon be able to send once our team reviews your account. In the meantime, you can send previews to [link]your authorized emails[/link].'), 'pendingKeyApprovalNotice': __('Youll soon be able to send once our team reviews your account. In the meantime, you can send previews to [link]your authorized emails[/link].'),
'pendingKeyApprovalNoticeRefresh': __('If you have already received approval email, click [link]here[/link] to update the status.'),
'orSimply': __('or simply'), 'orSimply': __('or simply'),
'goBackToDesign': __('go back to the Design page'), 'goBackToDesign': __('go back to the Design page'),
'websiteTimeIs': __("Your websites time is"), 'websiteTimeIs': __("Your websites time is"),