The communications platform that puts data protection first.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
Rocket.Chat/apps/meteor/client/startup/unread.ts

90 lines
2.3 KiB

import type { ISubscription } from '@rocket.chat/core-typings';
import { manageFavicon } from '@rocket.chat/favicon';
import { Meteor } from 'meteor/meteor';
import { Session } from 'meteor/session';
import { Tracker } from 'meteor/tracker';
import { ChatSubscription, ChatRoom } from '../../app/models/client';
import { settings } from '../../app/settings/client';
import { getUserPreference } from '../../app/utils/client';
import { fireGlobalEvent } from '../lib/utils/fireGlobalEvent';
const fetchSubscriptions = (): ISubscription[] =>
ChatSubscription.find(
{
open: true,
hideUnreadStatus: { $ne: true },
archived: { $ne: true },
},
{
fields: {
unread: 1,
alert: 1,
rid: 1,
t: 1,
name: 1,
ls: 1,
unreadAlert: 1,
fname: 1,
prid: 1,
},
},
).fetch();
Meteor.startup(() => {
Tracker.autorun(() => {
const userUnreadAlert = getUserPreference(Meteor.userId(), 'unreadAlert');
let unreadAlert: false | '•' = false;
const unreadCount = fetchSubscriptions().reduce(
(ret, subscription) =>
Tracker.nonreactive(() => {
const room = ChatRoom.findOne({ _id: subscription.rid }, { fields: { usersCount: 1 } });
fireGlobalEvent('unread-changed-by-subscription', {
...subscription,
usersCount: room?.usersCount,
});
if (subscription.alert || subscription.unread > 0) {
// Increment the total unread count.
if (subscription.alert === true && subscription.unreadAlert !== 'nothing') {
if (subscription.unreadAlert === 'all' || userUnreadAlert !== false) {
unreadAlert = '•';
}
}
return ret + subscription.unread;
}
return ret;
}),
0,
);
if (unreadCount > 0) {
if (unreadCount > 999) {
Session.set('unread', '999+');
} else {
Session.set('unread', unreadCount);
}
} else if (unreadAlert !== false) {
Session.set('unread', unreadAlert);
} else {
Session.set('unread', '');
}
});
});
Meteor.startup(() => {
const updateFavicon = manageFavicon();
Tracker.autorun(() => {
const siteName = settings.get('Site_Name') ?? '';
const unread = Session.get('unread');
fireGlobalEvent('unread-changed', unread);
updateFavicon(unread);
document.title = unread === '' ? siteName : `(${unread}) ${siteName}`;
});
});