diff --git a/assets/js/src/newsletters/listings/mixins.jsx b/assets/js/src/newsletters/listings/mixins.jsx index 547787b8c3..acb31708c6 100644 --- a/assets/js/src/newsletters/listings/mixins.jsx +++ b/assets/js/src/newsletters/listings/mixins.jsx @@ -448,7 +448,45 @@ const MailerMixin = { }, }; +const CronMixin = { + checkCronStatus: (state) => { + if (state.meta.cron_accessible !== false) { + MailPoet.Notice.hide('mailpoet_cron_error'); + return; + } + + const cronPingCheckNotice = ReactStringReplace( + MailPoet.I18n.t('cronNotAccessibleNotice'), + /\[link\](.*?)\[\/link\]/g, + match => ( + + { match } + + ) + ); + + MailPoet.Notice.error( + '', + { static: true, id: 'mailpoet_cron_error' } + ); + + ReactDOM.render( + ( +
+

{cronPingCheckNotice}

+
+ ), + jQuery('[data-id="mailpoet_cron_error"]')[0] + ); + }, +}; export { QueueMixin }; export { StatisticsMixin }; export { MailerMixin }; +export { CronMixin }; diff --git a/assets/js/src/newsletters/listings/notification.jsx b/assets/js/src/newsletters/listings/notification.jsx index bde666dcae..7165406a57 100644 --- a/assets/js/src/newsletters/listings/notification.jsx +++ b/assets/js/src/newsletters/listings/notification.jsx @@ -5,7 +5,10 @@ import Listing from 'listing/listing.jsx'; import ListingTabs from 'newsletters/listings/tabs.jsx'; import ListingHeading from 'newsletters/listings/heading.jsx'; -import { MailerMixin } from 'newsletters/listings/mixins.jsx'; +import { + MailerMixin, + CronMixin, +} from 'newsletters/listings/mixins.jsx'; import classNames from 'classnames'; import MailPoet from 'mailpoet'; @@ -155,7 +158,7 @@ const newsletterActions = [ ]; const NewsletterListNotification = React.createClass({ - mixins: [MailerMixin], + mixins: [MailerMixin, CronMixin], updateStatus: function updateStatus(e) { // make the event persist so that we can still override the selected value // in the ajax callback @@ -330,7 +333,7 @@ const NewsletterListNotification = React.createClass({ auto_refresh sort_by="updated_at" sort_order="desc" - afterGetItems={this.checkMailerStatus} + afterGetItems={(state) => { this.checkMailerStatus(state); this.checkCronStatus(state); }} /> ); diff --git a/assets/js/src/newsletters/listings/notification_history.jsx b/assets/js/src/newsletters/listings/notification_history.jsx index 1ff132d206..a49cf61683 100644 --- a/assets/js/src/newsletters/listings/notification_history.jsx +++ b/assets/js/src/newsletters/listings/notification_history.jsx @@ -12,6 +12,7 @@ import { QueueMixin, StatisticsMixin, MailerMixin, + CronMixin, } from 'newsletters/listings/mixins.jsx'; const mailpoetTrackingEnabled = (!!(window.mailpoet_tracking_enabled)); @@ -57,7 +58,7 @@ Hooks.addFilter('mailpoet_newsletters_listings_notification_history_actions', St newsletterActions = Hooks.applyFilters('mailpoet_newsletters_listings_notification_history_actions', newsletterActions); const NewsletterListNotificationHistory = React.createClass({ - mixins: [QueueMixin, StatisticsMixin, MailerMixin], + mixins: [QueueMixin, StatisticsMixin, MailerMixin, CronMixin], renderItem: function renderItem(newsletter, actions, meta) { const rowClasses = classNames( 'manage-column', @@ -120,7 +121,7 @@ const NewsletterListNotificationHistory = React.createClass({ auto_refresh sort_by="sent_at" sort_order="desc" - afterGetItems={this.checkMailerStatus} + afterGetItems={(state) => { this.checkMailerStatus(state); this.checkCronStatus(state); }} /> ); diff --git a/assets/js/src/newsletters/listings/standard.jsx b/assets/js/src/newsletters/listings/standard.jsx index 4254a49a59..e36fdd1c0b 100644 --- a/assets/js/src/newsletters/listings/standard.jsx +++ b/assets/js/src/newsletters/listings/standard.jsx @@ -12,6 +12,7 @@ import { QueueMixin, StatisticsMixin, MailerMixin, + CronMixin, } from 'newsletters/listings/mixins.jsx'; const mailpoetTrackingEnabled = (!!(window.mailpoet_tracking_enabled)); @@ -172,7 +173,7 @@ Hooks.addFilter('mailpoet_newsletters_listings_standard_actions', StatisticsMixi newsletterActions = Hooks.applyFilters('mailpoet_newsletters_listings_standard_actions', newsletterActions); const NewsletterListStandard = React.createClass({ - mixins: [QueueMixin, StatisticsMixin, MailerMixin], + mixins: [QueueMixin, StatisticsMixin, MailerMixin, CronMixin], renderItem: function renderItem(newsletter, actions, meta) { const rowClasses = classNames( 'manage-column', @@ -233,7 +234,7 @@ const NewsletterListStandard = React.createClass({ auto_refresh sort_by="sent_at" sort_order="desc" - afterGetItems={this.checkMailerStatus} + afterGetItems={(state) => { this.checkMailerStatus(state); this.checkCronStatus(state); }} /> ); diff --git a/assets/js/src/newsletters/listings/welcome.jsx b/assets/js/src/newsletters/listings/welcome.jsx index 1922c9cb8c..b559d2d257 100644 --- a/assets/js/src/newsletters/listings/welcome.jsx +++ b/assets/js/src/newsletters/listings/welcome.jsx @@ -4,7 +4,11 @@ import Listing from 'listing/listing.jsx'; import ListingTabs from 'newsletters/listings/tabs.jsx'; import ListingHeading from 'newsletters/listings/heading.jsx'; -import { StatisticsMixin, MailerMixin } from 'newsletters/listings/mixins.jsx'; +import { + StatisticsMixin, + MailerMixin, + CronMixin, +} from 'newsletters/listings/mixins.jsx'; import classNames from 'classnames'; import MailPoet from 'mailpoet'; @@ -128,7 +132,7 @@ Hooks.addFilter('mailpoet_newsletters_listings_welcome_notification_actions', St newsletterActions = Hooks.applyFilters('mailpoet_newsletters_listings_welcome_notification_actions', newsletterActions); const NewsletterListWelcome = React.createClass({ - mixins: [StatisticsMixin, MailerMixin], + mixins: [StatisticsMixin, MailerMixin, CronMixin], updateStatus: function updateStatus(e) { // make the event persist so that we can still override the selected value // in the ajax callback @@ -312,7 +316,7 @@ const NewsletterListWelcome = React.createClass({ auto_refresh sort_by="updated_at" sort_order="desc" - afterGetItems={this.checkMailerStatus} + afterGetItems={(state) => { this.checkMailerStatus(state); this.checkCronStatus(state); }} /> ); diff --git a/lib/API/JSON/v1/Newsletters.php b/lib/API/JSON/v1/Newsletters.php index 7a224a9284..bb74a20377 100644 --- a/lib/API/JSON/v1/Newsletters.php +++ b/lib/API/JSON/v1/Newsletters.php @@ -6,6 +6,7 @@ use Carbon\Carbon; use MailPoet\API\JSON\Endpoint as APIEndpoint; use MailPoet\API\JSON\Error as APIError; use MailPoet\Config\AccessControl; +use MailPoet\Cron\CronHelper; use MailPoet\Cron\Workers\SendingQueue\Tasks\Newsletter as NewsletterQueueTask; use MailPoet\Listing; use MailPoet\Models\Newsletter; @@ -416,6 +417,7 @@ class Newsletters extends APIEndpoint { 'groups' => $listing_data['groups'], 'mta_log' => Setting::getValue('mta_log'), 'mta_method' => Setting::getValue('mta.method'), + 'cron_accessible' => CronHelper::isDaemonAccessible(), 'current_time' => WPFunctions::currentTime('mysql') )); } diff --git a/views/newsletters.html b/views/newsletters.html index 86e57805a5..25411ff4be 100644 --- a/views/newsletters.html +++ b/views/newsletters.html @@ -287,6 +287,7 @@ 'beta': __('Beta'), 'errorWhileTakingScreenshot': __('An error occured while saving the template in "Recently sent"'), 'selectAutomaticEmailsEventsHeading': __('Select %1s events'), + 'cronNotAccessibleNotice': __('Oops! There seems to be an issue with the sending on your website. [link]See our guide[/link] to solve this yourself.'), }) %> <% endblock %>