mirror of
https://github.com/codeninjasllc/discourse.git
synced 2024-11-27 17:46:05 -05:00
convert desktop notifications to use safe localStorage
This commit is contained in:
parent
cafff9bf01
commit
7c369ab2b7
2 changed files with 36 additions and 35 deletions
|
@ -1,22 +1,24 @@
|
|||
import computed from 'ember-addons/ember-computed-decorators';
|
||||
import KeyValueStore from 'discourse/lib/key-value-store';
|
||||
|
||||
const keyValueStore = new KeyValueStore("discourse_desktop_notifications_");
|
||||
|
||||
export default Ember.Component.extend({
|
||||
classNames: ['controls'],
|
||||
|
||||
@computed
|
||||
notificationsPermission() {
|
||||
if (this.get('isNotSupported')) return '';
|
||||
return Notification.permission;
|
||||
@computed("isNotSupported")
|
||||
notificationsPermission(isNotSupported) {
|
||||
return isNotSupported ? "" : Notification.permission;
|
||||
},
|
||||
|
||||
@computed
|
||||
notificationsDisabled: {
|
||||
set(value) {
|
||||
localStorage.setItem('notifications-disabled', value);
|
||||
return localStorage.getItem('notifications-disabled');
|
||||
keyValueStore.setItem('notifications-disabled', value);
|
||||
return keyValueStore.getItem('notifications-disabled');
|
||||
},
|
||||
get() {
|
||||
return localStorage.getItem('notifications-disabled');
|
||||
return keyValueStore.getItem('notifications-disabled');
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -25,44 +27,40 @@ export default Ember.Component.extend({
|
|||
return typeof window.Notification === "undefined";
|
||||
},
|
||||
|
||||
isDefaultPermission: function() {
|
||||
if (this.get('isNotSupported')) return false;
|
||||
@computed("isNotSupported", "notificationsPermission")
|
||||
isDefaultPermission(isNotSupported, notificationsPermission) {
|
||||
return isNotSupported ? false : notificationsPermission === "default";
|
||||
},
|
||||
|
||||
return Notification.permission === "default";
|
||||
}.property('isNotSupported', 'notificationsPermission'),
|
||||
@computed("isNotSupported", "notificationsPermission")
|
||||
isDeniedPermission(isNotSupported, notificationsPermission) {
|
||||
return isNotSupported ? false : notificationsPermission === "denied";
|
||||
},
|
||||
|
||||
isDeniedPermission: function() {
|
||||
if (this.get('isNotSupported')) return false;
|
||||
@computed("isNotSupported", "notificationsPermission")
|
||||
isGrantedPermission(isNotSupported, notificationsPermission) {
|
||||
return isNotSupported ? false : notificationsPermission === "granted";
|
||||
},
|
||||
|
||||
return Notification.permission === "denied";
|
||||
}.property('isNotSupported', 'notificationsPermission'),
|
||||
|
||||
isGrantedPermission: function() {
|
||||
if (this.get('isNotSupported')) return false;
|
||||
|
||||
return Notification.permission === "granted";
|
||||
}.property('isNotSupported', 'notificationsPermission'),
|
||||
|
||||
isEnabled: function() {
|
||||
if (!this.get('isGrantedPermission')) return false;
|
||||
|
||||
return !this.get('notificationsDisabled');
|
||||
}.property('isGrantedPermission', 'notificationsDisabled'),
|
||||
@computed("isGrantedPermission", "notificationsDisabled")
|
||||
isEnabled(isGrantedPermission, notificationsDisabled) {
|
||||
return isGrantedPermission ? !notificationsDisabled : false;
|
||||
},
|
||||
|
||||
actions: {
|
||||
requestPermission() {
|
||||
const self = this;
|
||||
Notification.requestPermission(function() {
|
||||
self.propertyDidChange('notificationsPermission');
|
||||
});
|
||||
Notification.requestPermission(() => this.propertyDidChange('notificationsPermission'));
|
||||
},
|
||||
|
||||
recheckPermission() {
|
||||
this.propertyDidChange('notificationsPermission');
|
||||
},
|
||||
|
||||
turnoff() {
|
||||
this.set('notificationsDisabled', 'disabled');
|
||||
this.propertyDidChange('notificationsPermission');
|
||||
},
|
||||
|
||||
turnon() {
|
||||
this.set('notificationsDisabled', '');
|
||||
this.propertyDidChange('notificationsPermission');
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
import DiscourseURL from 'discourse/lib/url';
|
||||
import PageTracker from 'discourse/lib/page-tracker';
|
||||
import KeyValueStore from 'discourse/lib/key-value-store';
|
||||
|
||||
let primaryTab = false;
|
||||
let liveEnabled = false;
|
||||
|
@ -10,6 +11,8 @@ let lastAction = -1;
|
|||
const focusTrackerKey = "focus-tracker";
|
||||
const idleThresholdTime = 1000 * 10; // 10 seconds
|
||||
|
||||
const keyValueStore = new KeyValueStore("discourse_desktop_notifications_");
|
||||
|
||||
// Called from an initializer
|
||||
function init(messageBus) {
|
||||
liveEnabled = false;
|
||||
|
@ -20,7 +23,7 @@ function init(messageBus) {
|
|||
}
|
||||
|
||||
try {
|
||||
localStorage.getItem(focusTrackerKey);
|
||||
keyValueStore.getItem(focusTrackerKey);
|
||||
} catch (e) {
|
||||
Em.Logger.info('Discourse desktop notifications are disabled - localStorage denied.');
|
||||
return;
|
||||
|
@ -66,7 +69,7 @@ function setupNotifications() {
|
|||
window.addEventListener("focus", function() {
|
||||
if (!primaryTab) {
|
||||
primaryTab = true;
|
||||
localStorage.setItem(focusTrackerKey, mbClientId);
|
||||
keyValueStore.setItem(focusTrackerKey, mbClientId);
|
||||
}
|
||||
});
|
||||
|
||||
|
@ -74,7 +77,7 @@ function setupNotifications() {
|
|||
primaryTab = false;
|
||||
} else {
|
||||
primaryTab = true;
|
||||
localStorage.setItem(focusTrackerKey, mbClientId);
|
||||
keyValueStore.setItem(focusTrackerKey, mbClientId);
|
||||
}
|
||||
|
||||
if (document) {
|
||||
|
@ -95,7 +98,7 @@ function onNotification(data) {
|
|||
if (!liveEnabled) { return; }
|
||||
if (!primaryTab) { return; }
|
||||
if (!isIdle()) { return; }
|
||||
if (localStorage.getItem('notifications-disabled')) { return; }
|
||||
if (keyValueStore.getItem('notifications-disabled')) { return; }
|
||||
|
||||
const notificationTitle = I18n.t(i18nKey(data.notification_type), {
|
||||
site_title: Discourse.SiteSettings.title,
|
||||
|
|
Loading…
Reference in a new issue