diff --git a/assets/js/src/announcements/feature_announcement.jsx b/assets/js/src/announcements/feature_announcement.jsx index f2d3c1e55a..7df62d20df 100644 --- a/assets/js/src/announcements/feature_announcement.jsx +++ b/assets/js/src/announcements/feature_announcement.jsx @@ -3,14 +3,38 @@ import classNames from 'classnames'; import MailPoet from 'mailpoet'; import PropTypes from 'prop-types'; +const LAST_ANNOUNCEMENT_SEEN_LS_KEY = 'last_announcement_seen'; + +const getLocalStorageKey = function getLocalStorageKey() { + try { + return parseInt(window.localStorage.getItem(LAST_ANNOUNCEMENT_SEEN_LS_KEY), 10); + } catch (e) { + return null; + } +}; + +const setLocalStorageKey = function setLocalStorageKey(value) { + try { + return window.localStorage.setItem(LAST_ANNOUNCEMENT_SEEN_LS_KEY, String(value)); + } catch (e) { + return null; + } +}; + class FeatureAnnouncement extends React.Component { constructor(props) { super(props); this.loadBeamer = this.loadBeamer.bind(this); this.beamerCallback = this.beamerCallback.bind(this); + // localStorage is used as a backup for users who don't have a permission to update settings + const lastAnnouncementSeenLS = getLocalStorageKey(); + const hasNewsLS = lastAnnouncementSeenLS > 0 ? + lastAnnouncementSeenLS < window.mailpoet_last_announcement_date : + null; + this.state = { - showDot: props.hasNews, + showDot: hasNewsLS !== null ? hasNewsLS : props.hasNews, beamerLoaded: typeof window.Beamer !== 'undefined', }; } @@ -40,7 +64,9 @@ class FeatureAnnouncement extends React.Component { window.Beamer.show(); const data = { last_announcement_seen: window.mailpoet_last_announcement_seen || {} }; const userId = window.mailpoet_current_wp_user.ID; - data.last_announcement_seen[userId] = Math.floor(Date.now() / 1000); + const lastAnnouncementSeen = Math.floor(Date.now() / 1000); + data.last_announcement_seen[userId] = lastAnnouncementSeen; + setLocalStorageKey(lastAnnouncementSeen); MailPoet.Ajax.post({ api_version: window.mailpoet_api_version, endpoint: 'settings', diff --git a/lib/Config/Menu.php b/lib/Config/Menu.php index aa3e9789b7..54d21e287f 100644 --- a/lib/Config/Menu.php +++ b/lib/Config/Menu.php @@ -587,6 +587,7 @@ class Menu { $data['feature_announcement_has_news'] = empty($data['settings']['last_announcement_seen'][$user_id]) || $data['settings']['last_announcement_seen'][$user_id] < strtotime(self::LAST_ANNOUNCEMENT_DATE); $data['last_announcement_seen'] = isset($data['settings']['last_announcement_seen']) ? $data['settings']['last_announcement_seen'] : false; + $data['last_announcement_date'] = strtotime(self::LAST_ANNOUNCEMENT_DATE); $data['automatic_emails'] = array( array( diff --git a/views/newsletters.html b/views/newsletters.html index c8314c0f81..db01352525 100644 --- a/views/newsletters.html +++ b/views/newsletters.html @@ -25,6 +25,7 @@ var mailpoet_automatic_emails = <%= json_encode(automatic_emails) %>; var mailpoet_feature_announcement_has_news = <%= json_encode(feature_announcement_has_news) %>; var mailpoet_last_announcement_seen = <%= json_encode(last_announcement_seen) %>; + var mailpoet_last_announcement_date = <%= json_encode(last_announcement_date) %>; var mailpoet_user_locale = '<%= get_locale() %>'; var mailpoet_in_app_announcements = mailpoet_settings.in_app_announcements; var mailpoet_free_welcome_emails_image = '<%= cdn_url('in-app-announcements/hello-illustration-for-welcome-emails.20181121-1440.png') %>';