This repository has been archived on 2023-03-18. You can view files and clone it, but cannot push or open issues or pull requests.
osr-discourse-src/app/assets/javascripts/discourse/initializers/subscribe-user-notifications.js.es6
Jeff Wong 91b31860a1
Feature: Push notifications for Android (#5792)
* Feature: Push notifications for Android

Notification config for desktop and mobile are merged.

Desktop notifications stay as they are for desktop views.

If mobile mode, push notifications are enabled.

Added push notification subscriptions in their own table, rather than through
custom fields.

Notification banner prompts appear for both mobile and desktop when enabled.
2018-05-04 15:31:48 -07:00

120 lines
4.1 KiB
JavaScript

// Subscribes to user events on the message bus
import {
init as initDesktopNotifications,
onNotification,
alertChannel,
disable as disableDesktopNotifications,
} from 'discourse/lib/desktop-notifications';
import {
register as registerPushNotifications,
unsubscribe as unsubscribePushNotifications,
isPushNotificationsEnabled
} from 'discourse/lib/push-notifications';
export default {
name: 'subscribe-user-notifications',
after: 'message-bus',
initialize(container) {
const user = container.lookup('current-user:main');
const bus = container.lookup('message-bus:main');
const appEvents = container.lookup('app-events:main');
if (user) {
if (user.get('staff')) {
bus.subscribe('/flagged_counts', data => {
user.set('site_flagged_posts_count', data.total);
});
bus.subscribe('/queue_counts', data => {
user.set('post_queue_new_count', data.post_queue_new_count);
if (data.post_queue_new_count > 0) {
user.set('show_queued_posts', 1);
}
});
}
bus.subscribe(`/notification/${user.get('id')}`, data => {
const store = container.lookup('service:store');
const oldUnread = user.get('unread_notifications');
const oldPM = user.get('unread_private_messages');
user.setProperties({
unread_notifications: data.unread_notifications,
unread_private_messages: data.unread_private_messages,
read_first_notification: data.read_first_notification
});
if (oldUnread !== data.unread_notifications || oldPM !== data.unread_private_messages) {
appEvents.trigger('notifications:changed');
}
const stale = store.findStale('notification', {}, {cacheKey: 'recent-notifications'});
const lastNotification = data.last_notification && data.last_notification.notification;
if (stale && stale.hasResults && lastNotification) {
const oldNotifications = stale.results.get('content');
const staleIndex = _.findIndex(oldNotifications, {id: lastNotification.id});
if (staleIndex === -1) {
// this gets a bit tricky, unread pms are bumped to front
let insertPosition = 0;
if (lastNotification.notification_type !== 6) {
insertPosition = _.findIndex(oldNotifications, n => n.notification_type !== 6 || n.read);
insertPosition = insertPosition === -1 ? oldNotifications.length - 1 : insertPosition;
}
oldNotifications.insertAt(insertPosition, Em.Object.create(lastNotification));
}
for (let idx=0; idx < data.recent.length; idx++) {
let old;
while(old = oldNotifications[idx]) {
const info = data.recent[idx];
if (old.get('id') !== info[0]) {
oldNotifications.removeAt(idx);
} else {
if (old.get('read') !== info[1]) {
old.set('read', info[1]);
}
break;
}
}
if (!old) { break; }
}
}
}, user.notification_channel_position);
const site = container.lookup('site:main');
const siteSettings = container.lookup('site-settings:main');
const router = container.lookup('router:main');
bus.subscribe("/categories", data => {
_.each(data.categories, c => site.updateCategory(c));
_.each(data.deleted_categories, id => site.removeCategory(id));
});
bus.subscribe("/client_settings", data => Ember.set(siteSettings, data.name, data.value));
bus.subscribe("/refresh_client", data => {
Discourse.set("assetVersion", data);
});
if (!Ember.testing) {
bus.subscribe(alertChannel(user), data => onNotification(data, user));
initDesktopNotifications(bus, appEvents);
if(isPushNotificationsEnabled(user, site.mobileView)) {
disableDesktopNotifications();
registerPushNotifications(Discourse.User.current(), site.mobileView, router, appEvents);
}
else {
unsubscribePushNotifications(user);
}
}
}
}
};