Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

GH-1071 - Remove cap on showing of banners #74

Merged
merged 5 commits into from May 23, 2018
Merged
Changes from all commits
Commits
File filter
Filter file types
Jump to
Jump to file
Failed to load files.

Always

Just for now

@@ -49,13 +49,13 @@ const Notifications = (props) => {
</div>
<div className="s-option-group">
<div className="s-square-checkbox">
<input type="checkbox" id="settings-show-reload-banner" name="reload_banner_status" defaultChecked={settingsData.reload_banner_status.show} onClick={props.toggleCheckbox} />
<input type="checkbox" id="settings-show-reload-banner" name="reload_banner_status" defaultChecked={settingsData.reload_banner_status} onClick={props.toggleCheckbox} />
<label id="settings-show-reload-banner-label" htmlFor="settings-show-reload-banner">{ t('settings_show_reload_banner') }</label>
</div>
</div>
<div className="s-option-group">
<div className="s-square-checkbox">
<input type="checkbox" id="settings-show-trackers-banner" name="trackers_banner_status" defaultChecked={settingsData.trackers_banner_status.show} onClick={props.toggleCheckbox} />
<input type="checkbox" id="settings-show-trackers-banner" name="trackers_banner_status" defaultChecked={settingsData.trackers_banner_status} onClick={props.toggleCheckbox} />
<label id="settings-show-trackers-banner-label" htmlFor="settings-show-trackers-banner">{ t('settings_show_trackers_banner') }</label>
</div>
</div>
@@ -45,14 +45,8 @@ const initialState = {
notificationFilter: '', // compatibility/slow tracker/success message
notificationText: '',
notificationShown: false,
reload_banner_status: {
dismissals: [],
show: true,
},
trackers_banner_status: {
dismissals: [],
show: true,
},
reload_banner_status: true,
trackers_banner_status: true,
};
/**
* Default export for panel view reducer. Handles actions
@@ -181,9 +175,6 @@ export default (state = initialState, action) => {
const _showNotification = (state, action) => {
const msg = action.data;
const { reload } = msg;
const trackersBannerStatus = Object.assign({ ...state.trackers_banner_status, dismissals: [...state.trackers_banner_status.dismissals] });
const reloadBannerStatus = Object.assign({ ...state.reload_banner_status, dismissals: [...state.reload_banner_status.dismissals] });
const nowTime = Number(new Date().getTime());

let updated_notificationClasses = state.notificationClasses;
let updated_notificationShown = state.notificationShown;
@@ -212,7 +203,7 @@ const _showNotification = (state, action) => {
sendMessage('setPanelData', { needsReload: updated_needsReload });

// if we have changes and the user wants to see banners, then show
if ((msg.text || Object.keys(updated_needsReload.changes).length > 0) && reloadBannerStatus.show && nowTime > reloadBannerStatus.show_time) {
if ((msg.text || Object.keys(updated_needsReload.changes).length > 0) && state.reload_banner_status) {
updated_notificationShown = true;
} else {
updated_notificationShown = false;
@@ -221,7 +212,7 @@ const _showNotification = (state, action) => {
updated_notificationClasses = msg.classes || 'warning';
} else {
// Notification banners (success/warnings)
if (trackersBannerStatus.show && nowTime > trackersBannerStatus.show_time) {
if (state.trackers_banner_status) {
updated_notificationShown = true;
} else {
updated_notificationShown = false;
@@ -242,73 +233,19 @@ const _showNotification = (state, action) => {
};

/**
* Dismiss notification banners. Update the 'reload_banner_status' and
* 'trackers_banner_status' properties. If banners are dismissed BANNERS_ALLOWED times,
* within BANNER_INTERVAL, they will not be shown again for BANNERS_BANNED_TIME. Persist the change.
* Dismiss notification banners. Update notificationShown
* @memberOf PanelReactReducers
* @private
* @param {Object} state current state
* @param {Object} action action which contains data
* @return {Object} notification parameters
*/
const _closeNotification = (state, action) => {
const { banner_status_name } = action.data;
const BANNER_INTERVAL = 3600000; // one hour
const BANNERS_ALLOWED = 3;
const BANNERS_BANNED_TIME = 604800000; // one week

if (banner_status_name === 'temp_banner_status') {
return {
notificationShown: false,
};
}

// deep clone nested dismissals[]
let banner_status = { ...state[banner_status_name], dismissals: [...state[banner_status_name].dismissals] };

// show_time becomes 0 if it was set explicitly through Settinns or Setting page,
// or came through Sync which delivered choice different from default value
if (!banner_status.show_time) {
return false;
}

const { dismissals } = banner_status;
const lastDismissal = Number(new Date().getTime());

dismissals.push(lastDismissal);
let firstDismissal = dismissals[0];

while (lastDismissal > firstDismissal + BANNER_INTERVAL) {
dismissals.shift();
// eslint-disable-next-line prefer-destructuring
firstDismissal = dismissals[0];
}

if (dismissals.length >= BANNERS_ALLOWED) {
banner_status = {
show_time: lastDismissal + BANNERS_BANNED_TIME,
dismissals: [],
show: false,
};
} else {
banner_status = {
show_time: lastDismissal,
dismissals,
show: true,
};
}

// persist to background
sendMessage('setPanelData', { [banner_status_name]: banner_status });

return {
[banner_status_name]: banner_status,
notificationShown: false,
};
};
const _closeNotification = (state, action) => ({
notificationShown: false
});

/**
* Set the 'show' property on reload_banner_status and trackers_banner_status. Update from
* Update reload_banner_status and trackers_banner_status from
* Settings > Notifications. Persist the change.
* @memberOf PanelReactReducers
* @private
@@ -318,11 +255,8 @@ const _closeNotification = (state, action) => {
* @return {Object} notification parameter
*/
const _updateNotificationStatus = (state, action) => {
const msg = action.data;
const banner_status_name = msg.event;
// deep clone nested dismissals[] and update 'show'
const banner_status = { ...state[banner_status_name], dismissals: [...state[banner_status_name].dismissals], show: msg.checked };

const banner_status = action.data.checked;
const banner_status_name = action.data.event;
// persist to background
sendMessage('setPanelData', { [banner_status_name]: banner_status });

@@ -75,6 +75,15 @@ const handler = {
}
}

// Adjust banner statuses, as they used to be objects
// while now they are booleans. This filter covers syncing.
if (key === 'reload_banner_status' ||
key === 'trackers_banner_status') {
if (value && (typeof value === 'object')) {
value = !!value.show;
}
}

target[key] = value;

// Don't save to storage while background::init() called.
@@ -77,6 +77,22 @@ class ConfData {
_setProp('previous_version', this.previous_version);
}

// Transfer legacy banner statuses which used to be objects
const { reload_banner_status, trackers_banner_status } = data;
if (reload_banner_status && typeof reload_banner_status === 'object') {
this.reload_banner_status = !!reload_banner_status.show;
_setProp('reload_banner_status', this.reload_banner_status);
} else {
_initProperty('reload_banner_status', true);
}

if (trackers_banner_status && typeof trackers_banner_status === 'object') {
this.trackers_banner_status = !!trackers_banner_status.show;
_setProp('trackers_banner_status', this.trackers_banner_status);
} else {
_initProperty('trackers_banner_status', true);
}

// simple props
_initProperty('alert_bubble_pos', 'br');
_initProperty('alert_bubble_timeout', 15);
@@ -138,16 +154,6 @@ class ConfData {
decoded_user_token: {},
is_validated: false
});
_initProperty('reload_banner_status', {
dismissals: [],
show_time: nowTime,
show: true
});
_initProperty('trackers_banner_status', {
dismissals: [],
show_time: nowTime,
show: true
});
});
}

ProTip! Use n and p to navigate between commits in a pull request.