-
Notifications
You must be signed in to change notification settings - Fork 15
/
chatSelectors.js
86 lines (73 loc) · 2.72 KB
/
chatSelectors.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
import { createSelector, createStructuredSelector } from 'reselect';
import mapValues from 'just-map-values';
import parseChatMarkup from 'u-wave-parse-chat-markup';
import { getAvailableGroupMentions } from '../utils/chatMentions';
import {
availableEmojiNamesSelector,
availableEmojiImagesSelector,
} from './configSelectors';
import {
usersSelector,
currentUserSelector,
currentUserHasRoleSelector,
createRoleCheckSelector,
} from './userSelectors';
import { notificationSettingsSelector } from './settingSelectors';
const baseSelector = (state) => state.chat;
export const rawMotdSelector = createSelector(baseSelector, (chat) => chat.motd);
export const motdSelector = createSelector(
rawMotdSelector,
(motd) => (motd ? parseChatMarkup(motd) : null),
);
const MAX_MESSAGES = 500;
const allMessagesSelector = createSelector(baseSelector, (chat) => chat.messages);
const filteredMessagesSelector = createSelector(
allMessagesSelector,
notificationSettingsSelector,
(messages, notificationSettings) => messages.filter((message) => {
if (message.type === 'userJoin') return notificationSettings.userJoin;
if (message.type === 'userLeave') return notificationSettings.userLeave;
if (message.type === 'userNameChanged') return notificationSettings.userNameChanged;
if (message.type === 'skip') return notificationSettings.skip;
return true;
}),
);
export const messagesSelector = createSelector(
filteredMessagesSelector,
(messages) => messages.slice(-MAX_MESSAGES),
);
export const markupCompilerOptionsSelector = createStructuredSelector({
availableEmoji: availableEmojiNamesSelector,
emojiImages: availableEmojiImagesSelector,
});
const mutesSelector = createSelector(baseSelector, (chat) => chat.mutedUsers);
export const muteTimeoutsSelector = createSelector(
mutesSelector,
(mutes) => mapValues(mutes, (mute) => mute.expirationTimer),
);
export const mutedUserIDsSelector = createSelector(
mutesSelector,
(mutes) => Object.keys(mutes),
);
export const mutedUsersSelector = createSelector(
mutedUserIDsSelector,
usersSelector,
(mutedIDs, users) => mutedIDs.map((userID) => users[userID]),
);
export const currentUserMuteSelector = createSelector(
currentUserSelector,
mutesSelector,
(user, mutes) => (user ? mutes[user._id] : null),
);
export const availableGroupMentionsSelector = createSelector(
currentUserHasRoleSelector,
(hasRole) => getAvailableGroupMentions((mention) => hasRole(`chat.mention.${mention}`)),
);
export const emojiCompletionsSelector = createSelector(
availableEmojiImagesSelector,
(images) => Object.keys(images).map((name) => ({
shortcode: name,
image: images[name],
})),
);
export const canDeleteMessagesSelector = createRoleCheckSelector('chat.delete');