From b4f5321c0fd4b9bec40667764aa2cd9d33c2f6e3 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 22 May 2020 14:08:38 -0500 Subject: [PATCH] Make oneEmojiPerAccount() work --- .../utils/__tests__/emoji_reacts-test.js | 8 ++--- app/gabsocial/utils/emoji_reacts.js | 33 +++++++++++++++---- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/app/gabsocial/utils/__tests__/emoji_reacts-test.js b/app/gabsocial/utils/__tests__/emoji_reacts-test.js index 4e3cdd6f3..54cae7e63 100644 --- a/app/gabsocial/utils/__tests__/emoji_reacts-test.js +++ b/app/gabsocial/utils/__tests__/emoji_reacts-test.js @@ -123,12 +123,12 @@ describe('oneEmojiPerAccount', () => { // Sorted { 'count': 2, 'me': true, 'name': '👍', accounts: [{ id: '1' }, { id: '2' }] }, { 'count': 2, 'me': true, 'name': '❤', accounts: [{ id: '1' }, { id: '2' }] }, - { 'count': 1, 'me': true, 'name': '😯', accounts: [{ id: '1' }] }, - { 'count': 1, 'me': false, 'name': '😂', accounts: [{ id: '3' }] }, + { 'count': 1, 'me': true, 'name': '😯', accounts: [{ id: '1' }] }, + { 'count': 1, 'me': false, 'name': '😂', accounts: [{ id: '3' }] }, ]); - expect(oneEmojiPerAccount(emojiReacts)).toEqual(fromJS([ + expect(oneEmojiPerAccount(emojiReacts, '1')).toEqual(fromJS([ { 'count': 2, 'me': true, 'name': '👍', accounts: [{ id: '1' }, { id: '2' }] }, - { 'count': 1, 'me': false, 'name': '😂', accounts: [{ id: '3' }] }, + { 'count': 1, 'me': false, 'name': '😂', accounts: [{ id: '3' }] }, ])); }); }); diff --git a/app/gabsocial/utils/emoji_reacts.js b/app/gabsocial/utils/emoji_reacts.js index 1f352c7e8..7f6fcef2d 100644 --- a/app/gabsocial/utils/emoji_reacts.js +++ b/app/gabsocial/utils/emoji_reacts.js @@ -33,14 +33,33 @@ export const mergeEmojiFavourites = (emojiReacts, favouritesCount) => { } }; -export const oneEmojiPerAccount = emojiReacts => { +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(); - return emojiReacts.reduce((acc, cur) => { - if (acc.filter( - e => e.get('me') && e.get('name') !== cur.get('name') - ).length > 0) return acc.delete(cur); // FIXME: Incomplete - return acc; - }, emojiReacts).reverse(); + + 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(), + me: inAccounts(accounts, me), + })); + }, emojiReacts) + .filter(e => e.get('count') > 0) + .reverse(); }; export const filterEmoji = emojiReacts => (