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

253 lines
5.5 KiB
JavaScript
Raw Normal View History

2016-05-20 02:22:56 +08:00
import Users from '/imports/api/users';
2016-06-30 22:45:19 +08:00
import Chat from '/imports/api/chat';
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';
import { EMOJI_STATUSES } from '/imports/utils/statuses.js';
2016-06-28 21:10:20 +08:00
import { callServer } from '/imports/ui/services/api';
2016-06-07 00:45:30 +08:00
const CHAT_CONFIG = Meteor.settings.public.chat;
const USER_CONFIG = Meteor.settings.public.user;
const ROLE_MODERATOR = USER_CONFIG.role_moderator;
const PRIVATE_CHAT_TYPE = CHAT_CONFIG.type_private;
2016-06-07 00:45:30 +08:00
/* TODO: Same map is done in the chat/service we should share this someway */
2016-06-28 21:10:20 +08:00
const mapUser = user => ({
2016-06-07 00:45:30 +08:00
id: user.userid,
name: user.name,
emoji: {
status: user.emoji_status,
changedAt: user.set_emoji_time,
},
2016-06-07 00:45:30 +08:00
isPresenter: user.presenter,
isModerator: user.role === ROLE_MODERATOR,
isCurrent: user.userid === Auth.userID,
2016-06-07 00:45:30 +08:00
isVoiceUser: user.voiceUser.joined,
isMuted: user.voiceUser.muted,
2016-11-22 23:06:54 +08:00
isTalking: user.voiceUser.talking,
2016-06-07 00:45:30 +08:00
isListenOnly: user.listenOnly,
isSharingWebcam: user.webcam_stream.length,
2016-06-07 21:58:51 +08:00
isPhoneUser: user.phone_user,
isLoggedOut: !user ? true : false,
2016-06-07 00:45:30 +08:00
});
2016-06-28 21:10:20 +08:00
const mapOpenChats = chat => {
let currentUserId = Auth.userID;
return chat.message.from_userid !== Auth.userID
2016-06-28 21:10:20 +08:00
? chat.message.from_userid
: chat.message.to_userid;
};
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) => {
if ((EMOJI_STATUSES.indexOf(a.emoji.status) > -1)
&& (EMOJI_STATUSES.indexOf(b.emoji.status) > -1)) {
if (a.emoji.changedAt < b.emoji.changedAt) {
return -1;
} else if (a.emoji.changedAt > b.emoji.changedAt) {
return 1;
}
2016-06-07 21:58:51 +08:00
return sortUsersByName(a, b);
} else if (EMOJI_STATUSES.indexOf(a.emoji.status) > -1) {
2016-06-07 00:45:30 +08:00
return -1;
} else if (EMOJI_STATUSES.indexOf(b.emoji.status) > -1) {
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 sortChats = (a, b) => {
let sort = sortChatsByIcon(a, b);
if (sort === 0) {
sort = sortChatsByName(a, b);
}
return sort;
};
const userFindSorting = {
'user.set_emoji_time': 1,
'user.role': 1,
'user.phone_user': 1,
'user._sort_name': 1,
'user.userid': 1,
};
2016-06-07 00:45:30 +08:00
const getUsers = () => {
let users = Users
2016-06-28 21:10:20 +08:00
.find({}, userFindSorting)
2016-06-07 00:45:30 +08:00
.fetch();
return users
.map(u => u.user)
.map(mapUser)
.sort(sortUsers);
2016-05-31 19:29:38 +08:00
};
2016-05-20 02:22:56 +08:00
2016-06-30 22:45:19 +08:00
const getOpenChats = chatID => {
2016-06-29 03:52:03 +08:00
window.Users = Users;
2016-06-28 21:10:20 +08:00
let openChats = Chat
.find({ 'message.chat_type': PRIVATE_CHAT_TYPE })
.fetch()
.map(mapOpenChats);
let currentUserId = Auth.userID;
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
.find({ 'user.userid': { $in: openChats } })
.map(u => u.user)
2016-07-11 20:34:58 +08:00
.map(mapUser)
.map(op => {
op.unreadCounter = UnreadMessages.count(op.id);
return op;
});
2016-06-28 21:10:20 +08:00
openChats.push({
id: 'public',
name: 'Public Chat',
icon: 'group-chat',
2016-07-11 20:34:58 +08:00
unreadCounter: UnreadMessages.count('public_chat_userid'),
2016-06-28 21:10:20 +08:00
});
return openChats
.sort(sortChats);
};
getCurrentUser = () => {
let currentUserId = Auth.userID;
2016-07-06 00:54:45 +08:00
let currentUser = Users.findOne({ 'user.userid': currentUserId });
2016-06-28 21:10:20 +08:00
2016-07-06 00:54:45 +08:00
return (currentUser) ? mapUser(currentUser.user) : null;
2016-06-28 21:10:20 +08:00
};
const userActions = {
openChat: {
label: 'Chat',
handler: (router, user) => router.push(`/users/chat/${user.id}`),
icon: 'chat',
},
clearStatus: {
label: 'Clear Status',
2017-01-21 04:13:14 +08:00
handler: user => callServer('userSetEmoji', user.id, 'none'),
icon: 'clear-status',
},
setPresenter: {
label: 'Make Presenter',
2017-02-02 00:47:39 +08:00
handler: user => callServer('setUserPresenter', user.id, user.name),
icon: 'presentation',
},
kick: {
label: 'Kick User',
2017-02-02 00:47:39 +08:00
handler: user => callServer('kickUser', user.id),
icon: 'kick-user',
},
mute: {
label: 'Mute Audio',
2017-02-02 03:14:32 +08:00
handler: user=> callServer('muteUser', user.id),
icon: 'mute',
},
unmute: {
label: 'Unmute Audio',
2017-02-02 03:14:32 +08:00
handler: user=> callServer('unmuteUser', user.id),
icon: 'unmute',
},
2016-06-28 21:10:20 +08:00
};
export default {
2016-06-07 00:45:30 +08:00
getUsers,
2016-06-28 21:10:20 +08:00
getOpenChats,
getCurrentUser,
userActions,
};