From 569c6e83ab732baee0fe51e42268d56d811a4e6c Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Tue, 6 Jul 2021 13:07:54 -0500 Subject: [PATCH] Normalize chat panes (again), fixes #648 --- .../features/chats/components/chat_panes.js | 39 ++++++++++++++----- 1 file changed, 30 insertions(+), 9 deletions(-) diff --git a/app/soapbox/features/chats/components/chat_panes.js b/app/soapbox/features/chats/components/chat_panes.js index b1672c127..ddd0338c7 100644 --- a/app/soapbox/features/chats/components/chat_panes.js +++ b/app/soapbox/features/chats/components/chat_panes.js @@ -10,18 +10,39 @@ import { openChat, toggleMainWindow } from 'soapbox/actions/chats'; import ChatWindow from './chat_window'; import { shortNumberFormat } from 'soapbox/utils/numbers'; import AudioToggle from 'soapbox/features/chats/components/audio_toggle'; +import { List as ImmutableList } from 'immutable'; +import { createSelector } from 'reselect'; -const mapStateToProps = state => { - const settings = getSettings(state); - - return { - panes: settings.getIn(['chats', 'panes']), - mainWindowState: settings.getIn(['chats', 'mainWindow']), - unreadCount: state.get('chats').reduce((acc, curr) => acc + Math.min(curr.get('unread', 0), 1), 0), - }; +const getChatsUnreadCount = state => { + const chats = state.get('chats'); + return chats.reduce((acc, curr) => acc + Math.min(curr.get('unread', 0), 1), 0); }; -export default @connect(mapStateToProps) +// Filter out invalid chats +const normalizePanes = (chats, panes = ImmutableList()) => ( + panes.filter(pane => chats.get(pane.get('chat_id'))) +); + +const makeNormalizeChatPanes = () => createSelector([ + state => state.get('chats'), + state => getSettings(state).getIn(['chats', 'panes']), +], normalizePanes); + +const makeMapStateToProps = () => { + const mapStateToProps = state => { + const normalizeChatPanes = makeNormalizeChatPanes(); + + return { + panes: normalizeChatPanes(state), + mainWindowState: getSettings(state).getIn(['chats', 'mainWindow']), + unreadCount: getChatsUnreadCount(state), + }; + }; + + return mapStateToProps; +}; + +export default @connect(makeMapStateToProps) class ChatPanes extends ImmutablePureComponent { static propTypes = {