Fix getReactForStatus(), upgrade immutable.js

This commit is contained in:
Alex Gleason 2020-05-22 17:45:18 -05:00
parent bf1f744b99
commit c0fe85ca29
No known key found for this signature in database
GPG Key ID: 7211D1F99744FBB7
4 changed files with 40 additions and 37 deletions

View File

@ -53,38 +53,39 @@ describe('sortEmoji', () => {
describe('mergeEmojiFavourites', () => { describe('mergeEmojiFavourites', () => {
const favouritesCount = 12; const favouritesCount = 12;
const favourited = true;
describe('with existing 👍 reacts', () => { describe('with existing 👍 reacts', () => {
const emojiReacts = fromJS([ const emojiReacts = fromJS([
{ 'count': 20, 'me': true, 'name': '👍' }, { 'count': 20, 'me': false, 'name': '👍' },
{ 'count': 15, 'me': true, 'name': '❤' }, { 'count': 15, 'me': false, 'name': '❤' },
{ 'count': 7, 'me': true, 'name': '😯' }, { 'count': 7, 'me': false, 'name': '😯' },
]); ]);
it('combines 👍 reacts with favourites', () => { it('combines 👍 reacts with favourites', () => {
expect(mergeEmojiFavourites(emojiReacts, favouritesCount)).toEqual(fromJS([ expect(mergeEmojiFavourites(emojiReacts, favouritesCount, favourited)).toEqual(fromJS([
{ 'count': 32, 'me': true, 'name': '👍' }, { 'count': 32, 'me': true, 'name': '👍' },
{ 'count': 15, 'me': true, 'name': '❤' }, { 'count': 15, 'me': false, 'name': '❤' },
{ 'count': 7, 'me': true, 'name': '😯' }, { 'count': 7, 'me': false, 'name': '😯' },
])); ]));
}); });
}); });
describe('without existing 👍 reacts', () => { describe('without existing 👍 reacts', () => {
const emojiReacts = fromJS([ const emojiReacts = fromJS([
{ 'count': 15, 'me': true, 'name': '❤' }, { 'count': 15, 'me': false, 'name': '❤' },
{ 'count': 7, 'me': true, 'name': '😯' }, { 'count': 7, 'me': false, 'name': '😯' },
]); ]);
it('adds 👍 reacts to the map equaling favourite count', () => { it('adds 👍 reacts to the map equaling favourite count', () => {
expect(mergeEmojiFavourites(emojiReacts, favouritesCount)).toEqual(fromJS([ expect(mergeEmojiFavourites(emojiReacts, favouritesCount, favourited)).toEqual(fromJS([
{ 'count': 15, 'me': true, 'name': '❤' }, { 'count': 15, 'me': false, 'name': '❤' },
{ 'count': 7, 'me': true, 'name': '😯' }, { 'count': 7, 'me': false, 'name': '😯' },
{ 'count': 12, 'me': false, 'name': '👍' }, { 'count': 12, 'me': true, 'name': '👍' },
])); ]));
}); });
it('does not add 👍 reacts when there are no favourites', () => { it('does not add 👍 reacts when there are no favourites', () => {
expect(mergeEmojiFavourites(emojiReacts, 0)).toEqual(fromJS([ expect(mergeEmojiFavourites(emojiReacts, 0, false)).toEqual(fromJS([
{ 'count': 15, 'me': true, 'name': '❤' }, { 'count': 15, 'me': false, 'name': '❤' },
{ 'count': 7, 'me': true, 'name': '😯' }, { 'count': 7, 'me': false, 'name': '😯' },
])); ]));
}); });
}); });
@ -105,7 +106,7 @@ describe('reduceEmoji', () => {
{ 'count': 1, 'me': false, 'name': '🍩' }, { 'count': 1, 'me': false, 'name': '🍩' },
]); ]);
it('sorts, filters, and combines emoji and favourites', () => { it('sorts, filters, and combines emoji and favourites', () => {
expect(reduceEmoji(emojiReacts, 7, '1')).toEqual(fromJS([ expect(reduceEmoji(emojiReacts, 7, true)).toEqual(fromJS([
{ 'count': 27, 'me': true, 'name': '👍' }, { 'count': 27, 'me': true, 'name': '👍' },
{ 'count': 15, 'me': true, 'name': '❤' }, { 'count': 15, 'me': true, 'name': '❤' },
{ 'count': 7, 'me': true, 'name': '😯' }, { 'count': 7, 'me': true, 'name': '😯' },
@ -150,7 +151,7 @@ describe('getReactForStatus', () => {
}); });
it('returns a thumbs-up for a favourite', () => { it('returns a thumbs-up for a favourite', () => {
const status = fromJS({ favourited: true }); const status = fromJS({ favourites_count: 1, favourited: true });
expect(getReactForStatus(status)).toEqual('👍'); expect(getReactForStatus(status)).toEqual('👍');
}); });
}); });

View File

@ -21,15 +21,17 @@ export const mergeEmoji = emojiReacts => (
emojiReacts // TODO: Merge similar emoji emojiReacts // TODO: Merge similar emoji
); );
export const mergeEmojiFavourites = (emojiReacts, favouritesCount) => { export const mergeEmojiFavourites = (emojiReacts, favouritesCount, favourited) => {
if (!favouritesCount) return emojiReacts; if (!favouritesCount) return emojiReacts;
const likeIndex = emojiReacts.findIndex(emojiReact => const likeIndex = emojiReacts.findIndex(emojiReact => emojiReact.get('name') === '👍');
emojiReact.get('name') === '👍');
if (likeIndex > -1) { if (likeIndex > -1) {
const likeCount = emojiReacts.getIn([likeIndex, 'count']); const likeCount = emojiReacts.getIn([likeIndex, 'count']);
return emojiReacts.setIn([likeIndex, 'count'], likeCount + favouritesCount); favourited = favourited || emojiReacts.getIn([likeIndex, 'me'], false);
return emojiReacts
.setIn([likeIndex, 'count'], likeCount + favouritesCount)
.setIn([likeIndex, 'me'], favourited);
} else { } else {
return emojiReacts.push(ImmutableMap({ count: favouritesCount, me: false, name: '👍' })); return emojiReacts.push(ImmutableMap({ count: favouritesCount, me: favourited, name: '👍' }));
} }
}; };
@ -67,17 +69,17 @@ export const filterEmoji = emojiReacts => (
ALLOWED_EMOJI.includes(emojiReact.get('name')) ALLOWED_EMOJI.includes(emojiReact.get('name'))
))); )));
export const reduceEmoji = (emojiReacts, favouritesCount, me) => ( export const reduceEmoji = (emojiReacts, favouritesCount, favourited) => (
filterEmoji(sortEmoji(mergeEmoji(mergeEmojiFavourites( filterEmoji(sortEmoji(mergeEmoji(mergeEmojiFavourites(
emojiReacts, favouritesCount emojiReacts, favouritesCount, favourited
))))); )))));
export const getReactForStatus = status => { export const getReactForStatus = status => {
const emojiReacts = status.getIn(['pleroma', 'emoji_reactions'], ImmutableList()); return reduceEmoji(
const emojiReact = emojiReacts.reduce((acc, cur) => { status.getIn(['pleroma', 'emoji_reactions'], ImmutableList()),
if (acc) return acc; status.get('favourites_count'),
if (cur.get('me') === true) return cur.get('name'); status.get('favourited')
return acc; ).filter(e => e.get('me'))
}, undefined); .first(ImmutableMap())
return emojiReact ? emojiReact : status.get('favourited') && '👍'; .get('name');
}; };

View File

@ -74,7 +74,7 @@
"html-webpack-harddisk-plugin": "^1.0.1", "html-webpack-harddisk-plugin": "^1.0.1",
"html-webpack-plugin": "^4.3.0", "html-webpack-plugin": "^4.3.0",
"http-link-header": "^1.0.2", "http-link-header": "^1.0.2",
"immutable": "^3.8.2", "immutable": "^4.0.0-rc.12",
"imports-loader": "^0.8.0", "imports-loader": "^0.8.0",
"intersection-observer": "^0.7.0", "intersection-observer": "^0.7.0",
"intl": "^1.2.5", "intl": "^1.2.5",

View File

@ -5167,10 +5167,10 @@ ignore@^4.0.6:
resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
immutable@^3.8.2: immutable@^4.0.0-rc.12:
version "3.8.2" version "4.0.0-rc.12"
resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0-rc.12.tgz#ca59a7e4c19ae8d9bf74a97bdf0f6e2f2a5d0217"
integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM= integrity sha512-0M2XxkZLx/mi3t8NVwIm1g8nHoEmM9p9UBl/G9k4+hm0kBgOVdMV/B3CY5dQ8qG8qc80NN4gDV4HQv6FTJ5q7A==
import-cwd@^2.0.0: import-cwd@^2.0.0:
version "2.1.0" version "2.1.0"