soapbox/app/gabsocial/utils/emoji_reacts.js

103 wiersze
2.9 KiB
JavaScript
Czysty Zwykły widok Historia

import {
Map as ImmutableMap,
List as ImmutableList,
} from 'immutable';
2020-05-20 16:46:49 +00:00
2020-05-23 04:29:30 +00:00
// https://emojipedia.org/facebook
// I've customized them.
2020-05-20 16:46:49 +00:00
export const ALLOWED_EMOJI = [
'👍',
2020-05-20 20:52:28 +00:00
'❤',
2020-05-23 05:04:25 +00:00
'😆',
2020-05-23 04:29:30 +00:00
'😮',
2020-05-20 16:46:49 +00:00
'😢',
2020-05-23 04:29:30 +00:00
'😩',
2020-05-20 16:46:49 +00:00
];
export const sortEmoji = emojiReacts => (
emojiReacts.sortBy(emojiReact => -emojiReact.get('count'))
);
export const mergeEmoji = emojiReacts => (
emojiReacts // TODO: Merge similar emoji
);
export const mergeEmojiFavourites = (emojiReacts, favouritesCount, favourited) => {
if (!favouritesCount) return emojiReacts;
const likeIndex = emojiReacts.findIndex(emojiReact => emojiReact.get('name') === '👍');
2020-05-20 16:46:49 +00:00
if (likeIndex > -1) {
const likeCount = emojiReacts.getIn([likeIndex, 'count']);
favourited = favourited || emojiReacts.getIn([likeIndex, 'me'], false);
return emojiReacts
.setIn([likeIndex, 'count'], likeCount + favouritesCount)
.setIn([likeIndex, 'me'], favourited);
2020-05-20 16:46:49 +00:00
} else {
return emojiReacts.push(ImmutableMap({ count: favouritesCount, me: favourited, name: '👍' }));
2020-05-20 16:46:49 +00:00
}
};
2020-05-22 19:08:38 +00:00
const hasMultiReactions = (emojiReacts, account) => (
emojiReacts.filter(
e => e.get('accounts').filter(
a => a.get('id') === account.get('id')
).count() > 0
).count() > 1
);
const inAccounts = (accounts, id) => (
accounts.filter(a => a.get('id') === id).count() > 0
);
export const oneEmojiPerAccount = (emojiReacts, me) => {
emojiReacts = emojiReacts.reverse();
2020-05-22 19:08:38 +00:00
return emojiReacts.reduce((acc, cur, idx) => {
const accounts = cur.get('accounts', ImmutableList())
.filter(a => !hasMultiReactions(acc, a));
return acc.set(idx, cur.merge({
accounts: accounts,
count: accounts.count(),
2020-05-22 20:42:57 +00:00
me: me ? inAccounts(accounts, me) : false,
2020-05-22 19:08:38 +00:00
}));
}, emojiReacts)
.filter(e => e.get('count') > 0)
.reverse();
2020-05-22 04:17:11 +00:00
};
export const filterEmoji = (emojiReacts, allowedEmoji=ALLOWED_EMOJI) => (
2020-05-20 16:46:49 +00:00
emojiReacts.filter(emojiReact => (
allowedEmoji.includes(emojiReact.get('name'))
2020-05-20 16:46:49 +00:00
)));
export const reduceEmoji = (emojiReacts, favouritesCount, favourited, allowedEmoji=ALLOWED_EMOJI) => (
filterEmoji(sortEmoji(mergeEmoji(mergeEmojiFavourites(
emojiReacts, favouritesCount, favourited
))), allowedEmoji));
2020-05-22 04:17:11 +00:00
export const getReactForStatus = status => {
return reduceEmoji(
status.getIn(['pleroma', 'emoji_reactions'], ImmutableList()),
status.get('favourites_count'),
status.get('favourited')
2020-05-22 23:44:24 +00:00
).filter(e => e.get('me') === true)
.getIn([0, 'name']);
2020-05-22 04:17:11 +00:00
};
2020-05-24 01:29:25 +00:00
export const simulateEmojiReact = (emojiReacts, emoji) => {
const idx = emojiReacts.findIndex(e => e.get('name') === emoji);
if (idx > -1) {
const emojiReact = emojiReacts.get(idx);
return emojiReacts.set(idx, emojiReact.merge({
count: emojiReact.get('count') + 1,
me: true,
}));
} else {
return emojiReacts.push(ImmutableMap({
count: 1,
me: true,
name: emoji,
}));
}
};