This repository has been archived on 2023-03-18. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
osr-discourse-src/app/assets/javascripts/discourse/initializers/subscribe-user-notifications.js.es6
T
Robin Ward f5d391a48a REFACTOR: Move app-events:main to service:app-events (#8152)
AppEvents was always a service object in disguise, so we should move it
to the correct place in the application. Doing this allows other service
objects to inject it easily without container access.

In the future we should also deprecate `this.appEvents` without an
explicit injection too.
2019-10-04 10:06:08 -04:00

142 lines
4.6 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("service:app-events");
if (user) {
bus.subscribe("/reviewable_counts", data => {
user.set("reviewable_count", data.reviewable_count);
});
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");
if (
site.mobileView &&
(data.unread_notifications - oldUnread > 0 ||
data.unread_private_messages - oldPM > 0)
) {
appEvents.trigger("header:update-topic", null, 5000);
}
}
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,
Ember.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 => {
(data.categories || []).forEach(c => site.updateCategory(c));
(data.deleted_categories || []).forEach(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(user, site.mobileView, router, appEvents);
} else {
unsubscribePushNotifications(user);
}
}
}
}
};