From b7df0788c2e13730a77fc7e390d989f4332b7c1a Mon Sep 17 00:00:00 2001 From: audric Date: Tue, 20 Jul 2021 17:14:04 +1000 Subject: [PATCH] move mentions state to the ConversationState --- ts/components/session/SessionInboxView.tsx | 3 +-- .../conversation/SessionCompositionBox.tsx | 2 +- .../conversation/SessionConversation.tsx | 10 ++----- ts/models/conversation.ts | 4 ++- ts/state/ducks/conversations.ts | 18 +++++++++++++ ts/state/ducks/mentionsInput.ts | 27 ------------------- ts/state/ducks/onion.tsx | 6 +++-- ts/state/reducer.ts | 6 ----- ts/state/selectors/conversations.ts | 6 +++++ ts/state/selectors/mentionsInput.ts | 5 ---- ts/util/findMember.ts | 4 +-- 11 files changed, 37 insertions(+), 54 deletions(-) delete mode 100644 ts/state/ducks/mentionsInput.ts delete mode 100644 ts/state/selectors/mentionsInput.ts diff --git a/ts/components/session/SessionInboxView.tsx b/ts/components/session/SessionInboxView.tsx index 89f23be14..99a5a8750 100644 --- a/ts/components/session/SessionInboxView.tsx +++ b/ts/components/session/SessionInboxView.tsx @@ -7,7 +7,6 @@ import { UserUtils } from '../../session/utils'; import { createStore } from '../../state/createStore'; import { actions as conversationActions } from '../../state/ducks/conversations'; import { initialDefaultRoomState } from '../../state/ducks/defaultRooms'; -import { initialMentionsState } from '../../state/ducks/mentionsInput'; import { initialModalState } from '../../state/ducks/modalDialog'; import { initialOnionPathState } from '../../state/ducks/onion'; import { initialSearchState } from '../../state/ducks/search'; @@ -112,6 +111,7 @@ export class SessionInboxView extends React.Component { lightBox: undefined, nextMessageToPlay: undefined, quotedMessage: undefined, + mentionMembers: [], }, user: { ourNumber: UserUtils.getOurPubKeyStrFromCache(), @@ -120,7 +120,6 @@ export class SessionInboxView extends React.Component { defaultRooms: initialDefaultRoomState, search: initialSearchState, theme: initialThemeState, - mentionsInput: initialMentionsState, onionPaths: initialOnionPathState, modals: initialModalState, userConfig: initialUserConfigState, diff --git a/ts/components/session/conversation/SessionCompositionBox.tsx b/ts/components/session/conversation/SessionCompositionBox.tsx index 8cef90491..2617759c1 100644 --- a/ts/components/session/conversation/SessionCompositionBox.tsx +++ b/ts/components/session/conversation/SessionCompositionBox.tsx @@ -32,7 +32,6 @@ import { ReduxConversationType } from '../../../state/ducks/conversations'; import { SessionMemberListItem } from '../SessionMemberListItem'; import autoBind from 'auto-bind'; import { SessionSettingCategory } from '../settings/SessionSettings'; -import { getMentionsInput } from '../../../state/selectors/mentionsInput'; import { updateConfirmModal } from '../../../state/ducks/modalDialog'; import { SectionType, @@ -46,6 +45,7 @@ import { hasLinkPreviewPopupBeenDisplayed, } from '../../../data/data'; import { + getMentionsInput, getQuotedMessage, getSelectedConversation, getSelectedConversationKey, diff --git a/ts/components/session/conversation/SessionConversation.tsx b/ts/components/session/conversation/SessionConversation.tsx index b3722da72..d44640cec 100644 --- a/ts/components/session/conversation/SessionConversation.tsx +++ b/ts/components/session/conversation/SessionConversation.tsx @@ -26,16 +26,13 @@ import { resetSelectedMessageIds, showLightBox, SortedMessageModelProps, + updateMentionsMembers, } from '../../../state/ducks/conversations'; import { MessageView } from '../../MainViewController'; -import { pushUnblockToSend } from '../../../session/utils/Toast'; import { MessageDetail } from '../../conversation/MessageDetail'; import { getConversationController } from '../../../session/conversations'; -import { getMessageById, getPubkeysInPublicConversation } from '../../../data/data'; +import { getPubkeysInPublicConversation } from '../../../data/data'; import autoBind from 'auto-bind'; -import { getDecryptedMediaUrl } from '../../../session/crypto/DecryptedAttachmentsManager'; -import { updateMentionsMembers } from '../../../state/ducks/mentionsInput'; -import { sendDataExtractionNotification } from '../../../session/messages/outgoing/controlMessage/DataExtractionNotificationMessage'; interface State { unreadCount: number; @@ -117,8 +114,6 @@ export class SessionConversation extends React.Component { global.clearInterval(this.publicMembersRefreshTimeout); this.publicMembersRefreshTimeout = undefined; } - // shown convo changed. reset the list of members quotable - window?.inboxStore?.dispatch(updateMentionsMembers([])); // if the newConversation changed, and is public, start our refresh members list if (newConversation.isPublic) { // this is a debounced call. @@ -142,7 +137,6 @@ export class SessionConversation extends React.Component { } if (newConversationKey !== oldConversationKey) { void this.loadInitialMessages(); - window.inboxStore?.dispatch(resetSelectedMessageIds()); this.setState({ showOverlay: false, showRecordingView: false, diff --git a/ts/models/conversation.ts b/ts/models/conversation.ts index a1f9de274..eae8f9361 100644 --- a/ts/models/conversation.ts +++ b/ts/models/conversation.ts @@ -983,8 +983,10 @@ export class ConversationModel extends Backbone.Model { for (const nowRead of oldUnreadNowRead) { allProps.push(nowRead.getProps()); } - window.inboxStore?.dispatch(conversationActions.messagesChanged(allProps)); + if (allProps.length) { + window.inboxStore?.dispatch(conversationActions.messagesChanged(allProps)); + } // Some messages we're marking read are local notifications with no sender read = _.filter(read, m => Boolean(m.sender)); const realUnreadCount = await this.getUnreadCount(); diff --git a/ts/state/ducks/conversations.ts b/ts/state/ducks/conversations.ts index 93bd377f1..a7a35c95d 100644 --- a/ts/state/ducks/conversations.ts +++ b/ts/state/ducks/conversations.ts @@ -243,8 +243,15 @@ export type ConversationsStateType = { showScrollButton: boolean; animateQuotedMessageId?: string; nextMessageToPlay?: number; + mentionMembers: MentionsMembersType; }; +export type MentionsMembersType = Array<{ + id: string; + authorPhoneNumber: string; + authorProfileName: string; +}>; + async function getMessages( conversationKey: string, numMessages: number @@ -399,6 +406,7 @@ function getEmptyState(): ConversationsStateType { selectedMessageIds: [], areMoreMessagesBeingFetched: false, showScrollButton: false, + mentionMembers: [], }; } @@ -727,6 +735,7 @@ const conversationsSlice = createSlice({ nextMessageToPlay: undefined, showScrollButton: false, animateQuotedMessageId: undefined, + mentionMembers: [], }; }, showLightBox( @@ -758,6 +767,14 @@ const conversationsSlice = createSlice({ state.nextMessageToPlay = action.payload; return state; }, + updateMentionsMembers( + state: ConversationsStateType, + action: PayloadAction + ) { + window?.log?.warn('updating mentions input members length', action.payload?.length); + state.mentionMembers = action.payload; + return state; + }, }, extraReducers: (builder: any) => { // Add reducers for additional action types here, and handle loading state as needed @@ -814,4 +831,5 @@ export const { showScrollToBottomButton, quotedMessageToAnimate, setNextMessageToPlay, + updateMentionsMembers, } = actions; diff --git a/ts/state/ducks/mentionsInput.ts b/ts/state/ducks/mentionsInput.ts deleted file mode 100644 index 546e7bd9b..000000000 --- a/ts/state/ducks/mentionsInput.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { createSlice } from '@reduxjs/toolkit'; - -export type MentionsInputState = Array<{ - id: string; - authorPhoneNumber: string; - authorProfileName: string; -}>; - -export const initialMentionsState: MentionsInputState = []; - -/** - * This slice is the one holding the default joinable rooms fetched once in a while from the default opengroup v2 server. - */ -const mentionsInputSlice = createSlice({ - name: 'mentionsInput', - initialState: initialMentionsState, - reducers: { - updateMentionsMembers(state, action) { - window?.log?.warn('updating mentions input members length', action.payload?.length); - return action.payload as MentionsInputState; - }, - }, -}); - -const { actions, reducer } = mentionsInputSlice; -export const { updateMentionsMembers } = actions; -export const defaultMentionsInputReducer = reducer; diff --git a/ts/state/ducks/onion.tsx b/ts/state/ducks/onion.tsx index 4ebedebf2..4b9f45782 100644 --- a/ts/state/ducks/onion.tsx +++ b/ts/state/ducks/onion.tsx @@ -19,10 +19,12 @@ const onionSlice = createSlice({ initialState: initialOnionPathState, reducers: { updateOnionPaths(state: OnionState, action: PayloadAction>>) { - return { ...state, snodePaths: action.payload }; + state.snodePaths = action.payload; + return state; }, updateIsOnline(state: OnionState, action: PayloadAction) { - return { ...state, isOnline: action.payload }; + state.isOnline = action.payload; + return state; }, }, }); diff --git a/ts/state/reducer.ts b/ts/state/reducer.ts index b75f2e52d..1a96f579a 100644 --- a/ts/state/reducer.ts +++ b/ts/state/reducer.ts @@ -6,10 +6,6 @@ import { reducer as user, UserStateType } from './ducks/user'; import { reducer as theme, ThemeStateType } from './ducks/theme'; import { reducer as section, SectionStateType } from './ducks/section'; import { defaultRoomReducer as defaultRooms, DefaultRoomsState } from './ducks/defaultRooms'; -import { - defaultMentionsInputReducer as mentionsInput, - MentionsInputState, -} from './ducks/mentionsInput'; import { defaultOnionReducer as onionPaths, OnionState } from './ducks/onion'; import { modalReducer as modals, ModalState } from './ducks/modalDialog'; @@ -23,7 +19,6 @@ export type StateType = { theme: ThemeStateType; section: SectionStateType; defaultRooms: DefaultRoomsState; - mentionsInput: MentionsInputState; onionPaths: OnionState; modals: ModalState; userConfig: UserConfigState; @@ -37,7 +32,6 @@ export const reducers = { theme, section, defaultRooms, - mentionsInput, onionPaths, modals, userConfig, diff --git a/ts/state/selectors/conversations.ts b/ts/state/selectors/conversations.ts index c041344b5..e428c2b6e 100644 --- a/ts/state/selectors/conversations.ts +++ b/ts/state/selectors/conversations.ts @@ -4,6 +4,7 @@ import { StateType } from '../reducer'; import { ConversationLookupType, ConversationsStateType, + MentionsMembersType, MessagePropsDetails, ReduxConversationType, SortedMessageModelProps, @@ -316,3 +317,8 @@ export const getNextMessageToPlayIndex = createSelector( getConversations, (state: ConversationsStateType): number | undefined => state.nextMessageToPlay || undefined ); + +export const getMentionsInput = createSelector( + getConversations, + (state: ConversationsStateType): MentionsMembersType => state.mentionMembers +); diff --git a/ts/state/selectors/mentionsInput.ts b/ts/state/selectors/mentionsInput.ts deleted file mode 100644 index ffeb23e55..000000000 --- a/ts/state/selectors/mentionsInput.ts +++ /dev/null @@ -1,5 +0,0 @@ -import { StateType } from '../reducer'; - -import { MentionsInputState } from '../ducks/mentionsInput'; - -export const getMentionsInput = (state: StateType): MentionsInputState => state.mentionsInput; diff --git a/ts/util/findMember.ts b/ts/util/findMember.ts index 8b9eb1acb..f883e2a42 100644 --- a/ts/util/findMember.ts +++ b/ts/util/findMember.ts @@ -1,6 +1,6 @@ import { ConversationModel } from '../models/conversation'; import { getConversationController } from '../session/conversations'; -import { MentionsInputState } from '../state/ducks/mentionsInput'; +import { MentionsMembersType } from '../state/ducks/conversations'; // tslint:disable: no-unnecessary-class export class FindMember { @@ -31,7 +31,7 @@ export class FindMember { if (thisConvo.isPublic()) { const publicMembers = (await window.inboxStore?.getState() - .mentionsInput) as MentionsInputState; + .mentionsInput) as MentionsMembersType; const memberConversations = publicMembers .map(publicMember => getConversationController().get(publicMember.authorPhoneNumber)) .filter((c: any) => !!c);