From c0fe85ca2999fc4453cfa901e0ea11eef0287ed6 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 22 May 2020 17:45:18 -0500 Subject: [PATCH] Fix getReactForStatus(), upgrade immutable.js --- .../utils/__tests__/emoji_reacts-test.js | 37 ++++++++++--------- app/gabsocial/utils/emoji_reacts.js | 30 ++++++++------- package.json | 2 +- yarn.lock | 8 ++-- 4 files changed, 40 insertions(+), 37 deletions(-) diff --git a/app/gabsocial/utils/__tests__/emoji_reacts-test.js b/app/gabsocial/utils/__tests__/emoji_reacts-test.js index e53c241cd..639e0795c 100644 --- a/app/gabsocial/utils/__tests__/emoji_reacts-test.js +++ b/app/gabsocial/utils/__tests__/emoji_reacts-test.js @@ -53,38 +53,39 @@ describe('sortEmoji', () => { describe('mergeEmojiFavourites', () => { const favouritesCount = 12; + const favourited = true; describe('with existing 👍 reacts', () => { const emojiReacts = fromJS([ - { 'count': 20, 'me': true, 'name': '👍' }, - { 'count': 15, 'me': true, 'name': '❤' }, - { 'count': 7, 'me': true, 'name': '😯' }, + { 'count': 20, 'me': false, 'name': '👍' }, + { 'count': 15, 'me': false, 'name': '❤' }, + { 'count': 7, 'me': false, 'name': '😯' }, ]); it('combines 👍 reacts with favourites', () => { - expect(mergeEmojiFavourites(emojiReacts, favouritesCount)).toEqual(fromJS([ - { 'count': 32, 'me': true, 'name': '👍' }, - { 'count': 15, 'me': true, 'name': '❤' }, - { 'count': 7, 'me': true, 'name': '😯' }, + expect(mergeEmojiFavourites(emojiReacts, favouritesCount, favourited)).toEqual(fromJS([ + { 'count': 32, 'me': true, 'name': '👍' }, + { 'count': 15, 'me': false, 'name': '❤' }, + { 'count': 7, 'me': false, 'name': '😯' }, ])); }); }); describe('without existing 👍 reacts', () => { const emojiReacts = fromJS([ - { 'count': 15, 'me': true, 'name': '❤' }, - { 'count': 7, 'me': true, 'name': '😯' }, + { 'count': 15, 'me': false, 'name': '❤' }, + { 'count': 7, 'me': false, 'name': '😯' }, ]); it('adds 👍 reacts to the map equaling favourite count', () => { - expect(mergeEmojiFavourites(emojiReacts, favouritesCount)).toEqual(fromJS([ - { 'count': 15, 'me': true, 'name': '❤' }, - { 'count': 7, 'me': true, 'name': '😯' }, - { 'count': 12, 'me': false, 'name': '👍' }, + expect(mergeEmojiFavourites(emojiReacts, favouritesCount, favourited)).toEqual(fromJS([ + { 'count': 15, 'me': false, 'name': '❤' }, + { 'count': 7, 'me': false, 'name': '😯' }, + { 'count': 12, 'me': true, 'name': '👍' }, ])); }); it('does not add 👍 reacts when there are no favourites', () => { - expect(mergeEmojiFavourites(emojiReacts, 0)).toEqual(fromJS([ - { 'count': 15, 'me': true, 'name': '❤' }, - { 'count': 7, 'me': true, 'name': '😯' }, + expect(mergeEmojiFavourites(emojiReacts, 0, false)).toEqual(fromJS([ + { 'count': 15, 'me': false, 'name': '❤' }, + { 'count': 7, 'me': false, 'name': '😯' }, ])); }); }); @@ -105,7 +106,7 @@ describe('reduceEmoji', () => { { 'count': 1, 'me': false, 'name': '🍩' }, ]); 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': 15, 'me': true, 'name': '❤' }, { 'count': 7, 'me': true, 'name': '😯' }, @@ -150,7 +151,7 @@ describe('getReactForStatus', () => { }); 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('👍'); }); }); diff --git a/app/gabsocial/utils/emoji_reacts.js b/app/gabsocial/utils/emoji_reacts.js index 141fa7992..e9712e6ca 100644 --- a/app/gabsocial/utils/emoji_reacts.js +++ b/app/gabsocial/utils/emoji_reacts.js @@ -21,15 +21,17 @@ export const mergeEmoji = emojiReacts => ( emojiReacts // TODO: Merge similar emoji ); -export const mergeEmojiFavourites = (emojiReacts, favouritesCount) => { +export const mergeEmojiFavourites = (emojiReacts, favouritesCount, favourited) => { if (!favouritesCount) return emojiReacts; - const likeIndex = emojiReacts.findIndex(emojiReact => - emojiReact.get('name') === '👍'); + const likeIndex = emojiReacts.findIndex(emojiReact => emojiReact.get('name') === '👍'); if (likeIndex > -1) { 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 { - 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')) ))); -export const reduceEmoji = (emojiReacts, favouritesCount, me) => ( +export const reduceEmoji = (emojiReacts, favouritesCount, favourited) => ( filterEmoji(sortEmoji(mergeEmoji(mergeEmojiFavourites( - emojiReacts, favouritesCount + emojiReacts, favouritesCount, favourited ))))); export const getReactForStatus = status => { - const emojiReacts = status.getIn(['pleroma', 'emoji_reactions'], ImmutableList()); - const emojiReact = emojiReacts.reduce((acc, cur) => { - if (acc) return acc; - if (cur.get('me') === true) return cur.get('name'); - return acc; - }, undefined); - return emojiReact ? emojiReact : status.get('favourited') && '👍'; + return reduceEmoji( + status.getIn(['pleroma', 'emoji_reactions'], ImmutableList()), + status.get('favourites_count'), + status.get('favourited') + ).filter(e => e.get('me')) + .first(ImmutableMap()) + .get('name'); }; diff --git a/package.json b/package.json index 7b73a739d..8e700dc41 100644 --- a/package.json +++ b/package.json @@ -74,7 +74,7 @@ "html-webpack-harddisk-plugin": "^1.0.1", "html-webpack-plugin": "^4.3.0", "http-link-header": "^1.0.2", - "immutable": "^3.8.2", + "immutable": "^4.0.0-rc.12", "imports-loader": "^0.8.0", "intersection-observer": "^0.7.0", "intl": "^1.2.5", diff --git a/yarn.lock b/yarn.lock index be6152bc9..8185280d5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5167,10 +5167,10 @@ ignore@^4.0.6: resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== -immutable@^3.8.2: - version "3.8.2" - resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" - integrity sha1-wkOZUUVbs5kT2vKBN28VMOEErfM= +immutable@^4.0.0-rc.12: + version "4.0.0-rc.12" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.0.0-rc.12.tgz#ca59a7e4c19ae8d9bf74a97bdf0f6e2f2a5d0217" + integrity sha512-0M2XxkZLx/mi3t8NVwIm1g8nHoEmM9p9UBl/G9k4+hm0kBgOVdMV/B3CY5dQ8qG8qc80NN4gDV4HQv6FTJ5q7A== import-cwd@^2.0.0: version "2.1.0"