bigbluebutton-Github/bigbluebutton-html5/imports/ui/components/user-list/service.js

291 lines
7.0 KiB
JavaScript
Raw Normal View History

2017-06-29 01:16:04 +08:00
import Users from '/imports/api/2.0/users';
2017-07-12 20:42:16 +08:00
import Chat from '/imports/api/2.0/chat';
import Meetings from '/imports/api/2.0/meetings';
2016-07-07 20:50:32 +08:00
import Auth from '/imports/ui/services/auth';
2016-07-11 20:34:58 +08:00
import UnreadMessages from '/imports/ui/services/unread-messages';
2017-03-01 06:40:16 +08:00
import Storage from '/imports/ui/services/storage/session';
2017-08-01 21:10:12 +08:00
import mapUser from '/imports/ui/services/user/mapUser';
import { EMOJI_STATUSES, EMOJI_NORMALIZE } from '/imports/utils/statuses';
import { makeCall } from '/imports/ui/services/api';
2017-03-22 05:52:10 +08:00
import _ from 'lodash';
2016-06-07 00:45:30 +08:00
const CHAT_CONFIG = Meteor.settings.public.chat;
const PRIVATE_CHAT_TYPE = CHAT_CONFIG.type_private;
2017-07-13 04:15:50 +08:00
const PUBLIC_CHAT_USERID = CHAT_CONFIG.public_userid;
2016-06-07 00:45:30 +08:00
// session for closed chat list
const CLOSED_CHAT_LIST_KEY = 'closedChatList';
2017-06-03 03:25:02 +08:00
const mapOpenChats = (chat) => {
const currentUserId = Auth.userID;
2017-08-05 01:58:55 +08:00
return chat.fromUserId !== currentUserId
? chat.fromUserId
: chat.toUserId;
2016-06-28 21:10:20 +08:00
};
2016-06-07 21:58:51 +08:00
const sortUsersByName = (a, b) => {
if (a.name.toLowerCase() < b.name.toLowerCase()) {
2016-06-07 00:45:30 +08:00
return -1;
2016-06-07 21:58:51 +08:00
} else if (a.name.toLowerCase() > b.name.toLowerCase()) {
2016-06-07 00:45:30 +08:00
return 1;
2016-06-07 21:58:51 +08:00
} else if (a.id.toLowerCase() > b.id.toLowerCase()) {
2016-06-07 00:45:30 +08:00
return -1;
2016-06-07 21:58:51 +08:00
} else if (a.id.toLowerCase() < b.id.toLowerCase()) {
2016-06-07 00:45:30 +08:00
return 1;
2016-06-07 21:58:51 +08:00
}
return 0;
};
const sortUsersByEmoji = (a, b) => {
const emojiA = a in EMOJI_STATUSES ? EMOJI_STATUSES[a] : a;
const emojiB = b in EMOJI_STATUSES ? EMOJI_STATUSES[b] : b;
if (emojiA && emojiB) {
if (a.emoji.changedAt < b.emoji.changedAt) {
return -1;
} else if (a.emoji.changedAt > b.emoji.changedAt) {
return 1;
}
} else if (emojiA) {
2016-06-07 00:45:30 +08:00
return -1;
} else if (emojiB) {
2016-06-07 00:45:30 +08:00
return 1;
}
2016-06-07 21:58:51 +08:00
return 0;
};
const sortUsersByModerator = (a, b) => {
if (a.isModerator && b.isModerator) {
return sortUsersByEmoji(a, b);
2016-06-07 21:58:51 +08:00
} else if (a.isModerator) {
2016-06-07 00:45:30 +08:00
return -1;
2016-06-07 21:58:51 +08:00
} else if (b.isModerator) {
2016-06-07 00:45:30 +08:00
return 1;
2016-06-07 21:58:51 +08:00
}
return 0;
};
const sortUsersByPhoneUser = (a, b) => {
if (!a.isPhoneUser && !b.isPhoneUser) {
2016-06-07 21:58:51 +08:00
return sortUsersByName(a, b);
} else if (!a.isPhoneUser) {
2016-06-07 00:45:30 +08:00
return -1;
} else if (!b.isPhoneUser) {
2016-06-07 00:45:30 +08:00
return 1;
}
return 0;
};
2016-06-07 21:58:51 +08:00
const sortUsers = (a, b) => {
let sort = sortUsersByModerator(a, b);
2016-06-07 21:58:51 +08:00
if (sort === 0) {
sort = sortUsersByEmoji(a, b);
2016-06-07 21:58:51 +08:00
}
if (sort === 0) {
sort = sortUsersByPhoneUser(a, b);
}
if (sort === 0) {
sort = sortUsersByName(a, b);
}
return sort;
};
2016-06-28 21:10:20 +08:00
const sortChatsByName = (a, b) => {
if (a.name.toLowerCase() < b.name.toLowerCase()) {
return -1;
} else if (a.name.toLowerCase() > b.name.toLowerCase()) {
return 1;
} else if (a.id.toLowerCase() > b.id.toLowerCase()) {
return -1;
} else if (a.id.toLowerCase() < b.id.toLowerCase()) {
return 1;
}
return 0;
};
const sortChatsByIcon = (a, b) => {
if (a.icon && b.icon) {
return sortChatsByName(a, b);
} else if (a.icon) {
return -1;
} else if (b.icon) {
return 1;
}
return 0;
};
const isPublicChat = chat => (
chat.id === 'public'
);
2016-06-28 21:10:20 +08:00
const sortChats = (a, b) => {
let sort = sortChatsByIcon(a, b);
if (sort === 0) {
sort = sortChatsByName(a, b);
}
return sort;
};
const userFindSorting = {
2017-07-26 22:09:07 +08:00
emojiTime: 1,
role: 1,
phoneUser: 1,
sortName: 1,
userId: 1,
2016-06-28 21:10:20 +08:00
};
2016-06-07 00:45:30 +08:00
const getUsers = () => {
2017-06-03 03:25:02 +08:00
const users = Users
2017-07-26 22:09:07 +08:00
.find({ connectionStatus: 'online' }, userFindSorting)
2017-04-13 04:19:39 +08:00
.fetch();
2016-06-07 00:45:30 +08:00
return users
2017-04-13 04:19:39 +08:00
.map(mapUser)
.sort(sortUsers);
2016-05-31 19:29:38 +08:00
};
2016-05-20 02:22:56 +08:00
2017-06-03 03:25:02 +08:00
const getOpenChats = (chatID) => {
2016-06-28 21:10:20 +08:00
let openChats = Chat
2017-08-05 01:58:55 +08:00
.find({ type: PRIVATE_CHAT_TYPE })
2017-04-13 04:19:39 +08:00
.fetch()
.map(mapOpenChats);
2016-06-28 21:10:20 +08:00
2016-06-30 22:45:19 +08:00
if (chatID) {
openChats.push(chatID);
2016-06-28 21:10:20 +08:00
}
openChats = _.uniq(openChats);
openChats = Users
2017-07-26 22:09:07 +08:00
.find({ userId: { $in: openChats } })
2017-04-13 04:19:39 +08:00
.map(mapUser)
2017-06-03 03:25:02 +08:00
.map((op) => {
2017-07-12 21:18:26 +08:00
const openChat = op;
openChat.unreadCounter = UnreadMessages.count(op.id);
return openChat;
2017-04-13 04:19:39 +08:00
});
2017-03-01 06:40:16 +08:00
2017-06-03 03:25:02 +08:00
const currentClosedChats = Storage.getItem(CLOSED_CHAT_LIST_KEY) || [];
const filteredChatList = [];
2017-03-03 04:33:49 +08:00
openChats.forEach((op) => {
// When a new private chat message is received, ensure the conversation view is restored.
2017-03-03 04:33:49 +08:00
if (op.unreadCounter > 0) {
2017-03-22 05:52:10 +08:00
if (_.indexOf(currentClosedChats, op.id) > -1) {
Storage.setItem(CLOSED_CHAT_LIST_KEY, _.without(currentClosedChats, op.id));
}
2017-03-03 04:33:49 +08:00
}
2017-03-01 06:40:16 +08:00
2017-03-03 05:42:39 +08:00
// Compare openChats with session and push it into filteredChatList
// if one of the openChat is not in session.
// It will pass to openChats.
2017-03-22 05:52:10 +08:00
if (_.indexOf(currentClosedChats, op.id) < 0) {
2017-03-03 04:33:49 +08:00
filteredChatList.push(op);
2017-03-01 06:40:16 +08:00
}
2017-03-03 04:33:49 +08:00
});
openChats = filteredChatList;
2016-06-28 21:10:20 +08:00
openChats.push({
id: 'public',
name: 'Public Chat',
2017-03-02 09:03:02 +08:00
icon: 'group_chat',
2017-07-13 04:15:50 +08:00
unreadCounter: UnreadMessages.count(PUBLIC_CHAT_USERID),
2016-06-28 21:10:20 +08:00
});
return openChats
2017-04-13 04:19:39 +08:00
.sort(sortChats);
2016-06-28 21:10:20 +08:00
};
2017-08-16 22:56:31 +08:00
const getAvailableActions = (currentUser, user, router, isBreakoutRoom) => {
const hasAuthority = currentUser.isModerator || user.isCurrent;
const allowedToChatPrivately = !user.isCurrent;
const allowedToMuteAudio = hasAuthority && user.isVoiceUser && user.isMuted;
const allowedToUnmuteAudio = hasAuthority && user.isVoiceUser && !user.isMuted;
const allowedToResetStatus = hasAuthority && user.emoji.status !== EMOJI_STATUSES.none;
2017-08-16 22:56:31 +08:00
// if currentUser is a moderator, allow kicking other users
const allowedToKick = currentUser.isModerator && !user.isCurrent && !isBreakoutRoom;
const allowedToSetPresenter = currentUser.isModerator && !user.isPresenter;
const allowedToPromote = currentUser.isModerator && !user.isCurrent && !user.isModerator;
const allowedToDemote = currentUser.isModerator && !user.isCurrent && user.isModerator;
2017-08-16 22:56:31 +08:00
return {
allowedToChatPrivately,
allowedToMuteAudio,
allowedToUnmuteAudio,
allowedToResetStatus,
allowedToKick,
allowedToSetPresenter,
allowedToPromote,
allowedToDemote,
2017-08-16 22:56:31 +08:00
};
};
2017-07-12 21:18:26 +08:00
const getCurrentUser = () => {
2017-06-03 03:25:02 +08:00
const currentUserId = Auth.userID;
2017-07-26 22:09:07 +08:00
const currentUser = Users.findOne({ userId: currentUserId });
2016-06-28 21:10:20 +08:00
2017-07-26 22:09:07 +08:00
return (currentUser) ? mapUser(currentUser) : null;
2016-06-28 21:10:20 +08:00
};
const normalizeEmojiName = emoji => (
emoji in EMOJI_NORMALIZE ? EMOJI_NORMALIZE[emoji] : emoji
);
2017-08-16 22:56:31 +08:00
2017-09-07 02:32:29 +08:00
const isMeetingLocked = (id) => {
const meeting = Meetings.findOne({ meetingId: id });
2017-09-07 01:50:48 +08:00
let isLocked = false;
2017-09-11 21:42:56 +08:00
if (meeting.lockSettingsProp !== undefined) {
2017-09-07 03:57:24 +08:00
const lockSettings = meeting.lockSettingsProp;
if (lockSettings.disableCam
|| lockSettings.disableMic
|| lockSettings.disablePrivChat
|| lockSettings.disablePubChat) {
2017-09-07 03:57:24 +08:00
isLocked = true;
}
}
2017-09-07 01:50:48 +08:00
return isLocked;
};
const setEmojiStatus = (userId) => { makeCall('setEmojiStatus', userId, 'none'); };
const assignPresenter = (userId) => { makeCall('assignPresenter', userId); };
const kickUser = (userId) => { makeCall('kickUser', userId); };
const toggleVoice = (userId) => { makeCall('toggleVoice', userId); };
const changeRole = (userId, role) => { makeCall('changeRole', userId, role); };
export default {
setEmojiStatus,
assignPresenter,
kickUser,
toggleVoice,
changeRole,
2016-06-07 00:45:30 +08:00
getUsers,
2016-06-28 21:10:20 +08:00
getOpenChats,
getCurrentUser,
2017-08-16 22:56:31 +08:00
getAvailableActions,
normalizeEmojiName,
isMeetingLocked,
isPublicChat,
};